#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[10];
};
struct QuicksortObject {
  tint_array_wrapper numbers;
};
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 frag_color_1;
  float4 gl_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_pos_param [[attribute(0)]];
};
struct tint_symbol_3 {
  float4 frag_color_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

void main_1(constant buf0& x_34, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6, thread QuicksortObject* const tint_symbol_7, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
  int x_90 = 0;
  int x_91 = 0;
  int x_92 = 0;
  int x_93 = 0;
  int x_94 = 0;
  int x_95 = 0;
  int x_96 = 0;
  int x_97 = 0;
  int x_98 = 0;
  int x_99 = 0;
  int x_100 = 0;
  int x_101 = 0;
  int x_102 = 0;
  tint_array_wrapper x_103 = {};
  int x_104 = 0;
  int x_105 = 0;
  int x_106 = 0;
  int i_2 = 0;
  float2 uv = 0.0f;
  float3 color = 0.0f;
  float4 const x_107 = *(tint_symbol_5);
  *(tint_symbol_6) = ((x_107 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
  i_2 = 0;
  while (true) {
    int const x_114 = i_2;
    if ((x_114 < 10)) {
    } else {
      break;
    }
    int const x_117 = i_2;
    int const x_118 = i_2;
    (*(tint_symbol_7)).numbers.arr[x_117] = as_type<int>((as_type<uint>(10) - as_type<uint>(x_118)));
    int const x_121 = i_2;
    int const x_122 = i_2;
    int const x_124 = (*(tint_symbol_7)).numbers.arr[x_122];
    int const x_125 = i_2;
    int const x_127 = (*(tint_symbol_7)).numbers.arr[x_125];
    (*(tint_symbol_7)).numbers.arr[x_121] = as_type<int>((as_type<uint>(x_124) * as_type<uint>(x_127)));
    {
      int const x_130 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_130) + as_type<uint>(1)));
    }
  }
  x_100 = 0;
  x_101 = 9;
  x_102 = -1;
  int const x_132 = x_102;
  int const x_133 = as_type<int>((as_type<uint>(x_132) + as_type<uint>(1)));
  x_102 = x_133;
  int const x_134 = x_100;
  x_103.arr[x_133] = x_134;
  int const x_136 = x_102;
  int const x_137 = as_type<int>((as_type<uint>(x_136) + as_type<uint>(1)));
  x_102 = x_137;
  int const x_138 = x_101;
  x_103.arr[x_137] = x_138;
  while (true) {
    int const x_144 = x_102;
    if ((x_144 >= 0)) {
    } else {
      break;
    }
    int const x_147 = x_102;
    x_102 = as_type<int>((as_type<uint>(x_147) - as_type<uint>(1)));
    int const x_150 = x_103.arr[x_147];
    x_101 = x_150;
    int const x_151 = x_102;
    x_102 = as_type<int>((as_type<uint>(x_151) - as_type<uint>(1)));
    int const x_154 = x_103.arr[x_151];
    x_100 = x_154;
    int const x_155 = x_100;
    x_105 = x_155;
    int const x_156 = x_101;
    x_106 = x_156;
    int const x_157 = x_106;
    int const x_159 = (*(tint_symbol_7)).numbers.arr[x_157];
    x_92 = x_159;
    int const x_160 = x_105;
    x_93 = as_type<int>((as_type<uint>(x_160) - as_type<uint>(1)));
    int const x_162 = x_105;
    x_94 = x_162;
    while (true) {
      int const x_167 = x_94;
      int const x_168 = x_106;
      if ((x_167 <= as_type<int>((as_type<uint>(x_168) - as_type<uint>(1))))) {
      } else {
        break;
      }
      int const x_172 = x_94;
      int const x_174 = (*(tint_symbol_7)).numbers.arr[x_172];
      int const x_175 = x_92;
      if ((x_174 <= x_175)) {
        int const x_179 = x_93;
        x_93 = as_type<int>((as_type<uint>(x_179) + as_type<uint>(1)));
        int const x_181 = x_93;
        x_95 = x_181;
        int const x_182 = x_94;
        x_96 = x_182;
        int const x_183 = x_95;
        int const x_185 = (*(tint_symbol_7)).numbers.arr[x_183];
        x_91 = x_185;
        int const x_186 = x_95;
        int const x_187 = x_96;
        int const x_189 = (*(tint_symbol_7)).numbers.arr[x_187];
        (*(tint_symbol_7)).numbers.arr[x_186] = x_189;
        int const x_191 = x_96;
        int const x_192 = x_91;
        (*(tint_symbol_7)).numbers.arr[x_191] = x_192;
      }
      {
        int const x_194 = x_94;
        x_94 = as_type<int>((as_type<uint>(x_194) + as_type<uint>(1)));
      }
    }
    int const x_196 = x_93;
    x_97 = as_type<int>((as_type<uint>(x_196) + as_type<uint>(1)));
    int const x_198 = x_106;
    x_98 = x_198;
    int const x_199 = x_97;
    int const x_201 = (*(tint_symbol_7)).numbers.arr[x_199];
    x_90 = x_201;
    int const x_202 = x_97;
    int const x_203 = x_98;
    int const x_205 = (*(tint_symbol_7)).numbers.arr[x_203];
    (*(tint_symbol_7)).numbers.arr[x_202] = x_205;
    int const x_207 = x_98;
    int const x_208 = x_90;
    (*(tint_symbol_7)).numbers.arr[x_207] = x_208;
    int const x_210 = x_93;
    x_99 = as_type<int>((as_type<uint>(x_210) + as_type<uint>(1)));
    int const x_212 = x_99;
    x_104 = x_212;
    int const x_213 = x_104;
    int const x_215 = x_100;
    if ((as_type<int>((as_type<uint>(x_213) - as_type<uint>(1))) > x_215)) {
      int const x_219 = x_102;
      int const x_220 = as_type<int>((as_type<uint>(x_219) + as_type<uint>(1)));
      x_102 = x_220;
      int const x_221 = x_100;
      x_103.arr[x_220] = x_221;
      int const x_223 = x_102;
      int const x_224 = as_type<int>((as_type<uint>(x_223) + as_type<uint>(1)));
      x_102 = x_224;
      int const x_225 = x_104;
      x_103.arr[x_224] = as_type<int>((as_type<uint>(x_225) - as_type<uint>(1)));
    }
    int const x_228 = x_104;
    int const x_230 = x_101;
    if ((as_type<int>((as_type<uint>(x_228) + as_type<uint>(1))) < x_230)) {
      int const x_234 = x_102;
      int const x_235 = as_type<int>((as_type<uint>(x_234) + as_type<uint>(1)));
      x_102 = x_235;
      int const x_236 = x_104;
      x_103.arr[x_235] = as_type<int>((as_type<uint>(x_236) + as_type<uint>(1)));
      int const x_239 = x_102;
      int const x_240 = as_type<int>((as_type<uint>(x_239) + as_type<uint>(1)));
      x_102 = x_240;
      int const x_241 = x_101;
      x_103.arr[x_240] = x_241;
    }
  }
  float4 const x_243 = *(tint_symbol_6);
  float2 const x_246 = x_34.resolution;
  uv = (float2(x_243.x, x_243.y) / x_246);
  color = float3(1.0f, 2.0f, 3.0f);
  int const x_249 = (*(tint_symbol_7)).numbers.arr[0];
  float const x_252 = color.x;
  color.x = (x_252 + float(x_249));
  float const x_256 = uv.x;
  if ((x_256 > 0.25f)) {
    int const x_261 = (*(tint_symbol_7)).numbers.arr[1];
    float const x_264 = color.x;
    color.x = (x_264 + float(x_261));
  }
  float const x_268 = uv.x;
  if ((x_268 > 0.5f)) {
    int const x_273 = (*(tint_symbol_7)).numbers.arr[2];
    float const x_276 = color.y;
    color.y = (x_276 + float(x_273));
  }
  float const x_280 = uv.x;
  if ((x_280 > 0.75f)) {
    int const x_285 = (*(tint_symbol_7)).numbers.arr[3];
    float const x_288 = color.z;
    color.z = (x_288 + float(x_285));
  }
  int const x_292 = (*(tint_symbol_7)).numbers.arr[4];
  float const x_295 = color.y;
  color.y = (x_295 + float(x_292));
  float const x_299 = uv.y;
  if ((x_299 > 0.25f)) {
    int const x_304 = (*(tint_symbol_7)).numbers.arr[5];
    float const x_307 = color.x;
    color.x = (x_307 + float(x_304));
  }
  float const x_311 = uv.y;
  if ((x_311 > 0.5f)) {
    int const x_316 = (*(tint_symbol_7)).numbers.arr[6];
    float const x_319 = color.y;
    color.y = (x_319 + float(x_316));
  }
  float const x_323 = uv.y;
  if ((x_323 > 0.75f)) {
    int const x_328 = (*(tint_symbol_7)).numbers.arr[7];
    float const x_331 = color.z;
    color.z = (x_331 + float(x_328));
  }
  int const x_335 = (*(tint_symbol_7)).numbers.arr[8];
  float const x_338 = color.z;
  color.z = (x_338 + float(x_335));
  float const x_342 = uv.x;
  float const x_344 = uv.y;
  if ((fabs((x_342 - x_344)) < 0.25f)) {
    int const x_351 = (*(tint_symbol_7)).numbers.arr[9];
    float const x_354 = color.x;
    color.x = (x_354 + float(x_351));
  }
  float3 const x_357 = color;
  float3 const x_358 = normalize(x_357);
  *(tint_symbol_8) = float4(x_358.x, x_358.y, x_358.z, 1.0f);
  float4 const x_363 = *(tint_symbol_5);
  *(tint_symbol_9) = x_363;
  return;
}

