#include <metal_stdlib>

using namespace metal;

int tint_unary_minus(const int v) {
  return select(-v, v, v == -2147483648);
}

struct buf0 {
  /* 0x0000 */ float2 resolution;
};
struct tint_array_wrapper {
  float4 arr[16];
};
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_4, thread float4* const tint_symbol_5) {
  tint_array_wrapper indexable = {};
  int2 x_80 = 0;
  int2 x_113 = 0;
  int x_119 = 0;
  int2 x_80_phi = 0;
  int x_83_phi = 0;
  int2 x_114_phi = 0;
  int2 x_116_phi = 0;
  float4 const x_58 = *(tint_symbol_4);
  float2 const x_61 = x_6.resolution;
  float2 const x_62 = (float2(x_58.x, x_58.y) / x_61);
  int const x_65 = int((x_62.x * 8.0f));
  int const x_69 = int((x_62.y * 8.0f));
  int2 const x_78 = int2(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(((x_65 & 5) | (x_69 & 10))) * as_type<uint>(8)))) + as_type<uint>(((x_69 & 5) | (x_65 & 10))))), 0);
  x_80_phi = x_78;
  x_83_phi = 0;
  while (true) {
    int2 x_94 = 0;
    int2 x_102 = 0;
    int x_84 = 0;
    int2 x_95_phi = 0;
    int2 x_103_phi = 0;
    x_80 = x_80_phi;
    int const x_83 = x_83_phi;
    if ((x_83 < 100)) {
    } else {
      break;
    }
    x_95_phi = x_80;
    if ((x_80.x > 0)) {
      x_94 = x_80;
      x_94.y = as_type<int>((as_type<uint>(x_80.y) - as_type<uint>(1)));
      x_95_phi = x_94;
    }
    int2 const x_95 = x_95_phi;
    x_103_phi = x_95;
    if ((x_95.x < 0)) {
      x_102 = x_95;
      x_102.y = as_type<int>((as_type<uint>(x_95.y) + as_type<uint>(1)));
      x_103_phi = x_102;
    }
    int2 const x_103 = x_103_phi;
    int2 x_81_1 = x_103;
    x_81_1.x = as_type<int>((as_type<uint>(x_103.x) + as_type<uint>((x_103.y / 2))));
    int2 const x_81 = x_81_1;
    {
      x_84 = as_type<int>((as_type<uint>(x_83) + as_type<uint>(1)));
      x_80_phi = x_81;
      x_83_phi = x_84;
    }
  }
  int const x_108 = x_80.x;
  x_114_phi = x_80;
  if ((x_108 < 0)) {
    x_113 = x_80;
    x_113.x = tint_unary_minus(x_108);
    x_114_phi = x_113;
  }
  int2 const x_114 = x_114_phi;
  x_116_phi = x_114;
  while (true) {
    int2 x_117 = 0;
    int2 const x_116 = x_116_phi;
    x_119 = x_116.x;
    if ((x_119 > 15)) {
    } else {
      break;
    }
    {
      x_117 = x_116;
      x_117.x = as_type<int>(as_type<int>((as_type<uint>(x_119) - as_type<uint>(as_type<int>(16)))));
      x_116_phi = x_117;
    }
  }
  tint_array_wrapper const tint_symbol_2 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
  indexable = tint_symbol_2;
  float4 const x_124 = indexable.arr[x_119];
  *(tint_symbol_5) = x_124;
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(x_6, tint_symbol_6, tint_symbol_7);
  main_out const tint_symbol_3 = {.x_GLF_color_1=*(tint_symbol_7)};
  return tint_symbol_3;
}

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

