#include <metal_stdlib>

using namespace metal;
struct theSSBO {
  /* 0x0000 */ int out_data;
};
struct buf1 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};

void main_1(constant buf1& x_6, device theSSBO& x_4) {
  int i = 0;
  float GLF_live3s = 0.0f;
  int i_1 = 0;
  int z = 0;
  x_4.out_data = 42;
  float const x_37 = x_6.injectionSwitch.x;
  float const x_39 = x_6.injectionSwitch.y;
  if ((x_37 > x_39)) {
    threadgroup_barrier(mem_flags::mem_threadgroup);
  }
  float const x_44 = x_6.injectionSwitch.x;
  float const x_46 = x_6.injectionSwitch.y;
  if ((x_44 > x_46)) {
    threadgroup_barrier(mem_flags::mem_threadgroup);
  }
  float const x_51 = x_6.injectionSwitch.y;
  i = int(x_51);
  while (true) {
    int const x_57 = i;
    if ((x_57 > 0)) {
    } else {
      break;
    }
    threadgroup_barrier(mem_flags::mem_threadgroup);
    {
      int const x_60 = i;
      i = as_type<int>((as_type<uint>(x_60) - as_type<uint>(1)));
    }
  }
  GLF_live3s = 0.0f;
  while (true) {
    i_1 = 1;
    while (true) {
      int const x_70 = i_1;
      if ((x_70 < 2)) {
      } else {
        break;
      }
      float const x_74 = x_6.injectionSwitch.x;
      if ((x_74 > 1.0f)) {
        threadgroup_barrier(mem_flags::mem_threadgroup);
      }
      float const x_79 = x_6.injectionSwitch.x;
      float const x_81 = x_6.injectionSwitch.y;
      if ((x_79 > x_81)) {
        threadgroup_barrier(mem_flags::mem_threadgroup);
      }
      float const x_86 = x_6.injectionSwitch.y;
      z = int(x_86);
      while (true) {
        int const x_92 = z;
        if ((x_92 > 0)) {
        } else {
          break;
        }
        float const x_95 = GLF_live3s;
        GLF_live3s = (x_95 + 1.0f);
        {
          int const x_97 = z;
          z = as_type<int>((as_type<uint>(x_97) - as_type<uint>(1)));
        }
      }
      int const x_99 = i_1;
      if ((x_99 >= 1)) {
        float const x_104 = x_6.injectionSwitch.x;
        if ((x_104 > 1.0f)) {
          threadgroup_barrier(mem_flags::mem_threadgroup);
        }
      }
      {
        int const x_108 = i_1;
        i_1 = as_type<int>((as_type<uint>(x_108) + as_type<uint>(1)));
      }
    }
    {
      float const x_111 = x_6.injectionSwitch.x;
      float const x_113 = x_6.injectionSwitch.y;
      if ((x_111 > x_113)) {
      } else {
        break;
      }
    }
  }
  return;
}

kernel void tint_symbol(constant buf1& x_6 [[buffer(1)]], device theSSBO& x_4 [[buffer(0)]]) {
  main_1(x_6, x_4);
  return;
}

