#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct tint_array_wrapper {
  int arr[10];
};
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_6, thread float4* const tint_symbol_3) {
  int k = 0;
  int GLF_dead0j = 0;
  tint_array_wrapper donor_replacementGLF_dead0stack = {};
  int donor_replacementGLF_dead0top = 0;
  int x_54 = 0;
  float4 matrix_b = 0.0f;
  int b = 0;
  k = 0;
  while (true) {
    int const x_12 = k;
    if ((x_12 < 4)) {
    } else {
      break;
    }
    float const x_62 = x_6.injectionSwitch.y;
    if ((0.0f > x_62)) {
      GLF_dead0j = 1;
      while (true) {
        int const x_13 = donor_replacementGLF_dead0stack.arr[0];
        if ((1 <= x_13)) {
        } else {
          break;
        }
      }
      int const x_14 = donor_replacementGLF_dead0top;
      int const x_15 = donor_replacementGLF_dead0top;
      if (((x_14 >= 0) & (x_15 < 9))) {
        int const x_16 = donor_replacementGLF_dead0top;
        int const x_17 = as_type<int>((as_type<uint>(x_16) + as_type<uint>(1)));
        donor_replacementGLF_dead0top = x_17;
        x_54 = x_17;
      } else {
        x_54 = 0;
      }
      int const x_18 = x_54;
      donor_replacementGLF_dead0stack.arr[x_18] = 1;
    }
    matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
    b = 3;
    while (true) {
      int const x_19 = b;
      if ((x_19 >= 0)) {
      } else {
        break;
      }
      int const x_20 = b;
      int const x_21 = b;
      float const x_87 = matrix_b[x_21];
      matrix_b[x_20] = (x_87 - 1.0f);
      {
        int const x_22 = b;
        b = as_type<int>((as_type<uint>(x_22) - as_type<uint>(1)));
      }
    }
    {
      int const x_24 = k;
      k = as_type<int>((as_type<uint>(x_24) + as_type<uint>(1)));
    }
  }
  *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, thread float4* const tint_symbol_4) {
  main_1(x_6, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

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

