Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / web-tooling-benchmark / browser.js
1 /*
2 * This license applies to all parts of web-tooling-benchmark that are not
3 * externally maintained libraries. The externally maintained libraries
4 * used by web-tooling-benchmark are:
5
6 *   - The Backbone.js distribution, located in third_party/backbone-1.1.0.js.
7 *     This is copyrighted by Jeremy Ashkenas, DocumentCloud, and released
8 *     under the terms of the MIT license.
9
10 *   - The lexer from the CoffeeScript project, located in
11 *     third_party/coffeescript-lexer-2.0.1.coffee, which is copyrighted by
12 *     Jeremy Ashkenas, and relased under the terms of the MIT license.
13
14 *   - The jQuery distribution, located in third_party/jquery-3.2.1.js. This
15 *     is copyrighted by the JS Foundation and other contributors, and
16 *     released under the terms of the MIT license.
17
18 *   - The Lodash distribution, located in third_party/lodash.core-4.17.4.js
19 *     and third_party/lodash.min-4.17.4.js.map. This is copyrighted by
20 *     the JS Foundation and other contributors, and released under the
21 *     terms of the MIT license.
22
23 *   - The MooTools distribution, located in third_party/mootools-core-1.6.0.js.
24 *     This is copyrighted by Valerio Proietti, and released under the
25 *     terms of the MIT license.
26
27 *   - The Preact distribution, located in third_party/preact-8.2.5.js and
28 *     third_party/preact-8.2.5.js.map. This is copyrighted by Jason Miller,
29 *     and released under the terms of the MIT license.
30
31 *   - The Redux distribution, located in third_party/redux.min-3.7.2.js.
32 *     This is copyrighted by Dan Abramov, and released under the terms
33 *     of the MIT license.
34
35 *   - The source-map distribution, located in
36 *     third_party/source-map.min-0.5.7.map. This is copyrighted by the
37 *     Mozilla Foundation and contributors, and released under the terms
38 *     of a 3-clause BSD license.
39
40 *   - Several tests from the TodoMVC distribution, located in
41 *     third_party/speedometer-es2015-test-2.0.js and third_party/todomvc.
42 *     These are copyrighted by Addy Osmani, Sindre Sorhus, Pascal
43 *     Hartig, Stephen Sawchuk, and released under the terms of the
44 *     MIT license.
45
46 *   - The Underscore.js distribution, located in
47 *     third_party/underscore-1.8.3.js and
48 *     third_party/underscore.min-1.8.3.js.map. This is copyrighted by
49 *     Jeremy Ashkenas, and released under the terms of the MIT license.
50
51 *   - The VueJS distribution, located in
52 *     third_party/vue.runtime.esm-nobuble-2.4.4.js. This is copyrighted
53 *     Yuxi (Evan) You, and released under the terms of the MIT license.
54
55 * These libraries have their own licenses; we recommend you read them,
56 * as their terms may differ from the terms below.
57
58 * Copyright 2017, the V8 project authors. All rights reserved.
59 * Redistribution and use in source and binary forms, with or without
60 * modification, are permitted provided that the following conditions are
61 * met:
62
63 *     * Redistributions of source code must retain the above copyright
64 *       notice, this list of conditions and the following disclaimer.
65 *     * Redistributions in binary form must reproduce the above
66 *       copyright notice, this list of conditions and the following
67 *       disclaimer in the documentation and/or other materials provided
68 *       with the distribution.
69 *     * Neither the name of Google Inc. nor the names of its
70 *       contributors may be used to endorse or promote products derived
71 *       from this software without specific prior written permission.
72
73 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
74 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
75 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
76 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
77 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
78 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
79 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
80 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
81 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
82 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
83 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
84 */
85
86 // Work-around for the weird JaegerMonkey
87 // work-around inside benchmark.js.
88 const define = { amd: {} };
89
90 /******/ (function(modules) { // webpackBootstrap
91 /******/        // The module cache
92 /******/        var installedModules = {};
93 /******/
94 /******/        // The require function
95 /******/        function __webpack_require__(moduleId) {
96 /******/
97 /******/                // Check if module is in cache
98 /******/                if(installedModules[moduleId]) {
99 /******/                        return installedModules[moduleId].exports;
100 /******/                }
101 /******/                // Create a new module (and put it into the cache)
102 /******/                var module = installedModules[moduleId] = {
103 /******/                        i: moduleId,
104 /******/                        l: false,
105 /******/                        exports: {}
106 /******/                };
107 /******/
108 /******/                // Execute the module function
109 /******/                modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
110 /******/
111 /******/                // Flag the module as loaded
112 /******/                module.l = true;
113 /******/
114 /******/                // Return the exports of the module
115 /******/                return module.exports;
116 /******/        }
117 /******/
118 /******/
119 /******/        // expose the modules object (__webpack_modules__)
120 /******/        __webpack_require__.m = modules;
121 /******/
122 /******/        // expose the module cache
123 /******/        __webpack_require__.c = installedModules;
124 /******/
125 /******/        // define getter function for harmony exports
126 /******/        __webpack_require__.d = function(exports, name, getter) {
127 /******/                if(!__webpack_require__.o(exports, name)) {
128 /******/                        Object.defineProperty(exports, name, {
129 /******/                                configurable: false,
130 /******/                                enumerable: true,
131 /******/                                get: getter
132 /******/                        });
133 /******/                }
134 /******/        };
135 /******/
136 /******/        // getDefaultExport function for compatibility with non-harmony modules
137 /******/        __webpack_require__.n = function(module) {
138 /******/                var getter = module && module.__esModule ?
139 /******/                        function getDefault() { return module['default']; } :
140 /******/                        function getModuleExports() { return module; };
141 /******/                __webpack_require__.d(getter, 'a', getter);
142 /******/                return getter;
143 /******/        };
144 /******/
145 /******/        // Object.prototype.hasOwnProperty.call
146 /******/        __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
147 /******/
148 /******/        // __webpack_public_path__
149 /******/        __webpack_require__.p = "";
150 /******/
151 /******/        // Load entry module and return exports
152 /******/        return __webpack_require__(__webpack_require__.s = 387);
153 /******/ })
154 /************************************************************************/
155 /******/ ([
156 /* 0 */
157 /***/ (function(module, exports, __webpack_require__) {
158
159 "use strict";
160
161
162 Object.defineProperty(exports, "__esModule", {
163   value: true
164 });
165
166 var _Value = __webpack_require__(300);
167
168 Object.defineProperty(exports, "Value", {
169   enumerable: true,
170   get: function () {
171     return _interopRequireDefault(_Value).default;
172   }
173 });
174
175 var _ConcreteValue = __webpack_require__(654);
176
177 Object.defineProperty(exports, "ConcreteValue", {
178   enumerable: true,
179   get: function () {
180     return _interopRequireDefault(_ConcreteValue).default;
181   }
182 });
183
184 var _PrimitiveValue = __webpack_require__(301);
185
186 Object.defineProperty(exports, "PrimitiveValue", {
187   enumerable: true,
188   get: function () {
189     return _interopRequireDefault(_PrimitiveValue).default;
190   }
191 });
192
193 var _ObjectValue = __webpack_require__(655);
194
195 Object.defineProperty(exports, "ObjectValue", {
196   enumerable: true,
197   get: function () {
198     return _interopRequireDefault(_ObjectValue).default;
199   }
200 });
201
202 var _FunctionValue = __webpack_require__(920);
203
204 Object.defineProperty(exports, "FunctionValue", {
205   enumerable: true,
206   get: function () {
207     return _interopRequireDefault(_FunctionValue).default;
208   }
209 });
210
211 var _ECMAScriptFunctionValue = __webpack_require__(921);
212
213 Object.defineProperty(exports, "ECMAScriptFunctionValue", {
214   enumerable: true,
215   get: function () {
216     return _interopRequireDefault(_ECMAScriptFunctionValue).default;
217   }
218 });
219
220 var _ECMAScriptSourceFunctionValue = __webpack_require__(922);
221
222 Object.defineProperty(exports, "ECMAScriptSourceFunctionValue", {
223   enumerable: true,
224   get: function () {
225     return _interopRequireDefault(_ECMAScriptSourceFunctionValue).default;
226   }
227 });
228
229 var _BoundFunctionValue = __webpack_require__(923);
230
231 Object.defineProperty(exports, "BoundFunctionValue", {
232   enumerable: true,
233   get: function () {
234     return _interopRequireDefault(_BoundFunctionValue).default;
235   }
236 });
237
238 var _NativeFunctionValue = __webpack_require__(924);
239
240 Object.defineProperty(exports, "NativeFunctionValue", {
241   enumerable: true,
242   get: function () {
243     return _interopRequireDefault(_NativeFunctionValue).default;
244   }
245 });
246 Object.defineProperty(exports, "NativeFunctionCallback", {
247   enumerable: true,
248   get: function () {
249     return _NativeFunctionValue.NativeFunctionCallback;
250   }
251 });
252
253 var _ArrayValue = __webpack_require__(925);
254
255 Object.defineProperty(exports, "ArrayValue", {
256   enumerable: true,
257   get: function () {
258     return _interopRequireDefault(_ArrayValue).default;
259   }
260 });
261
262 var _UndefinedValue = __webpack_require__(926);
263
264 Object.defineProperty(exports, "UndefinedValue", {
265   enumerable: true,
266   get: function () {
267     return _interopRequireDefault(_UndefinedValue).default;
268   }
269 });
270
271 var _EmptyValue = __webpack_require__(927);
272
273 Object.defineProperty(exports, "EmptyValue", {
274   enumerable: true,
275   get: function () {
276     return _interopRequireDefault(_EmptyValue).default;
277   }
278 });
279
280 var _NullValue = __webpack_require__(928);
281
282 Object.defineProperty(exports, "NullValue", {
283   enumerable: true,
284   get: function () {
285     return _interopRequireDefault(_NullValue).default;
286   }
287 });
288
289 var _NumberValue = __webpack_require__(929);
290
291 Object.defineProperty(exports, "NumberValue", {
292   enumerable: true,
293   get: function () {
294     return _NumberValue.NumberValue;
295   }
296 });
297 Object.defineProperty(exports, "IntegralValue", {
298   enumerable: true,
299   get: function () {
300     return _NumberValue.IntegralValue;
301   }
302 });
303
304 var _ProxyValue = __webpack_require__(930);
305
306 Object.defineProperty(exports, "ProxyValue", {
307   enumerable: true,
308   get: function () {
309     return _interopRequireDefault(_ProxyValue).default;
310   }
311 });
312
313 var _StringExotic = __webpack_require__(931);
314
315 Object.defineProperty(exports, "StringExotic", {
316   enumerable: true,
317   get: function () {
318     return _interopRequireDefault(_StringExotic).default;
319   }
320 });
321
322 var _ArgumentsExotic = __webpack_require__(932);
323
324 Object.defineProperty(exports, "ArgumentsExotic", {
325   enumerable: true,
326   get: function () {
327     return _interopRequireDefault(_ArgumentsExotic).default;
328   }
329 });
330
331 var _IntegerIndexedExotic = __webpack_require__(933);
332
333 Object.defineProperty(exports, "IntegerIndexedExotic", {
334   enumerable: true,
335   get: function () {
336     return _interopRequireDefault(_IntegerIndexedExotic).default;
337   }
338 });
339
340 var _BooleanValue = __webpack_require__(934);
341
342 Object.defineProperty(exports, "BooleanValue", {
343   enumerable: true,
344   get: function () {
345     return _interopRequireDefault(_BooleanValue).default;
346   }
347 });
348
349 var _StringValue = __webpack_require__(935);
350
351 Object.defineProperty(exports, "StringValue", {
352   enumerable: true,
353   get: function () {
354     return _interopRequireDefault(_StringValue).default;
355   }
356 });
357
358 var _SymbolValue = __webpack_require__(936);
359
360 Object.defineProperty(exports, "SymbolValue", {
361   enumerable: true,
362   get: function () {
363     return _interopRequireDefault(_SymbolValue).default;
364   }
365 });
366
367 var _AbstractValue = __webpack_require__(368);
368
369 Object.defineProperty(exports, "AbstractValue", {
370   enumerable: true,
371   get: function () {
372     return _interopRequireDefault(_AbstractValue).default;
373   }
374 });
375 Object.defineProperty(exports, "AbstractValueBuildNodeFunction", {
376   enumerable: true,
377   get: function () {
378     return _AbstractValue.AbstractValueBuildNodeFunction;
379   }
380 });
381
382 var _AbstractObjectValue = __webpack_require__(370);
383
384 Object.defineProperty(exports, "AbstractObjectValue", {
385   enumerable: true,
386   get: function () {
387     return _interopRequireDefault(_AbstractObjectValue).default;
388   }
389 });
390
391 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
392
393 /***/ }),
394 /* 1 */
395 /***/ (function(module, exports, __webpack_require__) {
396
397 "use strict";
398
399
400 Object.defineProperty(exports, "__esModule", {
401   value: true
402 });
403 exports.default = invariant;
404 /**
405  * Copyright (c) 2017-present, Facebook, Inc.
406  * All rights reserved.
407  *
408  * This source code is licensed under the BSD-style license found in the
409  * LICENSE file in the root directory of this source tree. An additional grant
410  * of patent rights can be found in the PATENTS file in the same directory.
411  */
412
413 function invariant(condition, format) {
414   if (condition) return;
415   const message = `${format}
416 This is likely a bug in Prepack, not your code. Feel free to open an issue on GitHub.`;
417   let error = new Error(message);
418   error.name = "Invariant Violation";
419   throw error;
420 }
421
422 /***/ }),
423 /* 2 */
424 /***/ (function(module, exports, __webpack_require__) {
425
426 "use strict";
427
428
429 Object.defineProperty(exports, "__esModule", {
430   value: true
431 });
432 exports.setCreate = setCreate;
433 exports.setEnvironment = setEnvironment;
434 exports.setFunctions = setFunctions;
435 exports.setHavoc = setHavoc;
436 exports.setJoin = setJoin;
437 exports.setPath = setPath;
438 exports.setProperties = setProperties;
439 exports.setTo = setTo;
440 exports.setWiden = setWiden;
441 exports.setConcretize = setConcretize;
442 exports.setUtils = setUtils;
443 let Create = exports.Create = null; /**
444                                      * Copyright (c) 2017-present, Facebook, Inc.
445                                      * All rights reserved.
446                                      *
447                                      * This source code is licensed under the BSD-style license found in the
448                                      * LICENSE file in the root directory of this source tree. An additional grant
449                                      * of patent rights can be found in the PATENTS file in the same directory.
450                                      */
451
452 let Environment = exports.Environment = null;
453 let Functions = exports.Functions = null;
454 let Havoc = exports.Havoc = null;
455 let Join = exports.Join = null;
456 let Path = exports.Path = null;
457 let Properties = exports.Properties = null;
458 let To = exports.To = null;
459 let Widen = exports.Widen = null;
460 let concretize = exports.concretize = null;
461 let Utils = exports.Utils = null;
462
463 function setCreate(singleton) {
464   exports.Create = Create = singleton;
465 }
466
467 function setEnvironment(singleton) {
468   exports.Environment = Environment = singleton;
469 }
470
471 function setFunctions(singleton) {
472   exports.Functions = Functions = singleton;
473 }
474
475 function setHavoc(singleton) {
476   exports.Havoc = Havoc = singleton;
477 }
478
479 function setJoin(singleton) {
480   exports.Join = Join = singleton;
481 }
482
483 function setPath(singleton) {
484   exports.Path = Path = singleton;
485 }
486
487 function setProperties(singleton) {
488   exports.Properties = Properties = singleton;
489 }
490
491 function setTo(singleton) {
492   exports.To = To = singleton;
493 }
494
495 function setWiden(singleton) {
496   exports.Widen = Widen = singleton;
497 }
498
499 function setConcretize(singleton) {
500   exports.concretize = concretize = singleton;
501 }
502
503 function setUtils(singleton) {
504   exports.Utils = Utils = singleton;
505 }
506
507 /***/ }),
508 /* 3 */
509 /***/ (function(module, exports, __webpack_require__) {
510
511 "use strict";
512
513
514 Object.defineProperty(exports, "__esModule", {
515   value: true
516 });
517 exports.PossiblyNormalCompletion = exports.JoinedAbruptCompletions = exports.ReturnCompletion = exports.BreakCompletion = exports.ContinueCompletion = exports.ThrowCompletion = exports.AbruptCompletion = exports.NormalCompletion = exports.Completion = undefined;
518
519 var _invariant = __webpack_require__(1);
520
521 var _invariant2 = _interopRequireDefault(_invariant);
522
523 var _index = __webpack_require__(0);
524
525 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
526
527 class Completion {
528   constructor(value, location, target) {
529     this.value = value;
530     this.target = target;
531     this.location = location;
532   }
533
534 }
535
536 exports.Completion = Completion; // Normal completions are returned just like spec completions
537 /**
538  * Copyright (c) 2017-present, Facebook, Inc.
539  * All rights reserved.
540  *
541  * This source code is licensed under the BSD-style license found in the
542  * LICENSE file in the root directory of this source tree. An additional grant
543  * of patent rights can be found in the PATENTS file in the same directory.
544  */
545
546 class NormalCompletion extends Completion {}
547
548 exports.NormalCompletion = NormalCompletion; // Abrupt completions are thrown as exeptions, to make it a easier
549 // to quickly get to the matching high level construct.
550
551 class AbruptCompletion extends Completion {}
552
553 exports.AbruptCompletion = AbruptCompletion;
554 class ThrowCompletion extends AbruptCompletion {
555   constructor(value, location, nativeStack) {
556     super(value, location);
557     this.nativeStack = nativeStack || new Error().stack;
558   }
559
560 }
561 exports.ThrowCompletion = ThrowCompletion;
562 class ContinueCompletion extends AbruptCompletion {
563   constructor(value, location, target) {
564     super(value, location, target);
565   }
566 }
567
568 exports.ContinueCompletion = ContinueCompletion;
569 class BreakCompletion extends AbruptCompletion {
570   constructor(value, location, target) {
571     super(value, location, target);
572   }
573 }
574
575 exports.BreakCompletion = BreakCompletion;
576 class ReturnCompletion extends AbruptCompletion {
577   constructor(value, location) {
578     super(value, location);
579   }
580 }
581
582 exports.ReturnCompletion = ReturnCompletion;
583 class JoinedAbruptCompletions extends AbruptCompletion {
584   constructor(realm, joinCondition, consequent, consequentEffects, alternate, alternateEffects) {
585     super(realm.intrinsics.empty, consequent.location);
586     this.joinCondition = joinCondition;
587     this.consequent = consequent;
588     this.consequentEffects = consequentEffects;
589     this.alternate = alternate;
590     this.alternateEffects = alternateEffects;
591   }
592
593   containsBreakOrContinue() {
594     if (this.consequent instanceof BreakCompletion || this.consequent instanceof ContinueCompletion) return true;
595     if (this.alternate instanceof BreakCompletion || this.alternate instanceof ContinueCompletion) return true;
596     if (this.consequent instanceof JoinedAbruptCompletions) {
597       if (this.consequent.containsBreakOrContinue()) return true;
598     }
599     if (this.alternate instanceof JoinedAbruptCompletions) {
600       if (this.alternate.containsBreakOrContinue()) return true;
601     }
602     return false;
603   }
604 }
605
606 exports.JoinedAbruptCompletions = JoinedAbruptCompletions; // Possibly normal completions have to be treated like normal completions
607 // and are thus never thrown. At the end of a try block or loop body, however,
608 // action must be taken to deal with the possibly abrupt case of the completion.
609
610 class PossiblyNormalCompletion extends NormalCompletion {
611   constructor(value, joinCondition, consequent, consequentEffects, alternate, alternateEffects, pathConditions, savedPathConditions, savedEffects = undefined) {
612     (0, _invariant2.default)(consequent === consequentEffects[0]);
613     (0, _invariant2.default)(alternate === alternateEffects[0]);
614     (0, _invariant2.default)(consequent instanceof NormalCompletion || consequent instanceof _index.Value || alternate instanceof NormalCompletion || alternate instanceof _index.Value);
615     (0, _invariant2.default)(consequent instanceof AbruptCompletion || alternate instanceof AbruptCompletion);
616     (0, _invariant2.default)(value === consequent || consequent instanceof AbruptCompletion || consequent instanceof NormalCompletion && value === consequent.value);
617     (0, _invariant2.default)(value === alternate || alternate instanceof AbruptCompletion || alternate instanceof NormalCompletion && value === alternate.value);
618     let loc = consequent instanceof AbruptCompletion ? consequent.location : alternate instanceof Completion ? alternate.location : alternate.expressionLocation;
619     super(value, loc);
620     this.joinCondition = joinCondition;
621     this.consequent = consequent;
622     this.consequentEffects = consequentEffects;
623     this.alternate = alternate;
624     this.alternateEffects = alternateEffects;
625     this.savedEffects = savedEffects;
626     this.pathConditions = pathConditions;
627     this.savedPathConditions = savedPathConditions;
628   }
629
630   containsBreakOrContinue() {
631     if (this.consequent instanceof BreakCompletion || this.consequent instanceof ContinueCompletion) return true;
632     if (this.alternate instanceof BreakCompletion || this.alternate instanceof ContinueCompletion) return true;
633     if (this.consequent instanceof JoinedAbruptCompletions || this.consequent instanceof PossiblyNormalCompletion) {
634       if (this.consequent.containsBreakOrContinue()) return true;
635     }
636     if (this.alternate instanceof JoinedAbruptCompletions || this.alternate instanceof PossiblyNormalCompletion) {
637       if (this.alternate.containsBreakOrContinue()) return true;
638     }
639     return false;
640   }
641 }
642 exports.PossiblyNormalCompletion = PossiblyNormalCompletion;
643
644 /***/ }),
645 /* 4 */
646 /***/ (function(module, exports, __webpack_require__) {
647
648 "use strict";
649
650
651 exports.__esModule = true;
652 exports.createTypeAnnotationBasedOnTypeof = exports.removeTypeDuplicates = exports.createUnionTypeAnnotation = exports.valueToNode = exports.toBlock = exports.toExpression = exports.toStatement = exports.toBindingIdentifierName = exports.toIdentifier = exports.toKeyAlias = exports.toSequenceExpression = exports.toComputedKey = exports.isNodesEquivalent = exports.isImmutable = exports.isScope = exports.isSpecifierDefault = exports.isVar = exports.isBlockScoped = exports.isLet = exports.isValidIdentifier = exports.isReferenced = exports.isBinding = exports.getOuterBindingIdentifiers = exports.getBindingIdentifiers = exports.TYPES = exports.react = exports.DEPRECATED_KEYS = exports.BUILDER_KEYS = exports.NODE_FIELDS = exports.ALIAS_KEYS = exports.VISITOR_KEYS = exports.NOT_LOCAL_BINDING = exports.BLOCK_SCOPED_SYMBOL = exports.INHERIT_KEYS = exports.UNARY_OPERATORS = exports.STRING_UNARY_OPERATORS = exports.NUMBER_UNARY_OPERATORS = exports.BOOLEAN_UNARY_OPERATORS = exports.BINARY_OPERATORS = exports.NUMBER_BINARY_OPERATORS = exports.BOOLEAN_BINARY_OPERATORS = exports.COMPARISON_BINARY_OPERATORS = exports.EQUALITY_BINARY_OPERATORS = exports.BOOLEAN_NUMBER_BINARY_OPERATORS = exports.UPDATE_OPERATORS = exports.LOGICAL_OPERATORS = exports.COMMENT_KEYS = exports.FOR_INIT_KEYS = exports.FLATTENABLE_KEYS = exports.STATEMENT_OR_BLOCK_KEYS = undefined;
653
654 var _getOwnPropertySymbols = __webpack_require__(787);
655
656 var _getOwnPropertySymbols2 = _interopRequireDefault(_getOwnPropertySymbols);
657
658 var _getIterator2 = __webpack_require__(13);
659
660 var _getIterator3 = _interopRequireDefault(_getIterator2);
661
662 var _keys = __webpack_require__(91);
663
664 var _keys2 = _interopRequireDefault(_keys);
665
666 var _stringify = __webpack_require__(108);
667
668 var _stringify2 = _interopRequireDefault(_stringify);
669
670 var _constants = __webpack_require__(214);
671
672 Object.defineProperty(exports, "STATEMENT_OR_BLOCK_KEYS", {
673   enumerable: true,
674   get: function get() {
675     return _constants.STATEMENT_OR_BLOCK_KEYS;
676   }
677 });
678 Object.defineProperty(exports, "FLATTENABLE_KEYS", {
679   enumerable: true,
680   get: function get() {
681     return _constants.FLATTENABLE_KEYS;
682   }
683 });
684 Object.defineProperty(exports, "FOR_INIT_KEYS", {
685   enumerable: true,
686   get: function get() {
687     return _constants.FOR_INIT_KEYS;
688   }
689 });
690 Object.defineProperty(exports, "COMMENT_KEYS", {
691   enumerable: true,
692   get: function get() {
693     return _constants.COMMENT_KEYS;
694   }
695 });
696 Object.defineProperty(exports, "LOGICAL_OPERATORS", {
697   enumerable: true,
698   get: function get() {
699     return _constants.LOGICAL_OPERATORS;
700   }
701 });
702 Object.defineProperty(exports, "UPDATE_OPERATORS", {
703   enumerable: true,
704   get: function get() {
705     return _constants.UPDATE_OPERATORS;
706   }
707 });
708 Object.defineProperty(exports, "BOOLEAN_NUMBER_BINARY_OPERATORS", {
709   enumerable: true,
710   get: function get() {
711     return _constants.BOOLEAN_NUMBER_BINARY_OPERATORS;
712   }
713 });
714 Object.defineProperty(exports, "EQUALITY_BINARY_OPERATORS", {
715   enumerable: true,
716   get: function get() {
717     return _constants.EQUALITY_BINARY_OPERATORS;
718   }
719 });
720 Object.defineProperty(exports, "COMPARISON_BINARY_OPERATORS", {
721   enumerable: true,
722   get: function get() {
723     return _constants.COMPARISON_BINARY_OPERATORS;
724   }
725 });
726 Object.defineProperty(exports, "BOOLEAN_BINARY_OPERATORS", {
727   enumerable: true,
728   get: function get() {
729     return _constants.BOOLEAN_BINARY_OPERATORS;
730   }
731 });
732 Object.defineProperty(exports, "NUMBER_BINARY_OPERATORS", {
733   enumerable: true,
734   get: function get() {
735     return _constants.NUMBER_BINARY_OPERATORS;
736   }
737 });
738 Object.defineProperty(exports, "BINARY_OPERATORS", {
739   enumerable: true,
740   get: function get() {
741     return _constants.BINARY_OPERATORS;
742   }
743 });
744 Object.defineProperty(exports, "BOOLEAN_UNARY_OPERATORS", {
745   enumerable: true,
746   get: function get() {
747     return _constants.BOOLEAN_UNARY_OPERATORS;
748   }
749 });
750 Object.defineProperty(exports, "NUMBER_UNARY_OPERATORS", {
751   enumerable: true,
752   get: function get() {
753     return _constants.NUMBER_UNARY_OPERATORS;
754   }
755 });
756 Object.defineProperty(exports, "STRING_UNARY_OPERATORS", {
757   enumerable: true,
758   get: function get() {
759     return _constants.STRING_UNARY_OPERATORS;
760   }
761 });
762 Object.defineProperty(exports, "UNARY_OPERATORS", {
763   enumerable: true,
764   get: function get() {
765     return _constants.UNARY_OPERATORS;
766   }
767 });
768 Object.defineProperty(exports, "INHERIT_KEYS", {
769   enumerable: true,
770   get: function get() {
771     return _constants.INHERIT_KEYS;
772   }
773 });
774 Object.defineProperty(exports, "BLOCK_SCOPED_SYMBOL", {
775   enumerable: true,
776   get: function get() {
777     return _constants.BLOCK_SCOPED_SYMBOL;
778   }
779 });
780 Object.defineProperty(exports, "NOT_LOCAL_BINDING", {
781   enumerable: true,
782   get: function get() {
783     return _constants.NOT_LOCAL_BINDING;
784   }
785 });
786 exports.is = is;
787 exports.isType = isType;
788 exports.validate = validate;
789 exports.shallowEqual = shallowEqual;
790 exports.appendToMemberExpression = appendToMemberExpression;
791 exports.prependToMemberExpression = prependToMemberExpression;
792 exports.ensureBlock = ensureBlock;
793 exports.clone = clone;
794 exports.cloneWithoutLoc = cloneWithoutLoc;
795 exports.cloneDeep = cloneDeep;
796 exports.buildMatchMemberExpression = buildMatchMemberExpression;
797 exports.removeComments = removeComments;
798 exports.inheritsComments = inheritsComments;
799 exports.inheritTrailingComments = inheritTrailingComments;
800 exports.inheritLeadingComments = inheritLeadingComments;
801 exports.inheritInnerComments = inheritInnerComments;
802 exports.inherits = inherits;
803 exports.assertNode = assertNode;
804 exports.isNode = isNode;
805 exports.traverseFast = traverseFast;
806 exports.removeProperties = removeProperties;
807 exports.removePropertiesDeep = removePropertiesDeep;
808
809 var _retrievers = __webpack_require__(347);
810
811 Object.defineProperty(exports, "getBindingIdentifiers", {
812   enumerable: true,
813   get: function get() {
814     return _retrievers.getBindingIdentifiers;
815   }
816 });
817 Object.defineProperty(exports, "getOuterBindingIdentifiers", {
818   enumerable: true,
819   get: function get() {
820     return _retrievers.getOuterBindingIdentifiers;
821   }
822 });
823
824 var _validators = __webpack_require__(791);
825
826 Object.defineProperty(exports, "isBinding", {
827   enumerable: true,
828   get: function get() {
829     return _validators.isBinding;
830   }
831 });
832 Object.defineProperty(exports, "isReferenced", {
833   enumerable: true,
834   get: function get() {
835     return _validators.isReferenced;
836   }
837 });
838 Object.defineProperty(exports, "isValidIdentifier", {
839   enumerable: true,
840   get: function get() {
841     return _validators.isValidIdentifier;
842   }
843 });
844 Object.defineProperty(exports, "isLet", {
845   enumerable: true,
846   get: function get() {
847     return _validators.isLet;
848   }
849 });
850 Object.defineProperty(exports, "isBlockScoped", {
851   enumerable: true,
852   get: function get() {
853     return _validators.isBlockScoped;
854   }
855 });
856 Object.defineProperty(exports, "isVar", {
857   enumerable: true,
858   get: function get() {
859     return _validators.isVar;
860   }
861 });
862 Object.defineProperty(exports, "isSpecifierDefault", {
863   enumerable: true,
864   get: function get() {
865     return _validators.isSpecifierDefault;
866   }
867 });
868 Object.defineProperty(exports, "isScope", {
869   enumerable: true,
870   get: function get() {
871     return _validators.isScope;
872   }
873 });
874 Object.defineProperty(exports, "isImmutable", {
875   enumerable: true,
876   get: function get() {
877     return _validators.isImmutable;
878   }
879 });
880 Object.defineProperty(exports, "isNodesEquivalent", {
881   enumerable: true,
882   get: function get() {
883     return _validators.isNodesEquivalent;
884   }
885 });
886
887 var _converters = __webpack_require__(794);
888
889 Object.defineProperty(exports, "toComputedKey", {
890   enumerable: true,
891   get: function get() {
892     return _converters.toComputedKey;
893   }
894 });
895 Object.defineProperty(exports, "toSequenceExpression", {
896   enumerable: true,
897   get: function get() {
898     return _converters.toSequenceExpression;
899   }
900 });
901 Object.defineProperty(exports, "toKeyAlias", {
902   enumerable: true,
903   get: function get() {
904     return _converters.toKeyAlias;
905   }
906 });
907 Object.defineProperty(exports, "toIdentifier", {
908   enumerable: true,
909   get: function get() {
910     return _converters.toIdentifier;
911   }
912 });
913 Object.defineProperty(exports, "toBindingIdentifierName", {
914   enumerable: true,
915   get: function get() {
916     return _converters.toBindingIdentifierName;
917   }
918 });
919 Object.defineProperty(exports, "toStatement", {
920   enumerable: true,
921   get: function get() {
922     return _converters.toStatement;
923   }
924 });
925 Object.defineProperty(exports, "toExpression", {
926   enumerable: true,
927   get: function get() {
928     return _converters.toExpression;
929   }
930 });
931 Object.defineProperty(exports, "toBlock", {
932   enumerable: true,
933   get: function get() {
934     return _converters.toBlock;
935   }
936 });
937 Object.defineProperty(exports, "valueToNode", {
938   enumerable: true,
939   get: function get() {
940     return _converters.valueToNode;
941   }
942 });
943
944 var _flow = __webpack_require__(801);
945
946 Object.defineProperty(exports, "createUnionTypeAnnotation", {
947   enumerable: true,
948   get: function get() {
949     return _flow.createUnionTypeAnnotation;
950   }
951 });
952 Object.defineProperty(exports, "removeTypeDuplicates", {
953   enumerable: true,
954   get: function get() {
955     return _flow.removeTypeDuplicates;
956   }
957 });
958 Object.defineProperty(exports, "createTypeAnnotationBasedOnTypeof", {
959   enumerable: true,
960   get: function get() {
961     return _flow.createTypeAnnotationBasedOnTypeof;
962   }
963 });
964
965 var _toFastProperties = __webpack_require__(802);
966
967 var _toFastProperties2 = _interopRequireDefault(_toFastProperties);
968
969 var _clone = __webpack_require__(350);
970
971 var _clone2 = _interopRequireDefault(_clone);
972
973 var _uniq = __webpack_require__(825);
974
975 var _uniq2 = _interopRequireDefault(_uniq);
976
977 __webpack_require__(833);
978
979 var _definitions = __webpack_require__(68);
980
981 var _react2 = __webpack_require__(840);
982
983 var _react = _interopRequireWildcard(_react2);
984
985 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
986
987 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
988
989 var t = exports;
990
991 function registerType(type) {
992   var is = t["is" + type];
993   if (!is) {
994     is = t["is" + type] = function (node, opts) {
995       return t.is(type, node, opts);
996     };
997   }
998
999   t["assert" + type] = function (node, opts) {
1000     opts = opts || {};
1001     if (!is(node, opts)) {
1002       throw new Error("Expected type " + (0, _stringify2.default)(type) + " with option " + (0, _stringify2.default)(opts));
1003     }
1004   };
1005 }
1006
1007 exports.VISITOR_KEYS = _definitions.VISITOR_KEYS;
1008 exports.ALIAS_KEYS = _definitions.ALIAS_KEYS;
1009 exports.NODE_FIELDS = _definitions.NODE_FIELDS;
1010 exports.BUILDER_KEYS = _definitions.BUILDER_KEYS;
1011 exports.DEPRECATED_KEYS = _definitions.DEPRECATED_KEYS;
1012 exports.react = _react;
1013
1014
1015 for (var type in t.VISITOR_KEYS) {
1016   registerType(type);
1017 }
1018
1019 t.FLIPPED_ALIAS_KEYS = {};
1020
1021 (0, _keys2.default)(t.ALIAS_KEYS).forEach(function (type) {
1022   t.ALIAS_KEYS[type].forEach(function (alias) {
1023     var types = t.FLIPPED_ALIAS_KEYS[alias] = t.FLIPPED_ALIAS_KEYS[alias] || [];
1024     types.push(type);
1025   });
1026 });
1027
1028 (0, _keys2.default)(t.FLIPPED_ALIAS_KEYS).forEach(function (type) {
1029   t[type.toUpperCase() + "_TYPES"] = t.FLIPPED_ALIAS_KEYS[type];
1030   registerType(type);
1031 });
1032
1033 var TYPES = exports.TYPES = (0, _keys2.default)(t.VISITOR_KEYS).concat((0, _keys2.default)(t.FLIPPED_ALIAS_KEYS)).concat((0, _keys2.default)(t.DEPRECATED_KEYS));
1034
1035 function is(type, node, opts) {
1036   if (!node) return false;
1037
1038   var matches = isType(node.type, type);
1039   if (!matches) return false;
1040
1041   if (typeof opts === "undefined") {
1042     return true;
1043   } else {
1044     return t.shallowEqual(node, opts);
1045   }
1046 }
1047
1048 function isType(nodeType, targetType) {
1049   if (nodeType === targetType) return true;
1050
1051   if (t.ALIAS_KEYS[targetType]) return false;
1052
1053   var aliases = t.FLIPPED_ALIAS_KEYS[targetType];
1054   if (aliases) {
1055     if (aliases[0] === nodeType) return true;
1056
1057     for (var _iterator = aliases, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
1058       var _ref;
1059
1060       if (_isArray) {
1061         if (_i >= _iterator.length) break;
1062         _ref = _iterator[_i++];
1063       } else {
1064         _i = _iterator.next();
1065         if (_i.done) break;
1066         _ref = _i.value;
1067       }
1068
1069       var alias = _ref;
1070
1071       if (nodeType === alias) return true;
1072     }
1073   }
1074
1075   return false;
1076 }
1077
1078 (0, _keys2.default)(t.BUILDER_KEYS).forEach(function (type) {
1079   var keys = t.BUILDER_KEYS[type];
1080
1081   function builder() {
1082     if (arguments.length > keys.length) {
1083       throw new Error("t." + type + ": Too many arguments passed. Received " + arguments.length + " but can receive " + ("no more than " + keys.length));
1084     }
1085
1086     var node = {};
1087     node.type = type;
1088
1089     var i = 0;
1090
1091     for (var _iterator2 = keys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
1092       var _ref2;
1093
1094       if (_isArray2) {
1095         if (_i2 >= _iterator2.length) break;
1096         _ref2 = _iterator2[_i2++];
1097       } else {
1098         _i2 = _iterator2.next();
1099         if (_i2.done) break;
1100         _ref2 = _i2.value;
1101       }
1102
1103       var _key = _ref2;
1104
1105       var field = t.NODE_FIELDS[type][_key];
1106
1107       var arg = arguments[i++];
1108       if (arg === undefined) arg = (0, _clone2.default)(field.default);
1109
1110       node[_key] = arg;
1111     }
1112
1113     for (var key in node) {
1114       validate(node, key, node[key]);
1115     }
1116
1117     return node;
1118   }
1119
1120   t[type] = builder;
1121   t[type[0].toLowerCase() + type.slice(1)] = builder;
1122 });
1123
1124 var _loop = function _loop(_type) {
1125   var newType = t.DEPRECATED_KEYS[_type];
1126
1127   function proxy(fn) {
1128     return function () {
1129       console.trace("The node type " + _type + " has been renamed to " + newType);
1130       return fn.apply(this, arguments);
1131     };
1132   }
1133
1134   t[_type] = t[_type[0].toLowerCase() + _type.slice(1)] = proxy(t[newType]);
1135   t["is" + _type] = proxy(t["is" + newType]);
1136   t["assert" + _type] = proxy(t["assert" + newType]);
1137 };
1138
1139 for (var _type in t.DEPRECATED_KEYS) {
1140   _loop(_type);
1141 }
1142
1143 function validate(node, key, val) {
1144   if (!node) return;
1145
1146   var fields = t.NODE_FIELDS[node.type];
1147   if (!fields) return;
1148
1149   var field = fields[key];
1150   if (!field || !field.validate) return;
1151   if (field.optional && val == null) return;
1152
1153   field.validate(node, key, val);
1154 }
1155
1156 function shallowEqual(actual, expected) {
1157   var keys = (0, _keys2.default)(expected);
1158
1159   for (var _iterator3 = keys, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
1160     var _ref3;
1161
1162     if (_isArray3) {
1163       if (_i3 >= _iterator3.length) break;
1164       _ref3 = _iterator3[_i3++];
1165     } else {
1166       _i3 = _iterator3.next();
1167       if (_i3.done) break;
1168       _ref3 = _i3.value;
1169     }
1170
1171     var key = _ref3;
1172
1173     if (actual[key] !== expected[key]) {
1174       return false;
1175     }
1176   }
1177
1178   return true;
1179 }
1180
1181 function appendToMemberExpression(member, append, computed) {
1182   member.object = t.memberExpression(member.object, member.property, member.computed);
1183   member.property = append;
1184   member.computed = !!computed;
1185   return member;
1186 }
1187
1188 function prependToMemberExpression(member, prepend) {
1189   member.object = t.memberExpression(prepend, member.object);
1190   return member;
1191 }
1192
1193 function ensureBlock(node) {
1194   var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "body";
1195
1196   return node[key] = t.toBlock(node[key], node);
1197 }
1198
1199 function clone(node) {
1200   if (!node) return node;
1201   var newNode = {};
1202   for (var key in node) {
1203     if (key[0] === "_") continue;
1204     newNode[key] = node[key];
1205   }
1206   return newNode;
1207 }
1208
1209 function cloneWithoutLoc(node) {
1210   var newNode = clone(node);
1211   delete newNode.loc;
1212   return newNode;
1213 }
1214
1215 function cloneDeep(node) {
1216   if (!node) return node;
1217   var newNode = {};
1218
1219   for (var key in node) {
1220     if (key[0] === "_") continue;
1221
1222     var val = node[key];
1223
1224     if (val) {
1225       if (val.type) {
1226         val = t.cloneDeep(val);
1227       } else if (Array.isArray(val)) {
1228         val = val.map(t.cloneDeep);
1229       }
1230     }
1231
1232     newNode[key] = val;
1233   }
1234
1235   return newNode;
1236 }
1237
1238 function buildMatchMemberExpression(match, allowPartial) {
1239   var parts = match.split(".");
1240
1241   return function (member) {
1242     if (!t.isMemberExpression(member)) return false;
1243
1244     var search = [member];
1245     var i = 0;
1246
1247     while (search.length) {
1248       var node = search.shift();
1249
1250       if (allowPartial && i === parts.length) {
1251         return true;
1252       }
1253
1254       if (t.isIdentifier(node)) {
1255         if (parts[i] !== node.name) return false;
1256       } else if (t.isStringLiteral(node)) {
1257         if (parts[i] !== node.value) return false;
1258       } else if (t.isMemberExpression(node)) {
1259         if (node.computed && !t.isStringLiteral(node.property)) {
1260           return false;
1261         } else {
1262           search.push(node.object);
1263           search.push(node.property);
1264           continue;
1265         }
1266       } else {
1267         return false;
1268       }
1269
1270       if (++i > parts.length) {
1271         return false;
1272       }
1273     }
1274
1275     return true;
1276   };
1277 }
1278
1279 function removeComments(node) {
1280   for (var _iterator4 = t.COMMENT_KEYS, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
1281     var _ref4;
1282
1283     if (_isArray4) {
1284       if (_i4 >= _iterator4.length) break;
1285       _ref4 = _iterator4[_i4++];
1286     } else {
1287       _i4 = _iterator4.next();
1288       if (_i4.done) break;
1289       _ref4 = _i4.value;
1290     }
1291
1292     var key = _ref4;
1293
1294     delete node[key];
1295   }
1296   return node;
1297 }
1298
1299 function inheritsComments(child, parent) {
1300   inheritTrailingComments(child, parent);
1301   inheritLeadingComments(child, parent);
1302   inheritInnerComments(child, parent);
1303   return child;
1304 }
1305
1306 function inheritTrailingComments(child, parent) {
1307   _inheritComments("trailingComments", child, parent);
1308 }
1309
1310 function inheritLeadingComments(child, parent) {
1311   _inheritComments("leadingComments", child, parent);
1312 }
1313
1314 function inheritInnerComments(child, parent) {
1315   _inheritComments("innerComments", child, parent);
1316 }
1317
1318 function _inheritComments(key, child, parent) {
1319   if (child && parent) {
1320     child[key] = (0, _uniq2.default)([].concat(child[key], parent[key]).filter(Boolean));
1321   }
1322 }
1323
1324 function inherits(child, parent) {
1325   if (!child || !parent) return child;
1326
1327   for (var _iterator5 = t.INHERIT_KEYS.optional, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : (0, _getIterator3.default)(_iterator5);;) {
1328     var _ref5;
1329
1330     if (_isArray5) {
1331       if (_i5 >= _iterator5.length) break;
1332       _ref5 = _iterator5[_i5++];
1333     } else {
1334       _i5 = _iterator5.next();
1335       if (_i5.done) break;
1336       _ref5 = _i5.value;
1337     }
1338
1339     var _key2 = _ref5;
1340
1341     if (child[_key2] == null) {
1342       child[_key2] = parent[_key2];
1343     }
1344   }
1345
1346   for (var key in parent) {
1347     if (key[0] === "_") child[key] = parent[key];
1348   }
1349
1350   for (var _iterator6 = t.INHERIT_KEYS.force, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : (0, _getIterator3.default)(_iterator6);;) {
1351     var _ref6;
1352
1353     if (_isArray6) {
1354       if (_i6 >= _iterator6.length) break;
1355       _ref6 = _iterator6[_i6++];
1356     } else {
1357       _i6 = _iterator6.next();
1358       if (_i6.done) break;
1359       _ref6 = _i6.value;
1360     }
1361
1362     var _key3 = _ref6;
1363
1364     child[_key3] = parent[_key3];
1365   }
1366
1367   t.inheritsComments(child, parent);
1368
1369   return child;
1370 }
1371
1372 function assertNode(node) {
1373   if (!isNode(node)) {
1374     throw new TypeError("Not a valid node " + (node && node.type));
1375   }
1376 }
1377
1378 function isNode(node) {
1379   return !!(node && _definitions.VISITOR_KEYS[node.type]);
1380 }
1381
1382 (0, _toFastProperties2.default)(t);
1383 (0, _toFastProperties2.default)(t.VISITOR_KEYS);
1384
1385 function traverseFast(node, enter, opts) {
1386   if (!node) return;
1387
1388   var keys = t.VISITOR_KEYS[node.type];
1389   if (!keys) return;
1390
1391   opts = opts || {};
1392   enter(node, opts);
1393
1394   for (var _iterator7 = keys, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : (0, _getIterator3.default)(_iterator7);;) {
1395     var _ref7;
1396
1397     if (_isArray7) {
1398       if (_i7 >= _iterator7.length) break;
1399       _ref7 = _iterator7[_i7++];
1400     } else {
1401       _i7 = _iterator7.next();
1402       if (_i7.done) break;
1403       _ref7 = _i7.value;
1404     }
1405
1406     var key = _ref7;
1407
1408     var subNode = node[key];
1409
1410     if (Array.isArray(subNode)) {
1411       for (var _iterator8 = subNode, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : (0, _getIterator3.default)(_iterator8);;) {
1412         var _ref8;
1413
1414         if (_isArray8) {
1415           if (_i8 >= _iterator8.length) break;
1416           _ref8 = _iterator8[_i8++];
1417         } else {
1418           _i8 = _iterator8.next();
1419           if (_i8.done) break;
1420           _ref8 = _i8.value;
1421         }
1422
1423         var _node = _ref8;
1424
1425         traverseFast(_node, enter, opts);
1426       }
1427     } else {
1428       traverseFast(subNode, enter, opts);
1429     }
1430   }
1431 }
1432
1433 var CLEAR_KEYS = ["tokens", "start", "end", "loc", "raw", "rawValue"];
1434
1435 var CLEAR_KEYS_PLUS_COMMENTS = t.COMMENT_KEYS.concat(["comments"]).concat(CLEAR_KEYS);
1436
1437 function removeProperties(node, opts) {
1438   opts = opts || {};
1439   var map = opts.preserveComments ? CLEAR_KEYS : CLEAR_KEYS_PLUS_COMMENTS;
1440   for (var _iterator9 = map, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : (0, _getIterator3.default)(_iterator9);;) {
1441     var _ref9;
1442
1443     if (_isArray9) {
1444       if (_i9 >= _iterator9.length) break;
1445       _ref9 = _iterator9[_i9++];
1446     } else {
1447       _i9 = _iterator9.next();
1448       if (_i9.done) break;
1449       _ref9 = _i9.value;
1450     }
1451
1452     var _key4 = _ref9;
1453
1454     if (node[_key4] != null) node[_key4] = undefined;
1455   }
1456
1457   for (var key in node) {
1458     if (key[0] === "_" && node[key] != null) node[key] = undefined;
1459   }
1460
1461   var syms = (0, _getOwnPropertySymbols2.default)(node);
1462   for (var _iterator10 = syms, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : (0, _getIterator3.default)(_iterator10);;) {
1463     var _ref10;
1464
1465     if (_isArray10) {
1466       if (_i10 >= _iterator10.length) break;
1467       _ref10 = _iterator10[_i10++];
1468     } else {
1469       _i10 = _iterator10.next();
1470       if (_i10.done) break;
1471       _ref10 = _i10.value;
1472     }
1473
1474     var sym = _ref10;
1475
1476     node[sym] = null;
1477   }
1478 }
1479
1480 function removePropertiesDeep(tree, opts) {
1481   traverseFast(tree, removeProperties, opts);
1482   return tree;
1483 }
1484
1485 /***/ }),
1486 /* 5 */
1487 /***/ (function(module, exports, __webpack_require__) {
1488
1489 "use strict";
1490
1491
1492 Object.defineProperty(exports, "__esModule", {
1493   value: true
1494 });
1495
1496 var _abstract = __webpack_require__(19);
1497
1498 Object.keys(_abstract).forEach(function (key) {
1499   if (key === "default" || key === "__esModule") return;
1500   Object.defineProperty(exports, key, {
1501     enumerable: true,
1502     get: function () {
1503       return _abstract[key];
1504     }
1505   });
1506 });
1507
1508 var _call = __webpack_require__(20);
1509
1510 Object.keys(_call).forEach(function (key) {
1511   if (key === "default" || key === "__esModule") return;
1512   Object.defineProperty(exports, key, {
1513     enumerable: true,
1514     get: function () {
1515       return _call[key];
1516     }
1517   });
1518 });
1519
1520 var _construct = __webpack_require__(35);
1521
1522 Object.keys(_construct).forEach(function (key) {
1523   if (key === "default" || key === "__esModule") return;
1524   Object.defineProperty(exports, key, {
1525     enumerable: true,
1526     get: function () {
1527       return _construct[key];
1528     }
1529   });
1530 });
1531
1532 var _date = __webpack_require__(358);
1533
1534 Object.keys(_date).forEach(function (key) {
1535   if (key === "default" || key === "__esModule") return;
1536   Object.defineProperty(exports, key, {
1537     enumerable: true,
1538     get: function () {
1539       return _date[key];
1540     }
1541   });
1542 });
1543
1544 var _descriptor = __webpack_require__(853);
1545
1546 Object.keys(_descriptor).forEach(function (key) {
1547   if (key === "default" || key === "__esModule") return;
1548   Object.defineProperty(exports, key, {
1549     enumerable: true,
1550     get: function () {
1551       return _descriptor[key];
1552     }
1553   });
1554 });
1555
1556 var _get = __webpack_require__(11);
1557
1558 Object.keys(_get).forEach(function (key) {
1559   if (key === "default" || key === "__esModule") return;
1560   Object.defineProperty(exports, key, {
1561     enumerable: true,
1562     get: function () {
1563       return _get[key];
1564     }
1565   });
1566 });
1567
1568 var _has = __webpack_require__(27);
1569
1570 Object.keys(_has).forEach(function (key) {
1571   if (key === "default" || key === "__esModule") return;
1572   Object.defineProperty(exports, key, {
1573     enumerable: true,
1574     get: function () {
1575       return _has[key];
1576     }
1577   });
1578 });
1579
1580 var _hash = __webpack_require__(854);
1581
1582 Object.keys(_hash).forEach(function (key) {
1583   if (key === "default" || key === "__esModule") return;
1584   Object.defineProperty(exports, key, {
1585     enumerable: true,
1586     get: function () {
1587       return _hash[key];
1588     }
1589   });
1590 });
1591
1592 var _integrity = __webpack_require__(356);
1593
1594 Object.keys(_integrity).forEach(function (key) {
1595   if (key === "default" || key === "__esModule") return;
1596   Object.defineProperty(exports, key, {
1597     enumerable: true,
1598     get: function () {
1599       return _integrity[key];
1600     }
1601   });
1602 });
1603
1604 var _is = __webpack_require__(9);
1605
1606 Object.keys(_is).forEach(function (key) {
1607   if (key === "default" || key === "__esModule") return;
1608   Object.defineProperty(exports, key, {
1609     enumerable: true,
1610     get: function () {
1611       return _is[key];
1612     }
1613   });
1614 });
1615
1616 var _iterator = __webpack_require__(76);
1617
1618 Object.keys(_iterator).forEach(function (key) {
1619   if (key === "default" || key === "__esModule") return;
1620   Object.defineProperty(exports, key, {
1621     enumerable: true,
1622     get: function () {
1623       return _iterator[key];
1624     }
1625   });
1626 });
1627
1628 var _own = __webpack_require__(359);
1629
1630 Object.keys(_own).forEach(function (key) {
1631   if (key === "default" || key === "__esModule") return;
1632   Object.defineProperty(exports, key, {
1633     enumerable: true,
1634     get: function () {
1635       return _own[key];
1636     }
1637   });
1638 });
1639
1640 var _destructuring = __webpack_require__(855);
1641
1642 Object.keys(_destructuring).forEach(function (key) {
1643   if (key === "default" || key === "__esModule") return;
1644   Object.defineProperty(exports, key, {
1645     enumerable: true,
1646     get: function () {
1647       return _destructuring[key];
1648     }
1649   });
1650 });
1651
1652 var _regexp = __webpack_require__(159);
1653
1654 Object.keys(_regexp).forEach(function (key) {
1655   if (key === "default" || key === "__esModule") return;
1656   Object.defineProperty(exports, key, {
1657     enumerable: true,
1658     get: function () {
1659       return _regexp[key];
1660     }
1661   });
1662 });
1663
1664 var _promise = __webpack_require__(220);
1665
1666 Object.keys(_promise).forEach(function (key) {
1667   if (key === "default" || key === "__esModule") return;
1668   Object.defineProperty(exports, key, {
1669     enumerable: true,
1670     get: function () {
1671       return _promise[key];
1672     }
1673   });
1674 });
1675
1676 var _arraybuffer = __webpack_require__(92);
1677
1678 Object.keys(_arraybuffer).forEach(function (key) {
1679   if (key === "default" || key === "__esModule") return;
1680   Object.defineProperty(exports, key, {
1681     enumerable: true,
1682     get: function () {
1683       return _arraybuffer[key];
1684     }
1685   });
1686 });
1687
1688 /***/ }),
1689 /* 6 */
1690 /***/ (function(module, exports, __webpack_require__) {
1691
1692 "use strict";
1693
1694
1695 Object.defineProperty(exports, "__esModule", {
1696   value: true
1697 });
1698
1699
1700 // This is the error format used to report errors to the caller-supplied
1701 // error-handler
1702 /**
1703  * Copyright (c) 2017-present, Facebook, Inc.
1704  * All rights reserved.
1705  *
1706  * This source code is licensed under the BSD-style license found in the
1707  * LICENSE file in the root directory of this source tree. An additional grant
1708  * of patent rights can be found in the PATENTS file in the same directory.
1709  */
1710
1711 class CompilerDiagnostic extends Error {
1712   constructor(message, location, errorCode, severity) {
1713     super(message);
1714
1715     this.location = location;
1716     this.severity = severity;
1717     this.errorCode = errorCode;
1718   }
1719
1720 }
1721
1722 exports.CompilerDiagnostic = CompilerDiagnostic; // This error is thrown to exit Prepack when an ErrorHandler returns 'FatalError'
1723 // This should just be a class but Babel classes doesn't work with
1724 // built-in super classes.
1725
1726 class FatalError extends Error {
1727   constructor(message) {
1728     super(message || "A fatal error occurred while prepacking.");
1729   }
1730 }
1731
1732 exports.FatalError = FatalError;
1733
1734 /***/ }),
1735 /* 7 */
1736 /***/ (function(module, exports, __webpack_require__) {
1737
1738 "use strict";
1739
1740
1741 Object.defineProperty(exports, "__esModule", {
1742   value: true
1743 });
1744 exports.Realm = exports.ExecutionContext = exports.Tracer = undefined;
1745 exports.construct_empty_effects = construct_empty_effects;
1746
1747 var _errors = __webpack_require__(6);
1748
1749 var _index = __webpack_require__(0);
1750
1751 var _environment = __webpack_require__(8);
1752
1753 var _index2 = __webpack_require__(5);
1754
1755 var _completions = __webpack_require__(3);
1756
1757 var _invariant = __webpack_require__(1);
1758
1759 var _invariant2 = _interopRequireDefault(_invariant);
1760
1761 var _seedrandom = __webpack_require__(371);
1762
1763 var _seedrandom2 = _interopRequireDefault(_seedrandom);
1764
1765 var _generator = __webpack_require__(23);
1766
1767 var _internalizer = __webpack_require__(93);
1768
1769 var _singletons = __webpack_require__(2);
1770
1771 var _babelTypes = __webpack_require__(4);
1772
1773 var t = _interopRequireWildcard(_babelTypes);
1774
1775 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
1776
1777 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1778
1779 /**
1780  * Copyright (c) 2017-present, Facebook, Inc.
1781  * All rights reserved.
1782  *
1783  * This source code is licensed under the BSD-style license found in the
1784  * LICENSE file in the root directory of this source tree. An additional grant
1785  * of patent rights can be found in the PATENTS file in the same directory.
1786  */
1787
1788 class Tracer {
1789   beginEvaluateForEffects(state) {}
1790   endEvaluateForEffects(state, effects) {}
1791   detourCall(F, thisArgument, argumentsList, newTarget, performCall) {}
1792   beforeCall(F, thisArgument, argumentsList, newTarget) {}
1793   afterCall(F, thisArgument, argumentsList, newTarget, result) {}
1794 }
1795
1796 exports.Tracer = Tracer;
1797 class ExecutionContext {
1798
1799   setCaller(context) {
1800     this.caller = context;
1801   }
1802
1803   setFunction(F) {
1804     if (F instanceof _index.ECMAScriptSourceFunctionValue) this.isStrict = F.$Strict;
1805     this.function = F;
1806   }
1807
1808   setLocation(loc) {
1809     if (!loc) return;
1810     this.loc = loc;
1811   }
1812
1813   setRealm(realm) {
1814     this.realm = realm;
1815   }
1816
1817   /*
1818    Read-only envs disallow:
1819    - creating bindings in their scope
1820    - creating or modifying objects when they are current running context
1821   */
1822   setReadOnly(value) {
1823     let oldReadOnly = this.isReadOnly;
1824     if (this.variableEnvironment) this.variableEnvironment.environmentRecord.isReadOnly = value;
1825     if (this.lexicalEnvironment) this.lexicalEnvironment.environmentRecord.isReadOnly = value;
1826     this.isReadOnly = value;
1827     return oldReadOnly;
1828   }
1829
1830   suspend() {
1831     // TODO #712: suspend
1832   }
1833
1834   resume() {
1835     // TODO #712: resume
1836     return this.realm.intrinsics.undefined;
1837   }
1838 }
1839
1840 exports.ExecutionContext = ExecutionContext;
1841 function construct_empty_effects(realm) {
1842   return [realm.intrinsics.empty, new _generator.Generator(realm), new Map(), new Map(), new Set()];
1843 }
1844
1845 class Realm {
1846   constructor(opts) {
1847     this.contextStack = [];
1848     this.MOBILE_JSC_VERSION = "jsc-600-1-4-17";
1849     this.objectCount = 0;
1850     this.symbolCount = 867501803871088;
1851     this.functionBodyUniqueTagSeed = 1;
1852     this.nextGeneratorId = 0;
1853
1854     this.isReadOnly = false;
1855     this.useAbstractInterpretation = !!opts.serialize || !!opts.residual || !!opts.check;
1856     this.trackLeaks = !!opts.abstractEffectsInAdditionalFunctions;
1857     this.ignoreLeakLogic = false;
1858     this.isInPureTryStatement = false;
1859     if (opts.mathRandomSeed !== undefined) {
1860       this.mathRandomGenerator = (0, _seedrandom2.default)(opts.mathRandomSeed);
1861     }
1862     this.strictlyMonotonicDateNow = !!opts.strictlyMonotonicDateNow;
1863
1864     this.timeout = opts.timeout;
1865     if (this.timeout) {
1866       // We'll call Date.now for every this.timeoutCounterThreshold'th AST node.
1867       // The threshold is there to reduce the cost of the surprisingly expensive Date.now call.
1868       this.timeoutCounter = this.timeoutCounterThreshold = 1024;
1869     }
1870
1871     this.start = Date.now();
1872     this.compatibility = opts.compatibility || "browser";
1873     this.maxStackDepth = opts.maxStackDepth || 225;
1874     this.omitInvariants = !!opts.omitInvariants;
1875     this.emitConcreteModel = !!opts.emitConcreteModel;
1876
1877     this.$TemplateMap = [];
1878
1879     if (this.useAbstractInterpretation) {
1880       this.preludeGenerator = new _generator.PreludeGenerator(opts.debugNames, opts.uniqueSuffix);
1881       this.pathConditions = [];
1882       _index.ObjectValue.setupTrackedPropertyAccessors(_index.ObjectValue.trackedPropertyNames);
1883       _index.ObjectValue.setupTrackedPropertyAccessors(_index.NativeFunctionValue.trackedPropertyNames);
1884       _index.ObjectValue.setupTrackedPropertyAccessors(_index.ProxyValue.trackedPropertyNames);
1885     }
1886
1887     this.tracers = [];
1888
1889     // These get initialized in construct_realm to avoid the dependency
1890     this.intrinsics = {};
1891     this.$GlobalObject = {};
1892     this.evaluators = Object.create(null);
1893     this.partialEvaluators = Object.create(null);
1894     this.$GlobalEnv = undefined;
1895
1896     this.react = {
1897       abstractHints: new WeakMap(),
1898       classComponentMetadata: new Map(),
1899       currentOwner: undefined,
1900       enabled: opts.reactEnabled || false,
1901       output: opts.reactOutput || "create-element",
1902       hoistableFunctions: new WeakMap(),
1903       hoistableReactElements: new WeakMap(),
1904       reactElements: new WeakSet(),
1905       symbols: new Map()
1906     };
1907
1908     this.stripFlow = opts.stripFlow || false;
1909
1910     this.fbLibraries = {
1911       other: new Map(),
1912       react: undefined,
1913       reactRelay: undefined
1914     };
1915
1916     this.errorHandler = opts.errorHandler;
1917
1918     this.globalSymbolRegistry = [];
1919     this.activeLexicalEnvironments = new Set();
1920     this._abstractValuesDefined = new Set(); // A set of nameStrings to ensure abstract values have unique names
1921     this.debugNames = opts.debugNames;
1922   } // TODO(1264): Remove this once we implement proper exception handling in abstract calls.
1923
1924
1925   // A list of abstract conditions that are known to be true in the current execution path.
1926   // For example, the abstract condition of an if statement is known to be true inside its true branch.
1927
1928   // Unique tag for identifying function body ast node. It is neeeded
1929   // instead of ast node itself because we may perform ast tree deep clone
1930   // during serialization which changes the ast identity.
1931
1932
1933   // to force flow to type the annotations
1934   isCompatibleWith(compatibility) {
1935     return compatibility === this.compatibility;
1936   }
1937
1938   // Checks if there is a let binding at global scope with the given name
1939   // returning it if so
1940   getGlobalLetBinding(key) {
1941     let globrec = this.$GlobalEnv.environmentRecord;
1942     // GlobalEnv should have a GlobalEnvironmentRecord
1943     (0, _invariant2.default)(globrec instanceof _environment.GlobalEnvironmentRecord);
1944     let dclrec = globrec.$DeclarativeRecord;
1945
1946     try {
1947       return dclrec.HasBinding(key) ? dclrec.GetBindingValue(key, false) : undefined;
1948     } catch (e) {
1949       if (e instanceof _errors.FatalError) return undefined;
1950       throw e;
1951     }
1952   }
1953
1954   /*
1955    Read only realms disallow:
1956    - using console.log
1957    - creating bindings in any existing scopes
1958    - modifying object properties in any existing scopes
1959    Setting a realm read-only sets all contained environments to read-only, but
1960    all new environments (e.g. new ExecutionContexts) will be writeable.
1961    */
1962   setReadOnly(readOnlyValue) {
1963     this.isReadOnly = readOnlyValue;
1964     this.$GlobalEnv.environmentRecord.isReadOnly = readOnlyValue;
1965     this.contextStack.forEach(ctx => {
1966       ctx.setReadOnly(readOnlyValue);
1967     });
1968   }
1969
1970   testTimeout() {
1971     let timeout = this.timeout;
1972     if (timeout && ! --this.timeoutCounter) {
1973       this.timeoutCounter = this.timeoutCounterThreshold;
1974       let total = Date.now() - this.start;
1975       if (total > timeout) {
1976         throw new _errors.FatalError("Timed out");
1977       }
1978     }
1979   }
1980
1981   hasRunningContext() {
1982     return this.contextStack.length !== 0;
1983   }
1984
1985   getRunningContext() {
1986     let context = this.contextStack[this.contextStack.length - 1];
1987     (0, _invariant2.default)(context, "There's no running execution context");
1988     return context;
1989   }
1990
1991   clearBlockBindings(modifiedBindings, environmentRecord) {
1992     if (modifiedBindings === undefined) return;
1993     for (let b of modifiedBindings.keys()) if (environmentRecord.bindings[b.name] && environmentRecord.bindings[b.name] === b) modifiedBindings.delete(b);
1994   }
1995
1996   clearBlockBindingsFromCompletion(completion, environmentRecord) {
1997     if (completion instanceof _completions.PossiblyNormalCompletion) {
1998       this.clearBlockBindings(completion.alternateEffects[2], environmentRecord);
1999       this.clearBlockBindings(completion.consequentEffects[2], environmentRecord);
2000       if (completion.savedEffects !== undefined) this.clearBlockBindings(completion.savedEffects[2], environmentRecord);
2001       if (completion.alternate instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.alternate, environmentRecord);
2002       if (completion.consequent instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.consequent, environmentRecord);
2003     } else if (completion instanceof _completions.JoinedAbruptCompletions) {
2004       this.clearBlockBindings(completion.alternateEffects[2], environmentRecord);
2005       this.clearBlockBindings(completion.consequentEffects[2], environmentRecord);
2006       if (completion.alternate instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.alternate, environmentRecord);
2007       if (completion.consequent instanceof _completions.Completion) this.clearBlockBindingsFromCompletion(completion.consequent, environmentRecord);
2008     }
2009   }
2010
2011   // Call when a scope falls out of scope and should be destroyed.
2012   // Clears the Bindings corresponding to the disappearing Scope from ModifiedBindings
2013   onDestroyScope(lexicalEnvironment) {
2014     (0, _invariant2.default)(this.activeLexicalEnvironments.has(lexicalEnvironment));
2015     let modifiedBindings = this.modifiedBindings;
2016     if (modifiedBindings) {
2017       // Don't undo things to global scope because it's needed past its destruction point (for serialization)
2018       let environmentRecord = lexicalEnvironment.environmentRecord;
2019       if (environmentRecord instanceof _environment.DeclarativeEnvironmentRecord) {
2020         this.clearBlockBindings(modifiedBindings, environmentRecord);
2021         if (this.savedCompletion !== undefined) this.clearBlockBindingsFromCompletion(this.savedCompletion, environmentRecord);
2022       }
2023     }
2024
2025     // Ensures if we call onDestroyScope too early, there will be a failure.
2026     this.activeLexicalEnvironments.delete(lexicalEnvironment);
2027     lexicalEnvironment.destroy();
2028   }
2029
2030   pushContext(context) {
2031     if (this.contextStack.length >= this.maxStackDepth) {
2032       throw new _errors.FatalError("Maximum stack depth exceeded");
2033     }
2034     this.contextStack.push(context);
2035   }
2036
2037   clearFunctionBindings(modifiedBindings, funcVal) {
2038     if (modifiedBindings === undefined) return;
2039     for (let b of modifiedBindings.keys()) {
2040       if (b.environment.$FunctionObject === funcVal) modifiedBindings.delete(b);
2041     }
2042   }
2043
2044   clearFunctionBindingsFromCompletion(completion, funcVal) {
2045     if (completion instanceof _completions.PossiblyNormalCompletion) {
2046       this.clearFunctionBindings(completion.alternateEffects[2], funcVal);
2047       this.clearFunctionBindings(completion.consequentEffects[2], funcVal);
2048       if (completion.savedEffects !== undefined) this.clearFunctionBindings(completion.savedEffects[2], funcVal);
2049       if (completion.alternate instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.alternate, funcVal);
2050       if (completion.consequent instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.consequent, funcVal);
2051     } else if (completion instanceof _completions.JoinedAbruptCompletions) {
2052       this.clearFunctionBindings(completion.alternateEffects[2], funcVal);
2053       this.clearFunctionBindings(completion.consequentEffects[2], funcVal);
2054       if (completion.alternate instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.alternate, funcVal);
2055       if (completion.consequent instanceof _completions.Completion) this.clearFunctionBindingsFromCompletion(completion.consequent, funcVal);
2056     }
2057   }
2058
2059   popContext(context) {
2060     let funcVal = context.function;
2061     if (funcVal) {
2062       this.clearFunctionBindings(this.modifiedBindings, funcVal);
2063       if (this.savedCompletion !== undefined) this.clearFunctionBindingsFromCompletion(this.savedCompletion, funcVal);
2064     }
2065     let c = this.contextStack.pop();
2066     (0, _invariant2.default)(c === context);
2067   }
2068
2069   wrapInGlobalEnv(callback) {
2070     let context = new ExecutionContext();
2071     context.isStrict = this.isStrict;
2072     context.lexicalEnvironment = this.$GlobalEnv;
2073     context.variableEnvironment = this.$GlobalEnv;
2074     context.realm = this;
2075
2076     this.pushContext(context);
2077     try {
2078       return callback();
2079     } finally {
2080       this.popContext(context);
2081     }
2082   }
2083
2084   assignToGlobal(name, value) {
2085     this.wrapInGlobalEnv(() => this.$GlobalEnv.assignToGlobal(name, value));
2086   }
2087
2088   deleteGlobalBinding(name) {
2089     this.$GlobalEnv.environmentRecord.DeleteBinding(name);
2090   }
2091
2092   // Evaluate a context as if it won't have any side-effects outside of any objects
2093   // that it created itself. This promises that any abstract functions inside of it
2094   // also won't have effects on any objects or bindings that weren't created in this
2095   // call.
2096   evaluatePure(f) {
2097     if (!this.trackLeaks) {
2098       return f();
2099     }
2100     let saved_createdObjectsTrackedForLeaks = this.createdObjectsTrackedForLeaks;
2101     // Track all objects (including function closures) created during
2102     // this call. This will be used to make the assumption that every
2103     // *other* object is unchanged (pure). These objects are marked
2104     // as leaked if they're passed to abstract functions.
2105     this.createdObjectsTrackedForLeaks = new Set();
2106     try {
2107       return f();
2108     } finally {
2109       this.createdObjectsTrackedForLeaks = saved_createdObjectsTrackedForLeaks;
2110     }
2111   }
2112
2113   isInPureScope() {
2114     return !!this.createdObjectsTrackedForLeaks;
2115   }
2116
2117   evaluateWithoutLeakLogic(f) {
2118     (0, _invariant2.default)(!this.ignoreLeakLogic, "Nesting evaluateWithoutLeakLogic() calls is not supported.");
2119     this.ignoreLeakLogic = true;
2120     try {
2121       return f();
2122     } finally {
2123       this.ignoreLeakLogic = false;
2124     }
2125   }
2126
2127   // Evaluate some code that might generate temporal values knowing that it might end in an abrupt
2128   // completion. We only need to support ThrowCompletion for now but this can be expanded to support other
2129   // abrupt completions.
2130   evaluateWithPossibleThrowCompletion(f, thrownTypes, thrownValues) {
2131     // The cases when we need this are only when we might invoke unknown code such as abstract
2132     // funtions, getters, custom coercion etc. It is possible we can use this in other cases
2133     // where something might throw a built-in error but can never issue arbitrary code such as
2134     // calling something that might not be a function. For now we only use it in pure functions.
2135     (0, _invariant2.default)(this.isInPureScope(), "only abstract abrupt completion in pure functions");
2136
2137     // TODO(1264): We should create a new generator for this scope and wrap it in a try/catch.
2138     // We could use the outcome of that as the join condition for a PossiblyNormalCompletion.
2139     // We should then compose that with the saved completion and move on to the normal route.
2140     // Currently we just issue a recoverable error instead if this might matter.
2141     let value = f();
2142     if (this.isInPureTryStatement) {
2143       let diag = new _errors.CompilerDiagnostic("Possible throw inside try/catch is not yet supported", this.currentLocation, "PP0021", "RecoverableError");
2144       if (this.handleError(diag) !== "Recover") throw new _errors.FatalError();
2145     }
2146     return value;
2147   }
2148
2149   // Evaluate the given ast in a sandbox and return the evaluation results
2150   // in the form of a completion, a code generator, a map of changed variable
2151   // bindings and a map of changed property bindings.
2152   evaluateNodeForEffects(ast, strictCode, env, state, generatorName) {
2153     return this.evaluateForEffects(() => env.evaluateCompletionDeref(ast, strictCode), state, generatorName);
2154   }
2155
2156   evaluateForEffectsInGlobalEnv(func, state, generatorName) {
2157     return this.wrapInGlobalEnv(() => this.evaluateForEffects(func, state, generatorName));
2158   }
2159
2160   // NB: does not apply generators because there's no way to cleanly revert them.
2161   // func should not return undefined
2162   withEffectsAppliedInGlobalEnv(func, effects) {
2163     let result;
2164     this.evaluateForEffectsInGlobalEnv(() => {
2165       try {
2166         this.applyEffects(effects);
2167         result = func(effects);
2168         return this.intrinsics.undefined;
2169       } finally {
2170         this.restoreBindings(effects[2]);
2171         this.restoreProperties(effects[3]);
2172       }
2173     });
2174     (0, _invariant2.default)(result !== undefined, "If we get here, func must have returned undefined.");
2175     return result;
2176   }
2177
2178   evaluateNodeForEffectsInGlobalEnv(node, state, generatorName) {
2179     return this.wrapInGlobalEnv(() => this.evaluateNodeForEffects(node, false, this.$GlobalEnv, state, generatorName));
2180   }
2181
2182   partiallyEvaluateNodeForEffects(ast, strictCode, env) {
2183     let nodeAst, nodeIO;
2184     function partialEval() {
2185       let result;
2186       [result, nodeAst, nodeIO] = env.partiallyEvaluateCompletionDeref(ast, strictCode);
2187       return result;
2188     }
2189     let effects = this.evaluateForEffects(partialEval);
2190     (0, _invariant2.default)(nodeAst !== undefined && nodeIO !== undefined);
2191     return [effects, nodeAst, nodeIO];
2192   }
2193
2194   evaluateForEffects(f, state, generatorName) {
2195     // Save old state and set up empty state for ast
2196     let [savedBindings, savedProperties] = this.getAndResetModifiedMaps();
2197     let saved_generator = this.generator;
2198     let saved_createdObjects = this.createdObjects;
2199     let saved_completion = this.savedCompletion;
2200     this.generator = new _generator.Generator(this, generatorName);
2201     this.createdObjects = new Set();
2202     this.savedCompletion = undefined; // while in this call, we only explore the normal path.
2203
2204     let result;
2205     try {
2206       for (let t1 of this.tracers) t1.beginEvaluateForEffects(state);
2207
2208       let c;
2209       try {
2210         try {
2211           c = f();
2212           if (c instanceof _environment.Reference) c = _singletons.Environment.GetValue(this, c);
2213         } catch (e) {
2214           if (e instanceof _completions.AbruptCompletion) c = e;else throw e;
2215         }
2216         // This is a join point for the normal branch of a PossiblyNormalCompletion.
2217         if (c instanceof _index.Value || c instanceof _completions.AbruptCompletion) c = _singletons.Functions.incorporateSavedCompletion(this, c);
2218         (0, _invariant2.default)(c !== undefined);
2219         if (c instanceof _completions.PossiblyNormalCompletion) {
2220           // The current state may have advanced since the time control forked into the various paths recorded in c.
2221           // Update the normal path and restore the global state to what it was at the time of the fork.
2222           let subsequentEffects = this.getCapturedEffects(c, c.value);
2223           (0, _invariant2.default)(subsequentEffects !== undefined);
2224           this.stopEffectCaptureAndUndoEffects(c);
2225           _singletons.Join.updatePossiblyNormalCompletionWithSubsequentEffects(this, c, subsequentEffects);
2226           this.savedCompletion = undefined;
2227         }
2228
2229         (0, _invariant2.default)(this.generator !== undefined);
2230         (0, _invariant2.default)(this.modifiedBindings !== undefined);
2231         (0, _invariant2.default)(this.modifiedProperties !== undefined);
2232         (0, _invariant2.default)(this.createdObjects !== undefined);
2233         let astGenerator = this.generator;
2234         let astBindings = this.modifiedBindings;
2235         let astProperties = this.modifiedProperties;
2236         let astCreatedObjects = this.createdObjects;
2237
2238         // Return the captured state changes and evaluation result
2239         result = [c, astGenerator, astBindings, astProperties, astCreatedObjects];
2240         return result;
2241       } finally {
2242         // Roll back the state changes
2243         if (this.savedCompletion !== undefined) this.stopEffectCaptureAndUndoEffects(this.savedCompletion);
2244         if (result !== undefined) {
2245           this.restoreBindings(result[2]);
2246           this.restoreProperties(result[3]);
2247         } else {
2248           this.restoreBindings(this.modifiedBindings);
2249           this.restoreProperties(this.modifiedProperties);
2250         }
2251         this.generator = saved_generator;
2252         this.modifiedBindings = savedBindings;
2253         this.modifiedProperties = savedProperties;
2254         this.createdObjects = saved_createdObjects;
2255         this.savedCompletion = saved_completion;
2256       }
2257     } finally {
2258       for (let t2 of this.tracers) t2.endEvaluateForEffects(state, result);
2259     }
2260   }
2261
2262   evaluateWithUndo(f, defaultValue = this.intrinsics.undefined) {
2263     if (!this.useAbstractInterpretation) return f();
2264     let oldErrorHandler = this.errorHandler;
2265     this.errorHandler = d => {
2266       if (d.severity === "Information" || d.severity === "Warning") return "Recover";
2267       return "Fail";
2268     };
2269     try {
2270       let effects = this.evaluateForEffects(() => {
2271         try {
2272           return f();
2273         } catch (e) {
2274           if (e instanceof _completions.Completion) {
2275             return defaultValue;
2276           } else if (e instanceof _errors.FatalError) {
2277             return defaultValue;
2278           } else {
2279             throw e;
2280           }
2281         }
2282       });
2283       return effects[0] instanceof _index.Value ? effects[0] : defaultValue;
2284     } finally {
2285       this.errorHandler = oldErrorHandler;
2286     }
2287   }
2288
2289   evaluateWithUndoForDiagnostic(f) {
2290     if (!this.useAbstractInterpretation) return f();
2291     let savedHandler = this.errorHandler;
2292     let diagnostic;
2293     try {
2294       this.errorHandler = d => {
2295         diagnostic = d;
2296         return "Fail";
2297       };
2298       let effects = this.evaluateForEffects(f);
2299       this.applyEffects(effects);
2300       let resultVal = effects[0];
2301       if (resultVal instanceof _completions.AbruptCompletion) throw resultVal;
2302       if (resultVal instanceof _completions.PossiblyNormalCompletion) {
2303         // in this case one of the branches may complete abruptly, which means that
2304         // not all control flow branches join into one flow at this point.
2305         // Consequently we have to continue tracking changes until the point where
2306         // all the branches come together into one.
2307         resultVal = this.composeWithSavedCompletion(resultVal);
2308       }
2309       (0, _invariant2.default)(resultVal instanceof _index.Value);
2310       return resultVal;
2311     } catch (e) {
2312       if (diagnostic !== undefined) return diagnostic;
2313       throw e;
2314     } finally {
2315       this.errorHandler = savedHandler;
2316     }
2317   }
2318
2319   evaluateForFixpointEffects(loopContinueTest, loopBody) {
2320     try {
2321       let effects1 = this.evaluateForEffects(loopBody);
2322       while (true) {
2323         this.restoreBindings(effects1[2]);
2324         this.restoreProperties(effects1[3]);
2325         let effects2 = this.evaluateForEffects(() => {
2326           let test = loopContinueTest();
2327           if (!(test instanceof _index.AbstractValue)) throw new _errors.FatalError("loop terminates before fixed point");
2328           return loopBody();
2329         });
2330         this.restoreBindings(effects1[2]);
2331         this.restoreProperties(effects1[3]);
2332         if (_singletons.Widen.containsEffects(effects1, effects2)) {
2333           // effects1 includes every value present in effects2, so doing another iteration using effects2 will not
2334           // result in any more values being added to abstract domains and hence a fixpoint has been reached.
2335           let [, gen, bindings2, pbindings2] = effects2;
2336           this._emitPropertAssignments(gen, pbindings2);
2337           this._emitLocalAssignments(gen, bindings2);
2338           return [effects1, effects2];
2339         }
2340         effects1 = _singletons.Widen.widenEffects(this, effects1, effects2);
2341       }
2342     } catch (e) {
2343       return undefined;
2344     }
2345   }
2346
2347   // populate the loop body generator with assignments that will update the phiNodes
2348   _emitLocalAssignments(gen, bindings) {
2349     let tvalFor = new Map();
2350     bindings.forEach((binding, key, map) => {
2351       let val = binding.value;
2352       if (val instanceof _index.AbstractValue) {
2353         (0, _invariant2.default)(val._buildNode !== undefined);
2354         let tval = gen.derive(val.types, val.values, [val], ([n]) => n, {
2355           skipInvariant: true
2356         });
2357         tvalFor.set(key, tval);
2358       }
2359     });
2360     bindings.forEach((binding, key, map) => {
2361       let val = binding.value;
2362       if (val instanceof _index.AbstractValue) {
2363         let phiNode = key.phiNode;
2364         let tval = tvalFor.get(key);
2365         (0, _invariant2.default)(tval !== undefined);
2366         gen.emitStatement([tval], ([v]) => {
2367           (0, _invariant2.default)(phiNode !== undefined);
2368           let id = phiNode.buildNode([]);
2369           return t.expressionStatement(t.assignmentExpression("=", id, v));
2370         });
2371       }
2372     });
2373   }
2374
2375   // populate the loop body generator with assignments that will update properties modified inside the loop
2376   _emitPropertAssignments(gen, pbindings) {
2377     function isSelfReferential(value, pathNode) {
2378       if (value === pathNode) return true;
2379       if (value instanceof _index.AbstractValue && pathNode !== undefined) {
2380         for (let v of value.args) {
2381           if (isSelfReferential(v, pathNode)) return true;
2382         }
2383       }
2384       return false;
2385     }
2386
2387     let tvalFor = new Map();
2388     pbindings.forEach((val, key, map) => {
2389       let value = val && val.value;
2390       if (value instanceof _index.AbstractValue) {
2391         (0, _invariant2.default)(value._buildNode !== undefined);
2392         let tval = gen.derive(value.types, value.values, [key.object, value], ([o, n]) => {
2393           (0, _invariant2.default)(value instanceof _index.Value);
2394           if (typeof key.key === "string" && value.mightHaveBeenDeleted() && isSelfReferential(value, key.pathNode)) {
2395             let inTest = t.binaryExpression("in", t.stringLiteral(key.key), o);
2396             let addEmpty = t.conditionalExpression(inTest, n, _internalizer.emptyExpression);
2397             n = t.logicalExpression("||", n, addEmpty);
2398           }
2399           return n;
2400         }, {
2401           skipInvariant: true
2402         });
2403         tvalFor.set(key, tval);
2404       }
2405     });
2406     pbindings.forEach((val, key, map) => {
2407       let path = key.pathNode;
2408       let tval = tvalFor.get(key);
2409       (0, _invariant2.default)(val !== undefined);
2410       let value = val.value;
2411       (0, _invariant2.default)(value instanceof _index.Value);
2412       let mightHaveBeenDeleted = value.mightHaveBeenDeleted();
2413       let mightBeUndefined = value.mightBeUndefined();
2414       if (typeof key.key === "string") {
2415         gen.emitStatement([key.object, tval || value, this.intrinsics.empty], ([o, v, e]) => {
2416           (0, _invariant2.default)(path !== undefined);
2417           let lh = path.buildNode([o, t.identifier(key.key)]);
2418           let r = t.expressionStatement(t.assignmentExpression("=", lh, v));
2419           if (mightHaveBeenDeleted) {
2420             // If v === __empty || (v === undefined  && !(key.key in o))  then delete it
2421             let emptyTest = t.binaryExpression("===", v, e);
2422             let undefinedTest = t.binaryExpression("===", v, _internalizer.voidExpression);
2423             let inTest = t.unaryExpression("!", t.binaryExpression("in", t.stringLiteral(key.key), o));
2424             let guard = t.logicalExpression("||", emptyTest, t.logicalExpression("&&", undefinedTest, inTest));
2425             let deleteIt = t.expressionStatement(t.unaryExpression("delete", lh));
2426             return t.ifStatement(mightBeUndefined ? emptyTest : guard, deleteIt, r);
2427           }
2428           return r;
2429         });
2430       } else {
2431         gen.emitStatement([key.object, key.key, tval || value, this.intrinsics.empty], ([o, p, v, e]) => {
2432           (0, _invariant2.default)(path !== undefined);
2433           let lh = path.buildNode([o, p]);
2434           return t.expressionStatement(t.assignmentExpression("=", lh, v));
2435         });
2436       }
2437     });
2438   }
2439
2440   composeEffects(priorEffects, subsequentEffects) {
2441     let [, pg, pb, pp, po] = priorEffects;
2442     let [sc, sg, sb, sp, so] = subsequentEffects;
2443     let result = construct_empty_effects(this);
2444     let [,, rb, rp, ro] = result;
2445
2446     result[0] = sc;
2447
2448     result[1] = _singletons.Join.composeGenerators(this, pg || result[1], sg);
2449
2450     if (pb) {
2451       pb.forEach((val, key, m) => rb.set(key, val));
2452     }
2453     sb.forEach((val, key, m) => rb.set(key, val));
2454
2455     if (pp) {
2456       pp.forEach((desc, propertyBinding, m) => rp.set(propertyBinding, desc));
2457     }
2458     sp.forEach((val, key, m) => rp.set(key, val));
2459
2460     if (po) {
2461       po.forEach((ob, a) => ro.add(ob));
2462     }
2463     so.forEach((ob, a) => ro.add(ob));
2464
2465     return result;
2466   }
2467
2468   updateAbruptCompletions(priorEffects, c) {
2469     if (c.consequent instanceof _completions.AbruptCompletion) {
2470       c.consequentEffects = this.composeEffects(priorEffects, c.consequentEffects);
2471       let alternate = c.alternate;
2472       if (alternate instanceof _completions.PossiblyNormalCompletion) this.updateAbruptCompletions(priorEffects, alternate);
2473     } else {
2474       (0, _invariant2.default)(c.alternate instanceof _completions.AbruptCompletion);
2475       c.alternateEffects = this.composeEffects(priorEffects, c.alternateEffects);
2476       let consequent = c.consequent;
2477       if (consequent instanceof _completions.PossiblyNormalCompletion) this.updateAbruptCompletions(priorEffects, consequent);
2478     }
2479   }
2480
2481   composeWithSavedCompletion(completion) {
2482     if (this.savedCompletion === undefined) {
2483       this.savedCompletion = completion;
2484       this.savedCompletion.savedPathConditions = this.pathConditions;
2485       this.captureEffects(completion);
2486     } else {
2487       this.savedCompletion = _singletons.Join.composePossiblyNormalCompletions(this, this.savedCompletion, completion);
2488     }
2489     if (completion.consequent instanceof _completions.AbruptCompletion) {
2490       _singletons.Path.pushInverseAndRefine(completion.joinCondition);
2491       if (completion.alternate instanceof _completions.PossiblyNormalCompletion) {
2492         completion.alternate.pathConditions.forEach(_singletons.Path.pushAndRefine);
2493       }
2494     } else if (completion.alternate instanceof _completions.AbruptCompletion) {
2495       _singletons.Path.pushAndRefine(completion.joinCondition);
2496       if (completion.consequent instanceof _completions.PossiblyNormalCompletion) {
2497         completion.consequent.pathConditions.forEach(_singletons.Path.pushAndRefine);
2498       }
2499     }
2500     return completion.value;
2501   }
2502
2503   incorporatePriorSavedCompletion(priorCompletion) {
2504     if (priorCompletion === undefined) return;
2505     if (this.savedCompletion === undefined) {
2506       this.savedCompletion = priorCompletion;
2507       this.captureEffects(priorCompletion);
2508     } else {
2509       (0, _invariant2.default)(priorCompletion.savedEffects !== undefined);
2510       let savedEffects = this.savedCompletion.savedEffects;
2511       (0, _invariant2.default)(savedEffects !== undefined);
2512       this.restoreBindings(savedEffects[2]);
2513       this.restoreProperties(savedEffects[3]);
2514       _singletons.Join.updatePossiblyNormalCompletionWithSubsequentEffects(this, priorCompletion, savedEffects);
2515       this.restoreBindings(savedEffects[2]);
2516       this.restoreProperties(savedEffects[3]);
2517       (0, _invariant2.default)(this.savedCompletion !== undefined);
2518       this.savedCompletion.savedEffects = undefined;
2519       this.savedCompletion = _singletons.Join.composePossiblyNormalCompletions(this, priorCompletion, this.savedCompletion);
2520     }
2521   }
2522
2523   captureEffects(completion) {
2524     if (completion.savedEffects !== undefined) {
2525       // Already called captureEffects, just carry on
2526       return;
2527     }
2528     completion.savedEffects = [this.intrinsics.undefined, this.generator, this.modifiedBindings, this.modifiedProperties, this.createdObjects];
2529     this.generator = new _generator.Generator(this);
2530     this.modifiedBindings = new Map();
2531     this.modifiedProperties = new Map();
2532     this.createdObjects = new Set();
2533   }
2534
2535   getCapturedEffects(completion, v) {
2536     if (completion.savedEffects === undefined) return undefined;
2537     if (v === undefined) v = this.intrinsics.undefined;
2538     (0, _invariant2.default)(this.generator !== undefined);
2539     (0, _invariant2.default)(this.modifiedBindings !== undefined);
2540     (0, _invariant2.default)(this.modifiedProperties !== undefined);
2541     (0, _invariant2.default)(this.createdObjects !== undefined);
2542     return [v, this.generator, this.modifiedBindings, this.modifiedProperties, this.createdObjects];
2543   }
2544
2545   stopEffectCapture(completion) {
2546     let e = this.getCapturedEffects(completion);
2547     if (e !== undefined) {
2548       this.stopEffectCaptureAndUndoEffects(completion);
2549       this.applyEffects(e);
2550     }
2551   }
2552
2553   stopEffectCaptureAndUndoEffects(completion) {
2554     // Roll back the state changes
2555     this.restoreBindings(this.modifiedBindings);
2556     this.restoreProperties(this.modifiedProperties);
2557
2558     // Restore saved state
2559     if (completion.savedEffects !== undefined) {
2560       let [c, g, b, p, o] = completion.savedEffects;
2561       c;
2562       completion.savedEffects = undefined;
2563       this.generator = g;
2564       this.modifiedBindings = b;
2565       this.modifiedProperties = p;
2566       this.createdObjects = o;
2567     } else {
2568       (0, _invariant2.default)(false);
2569     }
2570   }
2571
2572   // Apply the given effects to the global state
2573   applyEffects(effects, leadingComment = "") {
2574     let [, generator, bindings, properties, createdObjects] = effects;
2575
2576     // Add generated code for property modifications
2577     this.appendGenerator(generator, leadingComment);
2578
2579     // Restore bindings
2580     this.restoreBindings(bindings);
2581     this.restoreProperties(properties);
2582
2583     // track bindings
2584     let realmModifiedBindings = this.modifiedBindings;
2585     if (realmModifiedBindings !== undefined) {
2586       bindings.forEach((val, key, m) => {
2587         (0, _invariant2.default)(realmModifiedBindings !== undefined);
2588         if (!realmModifiedBindings.has(key)) {
2589           realmModifiedBindings.set(key, val);
2590         }
2591       });
2592     }
2593     let realmModifiedProperties = this.modifiedProperties;
2594     if (realmModifiedProperties !== undefined) {
2595       properties.forEach((desc, propertyBinding, m) => {
2596         (0, _invariant2.default)(realmModifiedProperties !== undefined);
2597         if (!realmModifiedProperties.has(propertyBinding)) {
2598           realmModifiedProperties.set(propertyBinding, desc);
2599         }
2600       });
2601     }
2602
2603     // add created objects
2604     if (createdObjects.size > 0) {
2605       let realmCreatedObjects = this.createdObjects;
2606       if (realmCreatedObjects === undefined) this.createdObjects = new Set(createdObjects);else {
2607         createdObjects.forEach((ob, a) => {
2608           (0, _invariant2.default)(realmCreatedObjects !== undefined);
2609           realmCreatedObjects.add(ob);
2610         });
2611       }
2612     }
2613   }
2614
2615   outputToConsole(method, args) {
2616     if (this.isReadOnly) {
2617       // This only happens during speculative execution and is reported elsewhere
2618       throw new _errors.FatalError("Trying to create console output in read-only realm");
2619     }
2620     if (this.useAbstractInterpretation) {
2621       (0, _invariant2.default)(this.generator !== undefined);
2622       this.generator.emitConsoleLog(method, args);
2623     } else {
2624       console[method](getString(this, args));
2625     }
2626
2627     function getString(realm, values) {
2628       let res = "";
2629       while (values.length) {
2630         let next = values.shift();
2631         let nextString = _singletons.To.ToString(realm, next);
2632         res += nextString;
2633       }
2634       return res;
2635     }
2636   }
2637
2638   // Record the current value of binding in this.modifiedBindings unless
2639   // there is already an entry for binding.
2640   recordModifiedBinding(binding) {
2641     if (binding.environment.isReadOnly) {
2642       // This only happens during speculative execution and is reported elsewhere
2643       throw new _errors.FatalError("Trying to modify a binding in read-only realm");
2644     }
2645     if (this.modifiedBindings !== undefined && !this.modifiedBindings.has(binding)) this.modifiedBindings.set(binding, {
2646       hasLeaked: binding.hasLeaked,
2647       value: binding.value
2648     });
2649     return binding;
2650   }
2651
2652   callReportObjectGetOwnProperties(ob) {
2653     if (this.reportObjectGetOwnProperties !== undefined) {
2654       this.reportObjectGetOwnProperties(ob);
2655     }
2656   }
2657
2658   callReportPropertyAccess(binding) {
2659     if (this.reportPropertyAccess !== undefined) {
2660       this.reportPropertyAccess(binding);
2661     }
2662   }
2663
2664   // Record the current value of binding in this.modifiedProperties unless
2665   // there is already an entry for binding.
2666   recordModifiedProperty(binding) {
2667     if (binding === undefined) return;
2668     if (this.isReadOnly && (this.getRunningContext().isReadOnly || !this.isNewObject(binding.object))) {
2669       // This only happens during speculative execution and is reported elsewhere
2670       throw new _errors.FatalError("Trying to modify a property in read-only realm");
2671     }
2672     this.callReportPropertyAccess(binding);
2673     if (this.modifiedProperties !== undefined && !this.modifiedProperties.has(binding)) {
2674       this.modifiedProperties.set(binding, (0, _index2.cloneDescriptor)(binding.descriptor));
2675     }
2676   }
2677
2678   isNewObject(object) {
2679     if (object instanceof _index.AbstractObjectValue) return false;
2680     return this.createdObjects === undefined || this.createdObjects.has(object);
2681   }
2682
2683   recordNewObject(object) {
2684     if (this.createdObjects !== undefined) {
2685       this.createdObjects.add(object);
2686     }
2687     if (this.createdObjectsTrackedForLeaks !== undefined) {
2688       this.createdObjectsTrackedForLeaks.add(object);
2689     }
2690   }
2691
2692   // Returns the current values of modifiedBindings and modifiedProperties
2693   // and then assigns new empty maps to them.
2694   getAndResetModifiedMaps() {
2695     let result = [this.modifiedBindings, this.modifiedProperties];
2696     this.modifiedBindings = new Map();
2697     this.modifiedProperties = new Map();
2698     return result;
2699   }
2700
2701   // Restores each Binding in the given map to the value it
2702   // had when it was entered into the map and updates the map to record
2703   // the value the Binding had just before the call to this method.
2704   restoreBindings(modifiedBindings) {
2705     if (modifiedBindings === undefined) return;
2706     modifiedBindings.forEach(({ hasLeaked, value }, binding, m) => {
2707       let l = binding.hasLeaked;
2708       let v = binding.value;
2709       binding.hasLeaked = hasLeaked;
2710       binding.value = value;
2711       m.set(binding, {
2712         hasLeaked: l,
2713         value: v
2714       });
2715     });
2716   }
2717
2718   // Restores each PropertyBinding in the given map to the value it
2719   // had when it was entered into the map and updates the map to record
2720   // the value the Binding had just before the call to this method.
2721   restoreProperties(modifiedProperties) {
2722     if (modifiedProperties === undefined) return;
2723     modifiedProperties.forEach((desc, propertyBinding, m) => {
2724       let d = propertyBinding.descriptor;
2725       propertyBinding.descriptor = desc;
2726       m.set(propertyBinding, d);
2727     });
2728   }
2729
2730   // Provide the realm with maps in which to track modifications.
2731   // A map can be set to undefined if no tracking is required.
2732   setModifiedMaps(modifiedBindings, modifiedProperties) {
2733     this.modifiedBindings = modifiedBindings;
2734     this.modifiedProperties = modifiedProperties;
2735   }
2736
2737   rebuildObjectProperty(object, key, propertyValue, path) {
2738     if (!(propertyValue instanceof _index.AbstractValue)) return;
2739     if (propertyValue.kind === "abstractConcreteUnion") {
2740       let absVal = propertyValue.args.find(e => e instanceof _index.AbstractValue);
2741       (0, _invariant2.default)(absVal instanceof _index.AbstractValue);
2742       propertyValue = absVal;
2743     }
2744     if (!propertyValue.isIntrinsic()) {
2745       propertyValue.intrinsicName = `${path}.${key}`;
2746       propertyValue.kind = "rebuiltProperty";
2747       propertyValue.args = [object];
2748       propertyValue._buildNode = ([node]) => t.memberExpression(node, t.identifier(key));
2749       this.rebuildNestedProperties(propertyValue, propertyValue.intrinsicName);
2750     }
2751   }
2752
2753   rebuildNestedProperties(abstractValue, path) {
2754     if (!(abstractValue instanceof _index.AbstractObjectValue)) return;
2755     if (abstractValue.values.isTop()) return;
2756     let template = abstractValue.getTemplate();
2757     (0, _invariant2.default)(!template.intrinsicName || template.intrinsicName === path);
2758     template.intrinsicName = path;
2759     template.intrinsicNameGenerated = true;
2760     for (let [key, binding] of template.properties) {
2761       if (binding === undefined || binding.descriptor === undefined) continue; // deleted
2762       (0, _invariant2.default)(binding.descriptor !== undefined);
2763       let value = binding.descriptor.value;
2764       _singletons.Properties.ThrowIfMightHaveBeenDeleted(value);
2765       if (value === undefined) {
2766         _index.AbstractValue.reportIntrospectionError(abstractValue, key);
2767         throw new _errors.FatalError();
2768       }
2769       (0, _invariant2.default)(value instanceof _index.Value);
2770       this.rebuildObjectProperty(abstractValue, key, value, path);
2771     }
2772   }
2773
2774   createExecutionContext() {
2775     let context = new ExecutionContext();
2776
2777     let loc = this.nextContextLocation;
2778     if (loc) {
2779       context.setLocation(loc);
2780       this.nextContextLocation = null;
2781     }
2782
2783     return context;
2784   }
2785
2786   setNextExecutionContextLocation(loc) {
2787     if (!loc) return;
2788
2789     //if (this.nextContextLocation) {
2790     //  throw new ThrowCompletion(
2791     //    Construct(this, this.intrinsics.TypeError, [new StringValue(this, "Already have a context location that we haven't used yet")])
2792     //  );
2793     //} else {
2794     this.nextContextLocation = loc;
2795     //}
2796   }
2797
2798   reportIntrospectionError(message) {
2799     if (message === undefined) message = "";
2800     if (typeof message === "string") message = new _index.StringValue(this, message);
2801     (0, _invariant2.default)(message instanceof _index.StringValue);
2802     this.nextContextLocation = this.currentLocation;
2803     let error = new _errors.CompilerDiagnostic(message.value, this.currentLocation, "PP0001", "FatalError");
2804     this.handleError(error);
2805   }
2806
2807   createErrorThrowCompletion(type, message) {
2808     (0, _invariant2.default)(type !== this.intrinsics.__IntrospectionError);
2809     if (message === undefined) message = "";
2810     if (typeof message === "string") message = new _index.StringValue(this, message);
2811     (0, _invariant2.default)(message instanceof _index.StringValue);
2812     this.nextContextLocation = this.currentLocation;
2813     return new _completions.ThrowCompletion((0, _index2.Construct)(this, type, [message]), this.currentLocation);
2814   }
2815
2816   appendGenerator(generator, leadingComment = "") {
2817     let realmGenerator = this.generator;
2818     if (realmGenerator === undefined) {
2819       (0, _invariant2.default)(generator.empty());
2820       return;
2821     }
2822     realmGenerator.appendGenerator(generator, leadingComment);
2823   }
2824
2825   // Pass the error to the realm's error-handler
2826   // Return value indicates whether the caller should try to recover from the error or not.
2827   handleError(diagnostic) {
2828     if (!diagnostic.callStack && this.contextStack.length > 0) {
2829       let error = (0, _index2.Construct)(this, this.intrinsics.Error);
2830       let stack = error.$Get("stack", error);
2831       if (stack instanceof _index.StringValue) diagnostic.callStack = stack.value;
2832     }
2833     // Default behaviour is to bail on the first error
2834     let errorHandler = this.errorHandler;
2835     if (!errorHandler) {
2836       let msg = `${diagnostic.errorCode}: ${diagnostic.message}`;
2837       if (diagnostic.location) {
2838         let loc_start = diagnostic.location.start;
2839         let loc_end = diagnostic.location.end;
2840         msg += ` at ${loc_start.line}:${loc_start.column} to ${loc_end.line}:${loc_end.column}`;
2841       }
2842       try {
2843         switch (diagnostic.severity) {
2844           case "Information":
2845             console.log(`Info: ${msg}`);
2846             return "Recover";
2847           case "Warning":
2848             console.warn(`Warn: ${msg}`);
2849             return "Recover";
2850           case "RecoverableError":
2851             console.error(`Error: ${msg}`);
2852             return "Fail";
2853           case "FatalError":
2854             console.error(`Fatal Error: ${msg}`);
2855             return "Fail";
2856           default:
2857             (0, _invariant2.default)(false, "Unexpected error type");
2858         }
2859       } finally {
2860         console.log(diagnostic.callStack);
2861       }
2862     }
2863     return errorHandler(diagnostic);
2864   }
2865
2866   saveNameString(nameString) {
2867     this._abstractValuesDefined.add(nameString);
2868   }
2869
2870   isNameStringUnique(nameString) {
2871     return !this._abstractValuesDefined.has(nameString);
2872   }
2873 }
2874 exports.Realm = Realm;
2875
2876 /***/ }),
2877 /* 8 */
2878 /***/ (function(module, exports, __webpack_require__) {
2879
2880 "use strict";
2881
2882
2883 Object.defineProperty(exports, "__esModule", {
2884   value: true
2885 });
2886 exports.Reference = exports.LexicalEnvironment = exports.GlobalEnvironmentRecord = exports.FunctionEnvironmentRecord = exports.ObjectEnvironmentRecord = exports.DeclarativeEnvironmentRecord = exports.EnvironmentRecord = undefined;
2887 exports.havocBinding = havocBinding;
2888 exports.mightBecomeAnObject = mightBecomeAnObject;
2889
2890 var _completions = __webpack_require__(3);
2891
2892 var _errors = __webpack_require__(6);
2893
2894 var _options = __webpack_require__(302);
2895
2896 var _realm = __webpack_require__(7);
2897
2898 var _index = __webpack_require__(0);
2899
2900 var _babelGenerator = __webpack_require__(303);
2901
2902 var _babelGenerator2 = _interopRequireDefault(_babelGenerator);
2903
2904 var _parse = __webpack_require__(158);
2905
2906 var _parse2 = _interopRequireDefault(_parse);
2907
2908 var _invariant = __webpack_require__(1);
2909
2910 var _invariant2 = _interopRequireDefault(_invariant);
2911
2912 var _traverseFast = __webpack_require__(77);
2913
2914 var _traverseFast2 = _interopRequireDefault(_traverseFast);
2915
2916 var _index2 = __webpack_require__(5);
2917
2918 var _singletons = __webpack_require__(2);
2919
2920 var _babelTypes = __webpack_require__(4);
2921
2922 var t = _interopRequireWildcard(_babelTypes);
2923
2924 var _index3 = __webpack_require__(24);
2925
2926 var _PrimitiveValue = __webpack_require__(301);
2927
2928 var _PrimitiveValue2 = _interopRequireDefault(_PrimitiveValue);
2929
2930 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
2931
2932 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2933
2934 const sourceMap = __webpack_require__(313); /**
2935                                           * Copyright (c) 2017-present, Facebook, Inc.
2936                                           * All rights reserved.
2937                                           *
2938                                           * This source code is licensed under the BSD-style license found in the
2939                                           * LICENSE file in the root directory of this source tree. An additional grant
2940                                           * of patent rights can be found in the PATENTS file in the same directory.
2941                                           */
2942
2943 function deriveGetBinding(realm, binding) {
2944   let types = _index3.TypesDomain.topVal;
2945   let values = _index3.ValuesDomain.topVal;
2946   (0, _invariant2.default)(realm.generator !== undefined);
2947   return realm.generator.derive(types, values, [], (_, context) => context.serializeBinding(binding));
2948 }
2949
2950 function havocBinding(binding) {
2951   let realm = binding.environment.realm;
2952   if (!binding.hasLeaked) {
2953     realm.recordModifiedBinding(binding).hasLeaked = true;
2954   }
2955 }
2956
2957 // ECMA262 8.1.1
2958 class EnvironmentRecord {
2959
2960   constructor(realm) {
2961     (0, _invariant2.default)(realm, "expected realm");
2962     this.realm = realm;
2963     this.isReadOnly = false;
2964   }
2965
2966 }
2967
2968 exports.EnvironmentRecord = EnvironmentRecord;
2969
2970
2971 // ECMA262 8.1.1.1
2972 class DeclarativeEnvironmentRecord extends EnvironmentRecord {
2973   constructor(realm) {
2974     super(realm);
2975     this.bindings = Object.create(null);
2976     this.frozen = false;
2977   }
2978   // Frozen Records cannot have bindings created or deleted but can have bindings updated
2979
2980
2981   // ECMA262 8.1.1.1.1
2982   HasBinding(N) {
2983     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
2984     let envRec = this;
2985
2986     // 2. If envRec has a binding for the name that is the value of N, return true.
2987     if (envRec.bindings[N]) return true;
2988
2989     // 3. Return false.
2990     return false;
2991   }
2992
2993   // ECMA262 8.1.1.1.2
2994   CreateMutableBinding(N, D, isGlobal = false) {
2995     (0, _invariant2.default)(!this.frozen);
2996     let realm = this.realm;
2997
2998     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
2999     let envRec = this;
3000
3001     // 2. Assert: envRec does not already have a binding for N.
3002     (0, _invariant2.default)(!envRec.bindings[N], `shouldn't have the binding ${N}`);
3003
3004     // 3. Create a mutable binding in envRec for N and record that it is uninitialized. If D is true, record that the newly created binding may be deleted by a subsequent DeleteBinding call.
3005     this.bindings[N] = realm.recordModifiedBinding({
3006       initialized: false,
3007       mutable: true,
3008       deletable: D,
3009       environment: envRec,
3010       name: N,
3011       isGlobal: isGlobal,
3012       hasLeaked: false
3013     });
3014
3015     // 4. Return NormalCompletion(empty).
3016     return realm.intrinsics.undefined;
3017   }
3018
3019   // ECMA262 8.1.1.1.3
3020   CreateImmutableBinding(N, S, isGlobal = false) {
3021     (0, _invariant2.default)(!this.frozen);
3022     let realm = this.realm;
3023
3024     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3025     let envRec = this;
3026
3027     // 2. Assert: envRec does not already have a binding for N.
3028     (0, _invariant2.default)(!envRec.bindings[N], `shouldn't have the binding ${N}`);
3029
3030     // 3. Create an immutable binding in envRec for N and record that it is uninitialized. If S is true, record that the newly created binding is a strict binding.
3031     this.bindings[N] = realm.recordModifiedBinding({
3032       initialized: false,
3033       strict: S,
3034       deletable: false,
3035       environment: envRec,
3036       name: N,
3037       isGlobal: isGlobal,
3038       hasLeaked: false
3039     });
3040
3041     // 4. Return NormalCompletion(empty).
3042     return realm.intrinsics.undefined;
3043   }
3044
3045   // ECMA262 8.1.1.1.4
3046   InitializeBinding(N, V) {
3047     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3048     let envRec = this;
3049
3050     let binding = envRec.bindings[N];
3051
3052     // 2. Assert: envRec must have an uninitialized binding for N.
3053     (0, _invariant2.default)(binding && !binding.initialized, `shouldn't have the binding ${N}`);
3054
3055     // 3. Set the bound value for N in envRec to V.
3056     this.realm.recordModifiedBinding(binding).value = V;
3057
3058     // 4. Record that the binding for N in envRec has been initialized.
3059     binding.initialized = true;
3060
3061     // 5. Return NormalCompletion(empty).
3062     return this.realm.intrinsics.empty;
3063   }
3064
3065   // ECMA262 8.1.1.1.5
3066   SetMutableBinding(N, V, S) {
3067     // We can mutate frozen bindings because of captured bindings.
3068     let realm = this.realm;
3069
3070     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3071     let envRec = this;
3072
3073     let binding = envRec.bindings[N];
3074
3075     // 2. If envRec does not have a binding for N, then
3076     if (!binding) {
3077       // a. If S is true, throw a ReferenceError exception.
3078       if (S) {
3079         throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError, `${N} not found`);
3080       }
3081
3082       // b. Perform envRec.CreateMutableBinding(N, true).
3083       envRec.CreateMutableBinding(N, true);
3084
3085       // c. Perform envRec.InitializeBinding(N, V).
3086       envRec.InitializeBinding(N, V);
3087
3088       // d. Return NormalCompletion(empty).
3089       return this.realm.intrinsics.empty;
3090     }
3091
3092     // 3. If the binding for N in envRec is a strict binding, let S be true.
3093     if (binding.strict) S = true;
3094
3095     // 4. If the binding for N in envRec has not yet been initialized, throw a ReferenceError exception.
3096     if (!binding.initialized) {
3097       throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError, `${N} has not yet been initialized`);
3098     } else if (binding.mutable) {
3099       // 5. Else if the binding for N in envRec is a mutable binding, change its bound value to V.
3100       if (binding.hasLeaked) {
3101         _singletons.Havoc.value(realm, V);
3102         (0, _invariant2.default)(realm.generator);
3103         realm.generator.emitBindingAssignment(binding, V);
3104       } else {
3105         realm.recordModifiedBinding(binding).value = V;
3106       }
3107     } else {
3108       // 6. Else,
3109       // a. Assert: This is an attempt to change the value of an immutable binding.
3110
3111       // b. If S is true, throw a TypeError exception.
3112       if (S) {
3113         throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "attempt to change immutable binding");
3114       }
3115     }
3116
3117     // 7. Return NormalCompletion(empty).
3118     return this.realm.intrinsics.empty;
3119   }
3120
3121   // ECMA262 8.1.1.1.6
3122   GetBindingValue(N, S) {
3123     let realm = this.realm;
3124
3125     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3126     let envRec = this;
3127
3128     let binding = envRec.bindings[N];
3129
3130     // 2. Assert: envRec has a binding for N.
3131     (0, _invariant2.default)(binding, "expected binding");
3132
3133     // 3. If the binding for N in envRec is an uninitialized binding, throw a ReferenceError exception.
3134     if (!binding.initialized) {
3135       throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError);
3136     }
3137
3138     // 4. Return the value currently bound to N in envRec.
3139     if (binding.hasLeaked) {
3140       return deriveGetBinding(realm, binding);
3141     }
3142     (0, _invariant2.default)(binding.value);
3143     return binding.value;
3144   }
3145
3146   // ECMA262 8.1.1.1.7
3147   DeleteBinding(N) {
3148     (0, _invariant2.default)(!this.frozen);
3149     // 1. Let envRec be the declarative Environment Record for which the method was invoked.
3150     let envRec = this;
3151
3152     // 2. Assert: envRec has a binding for the name that is the value of N.
3153     (0, _invariant2.default)(envRec.bindings[N], "expected binding to exist");
3154
3155     // 3. If the binding for N in envRec cannot be deleted, return false.
3156     if (!envRec.bindings[N].deletable) return false;
3157
3158     // 4. Remove the binding for N from envRec.
3159     this.realm.recordModifiedBinding(envRec.bindings[N]).value = undefined;
3160     delete envRec.bindings[N];
3161
3162     // 5. Return true.
3163     return true;
3164   }
3165
3166   // ECMA262 8.1.1.1.8
3167   HasThisBinding() {
3168     // 1. Return false.
3169     return false;
3170   }
3171
3172   // ECMA262 8.1.1.1.9
3173   HasSuperBinding() {
3174     // 1. Return false.
3175     return false;
3176   }
3177
3178   // ECMA262 8.1.1.1.10
3179   WithBaseObject() {
3180     // 1. Return undefined.
3181     return this.realm.intrinsics.undefined;
3182   }
3183 }
3184
3185 exports.DeclarativeEnvironmentRecord = DeclarativeEnvironmentRecord; // ECMA262 8.1.1.2
3186
3187 class ObjectEnvironmentRecord extends EnvironmentRecord {
3188
3189   constructor(realm, obj) {
3190     super(realm);
3191     this.object = obj;
3192   }
3193
3194   // ECMA262 8.1.1.2.1
3195   HasBinding(N) {
3196     let realm = this.realm;
3197
3198     // 1. Let envRec be the object Environment Record for which the method was invoked.
3199     let envRec = this;
3200
3201     // 2. Let bindings be the binding object for envRec.
3202     let bindings = this.object;
3203
3204     // 3. Let foundBinding be ? HasProperty(bindings, N).
3205     let foundBinding = (0, _index2.HasProperty)(realm, bindings, N);
3206
3207     // 4. If foundBinding is false, return false.
3208     if (!foundBinding) return false;
3209
3210     // 5. If the withEnvironment flag of envRec is false, return true.
3211     if (!envRec.withEnvironment) return true;
3212
3213     // 6. Let unscopables be ? Get(bindings, @@unscopables).
3214     let unscopables = (0, _index2.Get)(realm, bindings, realm.intrinsics.SymbolUnscopables);
3215
3216     // 7. If Type(unscopables) is Object, then
3217     if (unscopables instanceof _index.ObjectValue || unscopables instanceof _index.AbstractObjectValue) {
3218       // a. Let blocked be ToBoolean(? Get(unscopables, N)).
3219       let blocked = _singletons.To.ToBooleanPartial(realm, (0, _index2.Get)(realm, unscopables, N));
3220
3221       // b. If blocked is true, return false.
3222       if (blocked) return false;
3223     }
3224     unscopables.throwIfNotConcrete();
3225
3226     // 8. Return true.
3227     return true;
3228   }
3229
3230   // ECMA262 8.1.1.2.2
3231   CreateMutableBinding(N, D) {
3232     let realm = this.realm;
3233
3234     // 1. Let envRec be the object Environment Record for which the method was invoked.
3235     let envRec = this;
3236
3237     // 2. Let bindings be the binding object for envRec.
3238     let bindings = envRec.object;
3239
3240     // 3. If D is true, let configValue be true; otherwise let configValue be false.
3241     let configValue = D ? true : false;
3242
3243     // 4. Return ? DefinePropertyOrThrow(bindings, N, PropertyDescriptor{[[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: configValue}).
3244     return new _index.BooleanValue(realm, _singletons.Properties.DefinePropertyOrThrow(realm, bindings, N, {
3245       value: realm.intrinsics.undefined,
3246       writable: true,
3247       enumerable: true,
3248       configurable: configValue
3249     }));
3250   }
3251
3252   // ECMA262 8.1.1.2.3
3253   CreateImmutableBinding(N, S) {
3254     // The concrete Environment Record method CreateImmutableBinding is never used within this specification in association with object Environment Records.
3255     (0, _invariant2.default)(false);
3256   }
3257
3258   // ECMA262 8.1.1.2.4
3259   InitializeBinding(N, V) {
3260     // 1. Let envRec be the object Environment Record for which the method was invoked.
3261     let envRec = this;
3262
3263     // 2. Assert: envRec must have an uninitialized binding for N.
3264     // 3. Record that the binding for N in envRec has been initialized.
3265
3266     // 4. Return ? envRec.SetMutableBinding(N, V, false).
3267     return envRec.SetMutableBinding(N, V, false);
3268   }
3269
3270   // ECMA262 8.1.1.2.5
3271   SetMutableBinding(N, V, S) {
3272     let realm = this.realm;
3273
3274     // 1. Let envRec be the object Environment Record for which the method was invoked.
3275     let envRec = this;
3276
3277     // 2. Let bindings be the binding object for envRec.
3278     let bindings = envRec.object;
3279
3280     // 3. Return ? Set(bindings, N, V, S).
3281     return new _index.BooleanValue(realm, _singletons.Properties.Set(realm, bindings, N, V, S));
3282   }
3283
3284   // ECMA262 8.1.1.2.6
3285   GetBindingValue(N, S) {
3286     let realm = this.realm;
3287
3288     // 1. Let envRec be the object Environment Record for which the method was invoked.
3289     let envRec = this;
3290
3291     // 2. Let bindings be the binding object for envRec.
3292     let bindings = envRec.object;
3293
3294     // 3. Let value be ? HasProperty(bindings, N).
3295     let value = (0, _index2.HasProperty)(realm, bindings, N);
3296
3297     // 4. If value is false, then
3298     if (!value) {
3299       // a. If S is false, return the value undefined; otherwise throw a ReferenceError exception.
3300       if (!S) {
3301         return realm.intrinsics.undefined;
3302       } else {
3303         throw realm.createErrorThrowCompletion(realm.intrinsics.ReferenceError);
3304       }
3305     }
3306
3307     // 5. Return ? Get(bindings, N).
3308     return (0, _index2.Get)(realm, bindings, N);
3309   }
3310
3311   // ECMA262 8.1.1.2.7
3312   DeleteBinding(N) {
3313     // 1. Let envRec be the object Environment Record for which the method was invoked.
3314     let envRec = this;
3315
3316     // 2. Let bindings be the binding object for envRec.
3317     let bindings = envRec.object;
3318
3319     // 3. Return ? bindings.[[Delete]](N).
3320     return bindings.$Delete(N);
3321   }
3322
3323   // ECMA262 8.1.1.2.8
3324   HasThisBinding() {
3325     // 1. Return false.
3326     return false;
3327   }
3328
3329   // ECMA262 8.1.1.2.9
3330   HasSuperBinding() {
3331     // 1. Return false.
3332     return false;
3333   }
3334
3335   // ECMA262 8.1.1.2.10
3336   WithBaseObject() {
3337     // 1. Let envRec be the object Environment Record for which the method was invoked.