#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 = as_type<int>((as_type<uint>(x_17) + as_type<uint>(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 = as_type<int>((as_type<uint>(x_21) + as_type<uint>(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 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(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 = as_type<int>((as_type<uint>(x_36) + as_type<uint>(1)));
      }
    }
    int const x_38 = idx;
    idx = as_type<int>((as_type<uint>(x_38) + as_type<uint>(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;
}

