#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_4) {
  float4 v = 0.0f;
  float dist1 = 0.0f;
  float dist2 = 0.0f;
  v = float4(1.0f, 2.0f, 3.0f, 4.0f);
  float4 const x_30 = v;
  float4 const x_32 = v;
  float4 const x_34 = v;
  dist1 = distance(tanh(x_30), (sinh(x_32) / cosh(x_34)));
  float4 const x_38 = v;
  dist2 = distance(tanh(x_38), float4(0.761590004f, 0.964030027f, 0.995050013f, 0.999329984f));
  float const x_41 = dist1;
  float const x_43 = dist2;
  if (((x_41 < 0.100000001f) & (x_43 < 0.100000001f))) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(&(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;
}

