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

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

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

var<private> x_GLF_color : vec4<f32>;

fn f_i1_(a : ptr<function, i32>) -> i32 {
  var i : i32;
  let x_16 : i32 = x_8.x_GLF_uniform_int_values[0];
  i = x_16;
  loop {
    let x_17 : i32 = i;
    let x_18 : i32 = x_8.x_GLF_uniform_int_values[6];
    if ((x_17 < x_18)) {
    } else {
      break;
    }
    let x_19 : i32 = i;
    let x_20 : i32 = x_8.x_GLF_uniform_int_values[2];
    if ((x_19 > x_20)) {
      let x_21 : i32 = *(a);
      return x_21;
    }

    continuing {
      let x_22 : i32 = i;
      i = (x_22 + 1);
    }
  }
  let x_24 : i32 = x_8.x_GLF_uniform_int_values[0];
  return x_24;
}

fn main_1() {
  var ref : array<i32, 10>;
  var i_1 : i32;
  var a_1 : array<i32, 10>;
  var param : i32;
  var param_1 : i32;
  var i_2 : i32;
  let x_25 : i32 = x_8.x_GLF_uniform_int_values[0];
  let x_26 : i32 = x_8.x_GLF_uniform_int_values[1];
  ref[x_25] = x_26;
  let x_27 : i32 = x_8.x_GLF_uniform_int_values[11];
  let x_28 : i32 = x_8.x_GLF_uniform_int_values[2];
  ref[x_27] = x_28;
  let x_29 : i32 = x_8.x_GLF_uniform_int_values[1];
  let x_30 : i32 = x_8.x_GLF_uniform_int_values[3];
  ref[x_29] = x_30;
  let x_31 : i32 = x_8.x_GLF_uniform_int_values[2];
  let x_32 : i32 = x_8.x_GLF_uniform_int_values[4];
  ref[x_31] = x_32;
  let x_33 : i32 = x_8.x_GLF_uniform_int_values[3];
  let x_34 : i32 = x_8.x_GLF_uniform_int_values[5];
  ref[x_33] = x_34;
  let x_35 : i32 = x_8.x_GLF_uniform_int_values[4];
  let x_36 : i32 = x_8.x_GLF_uniform_int_values[6];
  ref[x_35] = x_36;
  let x_37 : i32 = x_8.x_GLF_uniform_int_values[5];
  let x_38 : i32 = x_8.x_GLF_uniform_int_values[7];
  ref[x_37] = x_38;
  let x_39 : i32 = x_8.x_GLF_uniform_int_values[8];
  let x_40 : i32 = x_8.x_GLF_uniform_int_values[8];
  ref[x_39] = x_40;
  let x_41 : i32 = x_8.x_GLF_uniform_int_values[9];
  let x_42 : i32 = x_8.x_GLF_uniform_int_values[9];
  ref[x_41] = x_42;
  let x_43 : i32 = x_8.x_GLF_uniform_int_values[10];
  let x_44 : i32 = x_8.x_GLF_uniform_int_values[10];
  ref[x_43] = x_44;
  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
  i_1 = x_45;
  loop {
    let x_46 : i32 = i_1;
    let x_47 : i32 = x_8.x_GLF_uniform_int_values[6];
    if ((x_46 < x_47)) {
    } else {
      break;
    }
    let x_48 : i32 = i_1;
    let x_49 : i32 = i_1;
    a_1[x_48] = x_49;
    let x_50 : i32 = i_1;
    let x_51 : i32 = x_8.x_GLF_uniform_int_values[6];
    let x_52 : i32 = x_8.x_GLF_uniform_int_values[1];
    if ((x_50 < (x_51 / x_52))) {
      let x_54 : i32 = i_1;
      let x_55 : i32 = i_1;
      let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
      a_1[x_54] = (x_55 + x_56);
      let x_58 : i32 = i_1;
      let x_59 : i32 = x_8.x_GLF_uniform_int_values[6];
      if ((x_58 < x_59)) {
        continue;
      }
      let x_60 : i32 = i_1;
      let x_61 : i32 = i_1;
      let x_62 : i32 = x_8.x_GLF_uniform_int_values[8];
      a_1[x_60] = (x_61 + x_62);
      let x_64 : i32 = i_1;
      let x_65 : i32 = a_1[x_64];
      param = x_65;
      let x_66 : i32 = f_i1_(&(param));
      let x_67 : i32 = x_8.x_GLF_uniform_int_values[8];
      if ((x_66 < x_67)) {
        let x_68 : i32 = i_1;
        let x_182 : ptr<function, i32> = &(a_1[x_68]);
        let x_69 : i32 = *(x_182);
        *(x_182) = (x_69 - 1);
      }
    } else {
      let x_71 : i32 = i_1;
      let x_72 : i32 = a_1[x_71];
      param_1 = x_72;
      let x_73 : i32 = f_i1_(&(param_1));
      let x_74 : i32 = x_8.x_GLF_uniform_int_values[8];
      if ((x_73 < x_74)) {
        let x_75 : i32 = i_1;
        let x_76 : i32 = x_8.x_GLF_uniform_int_values[4];
        let x_77 : i32 = a_1[x_75];
        a_1[x_75] = (x_77 + x_76);
      }
    }

    continuing {
      let x_79 : i32 = i_1;
      i_1 = (x_79 + 1);
    }
  }
  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
  i_2 = x_81;
  loop {
    let x_82 : i32 = i_2;
    let x_83 : i32 = x_8.x_GLF_uniform_int_values[6];
    if ((x_82 < x_83)) {
    } else {
      break;
    }
    let x_84 : i32 = i_2;
    let x_85 : i32 = a_1[x_84];
    let x_86 : i32 = i_2;
    let x_87 : i32 = ref[x_86];
    if ((x_85 != x_87)) {
      let x_88 : i32 = x_8.x_GLF_uniform_int_values[0];
      let x_205 : f32 = f32(x_88);
      x_GLF_color = vec4<f32>(x_205, x_205, x_205, x_205);
      return;
    }

    continuing {
      let x_89 : i32 = i_2;
      i_2 = (x_89 + 1);
    }
  }
  let x_91 : i32 = x_8.x_GLF_uniform_int_values[11];
  let x_92 : i32 = x_8.x_GLF_uniform_int_values[0];
  let x_93 : i32 = x_8.x_GLF_uniform_int_values[0];
  let x_94 : i32 = x_8.x_GLF_uniform_int_values[11];
  x_GLF_color = vec4<f32>(f32(x_91), f32(x_92), f32(x_93), f32(x_94));
  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);
}
