#version 310 es
precision mediump float;

float tint_float_modulo(float lhs, float rhs) {
  return (lhs - rhs * trunc(lhs / rhs));
}


layout(location = 0) out vec4 x_GLF_color_1_1;
struct buf0 {
  vec2 resolution;
};

layout(binding = 0) uniform buf0_1 {
  vec2 resolution;
} x_13;

vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  {
    for(; (i < 800); i = (i + 1)) {
      if (((i % 32) == 0)) {
        result = (result + 0.400000006f);
      } else {
        int x_122 = i;
        float x_124 = thirty_two;
        if ((tint_float_modulo(float(x_122), round(x_124)) <= 0.01f)) {
          result = (result + 100.0f);
        }
      }
      int x_132 = i;
      float x_134 = limit;
      if ((float(x_132) >= x_134)) {
        return result;
      }
    }
  }
  return result;
}

void main_1() {
  vec3 c = vec3(0.0f, 0.0f, 0.0f);
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int i_1 = 0;
  c = vec3(7.0f, 8.0f, 9.0f);
  float x_56 = x_13.resolution.x;
  thirty_two_1 = round((x_56 / 8.0f));
  float x_60 = tint_symbol.x;
  param = x_60;
  param_1 = thirty_two_1;
  float x_62 = compute_value_f1_f1_(param, param_1);
  c.x = x_62;
  float x_65 = tint_symbol.y;
  param_2 = x_65;
  param_3 = thirty_two_1;
  float x_67 = compute_value_f1_f1_(param_2, param_3);
  c.y = x_67;
  float x_70 = c.x;
  float x_72 = c.y;
  c.z = (x_70 + x_72);
  i_1 = 0;
  {
    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
      float x_84 = c[i_1];
      if ((x_84 >= 1.0f)) {
        int x_88 = i_1;
        float x_91 = c[i_1];
        float x_94 = c[i_1];
        c[x_88] = (x_91 * x_94);
      }
    }
  }
  vec3 x_101 = normalize(abs(c));
  x_GLF_color = vec4(x_101.x, x_101.y, x_101.z, 1.0f);
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};

main_out tint_symbol_1(vec4 tint_symbol_2) {
  tint_symbol = tint_symbol_2;
  main_1();
  main_out tint_symbol_3 = main_out(x_GLF_color);
  return tint_symbol_3;
}

void main() {
  main_out inner_result = tint_symbol_1(gl_FragCoord);
  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
  return;
}
