//-------------------------------------------------------------------------------------------------------
// 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 = 16272;
b = 46836;
c = -64402;
d = 25621;
e = 4887;
f = 23253;
g = 3930;
h = -4055;
obj0.a = 1433;
obj0.b = -38651;
obj0.c = 64008;
obj0.d = 49780;
obj0.e = 44742;
ary[0] = 48525;
ary[1] = 38196;
ary[100] = -19739;
e = f;
if(((obj0.b + ((h <= 38683) - (-2155 ? -39832 : a))) < (g & d))) {
} else {
  obj0.e = (((- (h + obj0.a)) * ((obj0.b - -22147) - (obj0.a++ ))) ? ((obj0.b & f) * ((obj0.b++ ) & (-63023 & -55948))) : (((++ f) < (obj0.a ? -60422 : obj0.e)) - ((obj0.e | -57157) > 48449)));
  if((((+ (! obj0.e)) * d) >= (((obj0.e + 24175) - (-52368 & 11686)) + obj0.d))) {
    if((((f & a) & -1583) > (d | ((65391 | 65194) * obj0.d)))) {
      f = 9467;
      g = ((((-13580 - -19968) & g) - ((obj0.e != b) ? (45619 | -11866) : -37123)) | (a & (obj0.c | (770 | 38223))));
    } else {
    }
    if(((((obj0.e | -43543) | (a - 32338)) * obj0.e) < (((4262 ^ a) + c) - ((obj0.a <= b) > (-47916 ^ a))))) {
      c = ((((60874 <= -62820) ? d : (g & obj0.a)) - (a * (- -34390))) | ((d - (-63428 | d)) + a));
      d = h;
    } else {
      f = h;
      obj0.e = (((- (c & g)) * b) != (((3235 * 7381) * obj0.a) + (obj0.e & (obj0.b * 58982))));
      obj0.d = g;
    }
  } else {
    if(((h + ((+ -22612) & (-52955 - f))) < (((35588 ^ g) * e) ^ ((c == -14957) ? (obj0.b > -39040) : (e + 15121))))) {
    } else {
      obj0.c = d;
      a = (((+ (b | 10472)) & (! (-63898 != 37388))) | (((-51303 | d) - g) - 36911));
    }
    f = ((d * -1066) & ((+ (-37358 ^ 33162)) ^ ((29501 != obj0.c) ? d : (50772 * -19602))));
  }
  if((((h < (obj0.c + obj0.d)) | h) < ((a | (53621 ^ -41014)) & obj0.e))) {
    obj0.b = (((f * d) + h) * (a & ((obj0.c >= 1703) ? g : (obj0.c + 49333))));
  } else {
    if(((obj0.d + obj0.a) > (((-60851 <= 51734) & d) * (++ g)))) {
      b = ((b ^ ((-15530 >= -56989) ? (g ? d : obj0.a) : d)) * (obj0.b - a));
    } else {
    }
  }
}
if(((11216 + ((c++ ) ^ (obj0.d + -57805))) != (((38896 ? 35989 : 27360) & (+ obj0.d)) ^ obj0.b))) {
} else {
}
h = ((((obj0.b >= a) ? (! obj0.e) : b) - g) & ((a | a) & 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');
})();
