#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct tint_array_wrapper {
  float4 arr[16];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  tint_array_wrapper indexable = {};
  int2 x_77 = 0;
  int2 x_110 = 0;
  int x_116 = 0;
  int2 x_77_phi = 0;
  int x_80_phi = 0;
  int2 x_111_phi = 0;
  int2 x_113_phi = 0;
  float4 const x_56 = *(tint_symbol_6);
  float2 const x_59 = x_6.resolution;
  float2 const x_60 = (float2(x_56.x, x_56.y) / x_59);
  int const x_63 = int((x_60.x * 8.0f));
  int const x_66 = int((x_60.y * 8.0f));
  int2 const x_75 = int2(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
  x_77_phi = x_75;
  x_80_phi = 0;
  while (true) {
    int2 x_91 = 0;
    int2 x_99 = 0;
    int x_81 = 0;
    int2 x_92_phi = 0;
    int2 x_100_phi = 0;
    x_77 = x_77_phi;
    int const x_80 = x_80_phi;
    if ((x_80 < 100)) {
    } else {
      break;
    }
    x_92_phi = x_77;
    if ((x_77.x > 0)) {
      x_91 = x_77;
      x_91.y = (x_77.y - 1);
      x_92_phi = x_91;
    }
    int2 const x_92 = x_92_phi;
    x_100_phi = x_92;
    if ((x_92.x < 0)) {
      x_99 = x_92;
      x_99.y = (x_92.y + 1);
      x_100_phi = x_99;
    }
    int2 const x_100 = x_100_phi;
    int2 x_78_1 = x_100;
    x_78_1.x = (x_100.x + (x_100.y / 2));
    int2 const x_78 = x_78_1;
    {
      x_81 = (x_80 + 1);
      x_77_phi = x_78;
      x_80_phi = x_81;
    }
  }
  int const x_105 = x_77.x;
  x_111_phi = x_77;
  if ((x_105 < 0)) {
    x_110 = int2(0, 0);
    x_110.x = -(x_105);
    x_111_phi = x_110;
  }
  int2 const x_111 = x_111_phi;
  x_113_phi = x_111;
  while (true) {
    int2 x_114 = 0;
    int2 const x_113 = x_113_phi;
    x_116 = x_113.x;
    if ((x_116 > 15)) {
    } else {
      break;
    }
    {
      x_114 = int2(0, 0);
      x_114.x = as_type<int>((x_116 - as_type<int>(16)));
      x_113_phi = x_114;
    }
  }
  tint_array_wrapper const tint_symbol_4 = {.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_4;
  float4 const x_121 = indexable.arr[x_116];
  *(tint_symbol_7) = x_121;
  return;
}

fragment tint_symbol_2 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;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}

