#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[3];
};
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[3];
};
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_7, constant buf1& x_10, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float f = 0.0f;
  int i = 0;
  *(tint_symbol_4) = 0;
  float const x_36 = x_7.x_GLF_uniform_float_values.arr[1].el;
  f = x_36;
  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
  i = x_38;
  while (true) {
    int const x_43 = i;
    int const x_45 = x_10.x_GLF_uniform_int_values.arr[2].el;
    if ((x_43 < x_45)) {
    } else {
      break;
    }
    float const x_48 = f;
    float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
    if ((x_48 > x_50)) {
    }
    f = 1.0f;
    float const x_55 = x_7.x_GLF_uniform_float_values.arr[2].el;
    float const x_56 = f;
    int const x_59 = i;
    f = ((1.0f - clamp(x_55, 1.0f, x_56)) + float(x_59));
    {
      int const x_62 = i;
      i = (x_62 + 1);
    }
  }
  float const x_64 = f;
  float const x_66 = x_7.x_GLF_uniform_float_values.arr[0].el;
  if ((x_64 == x_66)) {
    int const x_72 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_81 = x_10.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
  } else {
    int const x_85 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_86 = float(x_85);
    *(tint_symbol_5) = float4(x_86, x_86, x_86, x_86);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
  thread int tint_symbol_6 = 0;
  thread float4 tint_symbol_7 = 0.0f;
  main_1(x_7, x_10, &(tint_symbol_6), &(tint_symbol_7));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

