#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[12];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_6, constant buf0& x_15, thread float4* const tint_symbol_4) {
  float3x4 m0 = float3x4(0.0f);
  float3x4 m1 = float3x4(0.0f);
  float3 undefined = 0.0f;
  float3 defined = 0.0f;
  float4 v0 = 0.0f;
  float4 v1 = 0.0f;
  float4 v2 = 0.0f;
  float4 v3 = 0.0f;
  int const x_17 = x_6.x_GLF_uniform_int_values.arr[4].el;
  int const x_18 = x_6.x_GLF_uniform_int_values.arr[5].el;
  int const x_19 = x_6.x_GLF_uniform_int_values.arr[6].el;
  int const x_20 = x_6.x_GLF_uniform_int_values.arr[10].el;
  int const x_21 = x_6.x_GLF_uniform_int_values.arr[7].el;
  int const x_22 = x_6.x_GLF_uniform_int_values.arr[8].el;
  int const x_23 = x_6.x_GLF_uniform_int_values.arr[11].el;
  int const x_24 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_25 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_26 = x_6.x_GLF_uniform_int_values.arr[3].el;
  m0 = float3x4(float4(float(x_17), float(x_18), float(x_19), 4.0f), float4(float(x_20), float(x_21), float(x_22), 8.0f), float4(float(x_23), float(x_24), float(x_25), float(x_26)));
  int const x_27 = x_6.x_GLF_uniform_int_values.arr[4].el;
  float const x_104 = float(x_27);
  m1 = float3x4(float4(x_104, 0.0f, 0.0f, 0.0f), float4(0.0f, x_104, 0.0f, 0.0f), float4(0.0f, 0.0f, x_104, 0.0f));
  undefined = ldexp(float3(1.0f, 1.0f, 1.0f), int3(500, 500, 500));
  int const x_28 = x_6.x_GLF_uniform_int_values.arr[4].el;
  float const x_111 = float(x_28);
  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
  defined = ldexp(float3(x_111, x_111, x_111), int3(x_29, x_29, x_29));
  float3x4 const x_116 = m0;
  float3 const x_117 = undefined;
  v0 = (x_116 * x_117);
  float3x4 const x_119 = m1;
  float3 const x_120 = undefined;
  v1 = (x_119 * x_120);
  float3x4 const x_122 = m0;
  float3 const x_123 = defined;
  v2 = (x_122 * x_123);
  float3x4 const x_125 = m1;
  float3 const x_126 = defined;
  v3 = (x_125 * x_126);
  float const x_129 = v2.x;
  float const x_131 = v3.x;
  if ((x_129 > x_131)) {
    int const x_30 = x_6.x_GLF_uniform_int_values.arr[4].el;
    int const x_31 = x_6.x_GLF_uniform_int_values.arr[9].el;
    int const x_32 = x_6.x_GLF_uniform_int_values.arr[9].el;
    int const x_33 = x_6.x_GLF_uniform_int_values.arr[4].el;
    *(tint_symbol_4) = float4(float(x_30), float(x_31), float(x_32), float(x_33));
  } else {
    int const x_34 = x_6.x_GLF_uniform_int_values.arr[9].el;
    float const x_146 = float(x_34);
    *(tint_symbol_4) = float4(x_146, x_146, x_146, x_146);
  }
  float const x_149 = v0.x;
  float const x_151 = v1.x;
  if ((x_149 < x_151)) {
    float const x_156 = x_15.x_GLF_uniform_float_values.arr[0].el;
    (*(tint_symbol_4)).y = x_156;
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_15 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, x_15, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