main_out tint_symbol_inner(constant buf0& x_34, float4 x_GLF_pos_param, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11, thread QuicksortObject* const tint_symbol_12, thread float4* const tint_symbol_13, thread float4* const tint_symbol_14) {
  *(tint_symbol_10) = x_GLF_pos_param;
  main_1(x_34, tint_symbol_10, tint_symbol_11, tint_symbol_12, tint_symbol_13, tint_symbol_14);
  main_out const tint_symbol_4 = {.frag_color_1=*(tint_symbol_13), .gl_Position=*(tint_symbol_14)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
  thread float4 tint_symbol_15 = 0.0f;
  thread float4 tint_symbol_16 = 0.0f;
  thread QuicksortObject tint_symbol_17 = {};
  thread float4 tint_symbol_18 = 0.0f;
  thread float4 tint_symbol_19 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_34, tint_symbol_1.x_GLF_pos_param, &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18), &(tint_symbol_19));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.frag_color_1 = inner_result.frag_color_1;
  wrapper_result.gl_Position = inner_result.gl_Position;
  return wrapper_result;
}

void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_20) {
  int temp = 0;
  int const x_366 = *(i);
  int const x_368 = (*(tint_symbol_20)).numbers.arr[x_366];
  temp = x_368;
  int const x_369 = *(i);
  int const x_370 = *(j);
  int const x_372 = (*(tint_symbol_20)).numbers.arr[x_370];
  (*(tint_symbol_20)).numbers.arr[x_369] = x_372;
  int const x_374 = *(j);
  int const x_375 = temp;
  (*(tint_symbol_20)).numbers.arr[x_374] = x_375;
  return;
}

