#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[19];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  int arr[17];
};
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_6, thread float4* const tint_symbol_6) {
  tint_array_wrapper_1 A = {};
  tint_array_wrapper_1 ref = {};
  int a = 0;
  int i = 0;
  bool ok = false;
  int i_1 = 0;
  int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_54 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_62 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_70 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_72 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_74 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_78 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_80 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_82 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84}};
  A = tint_symbol_3;
  int const x_87 = x_6.x_GLF_uniform_int_values.arr[3].el;
  int const x_89 = x_6.x_GLF_uniform_int_values.arr[4].el;
  int const x_91 = x_6.x_GLF_uniform_int_values.arr[5].el;
  int const x_93 = x_6.x_GLF_uniform_int_values.arr[6].el;
  int const x_95 = x_6.x_GLF_uniform_int_values.arr[7].el;
  int const x_97 = x_6.x_GLF_uniform_int_values.arr[8].el;
  int const x_99 = x_6.x_GLF_uniform_int_values.arr[9].el;
  int const x_101 = x_6.x_GLF_uniform_int_values.arr[10].el;
  int const x_103 = x_6.x_GLF_uniform_int_values.arr[11].el;
  int const x_105 = x_6.x_GLF_uniform_int_values.arr[12].el;
  int const x_107 = x_6.x_GLF_uniform_int_values.arr[13].el;
  int const x_109 = x_6.x_GLF_uniform_int_values.arr[14].el;
  int const x_111 = x_6.x_GLF_uniform_int_values.arr[15].el;
  int const x_113 = x_6.x_GLF_uniform_int_values.arr[16].el;
  int const x_115 = x_6.x_GLF_uniform_int_values.arr[17].el;
  int const x_117 = x_6.x_GLF_uniform_int_values.arr[18].el;
  int const x_119 = x_6.x_GLF_uniform_int_values.arr[1].el;
  tint_array_wrapper_1 const tint_symbol_4 = {.arr={x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119}};
  ref = tint_symbol_4;
  int const x_122 = x_6.x_GLF_uniform_int_values.arr[2].el;
  a = x_122;
  int const x_124 = x_6.x_GLF_uniform_int_values.arr[2].el;
  i = x_124;
  while (true) {
    int const x_129 = i;
    int const x_131 = x_6.x_GLF_uniform_int_values.arr[1].el;
    if ((x_129 < x_131)) {
    } else {
      break;
    }
    int const x_134 = i;
    int const x_135 = a;
    a = (x_135 - 1);
    A.arr[x_134] = x_135;
    int const x_138 = i;
    int const x_140 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_142 = x_6.x_GLF_uniform_int_values.arr[18].el;
    int const x_144 = i;
    int const x_146 = x_6.x_GLF_uniform_int_values.arr[3].el;
    A.arr[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
    {
      int const x_149 = i;
      i = (x_149 + 1);
    }
  }
  ok = true;
  int const x_152 = x_6.x_GLF_uniform_int_values.arr[2].el;
  i_1 = x_152;
  while (true) {
    int const x_157 = i_1;
    int const x_159 = x_6.x_GLF_uniform_int_values.arr[1].el;
    if ((x_157 < x_159)) {
    } else {
      break;
    }
    int const x_162 = i_1;
    int const x_164 = A.arr[x_162];
    int const x_165 = i_1;
    int const x_167 = ref.arr[x_165];
    if ((x_164 != x_167)) {
      ok = false;
    }
    {
      int const x_171 = i_1;
      i_1 = (x_171 + 1);
    }
  }
  int const x_174 = x_6.x_GLF_uniform_int_values.arr[2].el;
  float const x_175 = float(x_174);
  *(tint_symbol_6) = float4(x_175, x_175, x_175, x_175);
  bool const x_177 = ok;
  if (x_177) {
    int const x_181 = x_6.x_GLF_uniform_int_values.arr[3].el;
    int const x_184 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_187 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_190 = x_6.x_GLF_uniform_int_values.arr[3].el;
    *(tint_symbol_6) = float4(float(x_181), float(x_184), float(x_187), float(x_190));
  }
  return;
}

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

