#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[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  int arr[10];
};
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_7, thread float4* const tint_symbol_5) {
  tint_array_wrapper_1 arr = {};
  int a = 0;
  int i = 0;
  tint_array_wrapper_1 const tint_symbol_3 = {.arr={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}};
  arr = tint_symbol_3;
  a = 0;
  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_44 = arr.arr[x_42];
  if ((x_44 == 2)) {
    int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
    i = x_49;
    while (true) {
      int const x_54 = i;
      int const x_56 = x_7.x_GLF_uniform_int_values.arr[0].el;
      if ((x_54 < x_56)) {
      } else {
        break;
      }
      {
        int const x_59 = i;
        i = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
      }
    }
    int const x_61 = a;
    a = as_type<int>((as_type<uint>(x_61) + as_type<uint>(1)));
  }
  int const x_63 = a;
  int const x_66 = x_7.x_GLF_uniform_int_values.arr[2].el;
  if (((-1 % x_63) == x_66)) {
    int const x_71 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_75 = x_7.x_GLF_uniform_int_values.arr[2].el;
    arr.arr[int2(x_71, x_71).y] = x_75;
  }
  int const x_78 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_80 = arr.arr[x_78];
  int const x_82 = x_7.x_GLF_uniform_int_values.arr[2].el;
  if ((x_80 == x_82)) {
    int const x_88 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_91 = x_7.x_GLF_uniform_int_values.arr[2].el;
    int const x_94 = x_7.x_GLF_uniform_int_values.arr[2].el;
    int const x_97 = x_7.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_5) = float4(float(x_88), float(x_91), float(x_94), float(x_97));
  } else {
    int const x_101 = x_7.x_GLF_uniform_int_values.arr[2].el;
    float const x_102 = float(x_101);
    *(tint_symbol_5) = float4(x_102, x_102, x_102, x_102);
  }
  return;
}

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

