#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ int zero;
};
struct tint_array_wrapper {
  int arr[2];
};
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_8, thread float4* const tint_symbol_3) {
  int highSigned = 0;
  uint highUnsigned = 0u;
  int i = 0;
  tint_array_wrapper data = {};
  uint i_1 = 0u;
  bool x_78 = false;
  bool x_79_phi = false;
  highSigned = 1;
  highUnsigned = 2u;
  i = 0;
  while (true) {
    int const x_42 = i;
    int const x_43 = highSigned;
    int const x_46 = x_8.zero;
    if ((x_42 < as_type<int>((as_type<uint>(min(10, x_43)) + as_type<uint>(x_46))))) {
    } else {
      break;
    }
    int const x_50 = i;
    data.arr[x_50] = 5;
    {
      int const x_52 = i;
      i = as_type<int>((as_type<uint>(x_52) + as_type<uint>(1)));
    }
  }
  i_1 = 1u;
  while (true) {
    uint const x_58 = i_1;
    uint const x_59 = highUnsigned;
    int const x_62 = x_8.zero;
    if ((x_58 < (min(10u, x_59) + as_type<uint>(x_62)))) {
    } else {
      break;
    }
    uint const x_67 = i_1;
    data.arr[x_67] = 6;
    {
      uint const x_69 = i_1;
      i_1 = (x_69 + as_type<uint>(1));
    }
  }
  int const x_72 = data.arr[0];
  bool const x_73 = (x_72 == 5);
  x_79_phi = x_73;
  if (x_73) {
    int const x_77 = data.arr[1];
    x_78 = (x_77 == 6);
    x_79_phi = x_78;
  }
  bool const x_79 = x_79_phi;
  if (x_79) {
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_8, thread float4* const tint_symbol_4) {
  main_1(x_8, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

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

