struct S {
  data : i32;
};

struct buf1 {
  v1 : vec2<f32>;
};

type Arr = [[stride(16)]] array<i32, 5>;

struct buf0 {
  x_GLF_uniform_int_values : Arr;
};

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

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

var<private> x_GLF_color : vec4<f32>;

fn func_struct_S_i11_(s : ptr<function, S>) {
  let x_166 : f32 = x_8.v1.x;
  let x_168 : f32 = x_8.v1.y;
  if ((x_166 > x_168)) {
    return;
  }
  let x_173 : i32 = x_10.x_GLF_uniform_int_values[0];
  (*(s)).data = x_173;
  return;
}

fn main_1() {
  var i : i32;
  var arr : array<S, 3>;
  var i_1 : i32;
  var param : S;
  var j : i32;
  var x_132 : bool;
  var x_142 : bool;
  var x_133_phi : bool;
  var x_143_phi : bool;
  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
  i = x_46;
  loop {
    let x_51 : i32 = i;
    let x_53 : i32 = x_10.x_GLF_uniform_int_values[0];
    if ((x_51 < x_53)) {
    } else {
      break;
    }
    let x_56 : i32 = i;
    let x_57 : i32 = i;
    arr[x_56].data = x_57;

    continuing {
      let x_59 : i32 = i;
      i = (x_59 + 1);
    }
  }
  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
  i_1 = x_62;
  loop {
    let x_67 : i32 = i_1;
    let x_69 : i32 = x_10.x_GLF_uniform_int_values[0];
    if ((x_67 < x_69)) {
    } else {
      break;
    }
    let x_73 : f32 = x_8.v1.x;
    let x_75 : f32 = x_8.v1.y;
    if ((x_73 > x_75)) {
      break;
    }
    let x_79 : i32 = i_1;
    let x_81 : i32 = arr[x_79].data;
    let x_83 : i32 = x_10.x_GLF_uniform_int_values[3];
    if ((x_81 == x_83)) {
      let x_88 : i32 = i_1;
      let x_90 : S = arr[x_88];
      param = x_90;
      func_struct_S_i11_(&(param));
      let x_92 : S = param;
      arr[x_88] = x_92;
    } else {
      let x_95 : i32 = x_10.x_GLF_uniform_int_values[2];
      j = x_95;
      loop {
        let x_100 : i32 = j;
        let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
        if ((x_100 < x_102)) {
        } else {
          break;
        }
        let x_105 : i32 = j;
        let x_107 : i32 = arr[x_105].data;
        let x_109 : i32 = x_10.x_GLF_uniform_int_values[4];
        if ((x_107 > x_109)) {
          discard;
        }

        continuing {
          let x_113 : i32 = j;
          j = (x_113 + 1);
        }
      }
    }

    continuing {
      let x_115 : i32 = i_1;
      i_1 = (x_115 + 1);
    }
  }
  let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
  let x_120 : i32 = arr[x_118].data;
  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
  let x_123 : bool = (x_120 == x_122);
  x_133_phi = x_123;
  if (x_123) {
    let x_127 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_129 : i32 = arr[x_127].data;
    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
    x_132 = (x_129 == x_131);
    x_133_phi = x_132;
  }
  let x_133 : bool = x_133_phi;
  x_143_phi = x_133;
  if (x_133) {
    let x_137 : i32 = x_10.x_GLF_uniform_int_values[1];
    let x_139 : i32 = arr[x_137].data;
    let x_141 : i32 = x_10.x_GLF_uniform_int_values[1];
    x_142 = (x_139 == x_141);
    x_143_phi = x_142;
  }
  let x_143 : bool = x_143_phi;
  if (x_143) {
    let x_148 : i32 = x_10.x_GLF_uniform_int_values[3];
    let x_151 : i32 = x_10.x_GLF_uniform_int_values[2];
    let x_154 : i32 = x_10.x_GLF_uniform_int_values[2];
    let x_157 : i32 = x_10.x_GLF_uniform_int_values[3];
    x_GLF_color = vec4<f32>(f32(x_148), f32(x_151), f32(x_154), f32(x_157));
  } else {
    let x_161 : i32 = x_10.x_GLF_uniform_int_values[2];
    let x_162 : f32 = f32(x_161);
    x_GLF_color = vec4<f32>(x_162, x_162, x_162, x_162);
  }
  return;
}

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

[[stage(fragment)]]
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
