#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float one;
};
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_3, thread float4* const tint_symbol_4) {
  float4x4 m44 = float4x4(0.0f);
  int x_10_phi = 0;
  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
  x_10_phi = 0;
  while (true) {
    int x_9 = 0;
    int x_11_phi = 0;
    int const x_10 = x_10_phi;
    if ((x_10 < 4)) {
    } else {
      break;
    }
    float const x_63 = (*(tint_symbol_3)).y;
    if ((x_63 < 0.0f)) {
      break;
    }
    x_11_phi = 0;
    while (true) {
      int x_8 = 0;
      int const x_11 = x_11_phi;
      if ((x_11 < 4)) {
      } else {
        break;
      }
      {
        float const x_72 = x_7.one;
        int const x_73_save = x_10;
        int const x_73_save_1 = x_11;
        float const x_74 = m44[x_73_save][x_73_save_1];
        m44[x_73_save][x_73_save_1] = (x_74 + x_72);
        x_8 = as_type<int>((as_type<uint>(x_11) + as_type<uint>(1)));
        x_11_phi = x_8;
      }
    }
    {
      x_9 = as_type<int>((as_type<uint>(x_10) + as_type<uint>(1)));
      x_10_phi = x_9;
    }
  }
  float const x_77 = m44[1].y;
  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  x_79_1.x = (x_77 - 6.0f);
  float4 const x_79 = x_79_1;
  float const x_81 = m44[2].z;
  float4 x_83_1 = x_79;
  x_83_1.w = (x_81 - 11.0f);
  float4 const x_83 = x_83_1;
  *(tint_symbol_4) = x_83;
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_7, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

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

