#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf1 {
  /* 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 buf0 {
  /* 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 main_1(constant buf1& x_7, constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float2x3 m23 = float2x3(0.0f);
  int i = 0;
  float const x_46 = x_7.x_GLF_uniform_float_values.arr[1].el;
  m23 = float2x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f));
  i = 1;
  while (true) {
    bool x_80 = false;
    bool x_81_phi = false;
    int const x_54 = i;
    int const x_56 = x_10.x_GLF_uniform_int_values.arr[3].el;
    if ((x_54 < x_56)) {
    } else {
      break;
    }
    int const x_60 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
    float const x_64 = x_7.x_GLF_uniform_float_values.arr[0].el;
    float const x_66 = m23[x_60][x_62];
    m23[x_60][x_62] = (x_66 + x_64);
    float const x_70 = (*(tint_symbol_5)).y;
    float const x_72 = x_7.x_GLF_uniform_float_values.arr[0].el;
    if ((x_70 < x_72)) {
    }
    x_81_phi = true;
    if (true) {
      float const x_79 = (*(tint_symbol_5)).x;
      x_80 = (x_79 < 0.0f);
      x_81_phi = x_80;
    }
    bool const x_81 = x_81_phi;
    if (!(x_81)) {
      break;
    }
    {
      int const x_85 = i;
      i = (x_85 + 1);
    }
  }
  float2x3 const x_87 = m23;
  int const x_89 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_92 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_95 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_101 = x_10.x_GLF_uniform_int_values.arr[1].el;
  int const x_104 = x_10.x_GLF_uniform_int_values.arr[0].el;
  float2x3 const x_108 = float2x3(float3(float(x_89), float(x_92), float(x_95)), float3(float(x_98), float(x_101), float(x_104)));
  if ((all((x_87[0u] == x_108[0u])) && all((x_87[1u] == x_108[1u])))) {
    int const x_122 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_125 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_128 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_6) = float4(float(x_122), float(x_125), float(x_128), float(x_131));
  } else {
    int const x_135 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_136 = float(x_135);
    *(tint_symbol_6) = float4(x_136, x_136, x_136, x_136);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_10 [[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_7, x_10, &(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;
}

