#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct tint_array_wrapper_2 {
  float arr[3];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5) {
  float3x2 m32 = float3x2(0.0f);
  tint_array_wrapper_2 sums = {};
  int x_52_phi = 0;
  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
  m32 = float3x2(float2(x_40, 0.0f), float2(0.0f, x_40), float2(0.0f, 0.0f));
  int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
  if ((x_45 == 1)) {
    m32[3][x_45] = x_40;
  }
  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_40, x_40, x_40}};
  sums = tint_symbol_3;
  x_52_phi = x_45;
  while (true) {
    int x_53 = 0;
    int const x_52 = x_52_phi;
    int const x_56 = x_8.x_GLF_uniform_int_values.arr[2].el;
    if ((x_52 < x_56)) {
    } else {
      break;
    }
    {
      float const x_60 = m32[x_52][x_45];
      int const x_61_save = x_56;
      float const x_62 = sums.arr[x_61_save];
      sums.arr[x_61_save] = (x_62 + x_60);
      x_53 = as_type<int>((as_type<uint>(x_52) + as_type<uint>(1)));
      x_52_phi = x_53;
    }
  }
  float const x_65 = sums.arr[x_45];
  float const x_67 = x_6.x_GLF_uniform_float_values.arr[1].el;
  int const x_69 = x_8.x_GLF_uniform_int_values.arr[1].el;
  float const x_71 = sums.arr[x_69];
  *(tint_symbol_5) = float4(x_65, x_67, x_67, x_71);
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(x_6, x_8, &(tint_symbol_6));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_4;
}

