#include <metal_stdlib>

using namespace metal;
struct S {
  int data;
};
struct buf0 {
  /* 0x0000 */ int one;
};
struct tint_array_wrapper {
  S arr[1];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

int func_struct_S_i11_i1_(thread S* const s, thread int* const x) {
  int const x_17 = (*(s)).data;
  if ((x_17 == 1)) {
    int const x_18 = *(x);
    int const x_19 = (*(s)).data;
    return (x_18 + x_19);
  } else {
    int const x_21 = *(x);
    return x_21;
  }
  return 0;
}

void main_1(constant buf0& x_11, thread float4* const tint_symbol_4) {
  int a = 0;
  tint_array_wrapper arr = {};
  int i = 0;
  S param = {};
  int param_1 = 0;
  S param_2 = {};
  int param_3 = 0;
  a = 0;
  int const x_22 = x_11.one;
  arr.arr[0].data = x_22;
  i = 0;
  while (true) {
    int const x_23 = i;
    int const x_24 = x_11.one;
    if ((x_23 < (5 + x_24))) {
    } else {
      break;
    }
    int const x_26 = i;
    if (((x_26 % 2) != 0)) {
      S const x_74 = arr.arr[0];
      param = x_74;
      int const x_28 = i;
      param_1 = x_28;
      int const x_29 = func_struct_S_i11_i1_(&(param), &(param_1));
      S const x_75 = param;
      arr.arr[0] = x_75;
      a = x_29;
    } else {
      S const x_78 = arr.arr[0];
      param_2 = x_78;
      param_3 = 1;
      int const x_30 = func_struct_S_i11_i1_(&(param_2), &(param_3));
      S const x_79 = param_2;
      arr.arr[0] = x_79;
      a = x_30;
    }
    {
      int const x_31 = i;
      i = (x_31 + 1);
    }
  }
  int const x_33 = a;
  if ((x_33 == 6)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_11, &(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;
}

