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

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

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

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

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

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var v1 : vec4<f32>;
  var i : i32;
  var a : i32;
  var indexable : array<vec4<f32>, 2>;
  var indexable_1 : array<vec4<f32>, 2>;
  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
  v1 = vec4<f32>(x_45, x_45, x_45, x_45);
  let x_48 : i32 = x_9.x_GLF_uniform_int_values[1];
  i = x_48;
  loop {
    let x_53 : i32 = i;
    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
    if ((x_53 < x_55)) {
    } else {
      break;
    }
    let x_58 : i32 = i;
    let x_60 : i32 = x_9.x_GLF_uniform_int_values[1];
    let x_62 : i32 = x_9.x_GLF_uniform_int_values[2];
    indexable = array<vec4<f32>, 2>(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
    let x_65 : f32 = indexable[clamp(x_58, x_60, x_62)].x;
    a = i32(x_65);
    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
    let x_70 : f32 = x_6.x_GLF_uniform_float_values[1];
    let x_72 : f32 = x_6.x_GLF_uniform_float_values[1];
    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
    let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
    let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
    let x_81 : f32 = x_6.x_GLF_uniform_float_values[0];
    let x_83 : f32 = x_6.x_GLF_uniform_float_values[1];
    let x_86 : i32 = a;
    indexable_1 = array<vec4<f32>, 2>(vec4<f32>(x_68, x_70, x_72, x_74), vec4<f32>(x_77, x_79, x_81, x_83));
    let x_88 : vec4<f32> = indexable_1[x_86];
    v1 = x_88;

    continuing {
      let x_89 : i32 = i;
      i = (x_89 + 1);
    }
  }
  let x_91 : vec4<f32> = v1;
  x_GLF_color = x_91;
  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);
}
