#include <metal_stdlib>

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

float func_(constant buf0& x_8) {
  float s = 0.0f;
  int i = 0;
  int j = 0;
  s = 2.0f;
  i = 0;
  while (true) {
    int const x_47 = i;
    int const x_49 = x_8.zero;
    if ((x_47 < (x_49 + 1))) {
    } else {
      break;
    }
    float const x_53 = s;
    s = (x_53 + 3.0f);
    j = 0;
    while (true) {
      int const x_59 = j;
      if ((x_59 < 10)) {
      } else {
        break;
      }
      int const x_63 = x_8.zero;
      if ((x_63 == 1)) {
        discard_fragment();
      }
      {
        int const x_67 = j;
        j = (x_67 + 1);
      }
    }
    {
      int const x_69 = i;
      i = (x_69 + 1);
    }
  }
  float const x_71 = s;
  return x_71;
}

void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
  float4 c = 0.0f;
  float const x_34 = func_(x_8);
  c = float4(x_34, 0.0f, 0.0f, 1.0f);
  float const x_36 = func_(x_8);
  if ((x_36 == 5.0f)) {
    float4 const x_41 = c;
    *(tint_symbol_4) = x_41;
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_8, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

