#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[2];
};
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[2];
};
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)]];
};

int f1_vf2_(constant buf0& x_7, constant buf1& x_9, thread float2* const v1) {
  bool x_99 = false;
  bool x_100_phi = false;
  float const x_89 = (*(v1)).x;
  float const x_91 = x_7.x_GLF_uniform_float_values.arr[0].el;
  bool const x_92 = (x_89 == x_91);
  x_100_phi = x_92;
  if (x_92) {
    float const x_96 = (*(v1)).y;
    float const x_98 = x_7.x_GLF_uniform_float_values.arr[1].el;
    x_99 = (x_96 == x_98);
    x_100_phi = x_99;
  }
  bool const x_100 = x_100_phi;
  if (x_100) {
    int const x_104 = x_9.x_GLF_uniform_int_values.arr[1].el;
    return x_104;
  }
  int const x_106 = x_9.x_GLF_uniform_int_values.arr[0].el;
  return x_106;
}

void main_1(constant buf0& x_7, constant buf1& x_9, thread float4* const tint_symbol_4) {
  float2x2 m1 = float2x2(0.0f);
  float2x2 m2 = float2x2(0.0f);
  float2 v1_1 = 0.0f;
  int a = 0;
  float2 param = 0.0f;
  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
  float const x_47 = x_7.x_GLF_uniform_float_values.arr[1].el;
  float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
  float const x_52 = x_7.x_GLF_uniform_float_values.arr[1].el;
  m1 = float2x2(float2(x_45, -(x_47)), float2(x_50, sin(x_52)));
  float2x2 const x_57 = m1;
  float2x2 const x_58 = m1;
  m2 = (x_57 * x_58);
  float const x_61 = x_7.x_GLF_uniform_float_values.arr[0].el;
  float2x2 const x_63 = m2;
  v1_1 = (float2(x_61, x_61) * x_63);
  float2 const x_65 = v1_1;
  param = x_65;
  int const x_66 = f1_vf2_(x_7, x_9, &(param));
  a = x_66;
  int const x_67 = a;
  int const x_69 = x_9.x_GLF_uniform_int_values.arr[1].el;
  if ((x_67 == x_69)) {
    float const x_75 = x_7.x_GLF_uniform_float_values.arr[0].el;
    float const x_77 = x_7.x_GLF_uniform_float_values.arr[1].el;
    float const x_79 = x_7.x_GLF_uniform_float_values.arr[1].el;
    float const x_81 = x_7.x_GLF_uniform_float_values.arr[0].el;
    *(tint_symbol_4) = float4(x_75, x_77, x_79, x_81);
  } else {
    int const x_84 = x_9.x_GLF_uniform_int_values.arr[1].el;
    float const x_85 = float(x_84);
    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
  }
  return;
}

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

