#include <metal_stdlib>

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

void main_1(constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_4) {
  uint a = 0u;
  float4 values = 0.0f;
  float4 ref = 0.0f;
  bool x_85 = false;
  bool x_101 = false;
  bool x_117 = false;
  bool x_86_phi = false;
  bool x_102_phi = false;
  bool x_118_phi = false;
  a = as_type<uint>(half2(float2(1.0f, 1.0f)));
  uint const x_38 = a;
  values = unpack_unorm4x8_to_float(x_38);
  float const x_41 = x_8.x_GLF_uniform_float_values.arr[3].el;
  float const x_43 = x_8.x_GLF_uniform_float_values.arr[1].el;
  float const x_45 = x_8.x_GLF_uniform_float_values.arr[0].el;
  float const x_48 = x_8.x_GLF_uniform_float_values.arr[3].el;
  float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
  float const x_53 = x_8.x_GLF_uniform_float_values.arr[1].el;
  float const x_55 = x_8.x_GLF_uniform_float_values.arr[0].el;
  ref = float4(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
  int const x_59 = x_10.x_GLF_uniform_int_values.arr[0].el;
  float const x_61 = values[x_59];
  int const x_63 = x_10.x_GLF_uniform_int_values.arr[0].el;
  float const x_65 = ref[x_63];
  float const x_69 = x_8.x_GLF_uniform_float_values.arr[2].el;
  bool const x_70 = (fabs((x_61 - x_65)) < x_69);
  x_86_phi = x_70;
  if (x_70) {
    int const x_74 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_76 = values[x_74];
    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_80 = ref[x_78];
    float const x_84 = x_8.x_GLF_uniform_float_values.arr[2].el;
    x_85 = (fabs((x_76 - x_80)) < x_84);
    x_86_phi = x_85;
  }
  bool const x_86 = x_86_phi;
  x_102_phi = x_86;
  if (x_86) {
    int const x_90 = x_10.x_GLF_uniform_int_values.arr[3].el;
    float const x_92 = values[x_90];
    int const x_94 = x_10.x_GLF_uniform_int_values.arr[3].el;
    float const x_96 = ref[x_94];
    float const x_100 = x_8.x_GLF_uniform_float_values.arr[2].el;
    x_101 = (fabs((x_92 - x_96)) < x_100);
    x_102_phi = x_101;
  }
  bool const x_102 = x_102_phi;
  x_118_phi = x_102;
  if (x_102) {
    int const x_106 = x_10.x_GLF_uniform_int_values.arr[2].el;
    float const x_108 = values[x_106];
    int const x_110 = x_10.x_GLF_uniform_int_values.arr[2].el;
    float const x_112 = ref[x_110];
    float const x_116 = x_8.x_GLF_uniform_float_values.arr[2].el;
    x_117 = (fabs((x_108 - x_112)) < x_116);
    x_118_phi = x_117;
  }
  bool const x_118 = x_118_phi;
  if (x_118) {
    int const x_123 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_126 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_129 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_132 = x_10.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_4) = float4(float(x_123), float(x_126), float(x_129), float(x_132));
  } else {
    int const x_136 = x_10.x_GLF_uniform_int_values.arr[0].el;
    float const x_137 = float(x_136);
    *(tint_symbol_4) = float4(x_137, x_137, x_137, x_137);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_8, x_10, &(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;
}

