type Arr = [[stride(16)]] array<f32, 2>;

[[block]]
struct buf1 {
  x_GLF_uniform_float_values : Arr;
};

[[block]]
struct buf2 {
  zero : f32;
};

type Arr_1 = [[stride(16)]] array<i32, 2>;

[[block]]
struct buf0 {
  x_GLF_uniform_int_values : Arr_1;
};

[[group(0), binding(1)]] var<uniform> x_8 : buf1;

[[group(0), binding(2)]] var<uniform> x_10 : buf2;

var<private> gl_FragCoord : vec4<f32>;

var<private> x_GLF_color : vec4<f32>;

[[group(0), binding(0)]] var<uniform> x_13 : buf0;

fn func_vf2_(pos : ptr<function, vec2<f32>>) -> bool {
  let x_62 : f32 = (*(pos)).x;
  let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
  if ((x_62 < x_64)) {
    return true;
  }
  let x_69 : f32 = (*(pos)).y;
  let x_71 : f32 = x_8.x_GLF_uniform_float_values[0];
  if ((x_69 > x_71)) {
    return false;
  }
  let x_76 : f32 = x_10.zero;
  let x_78 : f32 = x_8.x_GLF_uniform_float_values[1];
  if ((x_76 > x_78)) {
    return true;
  }
  return true;
}

fn main_1() {
  var param : vec2<f32>;
  let x_42 : vec4<f32> = gl_FragCoord;
  param = vec2<f32>(x_42.x, x_42.y);
  let x_44 : bool = func_vf2_(&(param));
  if (x_44) {
    discard;
  }
  let x_48 : i32 = x_13.x_GLF_uniform_int_values[0];
  let x_51 : i32 = x_13.x_GLF_uniform_int_values[1];
  let x_54 : i32 = x_13.x_GLF_uniform_int_values[1];
  let x_57 : i32 = x_13.x_GLF_uniform_int_values[0];
  x_GLF_color = vec4<f32>(f32(x_48), f32(x_51), f32(x_54), f32(x_57));
  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);
}
