#include <metal_stdlib>

using namespace metal;
struct main_out {
  int out_data_1;
};
struct tint_symbol_1 {
  int out_data_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_3, thread int* const tint_symbol_4) {
  bool x_is_odd = false;
  bool y_is_odd = false;
  float const x_24 = (*(tint_symbol_3)).x;
  x_is_odd = ((int(x_24) & 1) == 1);
  float const x_29 = (*(tint_symbol_3)).y;
  y_is_odd = ((int(x_29) & 1) == 1);
  bool const x_33 = x_is_odd;
  bool const x_34 = y_is_odd;
  *(tint_symbol_4) = select(0, 1, (x_33 || x_34));
  return;
}

main_out tint_symbol_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread int* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.out_data_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread int tint_symbol_8 = 0;
  main_out const inner_result = tint_symbol_inner(gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.out_data_1 = inner_result.out_data_1;
  return wrapper_result;
}

