#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
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_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int odd_index = 0;
  int even_index = 0;
  int j = 0;
  int ll = 0;
  bool x_59 = false;
  bool x_60_phi = false;
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  float const x_53 = (*(tint_symbol_6)).x;
  bool const x_54 = (x_53 < 128.0f);
  x_60_phi = x_54;
  if (x_54) {
    float const x_58 = (*(tint_symbol_6)).y;
    x_59 = (x_58 < 128.0f);
    x_60_phi = x_59;
  }
  bool const x_60 = x_60_phi;
  if (x_60) {
    return;
  }
  odd_index = 0;
  while (true) {
    int const x_11 = odd_index;
    if ((x_11 <= 1)) {
    } else {
      break;
    }
    float const x_70 = (*(tint_symbol_5)).x;
    (*(tint_symbol_5)).x = (x_70 + 0.25f);
    int const x_12 = odd_index;
    odd_index = as_type<int>((as_type<uint>(x_12) + as_type<uint>(1)));
  }
  even_index = 1;
  while (true) {
    int const x_14 = even_index;
    if ((x_14 >= 0)) {
    } else {
      break;
    }
    float const x_80 = (*(tint_symbol_5)).x;
    (*(tint_symbol_5)).x = (x_80 + 0.25f);
    float const x_84 = x_8.injectionSwitch.x;
    float const x_86 = x_8.injectionSwitch.y;
    if ((x_84 > x_86)) {
      continue;
    }
    int const x_15 = even_index;
    if ((x_15 >= 1)) {
      discard_fragment();
    }
    j = 1;
    while (true) {
      if (true) {
      } else {
        break;
      }
      int const x_16 = ll;
      if ((x_16 >= 3)) {
        break;
      }
      int const x_17 = ll;
      ll = as_type<int>((as_type<uint>(x_17) + as_type<uint>(1)));
      int const x_19 = j;
      if ((as_type<uint>(x_19) < 1u)) {
        {
          int const x_20 = j;
          j = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
        }
        continue;
      }
      float const x_106 = x_8.injectionSwitch.x;
      float const x_108 = x_8.injectionSwitch.y;
      if ((x_106 > x_108)) {
        break;
      }
      {
        int const x_20 = j;
        j = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
      }
    }
    float const x_113 = x_8.injectionSwitch.x;
    float const x_115 = x_8.injectionSwitch.y;
    if ((x_113 > x_115)) {
      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    }
    int const x_22 = even_index;
    even_index = as_type<int>((as_type<uint>(x_22) - as_type<uint>(1)));
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_8, &(tint_symbol_8), &(tint_symbol_7));
  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;
}

