#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_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  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_5)).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_5)).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_6) = 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_6) = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 1.0f);
  }
  return;
}

fragment tint_symbol_2 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;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

