#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct tint_array_wrapper {
  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 buf0& x_11, thread float4* const tint_symbol_3, thread tint_array_wrapper* const tint_symbol_4, thread tint_array_wrapper* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int q = 0;
  int i = 0;
  int c = 0;
  q = 0;
  float const x_55 = (*(tint_symbol_3)).x;
  i = (int(x_55) % 3);
  c = 0;
  while (true) {
    int const x_14 = c;
    if ((x_14 < 3)) {
    } else {
      break;
    }
    int const x_15 = c;
    (*(tint_symbol_4)).arr[x_15] = 0.0f;
    int const x_16 = c;
    (*(tint_symbol_5)).arr[x_16] = 0.0f;
    float const x_65 = x_11.injectionSwitch.x;
    int const x_18 = q;
    switch(as_type<int>((as_type<uint>(int(x_65)) + as_type<uint>(x_18)))) {
      case 51: {
        while (true) {
          if (true) {
          } else {
            break;
          }
        }
        int const x_20 = c;
        (*(tint_symbol_4)).arr[x_20] = 1.0f;
        /* fallthrough */
      }
      case 61: {
        (*(tint_symbol_5)).arr[0] = 1.0f;
        int const x_21 = c;
        (*(tint_symbol_5)).arr[x_21] = 1.0f;
        break;
      }
      case 0: {
        q = 61;
        break;
      }
      default: {
        break;
      }
    }
    {
      int const x_22 = c;
      c = as_type<int>((as_type<uint>(x_22) + as_type<uint>(1)));
    }
  }
  int const x_24 = i;
  float const x_79 = (*(tint_symbol_5)).arr[x_24];
  int const x_25 = i;
  float const x_81 = (*(tint_symbol_4)).arr[x_25];
  int const x_26 = i;
  float const x_83 = (*(tint_symbol_4)).arr[x_26];
  *(tint_symbol_6) = float4(x_79, x_81, x_83, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_11, float4 gl_FragCoord_param, thread float4* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
  *(tint_symbol_7) = gl_FragCoord_param;
  main_1(x_11, tint_symbol_7, tint_symbol_8, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_10)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread tint_array_wrapper tint_symbol_12 = {};
  thread tint_array_wrapper tint_symbol_13 = {};
  thread float4 tint_symbol_14 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_11, gl_FragCoord_param, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

