#include <metal_stdlib>

using namespace metal;
struct buf2 {
  /* 0x0000 */ float one;
};
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[1];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[4];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void func0_i1_(constant buf2& x_10, constant buf0& x_12, thread int* const x, thread float4x2* const tint_symbol_5) {
  int i = 0;
  bool x_137 = false;
  bool x_138 = false;
  bool x_138_phi = false;
  bool x_139_phi = false;
  int const x_124 = *(x);
  bool const x_125 = (x_124 < 1);
  x_139_phi = x_125;
  if (!(x_125)) {
    int const x_129 = *(x);
    bool const x_130 = (x_129 > 1);
    x_138_phi = x_130;
    if (x_130) {
      float const x_134 = x_10.one;
      float const x_136 = x_12.x_GLF_uniform_float_values.arr[0].el;
      x_137 = (x_134 > x_136);
      x_138_phi = x_137;
    }
    x_138 = x_138_phi;
    x_139_phi = x_138;
  }
  bool const x_139 = x_139_phi;
  if (x_139) {
    return;
  }
  float const x_143 = x_10.one;
  float const x_145 = x_12.x_GLF_uniform_float_values.arr[0].el;
  if ((x_143 == x_145)) {
    i = 0;
    while (true) {
      int const x_150 = i;
      if ((x_150 < 2)) {
      } else {
        break;
      }
      {
        int const x_154 = *(x);
        int const x_155 = clamp(x_154, 0, 3);
        int const x_156 = i;
        float const x_158 = x_12.x_GLF_uniform_float_values.arr[0].el;
        float const x_160 = (*(tint_symbol_5))[x_155][x_156];
        (*(tint_symbol_5))[x_155][x_156] = (x_160 + x_158);
        int const x_163 = i;
        i = as_type<int>((as_type<uint>(x_163) + as_type<uint>(1)));
      }
    }
  }
  return;
}

void func1_(constant buf2& x_10, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4x2* const tint_symbol_7) {
  int param = 0;
  float const x_167 = (*(tint_symbol_6)).y;
  if ((x_167 < 0.0f)) {
    return;
  }
  param = 1;
  func0_i1_(x_10, x_12, &(param), tint_symbol_7);
  return;
}

void main_1(constant buf2& x_10, constant buf0& x_12, constant buf1& x_16, thread float4x2* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  *(tint_symbol_8) = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
  func1_(x_10, x_12, tint_symbol_9, tint_symbol_8);
  func1_(x_10, x_12, tint_symbol_9, tint_symbol_8);
  float4x2 const x_54 = *(tint_symbol_8);
  int const x_56 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_59 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_62 = x_16.x_GLF_uniform_int_values.arr[1].el;
  int const x_65 = x_16.x_GLF_uniform_int_values.arr[1].el;
  int const x_68 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_71 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_74 = x_16.x_GLF_uniform_int_values.arr[0].el;
  int const x_77 = x_16.x_GLF_uniform_int_values.arr[0].el;
  float4x2 const x_83 = float4x2(float2(float(x_56), float(x_59)), float2(float(x_62), float(x_65)), float2(float(x_68), float(x_71)), float2(float(x_74), float(x_77)));
  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
    int const x_107 = x_16.x_GLF_uniform_int_values.arr[3].el;
    int const x_110 = x_16.x_GLF_uniform_int_values.arr[0].el;
    int const x_113 = x_16.x_GLF_uniform_int_values.arr[0].el;
    int const x_116 = x_16.x_GLF_uniform_int_values.arr[3].el;
    *(tint_symbol_10) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
  } else {
    int const x_120 = x_16.x_GLF_uniform_int_values.arr[0].el;
    float const x_121 = float(x_120);
    *(tint_symbol_10) = float4(x_121, x_121, x_121, x_121);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_10 [[buffer(2)]], constant buf0& x_12 [[buffer(0)]], constant buf1& x_16 [[buffer(1)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread float4x2 tint_symbol_12 = float4x2(0.0f);
  thread float4 tint_symbol_13 = 0.0f;
  tint_symbol_11 = gl_FragCoord_param;
  main_1(x_10, x_12, x_16, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

