#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  float arr[9];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_4) {
  float4x3 m43 = float4x3(0.0f);
  int ll1 = 0;
  int rows = 0;
  int ll4 = 0;
  int ll2 = 0;
  int c = 0;
  float4x3 tempm43 = float4x3(0.0f);
  int ll3 = 0;
  int d = 0;
  int r = 0;
  tint_array_wrapper sums = {};
  int idx = 0;
  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
  ll1 = 0;
  rows = 2;
  while (true) {
    if (true) {
    } else {
      break;
    }
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    int const x_16 = ll1;
    if ((x_16 >= 5)) {
      break;
    }
    int const x_17 = ll1;
    ll1 = (x_17 + 1);
    ll4 = 10;
    ll2 = 0;
    c = 0;
    while (true) {
      int const x_19 = c;
      if ((x_19 < 1)) {
      } else {
        break;
      }
      int const x_20 = ll2;
      if ((x_20 >= 0)) {
        break;
      }
      int const x_21 = ll2;
      ll2 = (x_21 + 1);
      float4x3 const x_92 = m43;
      tempm43 = x_92;
      ll3 = 0;
      d = 0;
      while (true) {
        int const x_23 = ll4;
        if ((1 < x_23)) {
        } else {
          break;
        }
        int const x_24 = d;
        int const x_25 = d;
        int const x_26 = d;
        int const x_27 = r;
        int const x_28 = r;
        int const x_29 = r;
        tempm43[select(0, x_26, ((x_24 >= 0) && (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) && (x_28 < 3)))] = 1.0f;
        {
          int const x_30 = d;
          d = (x_30 + 1);
        }
      }
      int const x_32 = idx;
      int const x_33 = idx;
      int const x_34 = idx;
      int const x_111 = select(0, x_34, ((x_32 >= 0) && (x_33 < 9)));
      int const x_35 = c;
      float const x_113 = m43[x_35].y;
      float const x_115 = sums.arr[x_111];
      sums.arr[x_111] = (x_115 + x_113);
      {
        int const x_36 = c;
        c = (x_36 + 1);
      }
    }
    int const x_38 = idx;
    idx = (x_38 + 1);
  }
  return;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(&(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

