#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_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float x_43 = 0.0f;
  float x_44 = 0.0f;
  float x_45 = 0.0f;
  int x_46 = 0;
  int zero = 0;
  float2 param = 0.0f;
  float2 temp = 0.0f;
  float4 const x_47 = *(tint_symbol_5);
  param = float2(x_47.x, x_47.y);
  while (true) {
    float const x_54 = param.y;
    if ((x_54 < 50.0f)) {
      float const x_60 = x_9.injectionSwitch.y;
      x_44 = x_60;
    } else {
      x_44 = 0.0f;
    }
    float const x_61 = x_44;
    x_43 = x_61;
    float const x_63 = (*(tint_symbol_5)).y;
    float const x_65 = select(0.0f, 1.0f, (x_63 < 50.0f));
    x_45 = x_65;
    if (((x_61 - x_65) < 1.0f)) {
      x_46 = 0;
      break;
    }
    x_46 = 1;
    break;
    {
      if (false) {
      } else {
        break;
      }
    }
  }
  int const x_70 = x_46;
  zero = x_70;
  if ((x_70 == 1)) {
    return;
  }
  *(tint_symbol_6) = float4(0.0f, 1.0f, 1.0f, 1.0f);
  float const x_75 = (*(tint_symbol_5)).x;
  float const x_77 = x_9.injectionSwitch.x;
  if ((x_75 >= x_77)) {
    float const x_82 = (*(tint_symbol_5)).y;
    if ((x_82 >= 0.0f)) {
      float const x_87 = x_9.injectionSwitch.y;
      (*(tint_symbol_6)).x = x_87;
    }
  }
  float const x_90 = (*(tint_symbol_5)).y;
  if ((x_90 >= 0.0f)) {
    float const x_95 = x_9.injectionSwitch.x;
    (*(tint_symbol_6)).y = x_95;
  }
  float4 const x_97 = *(tint_symbol_5);
  float2 const x_98 = float2(x_97.x, x_97.y);
  float2 const x_101 = float2(x_98.x, x_98.y);
  temp = x_101;
  if ((x_101.y >= 0.0f)) {
    float const x_107 = x_9.injectionSwitch.x;
    (*(tint_symbol_6)).z = x_107;
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[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_9, &(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;
}

int alwaysZero_vf2_(constant buf0& x_9, thread float2* const coord, thread float4* const tint_symbol_9) {
  float a = 0.0f;
  float x_110 = 0.0f;
  float b = 0.0f;
  float const x_112 = (*(coord)).y;
  if ((x_112 < 50.0f)) {
    float const x_118 = x_9.injectionSwitch.y;
    x_110 = x_118;
  } else {
    x_110 = 0.0f;
  }
  float const x_119 = x_110;
  a = x_119;
  float const x_121 = (*(tint_symbol_9)).y;
  float const x_123 = select(0.0f, 1.0f, (x_121 < 50.0f));
  b = x_123;
  if (((x_119 - x_123) < 1.0f)) {
    return 0;
  }
  return 1;
}

