//-------------------------------------------------------------------------------------------------------
// 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 = -59314;
b = 38327;
c = -48733;
d = -54595;
e = 2983;
f = -57772;
g = -43452;
h = 42098;
obj0.a = 49285;
obj0.b = -7955;
obj0.c = 18856;
obj0.d = -31594;
obj0.e = -39003;
ary[0] = -52414;
ary[1] = 63624;
ary[100] = -22748;
e = ((g * ((4428 - obj0.a) | (obj0.e & f))) ^ (b - obj0.e));
if((((f * (-50572 + obj0.e)) * ((d > 3979) - (-17751 > 53730))) != (obj0.b ^ -48838))) {
  b = obj0.e;
} else {
  if((((obj0.e | (obj0.e * -3489)) & 62377) > ((b + obj0.e) + obj0.b))) {
    if((((34584 & e) ^ g) == (((34527 > -64084) ? (39861 * h) : 58877) | obj0.c))) {
      obj0.c = c;
      e = ((g & ((g & 15782) == (-29757 & 12452))) & (((c != b) & e) - d));
      c = -675;
    } else {
      h = (((obj0.d ^ (g & c)) + ((c ? g : f) >= f)) ^ (obj0.c & (c & 56228)));
      obj0.a = ((((e < obj0.a) ? g : -48959) * 64876) - (obj0.e & e));
    }
    obj0.e = (((+ e) | obj0.b) ^ (((45903 == obj0.b) ? (h | f) : (++ a)) * ((14237 | e) & (a - obj0.a))));
    obj0.e = a;
  } else {
    c = ((a * obj0.e) & ((g + -26943) - ((-57558 | a) + 45350)));
    if(((b ^ b) <= (h ^ b))) {
      obj0.c = c;
      obj0.a = ((b * (obj0.b - (59100 < g))) ? (((obj0.c >= -54770) ^ (-25935 | g)) - obj0.b) : (12661 & e));
      b = -5541;
    } else {
      obj0.e = -47128;
      obj0.c = ((obj0.c + ((45440 > b) ? h : d)) != (a * obj0.d));
      obj0.a = a;
    }
    g = obj0.a;
  }
}
if((((e + (f ? b : f)) * (! c)) < (a - (obj0.d - (+ a))))) {
  d = ((c & obj0.a) ? (a - b) : (((g++ ) * (e <= g)) * -64310));
  obj0.c = ((a + obj0.d) ^ (b & d));
  if(((((obj0.a ? 51535 : b) ^ 52631) - obj0.e) >= ((++ obj0.b) & (e + obj0.c)))) {
    if(((((d != a) ? (obj0.e++ ) : g) ^ -16411) == (((-48400 * 4806) + (e | -24393)) | obj0.a))) {
      b = (((d > g) * obj0.d) > (b - (e * h)));
      obj0.c = g;
      obj0.e = obj0.d;
    } else {
      f = ((((20167 ? d : e) * (-26620 == -40247)) - ((b & h) ^ (e ? -58331 : 50123))) + ((obj0.a - obj0.b) ^ ((11505 & obj0.b) & (c != 26675))));
      obj0.a = (((- (obj0.c >= 2466)) | -57872) ? ((e - -29484) & (+ (obj0.d | b))) : (-28919 & ((g ? -51243 : 29904) <= 33409)));
      c = ((((obj0.d ? e : obj0.e) & obj0.a) | a) != ((45436 - (-8655 ^ h)) * b));
    }
    c = ((obj0.e - ((16322 ? 3481 : 27257) - (b ^ 34134))) <= (obj0.b * ((c | 59608) * 5175)));
  } else {
  }
} else {
  if((((+ f) + ((49935 <= 33511) + (h | obj0.d))) == (f * ((obj0.c & obj0.b) < g)))) {
    obj0.d = 39836;
    g = c;
    if(((obj0.a + ((-44719 == e) > a)) < (obj0.d + g))) {
      obj0.d = obj0.e;
      g = ((b - ((obj0.d == obj0.d) | -33854)) * ((+ e) + obj0.c));
    } else {
      obj0.c = ((a ^ (+ obj0.c)) ? ((obj0.c + g) ^ ((-57891 ^ -751) ^ (++ h))) : (e - ((12672 + 44226) ^ (obj0.a + 40813))));
    }
  } else {
  }
  obj0.d = obj0.b;
  if(((-2306 - ((-32138 ? 48433 : b) * b)) >= (((++ obj0.e) - (-28212 - obj0.a)) ^ d))) {
    obj0.a = obj0.b;
  } else {
    if((((-33530 - (-58536 ? obj0.a : g)) - ((-6333 < c) ? obj0.c : g)) > (h & f))) {
      e = (((obj0.b ^ b) - (-14798 ^ (a * f))) ? ((+ c) * ((b++ ) <= b)) : (((obj0.e ? obj0.a : -48117) >= (-64504 - -24101)) & obj0.a));
      obj0.d = ((obj0.b - ((e ^ obj0.b) ^ b)) + (((-56090 != obj0.e) ? (b + 38155) : obj0.a) & ((obj0.a == -38065) & g)));
    } else {
      obj0.c = ((((obj0.e | obj0.c) * obj0.d) & -1871) * (-44101 - ((46372 + 61714) >= obj0.a)));
      a = (obj0.d++ );
      b = c;
    }
    h = obj0.c;
    if((((50818 + (d - g)) + ((obj0.e & 50946) * (-63411 > 50272))) > ((obj0.e++ ) + (obj0.c + (d & -35530))))) {
    } else {
      g = ((obj0.e * a) ^ ((+ a) ^ (60586 ^ e)));
      obj0.b = c;
      c = (+ (obj0.b ^ g));
    }
  }
}
e = ((((obj0.c + -38987) ^ (63313 ^ e)) ^ obj0.d) ^ (((obj0.a ? b : f) | obj0.b) + ((63188 < obj0.a) ? g : (3374 - 14508))));
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');
})();
