#include <metal_stdlib>

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

void main_1(constant buf0& x_9, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  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_3);
  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_3)).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_4) = float4(0.0f, 1.0f, 1.0f, 1.0f);
  float const x_75 = (*(tint_symbol_3)).x;
  float const x_77 = x_9.injectionSwitch.x;
  if ((x_75 >= x_77)) {
    float const x_82 = (*(tint_symbol_3)).y;
    if ((x_82 >= 0.0f)) {
      float const x_87 = x_9.injectionSwitch.y;
      (*(tint_symbol_4)).x = x_87;
    }
  }
  float const x_90 = (*(tint_symbol_3)).y;
  if ((x_90 >= 0.0f)) {
    float const x_95 = x_9.injectionSwitch.x;
    (*(tint_symbol_4)).y = x_95;
  }
  float4 const x_97 = *(tint_symbol_3);
  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_4)).z = x_107;
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_9, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_9, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_9, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

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;
}

