#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  device uint2* prevent_dce;
};
struct vertex_main_outputs {
  float4 tint_symbol [[position]];
};

void firstTrailingBit_45eb10(tint_module_vars_struct tint_module_vars) {
  uint2 arg_0 = uint2(1u);
  uint2 const v = arg_0;
  uint2 const v_1 = select(uint2(0u), uint2(16u), ((v & uint2(65535u)) == uint2(0u)));
  uint2 const v_2 = select(uint2(0u), uint2(8u), (((v >> v_1) & uint2(255u)) == uint2(0u)));
  uint2 const v_3 = select(uint2(0u), uint2(4u), ((((v >> v_1) >> v_2) & uint2(15u)) == uint2(0u)));
  uint2 const v_4 = select(uint2(0u), uint2(2u), (((((v >> v_1) >> v_2) >> v_3) & uint2(3u)) == uint2(0u)));
  uint2 res = select((v_1 | (v_2 | (v_3 | (v_4 | select(uint2(0u), uint2(1u), ((((((v >> v_1) >> v_2) >> v_3) >> v_4) & uint2(1u)) == uint2(0u))))))), uint2(4294967295u), (((((v >> v_1) >> v_2) >> v_3) >> v_4) == uint2(0u)));
  (*tint_module_vars.prevent_dce) = res;
}
float4 vertex_main_inner(tint_module_vars_struct tint_module_vars) {
  firstTrailingBit_45eb10(tint_module_vars);
  return float4(0.0f);
}
fragment void fragment_main(device uint2* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  firstTrailingBit_45eb10(tint_module_vars);
}
kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  firstTrailingBit_45eb10(tint_module_vars);
}
vertex vertex_main_outputs vertex_main(device uint2* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  return vertex_main_outputs{.tint_symbol=vertex_main_inner(tint_module_vars)};
}
