#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 main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
  float a = 0.0f;
  float const x_30 = x_6.x_GLF_uniform_float_values.arr[1].el;
  a = x_30;
  float const x_32 = x_6.x_GLF_uniform_float_values.arr[3].el;
  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if ((x_32 > x_34)) {
    float const x_39 = x_6.x_GLF_uniform_float_values.arr[0].el;
    float const x_40 = a;
    a = (x_40 + x_39);
    float const x_42 = a;
    *(tint_symbol_4) = float4(x_42, x_42, x_42, x_42);
    float const x_45 = x_6.x_GLF_uniform_float_values.arr[3].el;
    float const x_47 = x_6.x_GLF_uniform_float_values.arr[1].el;
    if ((x_45 > x_47)) {
      float const x_52 = (*(tint_symbol_4)).x;
      float const x_53 = a;
      a = (x_53 + x_52);
      float const x_56 = x_6.x_GLF_uniform_float_values.arr[2].el;
      *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
    }
  }
  float const x_58 = a;
  *(tint_symbol_4) = float4(x_58, 0.0f, 0.0f, 1.0f);
  return;
}

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

