#include <metal_stdlib>

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

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  while (true) {
    int const x_136 = i;
    if ((x_136 < 800)) {
    } else {
      break;
    }
    int const x_139 = i;
    if (((x_139 % 32) == 0)) {
      float const x_145 = result;
      result = (x_145 + 0.400000006f);
    } else {
      int const x_147 = i;
      float const x_149 = *(thirty_two);
      if ((fmod(float(x_147), rint(x_149)) <= 0.01f)) {
        float const x_155 = result;
        result = (x_155 + 100.0f);
      }
    }
    int const x_157 = i;
    float const x_159 = *(limit);
    if ((float(x_157) >= x_159)) {
      float const x_163 = result;
      return x_163;
    }
    {
      int const x_164 = i;
      i = (x_164 + 1);
    }
  }
  float const x_166 = result;
  return x_166;
}

void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int i_1 = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_63 = x_13.resolution.x;
  thirty_two_1 = rint((x_63 / 8.0f));
  float const x_67 = (*(tint_symbol_5)).x;
  param = x_67;
  float const x_68 = thirty_two_1;
  param_1 = x_68;
  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_69;
  float const x_72 = (*(tint_symbol_5)).y;
  param_2 = x_72;
  float const x_73 = thirty_two_1;
  param_3 = x_73;
  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_74;
  float3 const x_76 = c;
  float3 const x_79 = c;
  float4x2 const x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
  c.z = (((x_76 * float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)))).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
  i_1 = 0;
  while (true) {
    int const x_99 = i_1;
    if ((x_99 < 3)) {
    } else {
      break;
    }
    int const x_102 = i_1;
    float const x_104 = c[x_102];
    if ((x_104 >= 1.0f)) {
      int const x_108 = i_1;
      int const x_109 = i_1;
      float const x_111 = c[x_109];
      int const x_112 = i_1;
      float const x_114 = c[x_112];
      c[x_108] = (x_111 * x_114);
      float const x_118 = (*(tint_symbol_5)).y;
      if ((x_118 < 0.0f)) {
        break;
      }
    }
    {
      int const x_122 = i_1;
      i_1 = (x_122 + 1);
    }
  }
  float3 const x_124 = c;
  float3 const x_126 = normalize(fabs(x_124));
  *(tint_symbol_6) = float4(x_126.x, x_126.y, x_126.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[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_13, &(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;
}

