#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[10];
};
struct QuicksortObject {
  tint_array_wrapper numbers;
};
struct buf0 {
  /* 0x0000 */ 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]];
};

int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_5) {
  int x_314 = 0;
  int x_315 = 0;
  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_316 = *(h);
  int const x_318 = (*(tint_symbol_5)).numbers.arr[x_316];
  pivot = x_318;
  int const x_319 = *(l);
  i_1 = as_type<int>((as_type<uint>(x_319) - as_type<uint>(1)));
  int const x_321 = *(l);
  j_1 = x_321;
  while (true) {
    int const x_326 = j_1;
    int const x_327 = *(h);
    if ((x_326 <= as_type<int>((as_type<uint>(x_327) - as_type<uint>(1))))) {
    } else {
      break;
    }
    int const x_331 = j_1;
    int const x_333 = (*(tint_symbol_5)).numbers.arr[x_331];
    int const x_334 = pivot;
    if ((x_333 <= x_334)) {
      int const x_338 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_338) + as_type<uint>(1)));
      int const x_340 = i_1;
      param = x_340;
      int const x_341 = j_1;
      param_1 = x_341;
      int const x_342 = param;
      int const x_344 = (*(tint_symbol_5)).numbers.arr[x_342];
      x_315 = x_344;
      int const x_345 = param;
      int const x_346 = param_1;
      int const x_348 = (*(tint_symbol_5)).numbers.arr[x_346];
      (*(tint_symbol_5)).numbers.arr[x_345] = x_348;
      int const x_350 = param_1;
      int const x_351 = x_315;
      (*(tint_symbol_5)).numbers.arr[x_350] = x_351;
    }
    {
      int const x_353 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_353) + as_type<uint>(1)));
    }
  }
  int const x_355 = i_1;
  param_2 = as_type<int>((as_type<uint>(x_355) + as_type<uint>(1)));
  int const x_357 = *(h);
  param_3 = x_357;
  int const x_358 = param_2;
  int const x_360 = (*(tint_symbol_5)).numbers.arr[x_358];
  x_314 = x_360;
  int const x_361 = param_2;
  int const x_362 = param_3;
  int const x_364 = (*(tint_symbol_5)).numbers.arr[x_362];
  (*(tint_symbol_5)).numbers.arr[x_361] = x_364;
  int const x_366 = param_3;
  int const x_367 = x_314;
  (*(tint_symbol_5)).numbers.arr[x_366] = x_367;
  if (false) {
  } else {
    int const x_372 = i_1;
    return as_type<int>((as_type<uint>(x_372) + as_type<uint>(1)));
  }
  return 0;
}

