struct QuicksortObject {
  int numbers[10];
};

static QuicksortObject obj = (QuicksortObject)0;
static float4 x_GLF_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float4 x_GLF_pos = float4(0.0f, 0.0f, 0.0f, 0.0f);
cbuffer cbuffer_x_34 : register(b0, space0) {
  uint4 x_34[1];
};
static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);

void main_1() {
  int x_90 = 0;
  int x_91 = 0;
  int x_92 = 0;
  int x_93 = 0;
  int x_94 = 0;
  int x_95 = 0;
  int x_96 = 0;
  int x_97 = 0;
  int x_98 = 0;
  int x_99 = 0;
  int x_100 = 0;
  int x_101 = 0;
  int x_102 = 0;
  int x_103[10] = (int[10])0;
  int x_104 = 0;
  int x_105 = 0;
  int x_106 = 0;
  int i_2 = 0;
  float2 uv = float2(0.0f, 0.0f);
  float3 color = float3(0.0f, 0.0f, 0.0f);
  x_GLF_FragCoord = ((x_GLF_pos + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
  i_2 = 0;
  {
    for(; (i_2 < 10); i_2 = (i_2 + 1)) {
      obj.numbers[i_2] = (10 - i_2);
      const int x_121 = i_2;
      const int x_124 = obj.numbers[i_2];
      const int x_127 = obj.numbers[i_2];
      obj.numbers[x_121] = (x_124 * x_127);
    }
  }
  x_100 = 0;
  x_101 = 9;
  x_102 = -1;
  const int x_133 = (x_102 + 1);
  x_102 = x_133;
  x_103[x_133] = x_100;
  const int x_137 = (x_102 + 1);
  x_102 = x_137;
  x_103[x_137] = x_101;
  while (true) {
    if ((x_102 >= 0)) {
    } else {
      break;
    }
    const int x_147 = x_102;
    x_102 = (x_147 - 1);
    const int x_150 = x_103[x_147];
    x_101 = x_150;
    const int x_151 = x_102;
    x_102 = (x_151 - 1);
    const int x_154 = x_103[x_151];
    x_100 = x_154;
    x_105 = x_100;
    x_106 = x_101;
    const int x_159 = obj.numbers[x_106];
    x_92 = x_159;
    x_93 = (x_105 - 1);
    x_94 = x_105;
    {
      for(; (x_94 <= (x_106 - 1)); x_94 = (x_94 + 1)) {
        const int x_174 = obj.numbers[x_94];
        if ((x_174 <= x_92)) {
          x_93 = (x_93 + 1);
          x_95 = x_93;
          x_96 = x_94;
          const int x_185 = obj.numbers[x_95];
          x_91 = x_185;
          const int x_186 = x_95;
          const int x_189 = obj.numbers[x_96];
          obj.numbers[x_186] = x_189;
          obj.numbers[x_96] = x_91;
        }
      }
    }
    x_97 = (x_93 + 1);
    x_98 = x_106;
    const int x_201 = obj.numbers[x_97];
    x_90 = x_201;
    const int x_202 = x_97;
    const int x_205 = obj.numbers[x_98];
    obj.numbers[x_202] = x_205;
    obj.numbers[x_98] = x_90;
    x_99 = (x_93 + 1);
    x_104 = x_99;
    if (((x_104 - 1) > x_100)) {
      const int x_220 = (x_102 + 1);
      x_102 = x_220;
      x_103[x_220] = x_100;
      const int x_224 = (x_102 + 1);
      x_102 = x_224;
      x_103[x_224] = (x_104 - 1);
    }
    if (((x_104 + 1) < x_101)) {
      const int x_235 = (x_102 + 1);
      x_102 = x_235;
      x_103[x_235] = (x_104 + 1);
      const int x_240 = (x_102 + 1);
      x_102 = x_240;
      x_103[x_240] = x_101;
    }
  }
  const float4 x_243 = x_GLF_FragCoord;
  const float2 x_246 = asfloat(x_34[0].xy);
  uv = (float2(x_243.x, x_243.y) / x_246);
  color = float3(1.0f, 2.0f, 3.0f);
  const int x_249 = obj.numbers[0];
  const float x_252 = color.x;
  color.x = (x_252 + float(x_249));
  const float x_256 = uv.x;
  if ((x_256 > 0.25f)) {
    const int x_261 = obj.numbers[1];
    const float x_264 = color.x;
    color.x = (x_264 + float(x_261));
  }
  const float x_268 = uv.x;
  if ((x_268 > 0.5f)) {
    const int x_273 = obj.numbers[2];
    const float x_276 = color.y;
    color.y = (x_276 + float(x_273));
  }
  const float x_280 = uv.x;
  if ((x_280 > 0.75f)) {
    const int x_285 = obj.numbers[3];
    const float x_288 = color.z;
    color.z = (x_288 + float(x_285));
  }
  const int x_292 = obj.numbers[4];
  const float x_295 = color.y;
  color.y = (x_295 + float(x_292));
  const float x_299 = uv.y;
  if ((x_299 > 0.25f)) {
    const int x_304 = obj.numbers[5];
    const float x_307 = color.x;
    color.x = (x_307 + float(x_304));
  }
  const float x_311 = uv.y;
  if ((x_311 > 0.5f)) {
    const int x_316 = obj.numbers[6];
    const float x_319 = color.y;
    color.y = (x_319 + float(x_316));
  }
  const float x_323 = uv.y;
  if ((x_323 > 0.75f)) {
    const int x_328 = obj.numbers[7];
    const float x_331 = color.z;
    color.z = (x_331 + float(x_328));
  }
  const int x_335 = obj.numbers[8];
  const float x_338 = color.z;
  color.z = (x_338 + float(x_335));
  const float x_342 = uv.x;
  const float x_344 = uv.y;
  if ((abs((x_342 - x_344)) < 0.25f)) {
    const int x_351 = obj.numbers[9];
    const float x_354 = color.x;
    color.x = (x_354 + float(x_351));
  }
  const float3 x_358 = normalize(color);
  frag_color = float4(x_358.x, x_358.y, x_358.z, 1.0f);
  gl_Position = x_GLF_pos;
  return;
}

struct main_out {
  float4 frag_color_1;
  float4 gl_Position;
};
struct tint_symbol_1 {
  float4 x_GLF_pos_param : TEXCOORD0;
};
struct tint_symbol_2 {
  float4 frag_color_1 : TEXCOORD0;
  float4 gl_Position : SV_Position;
};

main_out main_inner(float4 x_GLF_pos_param) {
  x_GLF_pos = x_GLF_pos_param;
  main_1();
  const main_out tint_symbol_4 = {frag_color, gl_Position};
  return tint_symbol_4;
}

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const main_out inner_result = main_inner(tint_symbol.x_GLF_pos_param);
  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
  wrapper_result.frag_color_1 = inner_result.frag_color_1;
  wrapper_result.gl_Position = inner_result.gl_Position;
  return wrapper_result;
}

void swap_i1_i1_(inout int i, inout int j) {
  int temp = 0;
  const int x_366 = i;
  const int x_368 = obj.numbers[x_366];
  temp = x_368;
  const int x_369 = i;
  const int x_370 = j;
  const int x_372 = obj.numbers[x_370];
  obj.numbers[x_369] = x_372;
  const int x_374 = j;
  obj.numbers[x_374] = temp;
  return;
}

int performPartition_i1_i1_(inout int l, inout int h) {
  int pivot = 0;
  int i_1 = 0;
  int j_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  int param_3 = 0;
  const int x_378 = h;
  const int x_380 = obj.numbers[x_378];
  pivot = x_380;
  const int x_381 = l;
  i_1 = (x_381 - 1);
  const int x_383 = l;
  j_1 = x_383;
  while (true) {
    const int x_388 = j_1;
    const int x_389 = h;
    if ((x_388 <= (x_389 - 1))) {
    } else {
      break;
    }
    const int x_395 = obj.numbers[j_1];
    if ((x_395 <= pivot)) {
      i_1 = (i_1 + 1);
      param = i_1;
      param_1 = j_1;
      swap_i1_i1_(param, param_1);
    }
    {
      j_1 = (j_1 + 1);
    }
  }
  param_2 = (i_1 + 1);
  const int x_409 = h;
  param_3 = x_409;
  swap_i1_i1_(param_2, param_3);
  return (i_1 + 1);
}

void quicksort_() {
  int l_1 = 0;
  int h_1 = 0;
  int top = 0;
  int stack[10] = (int[10])0;
  int p = 0;
  int param_4 = 0;
  int param_5 = 0;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  const int x_415 = (top + 1);
  top = x_415;
  stack[x_415] = l_1;
  const int x_419 = (top + 1);
  top = x_419;
  stack[x_419] = h_1;
  while (true) {
    if ((top >= 0)) {
    } else {
      break;
    }
    const int x_429 = top;
    top = (x_429 - 1);
    const int x_432 = stack[x_429];
    h_1 = x_432;
    const int x_433 = top;
    top = (x_433 - 1);
    const int x_436 = stack[x_433];
    l_1 = x_436;
    param_4 = l_1;
    param_5 = h_1;
    const int x_439 = performPartition_i1_i1_(param_4, param_5);
    p = x_439;
    if (((p - 1) > l_1)) {
      const int x_447 = (top + 1);
      top = x_447;
      stack[x_447] = l_1;
      const int x_451 = (top + 1);
      top = x_451;
      stack[x_451] = (p - 1);
    }
    if (((p + 1) < h_1)) {
      const int x_462 = (top + 1);
      top = x_462;
      stack[x_462] = (p + 1);
      const int x_467 = (top + 1);
      top = x_467;
      stack[x_467] = h_1;
    }
  }
  return;
}
