#include <metal_stdlib>

using namespace metal;
struct buf1 {
  /* 0x0000 */ float2 resolution;
};
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct tint_array_wrapper {
  float arr[10];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  tint_array_wrapper data = {};
  int x_40_phi = 0;
  int x_52_phi = 0;
  x_40_phi = 0;
  while (true) {
    int x_41 = 0;
    int const x_40 = x_40_phi;
    if ((x_40 < 10)) {
    } else {
      break;
    }
    {
      float const x_48 = x_9.injectionSwitch.y;
      data.arr[x_40] = (float(as_type<int>((as_type<uint>(10) - as_type<uint>(x_40)))) * x_48);
      x_41 = as_type<int>((as_type<uint>(x_40) + as_type<uint>(1)));
      x_40_phi = x_41;
    }
  }
  x_52_phi = 0;
  while (true) {
    int x_53 = 0;
    int x_59_phi = 0;
    int const x_52 = x_52_phi;
    if ((x_52 < 9)) {
    } else {
      break;
    }
    x_59_phi = 0;
    while (true) {
      bool x_82 = false;
      bool x_83 = false;
      int x_60 = 0;
      bool x_84_phi = false;
      int const x_59 = x_59_phi;
      if ((x_59 < 10)) {
      } else {
        break;
      }
      if ((x_59 < as_type<int>((as_type<uint>(x_52) + as_type<uint>(1))))) {
        {
          x_60 = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
          x_59_phi = x_60;
        }
        continue;
      }
      int const x_69_save = x_52;
      float const x_70 = data.arr[x_69_save];
      int const x_71_save = x_59;
      float const x_72 = data.arr[x_71_save];
      float const x_74 = (*(tint_symbol_3)).y;
      float const x_76 = x_6.resolution.y;
      if ((x_74 < (x_76 * 0.5f))) {
        x_82 = (x_70 > x_72);
        x_84_phi = x_82;
      } else {
        x_83 = (x_70 < x_72);
        x_84_phi = x_83;
      }
      bool const x_84 = x_84_phi;
      if (x_84) {
        float const x_87 = data.arr[x_69_save];
        float const x_88 = data.arr[x_71_save];
        data.arr[x_69_save] = x_88;
        data.arr[x_71_save] = x_87;
      }
      {
        x_60 = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
        x_59_phi = x_60;
      }
    }
    {
      x_53 = as_type<int>((as_type<uint>(x_52) + as_type<uint>(1)));
      x_52_phi = x_53;
    }
  }
  float const x_90 = (*(tint_symbol_3)).x;
  float const x_92 = x_6.resolution.x;
  if ((x_90 < (x_92 * 0.5f))) {
    float const x_99 = data.arr[0];
    float const x_102 = data.arr[5];
    float const x_105 = data.arr[9];
    *(tint_symbol_4) = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
  } else {
    float const x_109 = data.arr[5];
    float const x_112 = data.arr[9];
    float const x_115 = data.arr[0];
    *(tint_symbol_4) = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_9, constant buf1& x_6, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_9, x_6, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_9, x_6, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

