struct buf0 {
  zero : f32;
};

var<private> gl_FragCoord : vec4<f32>;

var<private> x_GLF_color : vec4<f32>;

@group(0) @binding(0) var<uniform> x_11 : buf0;

fn func_i1_(b : ptr<function, i32>) -> f32 {
  var ndx : i32;
  var i : i32;
  ndx = 0;
  loop {
    let x_100 : i32 = ndx;
    if ((x_100 < 2)) {
    } else {
      break;
    }
    let x_104 : f32 = gl_FragCoord.x;
    if ((x_104 < 0.0)) {
      i = 0;
      loop {
        let x_112 : i32 = i;
        if ((x_112 < 2)) {
        } else {
          break;
        }
        if ((i32(cosh(vec2<f32>(1.0, 800.0)).x) <= 1)) {
          discard;
        }

        continuing {
          let x_121 : i32 = i;
          i = (x_121 + 1);
        }
      }
    }

    continuing {
      let x_123 : i32 = ndx;
      ndx = (x_123 + 1);
    }
  }
  let x_125 : i32 = *(b);
  if ((x_125 > 1)) {
    return 3.0;
  }
  let x_130 : f32 = gl_FragCoord.x;
  if ((x_130 < 0.0)) {
    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
  }
  return 5.0;
}

fn main_1() {
  var f : f32;
  var param : i32;
  var x : i32;
  var param_1 : i32;
  x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
  f = 0.0;
  loop {
    let x_54 : f32 = x_GLF_color.y;
    if ((i32(x_54) < 0)) {
      discard;
    } else {
      let x_61 : f32 = x_11.zero;
      param = i32(x_61);
      let x_63 : f32 = func_i1_(&(param));
      f = x_63;
    }
    let x_65 : f32 = x_GLF_color.y;
    if ((i32(x_65) > 65)) {
      discard;
    }
    x = 0;
    loop {
      let x_74 : i32 = x;
      let x_76 : f32 = x_11.zero;
      if ((x_74 < (i32(x_76) + 1))) {
      } else {
        break;
      }
      let x_81 : i32 = x;
      param_1 = (x_81 + 10);
      let x_83 : f32 = func_i1_(&(param_1));
      f = x_83;

      continuing {
        let x_84 : i32 = x;
        x = (x_84 + 1);
      }
    }

    continuing {
      let x_87 : f32 = x_11.zero;
      if ((i32(x_87) > 1)) {
      } else {
        break;
      }
    }
  }
  let x_90 : f32 = f;
  if ((x_90 == 3.0)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
  }
  return;
}

struct main_out {
  @location(0)
  x_GLF_color_1 : vec4<f32>;
};

@stage(fragment)
fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
