#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  int arr[10];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int const x_260 = *(from);
  k = x_260;
  int const x_261 = *(from);
  i = x_261;
  int const x_262 = *(mid);
  j = as_type<int>((as_type<uint>(x_262) + as_type<uint>(1)));
  while (true) {
    int const x_268 = i;
    int const x_269 = *(mid);
    int const x_271 = j;
    int const x_272 = *(to);
    if (((x_268 <= x_269) & (x_271 <= x_272))) {
    } else {
      break;
    }
    int const x_276 = i;
    int const x_278 = (*(tint_symbol_5)).arr[x_276];
    int const x_279 = j;
    int const x_281 = (*(tint_symbol_5)).arr[x_279];
    if ((x_278 < x_281)) {
      int const x_286 = k;
      k = as_type<int>((as_type<uint>(x_286) + as_type<uint>(1)));
      int const x_288 = i;
      i = as_type<int>((as_type<uint>(x_288) + as_type<uint>(1)));
      int const x_291 = (*(tint_symbol_5)).arr[x_288];
      (*(tint_symbol_6)).arr[x_286] = x_291;
    } else {
      int const x_293 = k;
      k = as_type<int>((as_type<uint>(x_293) + as_type<uint>(1)));
      int const x_295 = j;
      j = as_type<int>((as_type<uint>(x_295) + as_type<uint>(1)));
      int const x_298 = (*(tint_symbol_5)).arr[x_295];
      (*(tint_symbol_6)).arr[x_293] = x_298;
    }
  }
  while (true) {
    int const x_304 = i;
    int const x_306 = i;
    int const x_307 = *(mid);
    if (((x_304 < 10) & (x_306 <= x_307))) {
    } else {
      break;
    }
    int const x_311 = k;
    k = as_type<int>((as_type<uint>(x_311) + as_type<uint>(1)));
    int const x_313 = i;
    i = as_type<int>((as_type<uint>(x_313) + as_type<uint>(1)));
    int const x_316 = (*(tint_symbol_5)).arr[x_313];
    (*(tint_symbol_6)).arr[x_311] = x_316;
  }
  int const x_318 = *(from);
  i_1 = x_318;
  while (true) {
    int const x_323 = i_1;
    int const x_324 = *(to);
    if ((x_323 <= x_324)) {
    } else {
      break;
    }
    int const x_327 = i_1;
    int const x_328 = i_1;
    int const x_330 = (*(tint_symbol_6)).arr[x_328];
    (*(tint_symbol_5)).arr[x_327] = x_330;
    {
      int const x_332 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_332) + as_type<uint>(1)));
    }
  }
  return;
}

int func_i1_i1_(thread int* const m, thread int* const high, thread float4* const tint_symbol_7) {
  int x = 0;
  int x_335 = 0;
  int x_336 = 0;
  float const x_338 = (*(tint_symbol_7)).x;
  if ((x_338 >= 0.0f)) {
    if (false) {
      int const x_346 = *(high);
      x_336 = as_type<int>((as_type<uint>(x_346) << as_type<uint>(0)));
    } else {
      x_336 = 4;
    }
    int const x_348 = x_336;
    x_335 = as_type<int>((as_type<uint>(1) << as_type<uint>(x_348)));
  } else {
    x_335 = 1;
  }
  int const x_350 = x_335;
  x = x_350;
  int const x_351 = x;
  x = (x_351 >> as_type<uint>(4));
  int const x_353 = *(m);
  int const x_355 = *(m);
  int const x_357 = *(m);
  int const x_359 = x;
  return clamp(as_type<int>((as_type<uint>(2) * as_type<uint>(x_353))), as_type<int>((as_type<uint>(2) * as_type<uint>(x_355))), (as_type<int>((as_type<uint>(2) * as_type<uint>(x_357))) / x_359));
}

void mergeSort_(thread tint_array_wrapper* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
  int low = 0;
  int high_1 = 0;
  int m_1 = 0;
  int i_2 = 0;
  int from_1 = 0;
  int mid_1 = 0;
  int to_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  int param_3 = 0;
  int param_4 = 0;
  low = 0;
  high_1 = 9;
  m_1 = 1;
  while (true) {
    int const x_367 = m_1;
    int const x_368 = high_1;
    if ((x_367 <= x_368)) {
    } else {
      break;
    }
    int const x_371 = low;
    i_2 = x_371;
    while (true) {
      int const x_376 = i_2;
      int const x_377 = high_1;
      if ((x_376 < x_377)) {
      } else {
        break;
      }
      int const x_380 = i_2;
      from_1 = x_380;
      int const x_381 = i_2;
      int const x_382 = m_1;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_381) + as_type<uint>(x_382)))) - as_type<uint>(1)));
      int const x_385 = i_2;
      int const x_386 = m_1;
      int const x_390 = high_1;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_385) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_386))))))) - as_type<uint>(1))), x_390);
      int const x_392 = from_1;
      param = x_392;
      int const x_393 = mid_1;
      param_1 = x_393;
      int const x_394 = to_1;
      param_2 = x_394;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_8, tint_symbol_9);
      {
        int const x_396 = m_1;
        param_3 = x_396;
        int const x_397 = high_1;
        param_4 = x_397;
        int const x_398 = func_i1_i1_(&(param_3), &(param_4), tint_symbol_10);
        int const x_399 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_399) + as_type<uint>(x_398)));
      }
    }
    {
      int const x_401 = m_1;
      m_1 = as_type<int>((as_type<uint>(2) * as_type<uint>(x_401)));
    }
  }
  return;
}

