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

function test14() {
    var obj0 = {};
    var obj1 = {};
    var arrObj0 = {};
    var func1 = function(argFunc148, argMath149, argFunc150) {
    }
    var func2 = function() {
        for(var __loopvar0 = 0; __loopvar0 < 3; __loopvar0++) {
            var __loopvar1 = 0;
            while((func1.call(obj1, 1, (func1.call(arrObj0, 1, ({} instanceof ((typeof String == 'function') ? String : Object)), 1) ? (func1.call(arrObj0, 1, ({} instanceof ((typeof String == 'function') ? String : Object)), 1) * ((b >>= -428738333) + func1.call(arrObj0, 1, ({} instanceof ((typeof String == 'function') ? String : Object)), 1))) : 1), 1)) && __loopvar1 < 3) {
                __loopvar1++;
                GiantPrintArray.push('obj0.prop0 = ' + (obj0.prop0 | 0));
                for(var __loopvar2 = 0; __loopvar2 < 3; __loopvar2++) {
                    for(var __loopvar3 = 0; __loopvar3 < 3; __loopvar3++) {
                        eval('1 = 1');
                    }
                }
            }
        }
        (function() {
            'use strict';
        })();
    }
    var i8 = new Int8Array(256);
    var a = 1;
    function bar0(argMath151, argObj152, argFunc153) {
        i8[(((argObj152.length !== a) && (obj0.length == obj0.prop0))) & 255];
    }
    bar0.call(obj1, 1, 1, 1);
    func2.call(arrObj0);
};
test14();
test14();
test14();

WScript.Echo("pass");
