#include <metal_stdlib>

using namespace metal;
struct buf1 {
  /* 0x0000 */ packed_float2 resolution;
};
struct buf0 {
  /* 0x0000 */ packed_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)]];
};

bool checkSwap_f1_f1_(constant buf1& x_9, thread float* const a, thread float* const b, thread float4* const tint_symbol_3) {
  bool x_147 = false;
  float x_158 = 0.0f;
  float x_159 = 0.0f;
  float x_179 = 0.0f;
  float x_178 = 0.0f;
  float x_185 = 0.0f;
  float x_184 = 0.0f;
  float x_160_phi = 0.0f;
  float x_180_phi = 0.0f;
  float x_186_phi = 0.0f;
  float const x_149 = (*(tint_symbol_3)).y;
  float const x_151 = x_9.resolution.y;
  bool const x_153 = (x_149 < (x_151 / 2.0f));
  if (x_153) {
    x_158 = *(a);
    x_160_phi = x_158;
  } else {
    x_159 = 0.0f;
    x_160_phi = x_159;
  }
  float x_166 = 0.0f;
  float x_167 = 0.0f;
  float x_168_phi = 0.0f;
  float const x_160 = x_160_phi;
  bool guard155 = true;
  if (false) {
  } else {
    if (guard155) {
      if (x_153) {
        x_166 = *(b);
        x_168_phi = x_166;
      } else {
        x_167 = 0.0f;
        x_168_phi = x_167;
      }
      float const x_168 = x_168_phi;
      bool const x_169 = (x_160 > x_168);
      if (x_153) {
        x_147 = x_169;
      }
      if (true) {
      } else {
        guard155 = false;
      }
      if (guard155) {
        guard155 = false;
      }
    }
  }
  if (x_153) {
    x_179 = 0.0f;
    x_180_phi = x_179;
  } else {
    x_178 = *(a);
    x_180_phi = x_178;
  }
  float const x_180 = x_180_phi;
  if (x_153) {
    x_185 = 0.0f;
    x_186_phi = x_185;
  } else {
    x_184 = *(b);
    x_186_phi = x_184;
  }
  float const x_186 = x_186_phi;
  if (x_153) {
  } else {
    x_147 = (x_180 < x_186);
  }
  bool const x_191 = x_147;
  return x_191;
}

void main_1(constant buf0& x_13, constant buf1& x_9, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  int i = 0;
  tint_array_wrapper data = {};
  int i_1 = 0;
  int j = 0;
  bool doSwap = false;
  float param = 0.0f;
  float param_1 = 0.0f;
  float temp = 0.0f;
  i = 0;
  while (true) {
    int const x_59 = i;
    if ((x_59 < 10)) {
    } else {
      break;
    }
    int const x_62 = i;
    int const x_63 = i;
    float const x_67 = x_13.injectionSwitch.y;
    data.arr[x_62] = (float(as_type<int>((as_type<uint>(10) - as_type<uint>(x_63)))) * x_67);
    {
      int const x_70 = i;
      i = as_type<int>((as_type<uint>(x_70) + as_type<uint>(1)));
    }
  }
  i_1 = 0;
  while (true) {
    int const x_76 = i_1;
    if ((x_76 < 9)) {
    } else {
      break;
    }
    j = 0;
    while (true) {
      int const x_83 = j;
      if ((x_83 < 10)) {
      } else {
        break;
      }
      int const x_86 = j;
      int const x_87 = i_1;
      if ((x_86 < as_type<int>((as_type<uint>(x_87) + as_type<uint>(1))))) {
        {
          int const x_113 = j;
          j = as_type<int>((as_type<uint>(x_113) + as_type<uint>(1)));
        }
        continue;
      }
      int const x_92 = i_1;
      int const x_93 = j;
      float const x_95 = data.arr[x_92];
      param = x_95;
      float const x_97 = data.arr[x_93];
      param_1 = x_97;
      bool const x_98 = checkSwap_f1_f1_(x_9, &(param), &(param_1), tint_symbol_4);
      doSwap = x_98;
      bool const x_99 = doSwap;
      if (x_99) {
        int const x_102 = i_1;
        float const x_104 = data.arr[x_102];
        temp = x_104;
        int const x_105 = i_1;
        int const x_106 = j;
        float const x_108 = data.arr[x_106];
        data.arr[x_105] = x_108;
        int const x_110 = j;
        float const x_111 = temp;
        data.arr[x_110] = x_111;
      }
      {
        int const x_113 = j;
        j = as_type<int>((as_type<uint>(x_113) + as_type<uint>(1)));
      }
    }
    {
      int const x_115 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_115) + as_type<uint>(1)));
    }
  }
  float const x_118 = (*(tint_symbol_4)).x;
  float const x_120 = x_9.resolution.x;
  if ((x_118 < (x_120 / 2.0f))) {
    float const x_127 = data.arr[0];
    float const x_130 = data.arr[5];
    float const x_133 = data.arr[9];
    *(tint_symbol_5) = float4((x_127 / 10.0f), (x_130 / 10.0f), (x_133 / 10.0f), 1.0f);
  } else {
    float const x_137 = data.arr[5];
    float const x_140 = data.arr[9];
    float const x_143 = data.arr[0];
    *(tint_symbol_5) = float4((x_137 / 10.0f), (x_140 / 10.0f), (x_143 / 10.0f), 1.0f);
  }
  return;
}

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

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