int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_21) {
  int pivot = 0;
  int i_1 = 0;
  int j_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  int param_3 = 0;
  int const x_378 = *(h);
  int const x_380 = (*(tint_symbol_21)).numbers.arr[x_378];
  pivot = x_380;
  int const x_381 = *(l);
  i_1 = as_type<int>((as_type<uint>(x_381) - as_type<uint>(1)));
  int const x_383 = *(l);
  j_1 = x_383;
  while (true) {
    int const x_388 = j_1;
    int const x_389 = *(h);
    if ((x_388 <= as_type<int>((as_type<uint>(x_389) - as_type<uint>(1))))) {
    } else {
      break;
    }
    int const x_393 = j_1;
    int const x_395 = (*(tint_symbol_21)).numbers.arr[x_393];
    int const x_396 = pivot;
    if ((x_395 <= x_396)) {
      int const x_400 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_400) + as_type<uint>(1)));
      int const x_402 = i_1;
      param = x_402;
      int const x_403 = j_1;
      param_1 = x_403;
      swap_i1_i1_(&(param), &(param_1), tint_symbol_21);
    }
    {
      int const x_405 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_405) + as_type<uint>(1)));
    }
  }
  int const x_407 = i_1;
  param_2 = as_type<int>((as_type<uint>(x_407) + as_type<uint>(1)));
  int const x_409 = *(h);
  param_3 = x_409;
  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_21);
  int const x_411 = i_1;
  return as_type<int>((as_type<uint>(x_411) + as_type<uint>(1)));
}

