#include <metal_stdlib>

using namespace metal;
uint4 select_c4a4ef() {
  uint4 arg_0 = uint4(1u);
  uint4 arg_1 = uint4(1u);
  bool4 arg_2 = bool4(true);
  uint4 res = select(arg_0, arg_1, arg_2);
  return res;
}

fragment void fragment_main(device uint4* tint_symbol_1 [[buffer(0)]]) {
  *(tint_symbol_1) = select_c4a4ef();
  return;
}

kernel void compute_main(device uint4* tint_symbol_2 [[buffer(0)]]) {
  *(tint_symbol_2) = select_c4a4ef();
  return;
}

struct VertexOutput {
  float4 pos;
  uint4 prevent_dce;
};

struct tint_symbol {
  uint4 prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = select_c4a4ef();
  return out;
}

vertex tint_symbol vertex_main() {
  VertexOutput const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

