#include <metal_stdlib>

using namespace metal;
struct main_out {
  int x_4_1;
};
struct tint_symbol_2 {
  int x_3_param [[user(locn0)]];
};
struct tint_symbol_3 {
  int x_4_1 [[color(0)]];
};

void main_1(thread int* const tint_symbol_5, thread float4* const tint_symbol_6, thread int* const tint_symbol_7, texture2d<int, access::write> tint_symbol_8) {
  *(tint_symbol_5) = 1;
  float4 const x_23 = *(tint_symbol_6);
  int const x_27 = int(x_23.x);
  int const x_28 = int(x_23.y);
  int const x_33 = *(tint_symbol_7);
  if ((as_type<int>((as_type<uint>(as_type<int>((as_type<uint>((x_27 & 1)) + as_type<uint>((x_28 & 1))))) + as_type<uint>(x_33))) == int(x_23.z))) {
  }
  tint_symbol_8.write(int4(x_27, 0, 0, 0), uint2(int2(x_27, x_28)));
  return;
}

main_out tint_symbol_inner(float4 x_2_param, int x_3_param, thread float4* const tint_symbol_9, thread int* const tint_symbol_10, thread int* const tint_symbol_11, texture2d<int, access::write> tint_symbol_12) {
  *(tint_symbol_9) = x_2_param;
  *(tint_symbol_10) = x_3_param;
  main_1(tint_symbol_11, tint_symbol_9, tint_symbol_10, tint_symbol_12);
  main_out const tint_symbol_4 = {.x_4_1=*(tint_symbol_11)};
  return tint_symbol_4;
}

fragment tint_symbol_3 tint_symbol(texture2d<int, access::write> tint_symbol_16 [[texture(0)]], float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float4 tint_symbol_13 = 0.0f;
  thread int tint_symbol_14 = 0;
  thread int tint_symbol_15 = 0;
  main_out const inner_result = tint_symbol_inner(x_2_param, tint_symbol_1.x_3_param, &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_15), tint_symbol_16);
  tint_symbol_3 wrapper_result = {};
  wrapper_result.x_4_1 = inner_result.x_4_1;
  return wrapper_result;
}