void quicksort_(thread QuicksortObject* const tint_symbol_22) {
  int l_1 = 0;
  int h_1 = 0;
  int top = 0;
  tint_array_wrapper stack = {};
  int p = 0;
  int param_4 = 0;
  int param_5 = 0;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  int const x_414 = top;
  int const x_415 = as_type<int>((as_type<uint>(x_414) + as_type<uint>(1)));
  top = x_415;
  int const x_416 = l_1;
  stack.arr[x_415] = x_416;
  int const x_418 = top;
  int const x_419 = as_type<int>((as_type<uint>(x_418) + as_type<uint>(1)));
  top = x_419;
  int const x_420 = h_1;
  stack.arr[x_419] = x_420;
  while (true) {
    int const x_426 = top;
    if ((x_426 >= 0)) {
    } else {
      break;
    }
    int const x_429 = top;
    top = as_type<int>((as_type<uint>(x_429) - as_type<uint>(1)));
    int const x_432 = stack.arr[x_429];
    h_1 = x_432;
    int const x_433 = top;
    top = as_type<int>((as_type<uint>(x_433) - as_type<uint>(1)));
    int const x_436 = stack.arr[x_433];
    l_1 = x_436;
    int const x_437 = l_1;
    param_4 = x_437;
    int const x_438 = h_1;
    param_5 = x_438;
    int const x_439 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_22);
    p = x_439;
    int const x_440 = p;
    int const x_442 = l_1;
    if ((as_type<int>((as_type<uint>(x_440) - as_type<uint>(1))) > x_442)) {
      int const x_446 = top;
      int const x_447 = as_type<int>((as_type<uint>(x_446) + as_type<uint>(1)));
      top = x_447;
      int const x_448 = l_1;
      stack.arr[x_447] = x_448;
      int const x_450 = top;
      int const x_451 = as_type<int>((as_type<uint>(x_450) + as_type<uint>(1)));
      top = x_451;
      int const x_452 = p;
      stack.arr[x_451] = as_type<int>((as_type<uint>(x_452) - as_type<uint>(1)));
    }
    int const x_455 = p;
    int const x_457 = h_1;
    if ((as_type<int>((as_type<uint>(x_455) + as_type<uint>(1))) < x_457)) {
      int const x_461 = top;
      int const x_462 = as_type<int>((as_type<uint>(x_461) + as_type<uint>(1)));
      top = x_462;
      int const x_463 = p;
      stack.arr[x_462] = as_type<int>((as_type<uint>(x_463) + as_type<uint>(1)));
      int const x_466 = top;
      int const x_467 = as_type<int>((as_type<uint>(x_466) + as_type<uint>(1)));
      top = x_467;
      int const x_468 = h_1;
      stack.arr[x_467] = x_468;
    }
  }
  return;
}