void main_1(constant buf0& x_34, thread tint_array_wrapper* const tint_symbol_11, thread tint_array_wrapper* const tint_symbol_12, thread float4* const tint_symbol_13, thread float4* const tint_symbol_14) {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_93 = x_34.injectionSwitch.x;
  i_3 = int(x_93);
  while (true) {
    int const x_99 = i_3;
    switch(x_99) {
      case 9: {
        int const x_129 = i_3;
        (*(tint_symbol_11)).arr[x_129] = -5;
        break;
      }
      case 8: {
        int const x_127 = i_3;
        (*(tint_symbol_11)).arr[x_127] = -4;
        break;
      }
      case 7: {
        int const x_125 = i_3;
        (*(tint_symbol_11)).arr[x_125] = -3;
        break;
      }
      case 6: {
        int const x_123 = i_3;
        (*(tint_symbol_11)).arr[x_123] = -2;
        break;
      }
      case 5: {
        int const x_121 = i_3;
        (*(tint_symbol_11)).arr[x_121] = -1;
        break;
      }
      case 4: {
        int const x_119 = i_3;
        (*(tint_symbol_11)).arr[x_119] = 0;
        break;
      }
      case 3: {
        int const x_117 = i_3;
        (*(tint_symbol_11)).arr[x_117] = 1;
        break;
      }
      case 2: {
        int const x_115 = i_3;
        (*(tint_symbol_11)).arr[x_115] = 2;
        break;
      }
      case 1: {
        int const x_113 = i_3;
        (*(tint_symbol_11)).arr[x_113] = 3;
        break;
      }
      case 0: {
        int const x_111 = i_3;
        (*(tint_symbol_11)).arr[x_111] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_131 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_131) + as_type<uint>(1)));
    {
      int const x_133 = i_3;
      if ((x_133 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_139 = j_1;
    if ((x_139 < 10)) {
    } else {
      break;
    }
    int const x_142 = j_1;
    int const x_143 = j_1;
    int const x_145 = (*(tint_symbol_11)).arr[x_143];
    (*(tint_symbol_12)).arr[x_142] = x_145;
    {
      int const x_147 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_147) + as_type<uint>(1)));
    }
  }
  mergeSort_(tint_symbol_11, tint_symbol_12, tint_symbol_13);
  float const x_151 = (*(tint_symbol_13)).y;
  if ((int(x_151) < 30)) {
    int const x_158 = (*(tint_symbol_11)).arr[0];
    grey = (0.5f + (float(x_158) / 10.0f));
  } else {
    float const x_163 = (*(tint_symbol_13)).y;
    if ((int(x_163) < 60)) {
      int const x_170 = (*(tint_symbol_11)).arr[1];
      grey = (0.5f + (float(x_170) / 10.0f));
    } else {
      float const x_175 = (*(tint_symbol_13)).y;
      if ((int(x_175) < 90)) {
        int const x_182 = (*(tint_symbol_11)).arr[2];
        grey = (0.5f + (float(x_182) / 10.0f));
      } else {
        float const x_187 = (*(tint_symbol_13)).y;
        if ((int(x_187) < 120)) {
          int const x_194 = (*(tint_symbol_11)).arr[3];
          grey = (0.5f + (float(x_194) / 10.0f));
        } else {
          float const x_199 = (*(tint_symbol_13)).y;
          if ((int(x_199) < 150)) {
            discard_fragment();
          } else {
            float const x_206 = (*(tint_symbol_13)).y;
            if ((int(x_206) < 180)) {
              int const x_213 = (*(tint_symbol_11)).arr[5];
              grey = (0.5f + (float(x_213) / 10.0f));
            } else {
              float const x_218 = (*(tint_symbol_13)).y;
              if ((int(x_218) < 210)) {
                int const x_225 = (*(tint_symbol_11)).arr[6];
                grey = (0.5f + (float(x_225) / 10.0f));
              } else {
                float const x_230 = (*(tint_symbol_13)).y;
                if ((int(x_230) < 240)) {
                  int const x_237 = (*(tint_symbol_11)).arr[7];
                  grey = (0.5f + (float(x_237) / 10.0f));
                } else {
                  float const x_242 = (*(tint_symbol_13)).y;
                  if ((int(x_242) < 270)) {
                    int const x_249 = (*(tint_symbol_11)).arr[8];
                    grey = (0.5f + (float(x_249) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_253 = grey;
  float3 const x_254 = float3(x_253, x_253, x_253);
  *(tint_symbol_14) = float4(x_254.x, x_254.y, x_254.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_34 [[buffer(0)]]) {
  thread float4 tint_symbol_15 = 0.0f;
  thread tint_array_wrapper tint_symbol_16 = {};
  thread tint_array_wrapper tint_symbol_17 = {};
  thread float4 tint_symbol_18 = 0.0f;
  tint_symbol_15 = gl_FragCoord_param;
  main_1(x_34, &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_15), &(tint_symbol_18));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_18};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