void main_1(constant buf0& x_34, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  int x_91 = 0;
  int x_92 = 0;
  int x_93 = 0;
  tint_array_wrapper x_94 = {};
  int x_95 = 0;
  int x_96 = 0;
  int x_97 = 0;
  int i_2 = 0;
  float2 uv = 0.0f;
  float3 color = 0.0f;
  float4 const x_98 = *(tint_symbol_6);
  *(tint_symbol_7) = ((x_98 + 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_105 = i_2;
    if ((x_105 < 10)) {
    } else {
      break;
    }
    int const x_108 = i_2;
    int const x_109 = i_2;
    (*(tint_symbol_8)).numbers.arr[x_108] = as_type<int>((as_type<uint>(10) - as_type<uint>(x_109)));
    int const x_112 = i_2;
    int const x_113 = i_2;
    int const x_115 = (*(tint_symbol_8)).numbers.arr[x_113];
    int const x_116 = i_2;
    int const x_118 = (*(tint_symbol_8)).numbers.arr[x_116];
    (*(tint_symbol_8)).numbers.arr[x_112] = as_type<int>((as_type<uint>(x_115) * as_type<uint>(x_118)));
    {
      int const x_121 = i_2;
      i_2 = as_type<int>((as_type<uint>(x_121) + as_type<uint>(1)));
    }
  }
  x_91 = 0;
  x_92 = 9;
  x_93 = -1;
  int const x_123 = x_93;
  int const x_124 = as_type<int>((as_type<uint>(x_123) + as_type<uint>(1)));
  x_93 = x_124;
  int const x_125 = x_91;
  x_94.arr[x_124] = x_125;
  int const x_127 = x_93;
  int const x_128 = as_type<int>((as_type<uint>(x_127) + as_type<uint>(1)));
  x_93 = x_128;
  int const x_129 = x_92;
  x_94.arr[x_128] = x_129;
  while (true) {
    int const x_135 = x_93;
    if ((x_135 >= 0)) {
    } else {
      break;
    }
    int const x_138 = x_93;
    x_93 = as_type<int>((as_type<uint>(x_138) - as_type<uint>(1)));
    int const x_141 = x_94.arr[x_138];
    x_92 = x_141;
    int const x_142 = x_93;
    x_93 = as_type<int>((as_type<uint>(x_142) - as_type<uint>(1)));
    int const x_145 = x_94.arr[x_142];
    x_91 = x_145;
    int const x_146 = x_91;
    x_96 = x_146;
    int const x_147 = x_92;
    x_97 = x_147;
    int const x_148 = performPartition_i1_i1_(&(x_96), &(x_97), tint_symbol_8);
    x_95 = x_148;
    int const x_149 = x_95;
    int const x_151 = x_91;
    if ((as_type<int>((as_type<uint>(x_149) - as_type<uint>(1))) > x_151)) {
      int const x_155 = x_93;
      int const x_156 = as_type<int>((as_type<uint>(x_155) + as_type<uint>(1)));
      x_93 = x_156;
      int const x_157 = x_91;
      x_94.arr[x_156] = x_157;
      int const x_159 = x_93;
      int const x_160 = as_type<int>((as_type<uint>(x_159) + as_type<uint>(1)));
      x_93 = x_160;
      int const x_161 = x_95;
      x_94.arr[x_160] = as_type<int>((as_type<uint>(x_161) - as_type<uint>(1)));
    }
    int const x_164 = x_95;
    int const x_166 = x_92;
    if ((as_type<int>((as_type<uint>(x_164) + as_type<uint>(1))) < x_166)) {
      int const x_170 = x_93;
      int const x_171 = as_type<int>((as_type<uint>(x_170) + as_type<uint>(1)));
      x_93 = x_171;
      int const x_172 = x_95;
      x_94.arr[x_171] = as_type<int>((as_type<uint>(x_172) + as_type<uint>(1)));
      int const x_175 = x_93;
      int const x_176 = as_type<int>((as_type<uint>(x_175) + as_type<uint>(1)));
      x_93 = x_176;
      int const x_177 = x_92;
      x_94.arr[x_176] = x_177;
    }
  }
  float4 const x_179 = *(tint_symbol_7);
  float2 const x_182 = x_34.resolution;
  uv = (float2(x_179.x, x_179.y) / x_182);
  color = float3(1.0f, 2.0f, 3.0f);
  int const x_185 = (*(tint_symbol_8)).numbers.arr[0];
  float const x_188 = color.x;
  color.x = (x_188 + float(x_185));
  float const x_192 = uv.x;
  if ((x_192 > 0.25f)) {
    int const x_197 = (*(tint_symbol_8)).numbers.arr[1];
    float const x_200 = color.x;
    color.x = (x_200 + float(x_197));
  }
  float const x_204 = uv.x;
  if ((x_204 > 0.5f)) {
    int const x_209 = (*(tint_symbol_8)).numbers.arr[2];
    float const x_212 = color.y;
    color.y = (x_212 + float(x_209));
  }
  float const x_216 = uv.x;
  if ((x_216 > 0.75f)) {
    int const x_221 = (*(tint_symbol_8)).numbers.arr[3];
    float const x_224 = color.z;
    color.z = (x_224 + float(x_221));
  }
  int const x_228 = (*(tint_symbol_8)).numbers.arr[4];
  float const x_231 = color.y;
  color.y = (x_231 + float(x_228));
  float const x_235 = uv.y;
  if ((x_235 > 0.25f)) {
    int const x_240 = (*(tint_symbol_8)).numbers.arr[5];
    float const x_243 = color.x;
    color.x = (x_243 + float(x_240));
  }
  float const x_247 = uv.y;
  if ((x_247 > 0.5f)) {
    int const x_252 = (*(tint_symbol_8)).numbers.arr[6];
    float const x_255 = color.y;
    color.y = (x_255 + float(x_252));
  }
  float const x_259 = uv.y;
  if ((x_259 > 0.75f)) {
    int const x_264 = (*(tint_symbol_8)).numbers.arr[7];
    float const x_267 = color.z;
    color.z = (x_267 + float(x_264));
  }
  int const x_271 = (*(tint_symbol_8)).numbers.arr[8];
  float const x_274 = color.z;
  color.z = (x_274 + float(x_271));
  float const x_278 = uv.x;
  float const x_280 = uv.y;
  if ((fabs((x_278 - x_280)) < 0.25f)) {
    int const x_287 = (*(tint_symbol_8)).numbers.arr[9];
    float const x_290 = color.x;
    color.x = (x_290 + float(x_287));
  }
  float3 const x_293 = color;
  float3 const x_294 = normalize(x_293);
  *(tint_symbol_9) = float4(x_294.x, x_294.y, x_294.z, 1.0f);
  float4 const x_299 = *(tint_symbol_6);
  *(tint_symbol_10) = x_299;
  return;
}

main_out tint_symbol_inner(constant buf0& x_34, float4 x_GLF_pos_param, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12, thread QuicksortObject* const tint_symbol_13, thread float4* const tint_symbol_14, thread float4* const tint_symbol_15) {
  *(tint_symbol_11) = x_GLF_pos_param;
  main_1(x_34, tint_symbol_11, tint_symbol_12, tint_symbol_13, tint_symbol_14, tint_symbol_15);
  main_out const tint_symbol_4 = {.frag_color_1=*(tint_symbol_14), .gl_Position=*(tint_symbol_15)};
  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_16 = 0.0f;
  thread float4 tint_symbol_17 = 0.0f;
  thread QuicksortObject tint_symbol_18 = {};
  thread float4 tint_symbol_19 = 0.0f;
  thread float4 tint_symbol_20 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_34, tint_symbol_1.x_GLF_pos_param, &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18), &(tint_symbol_19), &(tint_symbol_20));
  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_21) {
  int temp = 0;
  int const x_302 = *(i);
  int const x_304 = (*(tint_symbol_21)).numbers.arr[x_302];
  temp = x_304;
  int const x_305 = *(i);
  int const x_306 = *(j);
  int const x_308 = (*(tint_symbol_21)).numbers.arr[x_306];
  (*(tint_symbol_21)).numbers.arr[x_305] = x_308;
  int const x_310 = *(j);
  int const x_311 = temp;
  (*(tint_symbol_21)).numbers.arr[x_310] = x_311;
  return;
}

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_376 = top;
  int const x_377 = as_type<int>((as_type<uint>(x_376) + as_type<uint>(1)));
  top = x_377;
  int const x_378 = l_1;
  stack.arr[x_377] = x_378;
  int const x_380 = top;
  int const x_381 = as_type<int>((as_type<uint>(x_380) + as_type<uint>(1)));
  top = x_381;
  int const x_382 = h_1;
  stack.arr[x_381] = x_382;
  while (true) {
    int const x_388 = top;
    if ((x_388 >= 0)) {
    } else {
      break;
    }
    int const x_391 = top;
    top = as_type<int>((as_type<uint>(x_391) - as_type<uint>(1)));
    int const x_394 = stack.arr[x_391];
    h_1 = x_394;
    int const x_395 = top;
    top = as_type<int>((as_type<uint>(x_395) - as_type<uint>(1)));
    int const x_398 = stack.arr[x_395];
    l_1 = x_398;
    int const x_399 = l_1;
    param_4 = x_399;
    int const x_400 = h_1;
    param_5 = x_400;
    int const x_401 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_22);
    p = x_401;
    int const x_402 = p;
    int const x_404 = l_1;
    if ((as_type<int>((as_type<uint>(x_402) - as_type<uint>(1))) > x_404)) {
      int const x_408 = top;
      int const x_409 = as_type<int>((as_type<uint>(x_408) + as_type<uint>(1)));
      top = x_409;
      int const x_410 = l_1;
      stack.arr[x_409] = x_410;
      int const x_412 = top;
      int const x_413 = as_type<int>((as_type<uint>(x_412) + as_type<uint>(1)));
      top = x_413;
      int const x_414 = p;
      stack.arr[x_413] = as_type<int>((as_type<uint>(x_414) - as_type<uint>(1)));
    }
    int const x_417 = p;
    int const x_419 = h_1;
    if ((as_type<int>((as_type<uint>(x_417) + as_type<uint>(1))) < x_419)) {
      int const x_423 = top;
      int const x_424 = as_type<int>((as_type<uint>(x_423) + as_type<uint>(1)));
      top = x_424;
      int const x_425 = p;
      stack.arr[x_424] = as_type<int>((as_type<uint>(x_425) + as_type<uint>(1)));
      int const x_428 = top;
      int const x_429 = as_type<int>((as_type<uint>(x_428) + as_type<uint>(1)));
      top = x_429;
      int const x_430 = h_1;
      stack.arr[x_429] = x_430;
    }
  }
  return;
}

