//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

(function() {
var ary = new Array(10);
var obj0 = new Object();
var a;
var b;
var c;
var d;
var e;
var f;
var g;
var h;
a = 4146;
b = 60454;
c = -38876;
d = -27001;
e = -9040;
f = 46187;
g = 36473;
h = -34124;
obj0.a = -20870;
obj0.b = -19211;
obj0.c = -1149;
obj0.d = 12247;
obj0.e = -64227;
ary[0] = -35725;
ary[1] = -53190;
ary[100] = 58969;
if(((e - ((e <= h) - obj0.d)) < (((obj0.c ? g : d) == (-23008 | f)) | (a ^ h)))) {
  obj0.c = obj0.a;
} else {
}
if(((((28781 + e) - (obj0.d > f)) ^ f) < (((g > obj0.d) ? g : (35720 ? f : e)) ^ (-39967 + (h | obj0.a))))) {
} else {
  obj0.d = obj0.b;
  if((((d != d) | d) <= ((+ (a - -56259)) * ((-55867 | -10754) != (++ e))))) {
    obj0.e = ((((obj0.a >= obj0.e) ? (e & -31743) : (64679 > a)) & h) >= (((f + 8850) | -50234) | obj0.e));
  } else {
    if(((g + ((obj0.e + -16854) + (62196 + 27558))) <= (((f <= 44100) ^ b) + a))) {
      e = obj0.d;
      h = ((((45388 < 6445) ? (g ^ 30114) : obj0.c) + 13372) ^ (((++ e) * (-6583 <= 62263)) * ((obj0.b <= -59582) * (- 51073))));
      obj0.e = a;
    } else {
    }
    d = 9180;
    e = ((-16531 | ((31605 - 57832) ^ (60640 + 64781))) + ((a & (b - b)) * (++ b)));
  }
}
if(((obj0.a * ((obj0.c + h) + (18046 ? -34433 : -9542))) <= (222 + (obj0.e + (-2604 ^ obj0.b))))) {
  if(((b | (obj0.b | (c ^ obj0.d))) > (22937 & d))) {
    if(((((obj0.d ^ obj0.e) == 17750) ^ (obj0.c < obj0.b)) == (e + f))) {
    } else {
    }
    if((((obj0.d - g) ^ 4615) >= ((obj0.e ^ obj0.c) | ((49038 * c) >= (49763 + obj0.a))))) {
      e = obj0.b;
      b = (+ (f * ((a <= 25596) ? (11937 ^ h) : h)));
    } else {
      g = c;
      obj0.a = c;
      obj0.b = obj0.a;
    }
  } else {
    if((((45049 | (53027 * -46041)) ^ g) > (((+ e) - f) ^ ((g | d) | (e ^ 534))))) {
      h = e;
      obj0.d = ((((e != obj0.c) ? -26629 : -13776) & (++ obj0.b)) ^ (f | 37948));
    } else {
      obj0.b = c;
      d = (+ (g & g));
    }
    if(((((52595 ? 20627 : d) == (d * f)) | ((obj0.e | obj0.d) * h)) <= (((c < -35789) ? (obj0.e ^ 54724) : (32315 - obj0.c)) * obj0.c))) {
    } else {
    }
    obj0.c = (+ (((-30921 & 25162) * (obj0.d ? obj0.c : obj0.d)) | ((-35688 | 5785) ^ (obj0.a ? 62732 : obj0.d))));
  }
  if(((obj0.c + (45157 ^ g)) < (obj0.e | d))) {
  } else {
    a = h;
    obj0.a = ((((g ? f : -9902) - (e ? e : 32303)) - 51864) ? (((34981 <= a) ? e : obj0.a) | obj0.c) : (26966 - (b - obj0.b)));
  }
  if(((d ^ (g * obj0.d)) >= ((! obj0.e) - a))) {
    if(((((51923 ^ f) | a) + obj0.a) < (((f == g) ? (obj0.b - a) : (-43041 - h)) * (-28282 ^ e)))) {
      g = ((((! -16445) - (b ^ obj0.b)) ^ g) & (-28351 ^ ((obj0.e | 49348) - (-42139 == h))));
      h = d;
      obj0.e = (((d++ ) * ((b - -47962) + a)) >= (((f ^ -24846) & (obj0.a ? obj0.a : a)) | ((17931 * f) ^ (49595 ^ -60435))));
    } else {
      d = e;
      e = (- (((obj0.e ? f : 46974) * -55680) + obj0.d));
    }
  } else {
    e = ((((c <= 47038) ? (e - -32793) : obj0.c) - (g ^ 19371)) + (((d | h) - (d < obj0.c)) | (d ^ (! -27116))));
  }
} else {
  h = 17909;
}
if((((52736 | (-29160 - e)) ^ d) > (((a < 52851) <= (53598 ? 2841 : 62359)) ^ (-48279 == (obj0.b * obj0.e))))) {
  if(((((17953 - 18282) ^ obj0.a) & obj0.a) >= (obj0.d - (h * f)))) {
    if((((++ d) + (a <= f)) < (((12752 + 36261) ^ (-63702 * b)) + obj0.a))) {
    } else {
      c = ((g - obj0.d) - (obj0.e + e));
      g = obj0.c;
      g = e;
    }
    obj0.c = 20017;
    if(((obj0.e - (d * b)) > (obj0.a + g))) {
      obj0.c = g;
      f = ((obj0.e & obj0.e) - (((45540 & e) | b) ^ ((21253 | h) - (30030 * 58166))));
    } else {
      d = obj0.a;
    }
  } else {
  }
  c = (((+ obj0.d) ^ b) & (obj0.b + (-14128 ^ (g + 12591))));
  if((((b - (obj0.a | obj0.a)) ^ ((obj0.e - 8393) * b)) == ((56662 & a) ^ ((-55938 * -43596) == (19711 - 46416))))) {
    c = ((a & (e ^ c)) ? (((12048 + -63257) | (c ? d : e)) * ((+ 45968) * (e ^ f))) : ((+ h) ^ ((26985 != obj0.c) ? b : (obj0.d + d))));
    a = ((c | (obj0.a * (obj0.b ^ d))) & (f - ((51125 < -50410) ? (40020 <= -45138) : obj0.a)));
    if((((+ obj0.b) & ((d | obj0.e) != obj0.b)) > (((+ g) - obj0.c) | ((g | -2503) * obj0.c)))) {
    } else {
      f = a;
      obj0.b = (d++ );
      obj0.b = obj0.d;
    }
  } else {
    obj0.b = b;
    e = ((((51738 | -16974) * a) & (obj0.b | obj0.e)) | (e ^ obj0.c));
    c = (((obj0.d++ ) + ((f ? obj0.a : 60335) + e)) ? (f ^ b) : (((obj0.c ? 33593 : 46131) + d) | ((-30736 ^ 11690) | (f <= -60114))));
  }
} else {
  if(((((-45184 * obj0.e) & (-35387 - -24621)) + (- obj0.e)) < (((obj0.e >= 60834) ? (51006 ? -6651 : 45881) : -23244) & g))) {
    e = ((((f >= 5463) ? 19861 : (-5760 * -10463)) - ((h & obj0.e) * e)) | ((c | (obj0.d++ )) - (- (29235 ^ h))));
    if(((f * obj0.c) != ((obj0.a + 41708) + f))) {
    } else {
    }
    if(((-27111 * ((57857 + -23548) - d)) == ((! b) & obj0.c))) {
      b = ((-21744 - e) ? (-42809 & ((obj0.c - 42911) * (obj0.d & obj0.b))) : ((-12876 <= obj0.a) & e));
    } else {
      obj0.a = f;
      g = ((f * e) > ((obj0.c * (4289 | 39904)) & ((13998 != g) ? (d | obj0.d) : -22686)));
    }
  } else {
  }
  if((((f - (56577 & 28733)) | ((obj0.a <= 15717) + (e ? -5278 : -23356))) >= ((! (obj0.b - obj0.b)) | (+ (f ? 48168 : 30697))))) {
    if(((d - a) != ((c++ ) - 59625))) {
      obj0.d = ((((obj0.c & 41181) & g) | (obj0.d | (++ a))) != ((g ^ f) + b));
      g = ((obj0.d ^ (+ g)) & (obj0.b | h));
    } else {
      g = ((d * -17948) ? (((- c) ^ (f | obj0.d)) - a) : (obj0.b * (-17687 - (38323 * 64641))));
      obj0.b = ((obj0.a + obj0.d) & ((-17050 > (obj0.c ? c : 21600)) ^ f));
    }
    if(((obj0.d ^ (c & obj0.e)) < (obj0.d + (g + h)))) {
      e = ((obj0.a * obj0.c) | (obj0.b & obj0.e));
      b = ((-48397 - 63134) != ((f * (c ? obj0.b : f)) & ((e ? 49720 : 12143) | -47202)));
      a = ((e + (+ g)) ^ (((+ -47574) >= (-25283 ^ 12301)) ^ ((obj0.d ^ obj0.d) | obj0.e)));
    } else {
      c = ((((b | d) > (h - 23828)) | e) - ((+ obj0.e) & ((56714 == -12836) ? a : b)));
    }
    obj0.d = -47485;
  } else {
  }
  d = d;
}
WScript.Echo("a = " + (a>>3));
WScript.Echo("b = " + (b>>3));
WScript.Echo("c = " + (c>>3));
WScript.Echo("d = " + (d>>3));
WScript.Echo("e = " + (e>>3));
WScript.Echo("f = " + (f>>3));
WScript.Echo("g = " + (g>>3));
WScript.Echo("h = " + (h>>3));
WScript.Echo("obj0.a = " + (obj0.a>>3));
WScript.Echo("obj0.b = " + (obj0.b>>3));
WScript.Echo("obj0.c = " + (obj0.c>>3));
WScript.Echo("obj0.d = " + (obj0.d>>3));
WScript.Echo("obj0.e = " + (obj0.e>>3));
WScript.Echo("ary[0] = " + (ary[0]>>3));
WScript.Echo("ary[1] = " + (ary[1]>>3));
WScript.Echo("ary[100] = " + (ary[100]>>3));
WScript.Echo('done');
})();
