#include <metal_stdlib>

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

float func_(constant buf0& x_7, thread float4* const tint_symbol_3) {
  int x = 0;
  float const x_99 = (*(tint_symbol_3)).x;
  if ((x_99 < 1.0f)) {
    return 5.0f;
  }
  float const x_104 = x_7.injectionSwitch.x;
  float const x_106 = x_7.injectionSwitch.y;
  if ((x_104 > x_106)) {
    return 1.0f;
  }
  float const x_111 = x_7.injectionSwitch.x;
  x = int(x_111);
  float const x_114 = x_7.injectionSwitch.x;
  int const x_118 = x;
  x = as_type<int>((as_type<uint>(x_118) + as_type<uint>(as_type<int>((as_type<uint>(int(clamp(x_114, 0.0f, 1.0f))) * as_type<uint>(3))))));
  int const x_120 = x;
  return (5.0f + float(x_120));
}

void main_1(constant buf0& x_7, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  int i = 0;
  int j = 0;
  tint_array_wrapper data = {};
  i = 0;
  while (true) {
    int const x_48 = i;
    float const x_50 = x_7.injectionSwitch.x;
    if ((x_48 < as_type<int>((as_type<uint>(4) + as_type<uint>(int(x_50)))))) {
    } else {
      break;
    }
    float const x_56 = (*(tint_symbol_4)).x;
    if ((x_56 >= 0.0f)) {
      j = 0;
      while (true) {
        bool x_81 = false;
        bool x_82_phi = false;
        int const x_64 = j;
        if ((x_64 < 4)) {
        } else {
          break;
        }
        int const x_67 = j;
        int const x_69 = i;
        float const x_71 = func_(x_7, tint_symbol_4);
        data.arr[as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(4) * as_type<uint>(x_67)))) + as_type<uint>(x_69)))].x = x_71;
        float const x_74 = data.arr[0].x;
        bool const x_75 = (x_74 == 5.0f);
        x_82_phi = x_75;
        if (!(x_75)) {
          float const x_80 = data.arr[15].x;
          x_81 = (x_80 == 5.0f);
          x_82_phi = x_81;
        }
        bool const x_82 = x_82_phi;
        if (x_82) {
          *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
        } else {
          *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
        }
        float const x_87 = x_7.injectionSwitch.x;
        float const x_89 = x_7.injectionSwitch.y;
        if ((x_87 > x_89)) {
          return;
        }
        {
          int const x_93 = j;
          j = as_type<int>((as_type<uint>(x_93) + as_type<uint>(1)));
        }
      }
    }
    {
      int const x_95 = i;
      i = as_type<int>((as_type<uint>(x_95) + as_type<uint>(1)));
    }
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, 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_7, 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_7 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, 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;
}

