void set_float3(inout float3 vec, int idx, float val) {
  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}

cbuffer cbuffer_x_13 : register(b0, space0) {
  uint4 x_13[1];
};
static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
cbuffer cbuffer_x_19 : register(b1, space0) {
  uint4 x_19[1];
};
static float4 x_GLF_color = float4(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 {
        const int x_155 = i;
        const float x_157 = thirty_two;
        if (((float(x_155) % round(x_157)) <= 0.01f)) {
          result = (result + 100.0f);
        }
      }
      const int x_165 = i;
      const float x_167 = limit;
      if ((float(x_165) >= x_167)) {
        return result;
      }
    }
  }
  return result;
}

void main_1() {
  float3 c = float3(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;
  float3 x_61 = float3(0.0f, 0.0f, 0.0f);
  int i_1 = 0;
  float j = 0.0f;
  c = float3(7.0f, 8.0f, 9.0f);
  const float x_63 = asfloat(x_13[0].x);
  thirty_two_1 = round((x_63 / 8.0f));
  const float x_67 = gl_FragCoord.x;
  param = x_67;
  param_1 = thirty_two_1;
  const float x_69 = compute_value_f1_f1_(param, param_1);
  c.x = x_69;
  const float x_72 = gl_FragCoord.y;
  param_2 = x_72;
  param_3 = thirty_two_1;
  const float x_74 = compute_value_f1_f1_(param_2, param_3);
  c.y = x_74;
  const float x_77 = c.x;
  if (true) {
    x_61 = c;
  } else {
    const float3 x_82 = c;
    const float x_84 = asfloat(x_19[0].x);
    x_61 = (x_82 * x_84);
  }
  const float x_87 = x_61.y;
  c.z = (x_77 + x_87);
  i_1 = 0;
  {
    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
      const float x_99 = c[i_1];
      if ((x_99 >= 1.0f)) {
        const int x_103 = i_1;
        const float x_106 = c[i_1];
        const float x_109 = c[i_1];
        set_float3(c, x_103, (x_106 * x_109));
      }
      j = 0.0f;
      while (true) {
        const float x_117 = asfloat(x_19[0].x);
        const float x_119 = asfloat(x_19[0].y);
        if ((x_117 > x_119)) {
        } else {
          break;
        }
        const float x_122 = j;
        const float x_124 = asfloat(x_19[0].x);
        if ((x_122 >= x_124)) {
          break;
        }
        j = (j + 1.0f);
      }
    }
  }
  const float3 x_134 = normalize(abs(c));
  x_GLF_color = float4(x_134.x, x_134.y, x_134.z, 1.0f);
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 gl_FragCoord_param : SV_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 : SV_Target0;
};

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  const main_out tint_symbol_3 = {x_GLF_color};
  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
  return tint_symbol_6;
}
