struct strided_arr {
  @size(16)
  el : i32,
}

type Arr = array<strided_arr, 2u>;

struct buf0 {
  x_GLF_uniform_int_values : Arr,
}

var<private> x_GLF_global_loop_count : i32;

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

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  x_GLF_global_loop_count = 0;
  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0].el;
  switch(x_27) {
    case 0: {
      if (true) {
        let x_34 : i32 = x_6.x_GLF_uniform_int_values[1].el;
        let x_35 : f32 = f32(x_34);
        x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
        return;
      }
      fallthrough;
    }
    case 1: {
      if (true) {
        let x_40 : i32 = x_6.x_GLF_uniform_int_values[0].el;
        let x_43 : i32 = x_6.x_GLF_uniform_int_values[1].el;
        let x_46 : i32 = x_6.x_GLF_uniform_int_values[1].el;
        let x_49 : i32 = x_6.x_GLF_uniform_int_values[0].el;
        x_GLF_color = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
        if (false) {
          let x_55 : i32 = x_6.x_GLF_uniform_int_values[0].el;
          let x_56 : f32 = f32(x_55);
          x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
          loop {
            let x_62 : i32 = x_GLF_global_loop_count;
            x_GLF_global_loop_count = (x_62 + 1);
            if (false) {
              return;
            }
            if (true) {
              return;
            }

            continuing {
              let x_68 : i32 = x_GLF_global_loop_count;
              if ((x_68 < 100)) {
              } else {
                break;
              }
            }
          }
        }
      }
    }
    default: {
    }
  }
  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);
}
