struct QuicksortObject {
  numbers : array<i32, 10>;
};

[[block]]
struct buf0 {
  resolution : vec2<f32>;
};

var<private> obj : QuicksortObject;

var<private> gl_FragCoord : vec4<f32>;

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

var<private> x_GLF_color : vec4<f32>;

fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>, x_228 : mat3x3<f32>) {
  var temp : i32;
  let x_230 : i32 = *(i);
  let x_232 : i32 = obj.numbers[x_230];
  temp = x_232;
  let x_233 : i32 = *(i);
  let x_234 : i32 = *(j);
  let x_236 : i32 = obj.numbers[x_234];
  obj.numbers[x_233] = x_236;
  let x_238 : i32 = *(j);
  let x_239 : i32 = temp;
  obj.numbers[x_238] = x_239;
  return;
}

fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
  var pivot : i32;
  var i_1 : i32;
  var j_1 : i32;
  var param : i32;
  var param_1 : i32;
  var param_2 : i32;
  var param_3 : i32;
  let x_242 : i32 = *(h);
  let x_244 : i32 = obj.numbers[x_242];
  pivot = x_244;
  let x_245 : i32 = *(l);
  i_1 = (x_245 - 1);
  let x_247 : i32 = *(l);
  j_1 = x_247;
  loop {
    let x_252 : i32 = j_1;
    let x_253 : i32 = *(h);
    if ((x_252 <= (x_253 - 1))) {
    } else {
      break;
    }
    let x_257 : i32 = j_1;
    let x_259 : i32 = obj.numbers[x_257];
    let x_260 : i32 = pivot;
    if ((x_259 <= x_260)) {
      let x_264 : i32 = i_1;
      i_1 = (x_264 + 1);
      let x_266 : i32 = i_1;
      param = x_266;
      let x_267 : i32 = j_1;
      param_1 = x_267;
      swap_i1_i1_(&(param), &(param_1), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
    }

    continuing {
      let x_269 : i32 = j_1;
      j_1 = (x_269 + 1);
    }
  }
  let x_271 : i32 = i_1;
  i_1 = (x_271 + 1);
  let x_273 : i32 = i_1;
  param_2 = x_273;
  let x_274 : i32 = *(h);
  param_3 = x_274;
  swap_i1_i1_(&(param_2), &(param_3), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
  let x_276 : i32 = i_1;
  return x_276;
}

fn quicksort_() {
  var l_1 : i32;
  var h_1 : i32;
  var top : i32;
  var stack : array<i32, 10>;
  var p : i32;
  var param_4 : i32;
  var param_5 : i32;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  let x_278 : i32 = top;
  let x_279 : i32 = (x_278 + 1);
  top = x_279;
  let x_280 : i32 = l_1;
  stack[x_279] = x_280;
  let x_282 : i32 = top;
  let x_283 : i32 = (x_282 + 1);
  top = x_283;
  let x_284 : i32 = h_1;
  stack[x_283] = x_284;
  loop {
    let x_290 : i32 = top;
    if ((x_290 >= 0)) {
    } else {
      break;
    }
    let x_293 : i32 = top;
    top = (x_293 - 1);
    let x_296 : i32 = stack[x_293];
    h_1 = x_296;
    let x_297 : i32 = top;
    top = (x_297 - 1);
    let x_300 : i32 = stack[x_297];
    l_1 = x_300;
    let x_301 : i32 = l_1;
    param_4 = x_301;
    let x_302 : i32 = h_1;
    param_5 = x_302;
    let x_303 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
    p = x_303;
    let x_304 : i32 = p;
    let x_306 : i32 = l_1;
    if (((x_304 - 1) > x_306)) {
      let x_310 : i32 = top;
      let x_311 : i32 = (x_310 + 1);
      top = x_311;
      let x_312 : i32 = l_1;
      stack[x_311] = x_312;
      let x_314 : i32 = top;
      let x_315 : i32 = (x_314 + 1);
      top = x_315;
      let x_316 : i32 = p;
      stack[x_315] = (x_316 - 1);
    }
    let x_319 : i32 = p;
    let x_321 : i32 = h_1;
    if (((x_319 + 1) < x_321)) {
      let x_325 : i32 = top;
      let x_326 : i32 = (x_325 + 1);
      top = x_326;
      let x_327 : i32 = p;
      stack[x_326] = (x_327 + 1);
      let x_330 : i32 = top;
      let x_331 : i32 = (x_330 + 1);
      top = x_331;
      let x_332 : i32 = h_1;
      stack[x_331] = x_332;
    }
  }
  return;
}

fn main_1() {
  var i_2 : i32;
  var uv : vec2<f32>;
  var color : vec3<f32>;
  i_2 = 0;
  loop {
    let x_89 : i32 = i_2;
    if ((x_89 < 10)) {
    } else {
      break;
    }
    let x_92 : i32 = i_2;
    let x_93 : i32 = i_2;
    obj.numbers[x_92] = (10 - x_93);
    let x_96 : i32 = i_2;
    let x_97 : i32 = i_2;
    let x_99 : i32 = obj.numbers[x_97];
    let x_100 : i32 = i_2;
    let x_102 : i32 = obj.numbers[x_100];
    obj.numbers[x_96] = (x_99 * x_102);

    continuing {
      let x_105 : i32 = i_2;
      i_2 = (x_105 + 1);
    }
  }
  quicksort_();
  let x_108 : vec4<f32> = gl_FragCoord;
  let x_111 : vec2<f32> = x_32.resolution;
  uv = (vec2<f32>(x_108.x, x_108.y) / x_111);
  color = vec3<f32>(1.0, 2.0, 3.0);
  let x_114 : i32 = obj.numbers[0];
  let x_117 : f32 = color.x;
  color.x = (x_117 + f32(x_114));
  let x_121 : f32 = uv.x;
  if ((x_121 > 0.25)) {
    let x_126 : i32 = obj.numbers[1];
    let x_129 : f32 = color.x;
    color.x = (x_129 + f32(x_126));
  }
  let x_133 : f32 = uv.x;
  if ((x_133 > 0.5)) {
    let x_138 : i32 = obj.numbers[2];
    let x_141 : f32 = color.y;
    color.y = (x_141 + f32(x_138));
  }
  let x_145 : f32 = uv.x;
  if ((x_145 > 0.75)) {
    let x_150 : i32 = obj.numbers[3];
    let x_153 : f32 = color.z;
    color.z = (x_153 + f32(x_150));
  }
  let x_157 : i32 = obj.numbers[4];
  let x_160 : f32 = color.y;
  color.y = (x_160 + f32(x_157));
  let x_164 : f32 = uv.y;
  if ((x_164 > 0.25)) {
    let x_169 : i32 = obj.numbers[5];
    let x_172 : f32 = color.x;
    color.x = (x_172 + f32(x_169));
  }
  let x_176 : f32 = uv.y;
  if ((x_176 > 0.5)) {
    let x_181 : i32 = obj.numbers[6];
    let x_184 : f32 = color.y;
    color.y = (x_184 + f32(x_181));
  }
  let x_188 : f32 = uv.y;
  if ((x_188 > 0.75)) {
    let x_193 : i32 = obj.numbers[7];
    let x_196 : f32 = color.z;
    color.z = (x_196 + f32(x_193));
  }
  let x_200 : i32 = obj.numbers[8];
  let x_203 : f32 = color.z;
  color.z = (x_203 + f32(x_200));
  let x_207 : f32 = uv.x;
  let x_209 : f32 = uv.y;
  if ((abs((x_207 - x_209)) < 0.25)) {
    let x_216 : i32 = obj.numbers[9];
    let x_219 : f32 = color.x;
    color.x = (x_219 + f32(x_216));
  }
  let x_222 : vec3<f32> = color;
  let x_223 : vec3<f32> = normalize(x_222);
  x_GLF_color = vec4<f32>(x_223.x, x_223.y, x_223.z, 1.0);
  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);
}
