#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_7, thread float* const tint_symbol_5, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  float lv = 0.0f;
  float x_43 = 0.0f;
  int GLF_live5r = 0;
  int GLF_live5_looplimiter6 = 0;
  float const x_45 = x_7.injectionSwitch.y;
  if ((1.0f > x_45)) {
    float const x_50 = *(tint_symbol_5);
    x_43 = fabs(x_50);
  } else {
    x_43 = 260.0f;
  }
  float const x_52 = x_43;
  lv = x_52;
  float const x_53 = lv;
  if ((int(x_53) < 250)) {
    float const x_58 = lv;
    if ((int(x_58) < 180)) {
      float const x_64 = lv;
      float const x_65 = clamp(x_64, 1.0f, 1.0f);
    } else {
      float const x_67 = (*(tint_symbol_6)).y;
      if ((x_67 < 0.0f)) {
        float const x_71 = lv;
        if ((int(x_71) < 210)) {
          while (true) {
            {
              if (true) {
              } else {
                break;
              }
            }
          }
        }
        GLF_live5r = 0;
        while (true) {
          if (true) {
          } else {
            break;
          }
          int const x_11 = GLF_live5_looplimiter6;
          if ((x_11 >= 6)) {
            break;
          }
          int const x_12 = GLF_live5_looplimiter6;
          GLF_live5_looplimiter6 = (x_12 + 1);
        }
      }
    }
  }
  *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float tint_symbol_9 = 0.0f;
  thread float4 tint_symbol_10 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_9), &(tint_symbol_8), &(tint_symbol_10));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

