esprima.js
   1  (function webpackUniversalModuleDefinition(root, factory) {
   2  /* istanbul ignore next */
   3  	if(typeof exports === 'object' && typeof module === 'object')
   4  		module.exports = factory();
   5  	else if(typeof define === 'function' && define.amd)
   6  		define([], factory);
   7  /* istanbul ignore next */
   8  	else if(typeof exports === 'object')
   9  		exports["esprima"] = factory();
  10  	else
  11  		root["esprima"] = factory();
  12  })(this, function() {
  13  return /******/ (function(modules) { // webpackBootstrap
  14  /******/ 	// The module cache
  15  /******/ 	var installedModules = {};
  16  
  17  /******/ 	// The require function
  18  /******/ 	function __webpack_require__(moduleId) {
  19  
  20  /******/ 		// Check if module is in cache
  21  /* istanbul ignore if */
  22  /******/ 		if(installedModules[moduleId])
  23  /******/ 			return installedModules[moduleId].exports;
  24  
  25  /******/ 		// Create a new module (and put it into the cache)
  26  /******/ 		var module = installedModules[moduleId] = {
  27  /******/ 			exports: {},
  28  /******/ 			id: moduleId,
  29  /******/ 			loaded: false
  30  /******/ 		};
  31  
  32  /******/ 		// Execute the module function
  33  /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  34  
  35  /******/ 		// Flag the module as loaded
  36  /******/ 		module.loaded = true;
  37  
  38  /******/ 		// Return the exports of the module
  39  /******/ 		return module.exports;
  40  /******/ 	}
  41  
  42  
  43  /******/ 	// expose the modules object (__webpack_modules__)
  44  /******/ 	__webpack_require__.m = modules;
  45  
  46  /******/ 	// expose the module cache
  47  /******/ 	__webpack_require__.c = installedModules;
  48  
  49  /******/ 	// __webpack_public_path__
  50  /******/ 	__webpack_require__.p = "";
  51  
  52  /******/ 	// Load entry module and return exports
  53  /******/ 	return __webpack_require__(0);
  54  /******/ })
  55  /************************************************************************/
  56  /******/ ([
  57  /* 0 */
  58  /***/ function(module, exports, __webpack_require__) {
  59  
  60  	"use strict";
  61  	/*
  62  	  Copyright JS Foundation and other contributors, https://js.foundation/
  63  
  64  	  Redistribution and use in source and binary forms, with or without
  65  	  modification, are permitted provided that the following conditions are met:
  66  
  67  	    * Redistributions of source code must retain the above copyright
  68  	      notice, this list of conditions and the following disclaimer.
  69  	    * Redistributions in binary form must reproduce the above copyright
  70  	      notice, this list of conditions and the following disclaimer in the
  71  	      documentation and/or other materials provided with the distribution.
  72  
  73  	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  74  	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  75  	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  76  	  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  77  	  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  78  	  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  79  	  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  80  	  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  81  	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  82  	  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  83  	*/
  84  	Object.defineProperty(exports, "__esModule", { value: true });
  85  	var comment_handler_1 = __webpack_require__(1);
  86  	var jsx_parser_1 = __webpack_require__(3);
  87  	var parser_1 = __webpack_require__(8);
  88  	var tokenizer_1 = __webpack_require__(15);
  89  	function parse(code, options, delegate) {
  90  	    var commentHandler = null;
  91  	    var proxyDelegate = function (node, metadata) {
  92  	        if (delegate) {
  93  	            delegate(node, metadata);
  94  	        }
  95  	        if (commentHandler) {
  96  	            commentHandler.visit(node, metadata);
  97  	        }
  98  	    };
  99  	    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
 100  	    var collectComment = false;
 101  	    if (options) {
 102  	        collectComment = (typeof options.comment === 'boolean' && options.comment);
 103  	        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
 104  	        if (collectComment || attachComment) {
 105  	            commentHandler = new comment_handler_1.CommentHandler();
 106  	            commentHandler.attach = attachComment;
 107  	            options.comment = true;
 108  	            parserDelegate = proxyDelegate;
 109  	        }
 110  	    }
 111  	    var isModule = false;
 112  	    if (options && typeof options.sourceType === 'string') {
 113  	        isModule = (options.sourceType === 'module');
 114  	    }
 115  	    var parser;
 116  	    if (options && typeof options.jsx === 'boolean' && options.jsx) {
 117  	        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
 118  	    }
 119  	    else {
 120  	        parser = new parser_1.Parser(code, options, parserDelegate);
 121  	    }
 122  	    var program = isModule ? parser.parseModule() : parser.parseScript();
 123  	    var ast = program;
 124  	    if (collectComment && commentHandler) {
 125  	        ast.comments = commentHandler.comments;
 126  	    }
 127  	    if (parser.config.tokens) {
 128  	        ast.tokens = parser.tokens;
 129  	    }
 130  	    if (parser.config.tolerant) {
 131  	        ast.errors = parser.errorHandler.errors;
 132  	    }
 133  	    return ast;
 134  	}
 135  	exports.parse = parse;
 136  	function parseModule(code, options, delegate) {
 137  	    var parsingOptions = options || {};
 138  	    parsingOptions.sourceType = 'module';
 139  	    return parse(code, parsingOptions, delegate);
 140  	}
 141  	exports.parseModule = parseModule;
 142  	function parseScript(code, options, delegate) {
 143  	    var parsingOptions = options || {};
 144  	    parsingOptions.sourceType = 'script';
 145  	    return parse(code, parsingOptions, delegate);
 146  	}
 147  	exports.parseScript = parseScript;
 148  	function tokenize(code, options, delegate) {
 149  	    var tokenizer = new tokenizer_1.Tokenizer(code, options);
 150  	    var tokens;
 151  	    tokens = [];
 152  	    try {
 153  	        while (true) {
 154  	            var token = tokenizer.getNextToken();
 155  	            if (!token) {
 156  	                break;
 157  	            }
 158  	            if (delegate) {
 159  	                token = delegate(token);
 160  	            }
 161  	            tokens.push(token);
 162  	        }
 163  	    }
 164  	    catch (e) {
 165  	        tokenizer.errorHandler.tolerate(e);
 166  	    }
 167  	    if (tokenizer.errorHandler.tolerant) {
 168  	        tokens.errors = tokenizer.errors();
 169  	    }
 170  	    return tokens;
 171  	}
 172  	exports.tokenize = tokenize;
 173  	var syntax_1 = __webpack_require__(2);
 174  	exports.Syntax = syntax_1.Syntax;
 175  	// Sync with *.json manifests.
 176  	exports.version = '4.0.1';
 177  
 178  
 179  /***/ },
 180  /* 1 */
 181  /***/ function(module, exports, __webpack_require__) {
 182  
 183  	"use strict";
 184  	Object.defineProperty(exports, "__esModule", { value: true });
 185  	var syntax_1 = __webpack_require__(2);
 186  	var CommentHandler = (function () {
 187  	    function CommentHandler() {
 188  	        this.attach = false;
 189  	        this.comments = [];
 190  	        this.stack = [];
 191  	        this.leading = [];
 192  	        this.trailing = [];
 193  	    }
 194  	    CommentHandler.prototype.insertInnerComments = function (node, metadata) {
 195  	        //  innnerComments for properties empty block
 196  	        //  `function a() {/** comments **\/}`
 197  	        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
 198  	            var innerComments = [];
 199  	            for (var i = this.leading.length - 1; i >= 0; --i) {
 200  	                var entry = this.leading[i];
 201  	                if (metadata.end.offset >= entry.start) {
 202  	                    innerComments.unshift(entry.comment);
 203  	                    this.leading.splice(i, 1);
 204  	                    this.trailing.splice(i, 1);
 205  	                }
 206  	            }
 207  	            if (innerComments.length) {
 208  	                node.innerComments = innerComments;
 209  	            }
 210  	        }
 211  	    };
 212  	    CommentHandler.prototype.findTrailingComments = function (metadata) {
 213  	        var trailingComments = [];
 214  	        if (this.trailing.length > 0) {
 215  	            for (var i = this.trailing.length - 1; i >= 0; --i) {
 216  	                var entry_1 = this.trailing[i];
 217  	                if (entry_1.start >= metadata.end.offset) {
 218  	                    trailingComments.unshift(entry_1.comment);
 219  	                }
 220  	            }
 221  	            this.trailing.length = 0;
 222  	            return trailingComments;
 223  	        }
 224  	        var entry = this.stack[this.stack.length - 1];
 225  	        if (entry && entry.node.trailingComments) {
 226  	            var firstComment = entry.node.trailingComments[0];
 227  	            if (firstComment && firstComment.range[0] >= metadata.end.offset) {
 228  	                trailingComments = entry.node.trailingComments;
 229  	                delete entry.node.trailingComments;
 230  	            }
 231  	        }
 232  	        return trailingComments;
 233  	    };
 234  	    CommentHandler.prototype.findLeadingComments = function (metadata) {
 235  	        var leadingComments = [];
 236  	        var target;
 237  	        while (this.stack.length > 0) {
 238  	            var entry = this.stack[this.stack.length - 1];
 239  	            if (entry && entry.start >= metadata.start.offset) {
 240  	                target = entry.node;
 241  	                this.stack.pop();
 242  	            }
 243  	            else {
 244  	                break;
 245  	            }
 246  	        }
 247  	        if (target) {
 248  	            var count = target.leadingComments ? target.leadingComments.length : 0;
 249  	            for (var i = count - 1; i >= 0; --i) {
 250  	                var comment = target.leadingComments[i];
 251  	                if (comment.range[1] <= metadata.start.offset) {
 252  	                    leadingComments.unshift(comment);
 253  	                    target.leadingComments.splice(i, 1);
 254  	                }
 255  	            }
 256  	            if (target.leadingComments && target.leadingComments.length === 0) {
 257  	                delete target.leadingComments;
 258  	            }
 259  	            return leadingComments;
 260  	        }
 261  	        for (var i = this.leading.length - 1; i >= 0; --i) {
 262  	            var entry = this.leading[i];
 263  	            if (entry.start <= metadata.start.offset) {
 264  	                leadingComments.unshift(entry.comment);
 265  	                this.leading.splice(i, 1);
 266  	            }
 267  	        }
 268  	        return leadingComments;
 269  	    };
 270  	    CommentHandler.prototype.visitNode = function (node, metadata) {
 271  	        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
 272  	            return;
 273  	        }
 274  	        this.insertInnerComments(node, metadata);
 275  	        var trailingComments = this.findTrailingComments(metadata);
 276  	        var leadingComments = this.findLeadingComments(metadata);
 277  	        if (leadingComments.length > 0) {
 278  	            node.leadingComments = leadingComments;
 279  	        }
 280  	        if (trailingComments.length > 0) {
 281  	            node.trailingComments = trailingComments;
 282  	        }
 283  	        this.stack.push({
 284  	            node: node,
 285  	            start: metadata.start.offset
 286  	        });
 287  	    };
 288  	    CommentHandler.prototype.visitComment = function (node, metadata) {
 289  	        var type = (node.type[0] === 'L') ? 'Line' : 'Block';
 290  	        var comment = {
 291  	            type: type,
 292  	            value: node.value
 293  	        };
 294  	        if (node.range) {
 295  	            comment.range = node.range;
 296  	        }
 297  	        if (node.loc) {
 298  	            comment.loc = node.loc;
 299  	        }
 300  	        this.comments.push(comment);
 301  	        if (this.attach) {
 302  	            var entry = {
 303  	                comment: {
 304  	                    type: type,
 305  	                    value: node.value,
 306  	                    range: [metadata.start.offset, metadata.end.offset]
 307  	                },
 308  	                start: metadata.start.offset
 309  	            };
 310  	            if (node.loc) {
 311  	                entry.comment.loc = node.loc;
 312  	            }
 313  	            node.type = type;
 314  	            this.leading.push(entry);
 315  	            this.trailing.push(entry);
 316  	        }
 317  	    };
 318  	    CommentHandler.prototype.visit = function (node, metadata) {
 319  	        if (node.type === 'LineComment') {
 320  	            this.visitComment(node, metadata);
 321  	        }
 322  	        else if (node.type === 'BlockComment') {
 323  	            this.visitComment(node, metadata);
 324  	        }
 325  	        else if (this.attach) {
 326  	            this.visitNode(node, metadata);
 327  	        }
 328  	    };
 329  	    return CommentHandler;
 330  	}());
 331  	exports.CommentHandler = CommentHandler;
 332  
 333  
 334  /***/ },
 335  /* 2 */
 336  /***/ function(module, exports) {
 337  
 338  	"use strict";
 339  	Object.defineProperty(exports, "__esModule", { value: true });
 340  	exports.Syntax = {
 341  	    AssignmentExpression: 'AssignmentExpression',
 342  	    AssignmentPattern: 'AssignmentPattern',
 343  	    ArrayExpression: 'ArrayExpression',
 344  	    ArrayPattern: 'ArrayPattern',
 345  	    ArrowFunctionExpression: 'ArrowFunctionExpression',
 346  	    AwaitExpression: 'AwaitExpression',
 347  	    BlockStatement: 'BlockStatement',
 348  	    BinaryExpression: 'BinaryExpression',
 349  	    BreakStatement: 'BreakStatement',
 350  	    CallExpression: 'CallExpression',
 351  	    CatchClause: 'CatchClause',
 352  	    ClassBody: 'ClassBody',
 353  	    ClassDeclaration: 'ClassDeclaration',
 354  	    ClassExpression: 'ClassExpression',
 355  	    ConditionalExpression: 'ConditionalExpression',
 356  	    ContinueStatement: 'ContinueStatement',
 357  	    DoWhileStatement: 'DoWhileStatement',
 358  	    DebuggerStatement: 'DebuggerStatement',
 359  	    EmptyStatement: 'EmptyStatement',
 360  	    ExportAllDeclaration: 'ExportAllDeclaration',
 361  	    ExportDefaultDeclaration: 'ExportDefaultDeclaration',
 362  	    ExportNamedDeclaration: 'ExportNamedDeclaration',
 363  	    ExportSpecifier: 'ExportSpecifier',
 364  	    ExpressionStatement: 'ExpressionStatement',
 365  	    ForStatement: 'ForStatement',
 366  	    ForOfStatement: 'ForOfStatement',
 367  	    ForInStatement: 'ForInStatement',
 368  	    FunctionDeclaration: 'FunctionDeclaration',
 369  	    FunctionExpression: 'FunctionExpression',
 370  	    Identifier: 'Identifier',
 371  	    IfStatement: 'IfStatement',
 372  	    ImportDeclaration: 'ImportDeclaration',
 373  	    ImportDefaultSpecifier: 'ImportDefaultSpecifier',
 374  	    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
 375  	    ImportSpecifier: 'ImportSpecifier',
 376  	    Literal: 'Literal',
 377  	    LabeledStatement: 'LabeledStatement',
 378  	    LogicalExpression: 'LogicalExpression',
 379  	    MemberExpression: 'MemberExpression',
 380  	    MetaProperty: 'MetaProperty',
 381  	    MethodDefinition: 'MethodDefinition',
 382  	    NewExpression: 'NewExpression',
 383  	    ObjectExpression: 'ObjectExpression',
 384  	    ObjectPattern: 'ObjectPattern',
 385  	    Program: 'Program',
 386  	    Property: 'Property',
 387  	    RestElement: 'RestElement',
 388  	    ReturnStatement: 'ReturnStatement',
 389  	    SequenceExpression: 'SequenceExpression',
 390  	    SpreadElement: 'SpreadElement',
 391  	    Super: 'Super',
 392  	    SwitchCase: 'SwitchCase',
 393  	    SwitchStatement: 'SwitchStatement',
 394  	    TaggedTemplateExpression: 'TaggedTemplateExpression',
 395  	    TemplateElement: 'TemplateElement',
 396  	    TemplateLiteral: 'TemplateLiteral',
 397  	    ThisExpression: 'ThisExpression',
 398  	    ThrowStatement: 'ThrowStatement',
 399  	    TryStatement: 'TryStatement',
 400  	    UnaryExpression: 'UnaryExpression',
 401  	    UpdateExpression: 'UpdateExpression',
 402  	    VariableDeclaration: 'VariableDeclaration',
 403  	    VariableDeclarator: 'VariableDeclarator',
 404  	    WhileStatement: 'WhileStatement',
 405  	    WithStatement: 'WithStatement',
 406  	    YieldExpression: 'YieldExpression'
 407  	};
 408  
 409  
 410  /***/ },
 411  /* 3 */
 412  /***/ function(module, exports, __webpack_require__) {
 413  
 414  	"use strict";
 415  /* istanbul ignore next */
 416  	var __extends = (this && this.__extends) || (function () {
 417  	    var extendStatics = Object.setPrototypeOf ||
 418  	        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
 419  	        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
 420  	    return function (d, b) {
 421  	        extendStatics(d, b);
 422  	        function __() { this.constructor = d; }
 423  	        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
 424  	    };
 425  	})();
 426  	Object.defineProperty(exports, "__esModule", { value: true });
 427  	var character_1 = __webpack_require__(4);
 428  	var JSXNode = __webpack_require__(5);
 429  	var jsx_syntax_1 = __webpack_require__(6);
 430  	var Node = __webpack_require__(7);
 431  	var parser_1 = __webpack_require__(8);
 432  	var token_1 = __webpack_require__(13);
 433  	var xhtml_entities_1 = __webpack_require__(14);
 434  	token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
 435  	token_1.TokenName[101 /* Text */] = 'JSXText';
 436  	// Fully qualified element name, e.g. <svg:path> returns "svg:path"
 437  	function getQualifiedElementName(elementName) {
 438  	    var qualifiedName;
 439  	    switch (elementName.type) {
 440  	        case jsx_syntax_1.JSXSyntax.JSXIdentifier:
 441  	            var id = elementName;
 442  	            qualifiedName = id.name;
 443  	            break;
 444  	        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
 445  	            var ns = elementName;
 446  	            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
 447  	                getQualifiedElementName(ns.name);
 448  	            break;
 449  	        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
 450  	            var expr = elementName;
 451  	            qualifiedName = getQualifiedElementName(expr.object) + '.' +
 452  	                getQualifiedElementName(expr.property);
 453  	            break;
 454  	        /* istanbul ignore next */
 455  	        default:
 456  	            break;
 457  	    }
 458  	    return qualifiedName;
 459  	}
 460  	var JSXParser = (function (_super) {
 461  	    __extends(JSXParser, _super);
 462  	    function JSXParser(code, options, delegate) {
 463  	        return _super.call(this, code, options, delegate) || this;
 464  	    }
 465  	    JSXParser.prototype.parsePrimaryExpression = function () {
 466  	        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
 467  	    };
 468  	    JSXParser.prototype.startJSX = function () {
 469  	        // Unwind the scanner before the lookahead token.
 470  	        this.scanner.index = this.startMarker.index;
 471  	        this.scanner.lineNumber = this.startMarker.line;
 472  	        this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
 473  	    };
 474  	    JSXParser.prototype.finishJSX = function () {
 475  	        // Prime the next lookahead.
 476  	        this.nextToken();
 477  	    };
 478  	    JSXParser.prototype.reenterJSX = function () {
 479  	        this.startJSX();
 480  	        this.expectJSX('}');
 481  	        // Pop the closing '}' added from the lookahead.
 482  	        if (this.config.tokens) {
 483  	            this.tokens.pop();
 484  	        }
 485  	    };
 486  	    JSXParser.prototype.createJSXNode = function () {
 487  	        this.collectComments();
 488  	        return {
 489  	            index: this.scanner.index,
 490  	            line: this.scanner.lineNumber,
 491  	            column: this.scanner.index - this.scanner.lineStart
 492  	        };
 493  	    };
 494  	    JSXParser.prototype.createJSXChildNode = function () {
 495  	        return {
 496  	            index: this.scanner.index,
 497  	            line: this.scanner.lineNumber,
 498  	            column: this.scanner.index - this.scanner.lineStart
 499  	        };
 500  	    };
 501  	    JSXParser.prototype.scanXHTMLEntity = function (quote) {
 502  	        var result = '&';
 503  	        var valid = true;
 504  	        var terminated = false;
 505  	        var numeric = false;
 506  	        var hex = false;
 507  	        while (!this.scanner.eof() && valid && !terminated) {
 508  	            var ch = this.scanner.source[this.scanner.index];
 509  	            if (ch === quote) {
 510  	                break;
 511  	            }
 512  	            terminated = (ch === ';');
 513  	            result += ch;
 514  	            ++this.scanner.index;
 515  	            if (!terminated) {
 516  	                switch (result.length) {
 517  	                    case 2:
 518  	                        // e.g. '&#123;'
 519  	                        numeric = (ch === '#');
 520  	                        break;
 521  	                    case 3:
 522  	                        if (numeric) {
 523  	                            // e.g. '&#x41;'
 524  	                            hex = (ch === 'x');
 525  	                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
 526  	                            numeric = numeric && !hex;
 527  	                        }
 528  	                        break;
 529  	                    default:
 530  	                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
 531  	                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
 532  	                        break;
 533  	                }
 534  	            }
 535  	        }
 536  	        if (valid && terminated && result.length > 2) {
 537  	            // e.g. '&#x41;' becomes just '#x41'
 538  	            var str = result.substr(1, result.length - 2);
 539  	            if (numeric && str.length > 1) {
 540  	                result = String.fromCharCode(parseInt(str.substr(1), 10));
 541  	            }
 542  	            else if (hex && str.length > 2) {
 543  	                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
 544  	            }
 545  	            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
 546  	                result = xhtml_entities_1.XHTMLEntities[str];
 547  	            }
 548  	        }
 549  	        return result;
 550  	    };
 551  	    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
 552  	    JSXParser.prototype.lexJSX = function () {
 553  	        var cp = this.scanner.source.charCodeAt(this.scanner.index);
 554  	        // < > / : = { }
 555  	        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
 556  	            var value = this.scanner.source[this.scanner.index++];
 557  	            return {
 558  	                type: 7 /* Punctuator */,
 559  	                value: value,
 560  	                lineNumber: this.scanner.lineNumber,
 561  	                lineStart: this.scanner.lineStart,
 562  	                start: this.scanner.index - 1,
 563  	                end: this.scanner.index
 564  	            };
 565  	        }
 566  	        // " '
 567  	        if (cp === 34 || cp === 39) {
 568  	            var start = this.scanner.index;
 569  	            var quote = this.scanner.source[this.scanner.index++];
 570  	            var str = '';
 571  	            while (!this.scanner.eof()) {
 572  	                var ch = this.scanner.source[this.scanner.index++];
 573  	                if (ch === quote) {
 574  	                    break;
 575  	                }
 576  	                else if (ch === '&') {
 577  	                    str += this.scanXHTMLEntity(quote);
 578  	                }
 579  	                else {
 580  	                    str += ch;
 581  	                }
 582  	            }
 583  	            return {
 584  	                type: 8 /* StringLiteral */,
 585  	                value: str,
 586  	                lineNumber: this.scanner.lineNumber,
 587  	                lineStart: this.scanner.lineStart,
 588  	                start: start,
 589  	                end: this.scanner.index
 590  	            };
 591  	        }
 592  	        // ... or .
 593  	        if (cp === 46) {
 594  	            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
 595  	            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
 596  	            var value = (n1 === 46 && n2 === 46) ? '...' : '.';
 597  	            var start = this.scanner.index;
 598  	            this.scanner.index += value.length;
 599  	            return {
 600  	                type: 7 /* Punctuator */,
 601  	                value: value,
 602  	                lineNumber: this.scanner.lineNumber,
 603  	                lineStart: this.scanner.lineStart,
 604  	                start: start,
 605  	                end: this.scanner.index
 606  	            };
 607  	        }
 608  	        // `
 609  	        if (cp === 96) {
 610  	            // Only placeholder, since it will be rescanned as a real assignment expression.
 611  	            return {
 612  	                type: 10 /* Template */,
 613  	                value: '',
 614  	                lineNumber: this.scanner.lineNumber,
 615  	                lineStart: this.scanner.lineStart,
 616  	                start: this.scanner.index,
 617  	                end: this.scanner.index
 618  	            };
 619  	        }
 620  	        // Identifer can not contain backslash (char code 92).
 621  	        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
 622  	            var start = this.scanner.index;
 623  	            ++this.scanner.index;
 624  	            while (!this.scanner.eof()) {
 625  	                var ch = this.scanner.source.charCodeAt(this.scanner.index);
 626  	                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
 627  	                    ++this.scanner.index;
 628  	                }
 629  	                else if (ch === 45) {
 630  	                    // Hyphen (char code 45) can be part of an identifier.
 631  	                    ++this.scanner.index;
 632  	                }
 633  	                else {
 634  	                    break;
 635  	                }
 636  	            }
 637  	            var id = this.scanner.source.slice(start, this.scanner.index);
 638  	            return {
 639  	                type: 100 /* Identifier */,
 640  	                value: id,
 641  	                lineNumber: this.scanner.lineNumber,
 642  	                lineStart: this.scanner.lineStart,
 643  	                start: start,
 644  	                end: this.scanner.index
 645  	            };
 646  	        }
 647  	        return this.scanner.lex();
 648  	    };
 649  	    JSXParser.prototype.nextJSXToken = function () {
 650  	        this.collectComments();
 651  	        this.startMarker.index = this.scanner.index;
 652  	        this.startMarker.line = this.scanner.lineNumber;
 653  	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
 654  	        var token = this.lexJSX();
 655  	        this.lastMarker.index = this.scanner.index;
 656  	        this.lastMarker.line = this.scanner.lineNumber;
 657  	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
 658  	        if (this.config.tokens) {
 659  	            this.tokens.push(this.convertToken(token));
 660  	        }
 661  	        return token;
 662  	    };
 663  	    JSXParser.prototype.nextJSXText = function () {
 664  	        this.startMarker.index = this.scanner.index;
 665  	        this.startMarker.line = this.scanner.lineNumber;
 666  	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
 667  	        var start = this.scanner.index;
 668  	        var text = '';
 669  	        while (!this.scanner.eof()) {
 670  	            var ch = this.scanner.source[this.scanner.index];
 671  	            if (ch === '{' || ch === '<') {
 672  	                break;
 673  	            }
 674  	            ++this.scanner.index;
 675  	            text += ch;
 676  	            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
 677  	                ++this.scanner.lineNumber;
 678  	                if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
 679  	                    ++this.scanner.index;
 680  	                }
 681  	                this.scanner.lineStart = this.scanner.index;
 682  	            }
 683  	        }
 684  	        this.lastMarker.index = this.scanner.index;
 685  	        this.lastMarker.line = this.scanner.lineNumber;
 686  	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
 687  	        var token = {
 688  	            type: 101 /* Text */,
 689  	            value: text,
 690  	            lineNumber: this.scanner.lineNumber,
 691  	            lineStart: this.scanner.lineStart,
 692  	            start: start,
 693  	            end: this.scanner.index
 694  	        };
 695  	        if ((text.length > 0) && this.config.tokens) {
 696  	            this.tokens.push(this.convertToken(token));
 697  	        }
 698  	        return token;
 699  	    };
 700  	    JSXParser.prototype.peekJSXToken = function () {
 701  	        var state = this.scanner.saveState();
 702  	        this.scanner.scanComments();
 703  	        var next = this.lexJSX();
 704  	        this.scanner.restoreState(state);
 705  	        return next;
 706  	    };
 707  	    // Expect the next JSX token to match the specified punctuator.
 708  	    // If not, an exception will be thrown.
 709  	    JSXParser.prototype.expectJSX = function (value) {
 710  	        var token = this.nextJSXToken();
 711  	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
 712  	            this.throwUnexpectedToken(token);
 713  	        }
 714  	    };
 715  	    // Return true if the next JSX token matches the specified punctuator.
 716  	    JSXParser.prototype.matchJSX = function (value) {
 717  	        var next = this.peekJSXToken();
 718  	        return next.type === 7 /* Punctuator */ && next.value === value;
 719  	    };
 720  	    JSXParser.prototype.parseJSXIdentifier = function () {
 721  	        var node = this.createJSXNode();
 722  	        var token = this.nextJSXToken();
 723  	        if (token.type !== 100 /* Identifier */) {
 724  	            this.throwUnexpectedToken(token);
 725  	        }
 726  	        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
 727  	    };
 728  	    JSXParser.prototype.parseJSXElementName = function () {
 729  	        var node = this.createJSXNode();
 730  	        var elementName = this.parseJSXIdentifier();
 731  	        if (this.matchJSX(':')) {
 732  	            var namespace = elementName;
 733  	            this.expectJSX(':');
 734  	            var name_1 = this.parseJSXIdentifier();
 735  	            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
 736  	        }
 737  	        else if (this.matchJSX('.')) {
 738  	            while (this.matchJSX('.')) {
 739  	                var object = elementName;
 740  	                this.expectJSX('.');
 741  	                var property = this.parseJSXIdentifier();
 742  	                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
 743  	            }
 744  	        }
 745  	        return elementName;
 746  	    };
 747  	    JSXParser.prototype.parseJSXAttributeName = function () {
 748  	        var node = this.createJSXNode();
 749  	        var attributeName;
 750  	        var identifier = this.parseJSXIdentifier();
 751  	        if (this.matchJSX(':')) {
 752  	            var namespace = identifier;
 753  	            this.expectJSX(':');
 754  	            var name_2 = this.parseJSXIdentifier();
 755  	            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
 756  	        }
 757  	        else {
 758  	            attributeName = identifier;
 759  	        }
 760  	        return attributeName;
 761  	    };
 762  	    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
 763  	        var node = this.createJSXNode();
 764  	        var token = this.nextJSXToken();
 765  	        if (token.type !== 8 /* StringLiteral */) {
 766  	            this.throwUnexpectedToken(token);
 767  	        }
 768  	        var raw = this.getTokenRaw(token);
 769  	        return this.finalize(node, new Node.Literal(token.value, raw));
 770  	    };
 771  	    JSXParser.prototype.parseJSXExpressionAttribute = function () {
 772  	        var node = this.createJSXNode();
 773  	        this.expectJSX('{');
 774  	        this.finishJSX();
 775  	        if (this.match('}')) {
 776  	            this.tolerateError('JSX attributes must only be assigned a non-empty expression');
 777  	        }
 778  	        var expression = this.parseAssignmentExpression();
 779  	        this.reenterJSX();
 780  	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
 781  	    };
 782  	    JSXParser.prototype.parseJSXAttributeValue = function () {
 783  	        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
 784  	            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
 785  	    };
 786  	    JSXParser.prototype.parseJSXNameValueAttribute = function () {
 787  	        var node = this.createJSXNode();
 788  	        var name = this.parseJSXAttributeName();
 789  	        var value = null;
 790  	        if (this.matchJSX('=')) {
 791  	            this.expectJSX('=');
 792  	            value = this.parseJSXAttributeValue();
 793  	        }
 794  	        return this.finalize(node, new JSXNode.JSXAttribute(name, value));
 795  	    };
 796  	    JSXParser.prototype.parseJSXSpreadAttribute = function () {
 797  	        var node = this.createJSXNode();
 798  	        this.expectJSX('{');
 799  	        this.expectJSX('...');
 800  	        this.finishJSX();
 801  	        var argument = this.parseAssignmentExpression();
 802  	        this.reenterJSX();
 803  	        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
 804  	    };
 805  	    JSXParser.prototype.parseJSXAttributes = function () {
 806  	        var attributes = [];
 807  	        while (!this.matchJSX('/') && !this.matchJSX('>')) {
 808  	            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
 809  	                this.parseJSXNameValueAttribute();
 810  	            attributes.push(attribute);
 811  	        }
 812  	        return attributes;
 813  	    };
 814  	    JSXParser.prototype.parseJSXOpeningElement = function () {
 815  	        var node = this.createJSXNode();
 816  	        this.expectJSX('<');
 817  	        var name = this.parseJSXElementName();
 818  	        var attributes = this.parseJSXAttributes();
 819  	        var selfClosing = this.matchJSX('/');
 820  	        if (selfClosing) {
 821  	            this.expectJSX('/');
 822  	        }
 823  	        this.expectJSX('>');
 824  	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
 825  	    };
 826  	    JSXParser.prototype.parseJSXBoundaryElement = function () {
 827  	        var node = this.createJSXNode();
 828  	        this.expectJSX('<');
 829  	        if (this.matchJSX('/')) {
 830  	            this.expectJSX('/');
 831  	            var name_3 = this.parseJSXElementName();
 832  	            this.expectJSX('>');
 833  	            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
 834  	        }
 835  	        var name = this.parseJSXElementName();
 836  	        var attributes = this.parseJSXAttributes();
 837  	        var selfClosing = this.matchJSX('/');
 838  	        if (selfClosing) {
 839  	            this.expectJSX('/');
 840  	        }
 841  	        this.expectJSX('>');
 842  	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
 843  	    };
 844  	    JSXParser.prototype.parseJSXEmptyExpression = function () {
 845  	        var node = this.createJSXChildNode();
 846  	        this.collectComments();
 847  	        this.lastMarker.index = this.scanner.index;
 848  	        this.lastMarker.line = this.scanner.lineNumber;
 849  	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
 850  	        return this.finalize(node, new JSXNode.JSXEmptyExpression());
 851  	    };
 852  	    JSXParser.prototype.parseJSXExpressionContainer = function () {
 853  	        var node = this.createJSXNode();
 854  	        this.expectJSX('{');
 855  	        var expression;
 856  	        if (this.matchJSX('}')) {
 857  	            expression = this.parseJSXEmptyExpression();
 858  	            this.expectJSX('}');
 859  	        }
 860  	        else {
 861  	            this.finishJSX();
 862  	            expression = this.parseAssignmentExpression();
 863  	            this.reenterJSX();
 864  	        }
 865  	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
 866  	    };
 867  	    JSXParser.prototype.parseJSXChildren = function () {
 868  	        var children = [];
 869  	        while (!this.scanner.eof()) {
 870  	            var node = this.createJSXChildNode();
 871  	            var token = this.nextJSXText();
 872  	            if (token.start < token.end) {
 873  	                var raw = this.getTokenRaw(token);
 874  	                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
 875  	                children.push(child);
 876  	            }
 877  	            if (this.scanner.source[this.scanner.index] === '{') {
 878  	                var container = this.parseJSXExpressionContainer();
 879  	                children.push(container);
 880  	            }
 881  	            else {
 882  	                break;
 883  	            }
 884  	        }
 885  	        return children;
 886  	    };
 887  	    JSXParser.prototype.parseComplexJSXElement = function (el) {
 888  	        var stack = [];
 889  	        while (!this.scanner.eof()) {
 890  	            el.children = el.children.concat(this.parseJSXChildren());
 891  	            var node = this.createJSXChildNode();
 892  	            var element = this.parseJSXBoundaryElement();
 893  	            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
 894  	                var opening = element;
 895  	                if (opening.selfClosing) {
 896  	                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
 897  	                    el.children.push(child);
 898  	                }
 899  	                else {
 900  	                    stack.push(el);
 901  	                    el = { node: node, opening: opening, closing: null, children: [] };
 902  	                }
 903  	            }
 904  	            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
 905  	                el.closing = element;
 906  	                var open_1 = getQualifiedElementName(el.opening.name);
 907  	                var close_1 = getQualifiedElementName(el.closing.name);
 908  	                if (open_1 !== close_1) {
 909  	                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
 910  	                }
 911  	                if (stack.length > 0) {
 912  	                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
 913  	                    el = stack[stack.length - 1];
 914  	                    el.children.push(child);
 915  	                    stack.pop();
 916  	                }
 917  	                else {
 918  	                    break;
 919  	                }
 920  	            }
 921  	        }
 922  	        return el;
 923  	    };
 924  	    JSXParser.prototype.parseJSXElement = function () {
 925  	        var node = this.createJSXNode();
 926  	        var opening = this.parseJSXOpeningElement();
 927  	        var children = [];
 928  	        var closing = null;
 929  	        if (!opening.selfClosing) {
 930  	            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
 931  	            children = el.children;
 932  	            closing = el.closing;
 933  	        }
 934  	        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
 935  	    };
 936  	    JSXParser.prototype.parseJSXRoot = function () {
 937  	        // Pop the opening '<' added from the lookahead.
 938  	        if (this.config.tokens) {
 939  	            this.tokens.pop();
 940  	        }
 941  	        this.startJSX();
 942  	        var element = this.parseJSXElement();
 943  	        this.finishJSX();
 944  	        return element;
 945  	    };
 946  	    JSXParser.prototype.isStartOfExpression = function () {
 947  	        return _super.prototype.isStartOfExpression.call(this) || this.match('<');
 948  	    };
 949  	    return JSXParser;
 950  	}(parser_1.Parser));
 951  	exports.JSXParser = JSXParser;
 952  
 953  
 954  /***/ },
 955  /* 4 */
 956  /***/ function(module, exports) {
 957  
 958  	"use strict";
 959  	Object.defineProperty(exports, "__esModule", { value: true });
 960  	// See also tools/generate-unicode-regex.js.
 961  	var Regex = {
 962  	    // Unicode v8.0.0 NonAsciiIdentifierStart:
 963  	    NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
 964  	    // Unicode v8.0.0 NonAsciiIdentifierPart:
 965  	    NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
 966  	};
 967  	exports.Character = {
 968  	    /* tslint:disable:no-bitwise */
 969  	    fromCodePoint: function (cp) {
 970  	        return (cp < 0x10000) ? String.fromCharCode(cp) :
 971  	            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
 972  	                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
 973  	    },
 974  	    // https://tc39.github.io/ecma262/#sec-white-space
 975  	    isWhiteSpace: function (cp) {
 976  	        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
 977  	            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
 978  	    },
 979  	    // https://tc39.github.io/ecma262/#sec-line-terminators
 980  	    isLineTerminator: function (cp) {
 981  	        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
 982  	    },
 983  	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
 984  	    isIdentifierStart: function (cp) {
 985  	        return (cp === 0x24) || (cp === 0x5F) ||
 986  	            (cp >= 0x41 && cp <= 0x5A) ||
 987  	            (cp >= 0x61 && cp <= 0x7A) ||
 988  	            (cp === 0x5C) ||
 989  	            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
 990  	    },
 991  	    isIdentifierPart: function (cp) {
 992  	        return (cp === 0x24) || (cp === 0x5F) ||
 993  	            (cp >= 0x41 && cp <= 0x5A) ||
 994  	            (cp >= 0x61 && cp <= 0x7A) ||
 995  	            (cp >= 0x30 && cp <= 0x39) ||
 996  	            (cp === 0x5C) ||
 997  	            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
 998  	    },
 999  	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
1000  	    isDecimalDigit: function (cp) {
1001  	        return (cp >= 0x30 && cp <= 0x39); // 0..9
1002  	    },
1003  	    isHexDigit: function (cp) {
1004  	        return (cp >= 0x30 && cp <= 0x39) ||
1005  	            (cp >= 0x41 && cp <= 0x46) ||
1006  	            (cp >= 0x61 && cp <= 0x66); // a..f
1007  	    },
1008  	    isOctalDigit: function (cp) {
1009  	        return (cp >= 0x30 && cp <= 0x37); // 0..7
1010  	    }
1011  	};
1012  
1013  
1014  /***/ },
1015  /* 5 */
1016  /***/ function(module, exports, __webpack_require__) {
1017  
1018  	"use strict";
1019  	Object.defineProperty(exports, "__esModule", { value: true });
1020  	var jsx_syntax_1 = __webpack_require__(6);
1021  	/* tslint:disable:max-classes-per-file */
1022  	var JSXClosingElement = (function () {
1023  	    function JSXClosingElement(name) {
1024  	        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
1025  	        this.name = name;
1026  	    }
1027  	    return JSXClosingElement;
1028  	}());
1029  	exports.JSXClosingElement = JSXClosingElement;
1030  	var JSXElement = (function () {
1031  	    function JSXElement(openingElement, children, closingElement) {
1032  	        this.type = jsx_syntax_1.JSXSyntax.JSXElement;
1033  	        this.openingElement = openingElement;
1034  	        this.children = children;
1035  	        this.closingElement = closingElement;
1036  	    }
1037  	    return JSXElement;
1038  	}());
1039  	exports.JSXElement = JSXElement;
1040  	var JSXEmptyExpression = (function () {
1041  	    function JSXEmptyExpression() {
1042  	        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
1043  	    }
1044  	    return JSXEmptyExpression;
1045  	}());
1046  	exports.JSXEmptyExpression = JSXEmptyExpression;
1047  	var JSXExpressionContainer = (function () {
1048  	    function JSXExpressionContainer(expression) {
1049  	        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
1050  	        this.expression = expression;
1051  	    }
1052  	    return JSXExpressionContainer;
1053  	}());
1054  	exports.JSXExpressionContainer = JSXExpressionContainer;
1055  	var JSXIdentifier = (function () {
1056  	    function JSXIdentifier(name) {
1057  	        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
1058  	        this.name = name;
1059  	    }
1060  	    return JSXIdentifier;
1061  	}());
1062  	exports.JSXIdentifier = JSXIdentifier;
1063  	var JSXMemberExpression = (function () {
1064  	    function JSXMemberExpression(object, property) {
1065  	        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
1066  	        this.object = object;
1067  	        this.property = property;
1068  	    }
1069  	    return JSXMemberExpression;
1070  	}());
1071  	exports.JSXMemberExpression = JSXMemberExpression;
1072  	var JSXAttribute = (function () {
1073  	    function JSXAttribute(name, value) {
1074  	        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
1075  	        this.name = name;
1076  	        this.value = value;
1077  	    }
1078  	    return JSXAttribute;
1079  	}());
1080  	exports.JSXAttribute = JSXAttribute;
1081  	var JSXNamespacedName = (function () {
1082  	    function JSXNamespacedName(namespace, name) {
1083  	        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
1084  	        this.namespace = namespace;
1085  	        this.name = name;
1086  	    }
1087  	    return JSXNamespacedName;
1088  	}());
1089  	exports.JSXNamespacedName = JSXNamespacedName;
1090  	var JSXOpeningElement = (function () {
1091  	    function JSXOpeningElement(name, selfClosing, attributes) {
1092  	        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
1093  	        this.name = name;
1094  	        this.selfClosing = selfClosing;
1095  	        this.attributes = attributes;
1096  	    }
1097  	    return JSXOpeningElement;
1098  	}());
1099  	exports.JSXOpeningElement = JSXOpeningElement;
1100  	var JSXSpreadAttribute = (function () {
1101  	    function JSXSpreadAttribute(argument) {
1102  	        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
1103  	        this.argument = argument;
1104  	    }
1105  	    return JSXSpreadAttribute;
1106  	}());
1107  	exports.JSXSpreadAttribute = JSXSpreadAttribute;
1108  	var JSXText = (function () {
1109  	    function JSXText(value, raw) {
1110  	        this.type = jsx_syntax_1.JSXSyntax.JSXText;
1111  	        this.value = value;
1112  	        this.raw = raw;
1113  	    }
1114  	    return JSXText;
1115  	}());
1116  	exports.JSXText = JSXText;
1117  
1118  
1119  /***/ },
1120  /* 6 */
1121  /***/ function(module, exports) {
1122  
1123  	"use strict";
1124  	Object.defineProperty(exports, "__esModule", { value: true });
1125  	exports.JSXSyntax = {
1126  	    JSXAttribute: 'JSXAttribute',
1127  	    JSXClosingElement: 'JSXClosingElement',
1128  	    JSXElement: 'JSXElement',
1129  	    JSXEmptyExpression: 'JSXEmptyExpression',
1130  	    JSXExpressionContainer: 'JSXExpressionContainer',
1131  	    JSXIdentifier: 'JSXIdentifier',
1132  	    JSXMemberExpression: 'JSXMemberExpression',
1133  	    JSXNamespacedName: 'JSXNamespacedName',
1134  	    JSXOpeningElement: 'JSXOpeningElement',
1135  	    JSXSpreadAttribute: 'JSXSpreadAttribute',
1136  	    JSXText: 'JSXText'
1137  	};
1138  
1139  
1140  /***/ },
1141  /* 7 */
1142  /***/ function(module, exports, __webpack_require__) {
1143  
1144  	"use strict";
1145  	Object.defineProperty(exports, "__esModule", { value: true });
1146  	var syntax_1 = __webpack_require__(2);
1147  	/* tslint:disable:max-classes-per-file */
1148  	var ArrayExpression = (function () {
1149  	    function ArrayExpression(elements) {
1150  	        this.type = syntax_1.Syntax.ArrayExpression;
1151  	        this.elements = elements;
1152  	    }
1153  	    return ArrayExpression;
1154  	}());
1155  	exports.ArrayExpression = ArrayExpression;
1156  	var ArrayPattern = (function () {
1157  	    function ArrayPattern(elements) {
1158  	        this.type = syntax_1.Syntax.ArrayPattern;
1159  	        this.elements = elements;
1160  	    }
1161  	    return ArrayPattern;
1162  	}());
1163  	exports.ArrayPattern = ArrayPattern;
1164  	var ArrowFunctionExpression = (function () {
1165  	    function ArrowFunctionExpression(params, body, expression) {
1166  	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
1167  	        this.id = null;
1168  	        this.params = params;
1169  	        this.body = body;
1170  	        this.generator = false;
1171  	        this.expression = expression;
1172  	        this.async = false;
1173  	    }
1174  	    return ArrowFunctionExpression;
1175  	}());
1176  	exports.ArrowFunctionExpression = ArrowFunctionExpression;
1177  	var AssignmentExpression = (function () {
1178  	    function AssignmentExpression(operator, left, right) {
1179  	        this.type = syntax_1.Syntax.AssignmentExpression;
1180  	        this.operator = operator;
1181  	        this.left = left;
1182  	        this.right = right;
1183  	    }
1184  	    return AssignmentExpression;
1185  	}());
1186  	exports.AssignmentExpression = AssignmentExpression;
1187  	var AssignmentPattern = (function () {
1188  	    function AssignmentPattern(left, right) {
1189  	        this.type = syntax_1.Syntax.AssignmentPattern;
1190  	        this.left = left;
1191  	        this.right = right;
1192  	    }
1193  	    return AssignmentPattern;
1194  	}());
1195  	exports.AssignmentPattern = AssignmentPattern;
1196  	var AsyncArrowFunctionExpression = (function () {
1197  	    function AsyncArrowFunctionExpression(params, body, expression) {
1198  	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
1199  	        this.id = null;
1200  	        this.params = params;
1201  	        this.body = body;
1202  	        this.generator = false;
1203  	        this.expression = expression;
1204  	        this.async = true;
1205  	    }
1206  	    return AsyncArrowFunctionExpression;
1207  	}());
1208  	exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
1209  	var AsyncFunctionDeclaration = (function () {
1210  	    function AsyncFunctionDeclaration(id, params, body) {
1211  	        this.type = syntax_1.Syntax.FunctionDeclaration;
1212  	        this.id = id;
1213  	        this.params = params;
1214  	        this.body = body;
1215  	        this.generator = false;
1216  	        this.expression = false;
1217  	        this.async = true;
1218  	    }
1219  	    return AsyncFunctionDeclaration;
1220  	}());
1221  	exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
1222  	var AsyncFunctionExpression = (function () {
1223  	    function AsyncFunctionExpression(id, params, body) {
1224  	        this.type = syntax_1.Syntax.FunctionExpression;
1225  	        this.id = id;
1226  	        this.params = params;
1227  	        this.body = body;
1228  	        this.generator = false;
1229  	        this.expression = false;
1230  	        this.async = true;
1231  	    }
1232  	    return AsyncFunctionExpression;
1233  	}());
1234  	exports.AsyncFunctionExpression = AsyncFunctionExpression;
1235  	var AwaitExpression = (function () {
1236  	    function AwaitExpression(argument) {
1237  	        this.type = syntax_1.Syntax.AwaitExpression;
1238  	        this.argument = argument;
1239  	    }
1240  	    return AwaitExpression;
1241  	}());
1242  	exports.AwaitExpression = AwaitExpression;
1243  	var BinaryExpression = (function () {
1244  	    function BinaryExpression(operator, left, right) {
1245  	        var logical = (operator === '||' || operator === '&&');
1246  	        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
1247  	        this.operator = operator;
1248  	        this.left = left;
1249  	        this.right = right;
1250  	    }
1251  	    return BinaryExpression;
1252  	}());
1253  	exports.BinaryExpression = BinaryExpression;
1254  	var BlockStatement = (function () {
1255  	    function BlockStatement(body) {
1256  	        this.type = syntax_1.Syntax.BlockStatement;
1257  	        this.body = body;
1258  	    }
1259  	    return BlockStatement;
1260  	}());
1261  	exports.BlockStatement = BlockStatement;
1262  	var BreakStatement = (function () {
1263  	    function BreakStatement(label) {
1264  	        this.type = syntax_1.Syntax.BreakStatement;
1265  	        this.label = label;
1266  	    }
1267  	    return BreakStatement;
1268  	}());
1269  	exports.BreakStatement = BreakStatement;
1270  	var CallExpression = (function () {
1271  	    function CallExpression(callee, args) {
1272  	        this.type = syntax_1.Syntax.CallExpression;
1273  	        this.callee = callee;
1274  	        this.arguments = args;
1275  	    }
1276  	    return CallExpression;
1277  	}());
1278  	exports.CallExpression = CallExpression;
1279  	var CatchClause = (function () {
1280  	    function CatchClause(param, body) {
1281  	        this.type = syntax_1.Syntax.CatchClause;
1282  	        this.param = param;
1283  	        this.body = body;
1284  	    }
1285  	    return CatchClause;
1286  	}());
1287  	exports.CatchClause = CatchClause;
1288  	var ClassBody = (function () {
1289  	    function ClassBody(body) {
1290  	        this.type = syntax_1.Syntax.ClassBody;
1291  	        this.body = body;
1292  	    }
1293  	    return ClassBody;
1294  	}());
1295  	exports.ClassBody = ClassBody;
1296  	var ClassDeclaration = (function () {
1297  	    function ClassDeclaration(id, superClass, body) {
1298  	        this.type = syntax_1.Syntax.ClassDeclaration;
1299  	        this.id = id;
1300  	        this.superClass = superClass;
1301  	        this.body = body;
1302  	    }
1303  	    return ClassDeclaration;
1304  	}());
1305  	exports.ClassDeclaration = ClassDeclaration;
1306  	var ClassExpression = (function () {
1307  	    function ClassExpression(id, superClass, body) {
1308  	        this.type = syntax_1.Syntax.ClassExpression;
1309  	        this.id = id;
1310  	        this.superClass = superClass;
1311  	        this.body = body;
1312  	    }
1313  	    return ClassExpression;
1314  	}());
1315  	exports.ClassExpression = ClassExpression;
1316  	var ComputedMemberExpression = (function () {
1317  	    function ComputedMemberExpression(object, property) {
1318  	        this.type = syntax_1.Syntax.MemberExpression;
1319  	        this.computed = true;
1320  	        this.object = object;
1321  	        this.property = property;
1322  	    }
1323  	    return ComputedMemberExpression;
1324  	}());
1325  	exports.ComputedMemberExpression = ComputedMemberExpression;
1326  	var ConditionalExpression = (function () {
1327  	    function ConditionalExpression(test, consequent, alternate) {
1328  	        this.type = syntax_1.Syntax.ConditionalExpression;
1329  	        this.test = test;
1330  	        this.consequent = consequent;
1331  	        this.alternate = alternate;
1332  	    }
1333  	    return ConditionalExpression;
1334  	}());
1335  	exports.ConditionalExpression = ConditionalExpression;
1336  	var ContinueStatement = (function () {
1337  	    function ContinueStatement(label) {
1338  	        this.type = syntax_1.Syntax.ContinueStatement;
1339  	        this.label = label;
1340  	    }
1341  	    return ContinueStatement;
1342  	}());
1343  	exports.ContinueStatement = ContinueStatement;
1344  	var DebuggerStatement = (function () {
1345  	    function DebuggerStatement() {
1346  	        this.type = syntax_1.Syntax.DebuggerStatement;
1347  	    }
1348  	    return DebuggerStatement;
1349  	}());
1350  	exports.DebuggerStatement = DebuggerStatement;
1351  	var Directive = (function () {
1352  	    function Directive(expression, directive) {
1353  	        this.type = syntax_1.Syntax.ExpressionStatement;
1354  	        this.expression = expression;
1355  	        this.directive = directive;
1356  	    }
1357  	    return Directive;
1358  	}());
1359  	exports.Directive = Directive;
1360  	var DoWhileStatement = (function () {
1361  	    function DoWhileStatement(body, test) {
1362  	        this.type = syntax_1.Syntax.DoWhileStatement;
1363  	        this.body = body;
1364  	        this.test = test;
1365  	    }
1366  	    return DoWhileStatement;
1367  	}());
1368  	exports.DoWhileStatement = DoWhileStatement;
1369  	var EmptyStatement = (function () {
1370  	    function EmptyStatement() {
1371  	        this.type = syntax_1.Syntax.EmptyStatement;
1372  	    }
1373  	    return EmptyStatement;
1374  	}());
1375  	exports.EmptyStatement = EmptyStatement;
1376  	var ExportAllDeclaration = (function () {
1377  	    function ExportAllDeclaration(source) {
1378  	        this.type = syntax_1.Syntax.ExportAllDeclaration;
1379  	        this.source = source;
1380  	    }
1381  	    return ExportAllDeclaration;
1382  	}());
1383  	exports.ExportAllDeclaration = ExportAllDeclaration;
1384  	var ExportDefaultDeclaration = (function () {
1385  	    function ExportDefaultDeclaration(declaration) {
1386  	        this.type = syntax_1.Syntax.ExportDefaultDeclaration;
1387  	        this.declaration = declaration;
1388  	    }
1389  	    return ExportDefaultDeclaration;
1390  	}());
1391  	exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
1392  	var ExportNamedDeclaration = (function () {
1393  	    function ExportNamedDeclaration(declaration, specifiers, source) {
1394  	        this.type = syntax_1.Syntax.ExportNamedDeclaration;
1395  	        this.declaration = declaration;
1396  	        this.specifiers = specifiers;
1397  	        this.source = source;
1398  	    }
1399  	    return ExportNamedDeclaration;
1400  	}());
1401  	exports.ExportNamedDeclaration = ExportNamedDeclaration;
1402  	var ExportSpecifier = (function () {
1403  	    function ExportSpecifier(local, exported) {
1404  	        this.type = syntax_1.Syntax.ExportSpecifier;
1405  	        this.exported = exported;
1406  	        this.local = local;
1407  	    }
1408  	    return ExportSpecifier;
1409  	}());
1410  	exports.ExportSpecifier = ExportSpecifier;
1411  	var ExpressionStatement = (function () {
1412  	    function ExpressionStatement(expression) {
1413  	        this.type = syntax_1.Syntax.ExpressionStatement;
1414  	        this.expression = expression;
1415  	    }
1416  	    return ExpressionStatement;
1417  	}());
1418  	exports.ExpressionStatement = ExpressionStatement;
1419  	var ForInStatement = (function () {
1420  	    function ForInStatement(left, right, body) {
1421  	        this.type = syntax_1.Syntax.ForInStatement;
1422  	        this.left = left;
1423  	        this.right = right;
1424  	        this.body = body;
1425  	        this.each = false;
1426  	    }
1427  	    return ForInStatement;
1428  	}());
1429  	exports.ForInStatement = ForInStatement;
1430  	var ForOfStatement = (function () {
1431  	    function ForOfStatement(left, right, body) {
1432  	        this.type = syntax_1.Syntax.ForOfStatement;
1433  	        this.left = left;
1434  	        this.right = right;
1435  	        this.body = body;
1436  	    }
1437  	    return ForOfStatement;
1438  	}());
1439  	exports.ForOfStatement = ForOfStatement;
1440  	var ForStatement = (function () {
1441  	    function ForStatement(init, test, update, body) {
1442  	        this.type = syntax_1.Syntax.ForStatement;
1443  	        this.init = init;
1444  	        this.test = test;
1445  	        this.update = update;
1446  	        this.body = body;
1447  	    }
1448  	    return ForStatement;
1449  	}());
1450  	exports.ForStatement = ForStatement;
1451  	var FunctionDeclaration = (function () {
1452  	    function FunctionDeclaration(id, params, body, generator) {
1453  	        this.type = syntax_1.Syntax.FunctionDeclaration;
1454  	        this.id = id;
1455  	        this.params = params;
1456  	        this.body = body;
1457  	        this.generator = generator;
1458  	        this.expression = false;
1459  	        this.async = false;
1460  	    }
1461  	    return FunctionDeclaration;
1462  	}());
1463  	exports.FunctionDeclaration = FunctionDeclaration;
1464  	var FunctionExpression = (function () {
1465  	    function FunctionExpression(id, params, body, generator) {
1466  	        this.type = syntax_1.Syntax.FunctionExpression;
1467  	        this.id = id;
1468  	        this.params = params;
1469  	        this.body = body;
1470  	        this.generator = generator;
1471  	        this.expression = false;
1472  	        this.async = false;
1473  	    }
1474  	    return FunctionExpression;
1475  	}());
1476  	exports.FunctionExpression = FunctionExpression;
1477  	var Identifier = (function () {
1478  	    function Identifier(name) {
1479  	        this.type = syntax_1.Syntax.Identifier;
1480  	        this.name = name;
1481  	    }
1482  	    return Identifier;
1483  	}());
1484  	exports.Identifier = Identifier;
1485  	var IfStatement = (function () {
1486  	    function IfStatement(test, consequent, alternate) {
1487  	        this.type = syntax_1.Syntax.IfStatement;
1488  	        this.test = test;
1489  	        this.consequent = consequent;
1490  	        this.alternate = alternate;
1491  	    }
1492  	    return IfStatement;
1493  	}());
1494  	exports.IfStatement = IfStatement;
1495  	var ImportDeclaration = (function () {
1496  	    function ImportDeclaration(specifiers, source) {
1497  	        this.type = syntax_1.Syntax.ImportDeclaration;
1498  	        this.specifiers = specifiers;
1499  	        this.source = source;
1500  	    }
1501  	    return ImportDeclaration;
1502  	}());
1503  	exports.ImportDeclaration = ImportDeclaration;
1504  	var ImportDefaultSpecifier = (function () {
1505  	    function ImportDefaultSpecifier(local) {
1506  	        this.type = syntax_1.Syntax.ImportDefaultSpecifier;
1507  	        this.local = local;
1508  	    }
1509  	    return ImportDefaultSpecifier;
1510  	}());
1511  	exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
1512  	var ImportNamespaceSpecifier = (function () {
1513  	    function ImportNamespaceSpecifier(local) {
1514  	        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
1515  	        this.local = local;
1516  	    }
1517  	    return ImportNamespaceSpecifier;
1518  	}());
1519  	exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
1520  	var ImportSpecifier = (function () {
1521  	    function ImportSpecifier(local, imported) {
1522  	        this.type = syntax_1.Syntax.ImportSpecifier;
1523  	        this.local = local;
1524  	        this.imported = imported;
1525  	    }
1526  	    return ImportSpecifier;
1527  	}());
1528  	exports.ImportSpecifier = ImportSpecifier;
1529  	var LabeledStatement = (function () {
1530  	    function LabeledStatement(label, body) {
1531  	        this.type = syntax_1.Syntax.LabeledStatement;
1532  	        this.label = label;
1533  	        this.body = body;
1534  	    }
1535  	    return LabeledStatement;
1536  	}());
1537  	exports.LabeledStatement = LabeledStatement;
1538  	var Literal = (function () {
1539  	    function Literal(value, raw) {
1540  	        this.type = syntax_1.Syntax.Literal;
1541  	        this.value = value;
1542  	        this.raw = raw;
1543  	    }
1544  	    return Literal;
1545  	}());
1546  	exports.Literal = Literal;
1547  	var MetaProperty = (function () {
1548  	    function MetaProperty(meta, property) {
1549  	        this.type = syntax_1.Syntax.MetaProperty;
1550  	        this.meta = meta;
1551  	        this.property = property;
1552  	    }
1553  	    return MetaProperty;
1554  	}());
1555  	exports.MetaProperty = MetaProperty;
1556  	var MethodDefinition = (function () {
1557  	    function MethodDefinition(key, computed, value, kind, isStatic) {
1558  	        this.type = syntax_1.Syntax.MethodDefinition;
1559  	        this.key = key;
1560  	        this.computed = computed;
1561  	        this.value = value;
1562  	        this.kind = kind;
1563  	        this.static = isStatic;
1564  	    }
1565  	    return MethodDefinition;
1566  	}());
1567  	exports.MethodDefinition = MethodDefinition;
1568  	var Module = (function () {
1569  	    function Module(body) {
1570  	        this.type = syntax_1.Syntax.Program;
1571  	        this.body = body;
1572  	        this.sourceType = 'module';
1573  	    }
1574  	    return Module;
1575  	}());
1576  	exports.Module = Module;
1577  	var NewExpression = (function () {
1578  	    function NewExpression(callee, args) {
1579  	        this.type = syntax_1.Syntax.NewExpression;
1580  	        this.callee = callee;
1581  	        this.arguments = args;
1582  	    }
1583  	    return NewExpression;
1584  	}());
1585  	exports.NewExpression = NewExpression;
1586  	var ObjectExpression = (function () {
1587  	    function ObjectExpression(properties) {
1588  	        this.type = syntax_1.Syntax.ObjectExpression;
1589  	        this.properties = properties;
1590  	    }
1591  	    return ObjectExpression;
1592  	}());
1593  	exports.ObjectExpression = ObjectExpression;
1594  	var ObjectPattern = (function () {
1595  	    function ObjectPattern(properties) {
1596  	        this.type = syntax_1.Syntax.ObjectPattern;
1597  	        this.properties = properties;
1598  	    }
1599  	    return ObjectPattern;
1600  	}());
1601  	exports.ObjectPattern = ObjectPattern;
1602  	var Property = (function () {
1603  	    function Property(kind, key, computed, value, method, shorthand) {
1604  	        this.type = syntax_1.Syntax.Property;
1605  	        this.key = key;
1606  	        this.computed = computed;
1607  	        this.value = value;
1608  	        this.kind = kind;
1609  	        this.method = method;
1610  	        this.shorthand = shorthand;
1611  	    }
1612  	    return Property;
1613  	}());
1614  	exports.Property = Property;
1615  	var RegexLiteral = (function () {
1616  	    function RegexLiteral(value, raw, pattern, flags) {
1617  	        this.type = syntax_1.Syntax.Literal;
1618  	        this.value = value;
1619  	        this.raw = raw;
1620  	        this.regex = { pattern: pattern, flags: flags };
1621  	    }
1622  	    return RegexLiteral;
1623  	}());
1624  	exports.RegexLiteral = RegexLiteral;
1625  	var RestElement = (function () {
1626  	    function RestElement(argument) {
1627  	        this.type = syntax_1.Syntax.RestElement;
1628  	        this.argument = argument;
1629  	    }
1630  	    return RestElement;
1631  	}());
1632  	exports.RestElement = RestElement;
1633  	var ReturnStatement = (function () {
1634  	    function ReturnStatement(argument) {
1635  	        this.type = syntax_1.Syntax.ReturnStatement;
1636  	        this.argument = argument;
1637  	    }
1638  	    return ReturnStatement;
1639  	}());
1640  	exports.ReturnStatement = ReturnStatement;
1641  	var Script = (function () {
1642  	    function Script(body) {
1643  	        this.type = syntax_1.Syntax.Program;
1644  	        this.body = body;
1645  	        this.sourceType = 'script';
1646  	    }
1647  	    return Script;
1648  	}());
1649  	exports.Script = Script;
1650  	var SequenceExpression = (function () {
1651  	    function SequenceExpression(expressions) {
1652  	        this.type = syntax_1.Syntax.SequenceExpression;
1653  	        this.expressions = expressions;
1654  	    }
1655  	    return SequenceExpression;
1656  	}());
1657  	exports.SequenceExpression = SequenceExpression;
1658  	var SpreadElement = (function () {
1659  	    function SpreadElement(argument) {
1660  	        this.type = syntax_1.Syntax.SpreadElement;
1661  	        this.argument = argument;
1662  	    }
1663  	    return SpreadElement;
1664  	}());
1665  	exports.SpreadElement = SpreadElement;
1666  	var StaticMemberExpression = (function () {
1667  	    function StaticMemberExpression(object, property) {
1668  	        this.type = syntax_1.Syntax.MemberExpression;
1669  	        this.computed = false;
1670  	        this.object = object;
1671  	        this.property = property;
1672  	    }
1673  	    return StaticMemberExpression;
1674  	}());
1675  	exports.StaticMemberExpression = StaticMemberExpression;
1676  	var Super = (function () {
1677  	    function Super() {
1678  	        this.type = syntax_1.Syntax.Super;
1679  	    }
1680  	    return Super;
1681  	}());
1682  	exports.Super = Super;
1683  	var SwitchCase = (function () {
1684  	    function SwitchCase(test, consequent) {
1685  	        this.type = syntax_1.Syntax.SwitchCase;
1686  	        this.test = test;
1687  	        this.consequent = consequent;
1688  	    }
1689  	    return SwitchCase;
1690  	}());
1691  	exports.SwitchCase = SwitchCase;
1692  	var SwitchStatement = (function () {
1693  	    function SwitchStatement(discriminant, cases) {
1694  	        this.type = syntax_1.Syntax.SwitchStatement;
1695  	        this.discriminant = discriminant;
1696  	        this.cases = cases;
1697  	    }
1698  	    return SwitchStatement;
1699  	}());
1700  	exports.SwitchStatement = SwitchStatement;
1701  	var TaggedTemplateExpression = (function () {
1702  	    function TaggedTemplateExpression(tag, quasi) {
1703  	        this.type = syntax_1.Syntax.TaggedTemplateExpression;
1704  	        this.tag = tag;
1705  	        this.quasi = quasi;
1706  	    }
1707  	    return TaggedTemplateExpression;
1708  	}());
1709  	exports.TaggedTemplateExpression = TaggedTemplateExpression;
1710  	var TemplateElement = (function () {
1711  	    function TemplateElement(value, tail) {
1712  	        this.type = syntax_1.Syntax.TemplateElement;
1713  	        this.value = value;
1714  	        this.tail = tail;
1715  	    }
1716  	    return TemplateElement;
1717  	}());
1718  	exports.TemplateElement = TemplateElement;
1719  	var TemplateLiteral = (function () {
1720  	    function TemplateLiteral(quasis, expressions) {
1721  	        this.type = syntax_1.Syntax.TemplateLiteral;
1722  	        this.quasis = quasis;
1723  	        this.expressions = expressions;
1724  	    }
1725  	    return TemplateLiteral;
1726  	}());
1727  	exports.TemplateLiteral = TemplateLiteral;
1728  	var ThisExpression = (function () {
1729  	    function ThisExpression() {
1730  	        this.type = syntax_1.Syntax.ThisExpression;
1731  	    }
1732  	    return ThisExpression;
1733  	}());
1734  	exports.ThisExpression = ThisExpression;
1735  	var ThrowStatement = (function () {
1736  	    function ThrowStatement(argument) {
1737  	        this.type = syntax_1.Syntax.ThrowStatement;
1738  	        this.argument = argument;
1739  	    }
1740  	    return ThrowStatement;
1741  	}());
1742  	exports.ThrowStatement = ThrowStatement;
1743  	var TryStatement = (function () {
1744  	    function TryStatement(block, handler, finalizer) {
1745  	        this.type = syntax_1.Syntax.TryStatement;
1746  	        this.block = block;
1747  	        this.handler = handler;
1748  	        this.finalizer = finalizer;
1749  	    }
1750  	    return TryStatement;
1751  	}());
1752  	exports.TryStatement = TryStatement;
1753  	var UnaryExpression = (function () {
1754  	    function UnaryExpression(operator, argument) {
1755  	        this.type = syntax_1.Syntax.UnaryExpression;
1756  	        this.operator = operator;
1757  	        this.argument = argument;
1758  	        this.prefix = true;
1759  	    }
1760  	    return UnaryExpression;
1761  	}());
1762  	exports.UnaryExpression = UnaryExpression;
1763  	var UpdateExpression = (function () {
1764  	    function UpdateExpression(operator, argument, prefix) {
1765  	        this.type = syntax_1.Syntax.UpdateExpression;
1766  	        this.operator = operator;
1767  	        this.argument = argument;
1768  	        this.prefix = prefix;
1769  	    }
1770  	    return UpdateExpression;
1771  	}());
1772  	exports.UpdateExpression = UpdateExpression;
1773  	var VariableDeclaration = (function () {
1774  	    function VariableDeclaration(declarations, kind) {
1775  	        this.type = syntax_1.Syntax.VariableDeclaration;
1776  	        this.declarations = declarations;
1777  	        this.kind = kind;
1778  	    }
1779  	    return VariableDeclaration;
1780  	}());
1781  	exports.VariableDeclaration = VariableDeclaration;
1782  	var VariableDeclarator = (function () {
1783  	    function VariableDeclarator(id, init) {
1784  	        this.type = syntax_1.Syntax.VariableDeclarator;
1785  	        this.id = id;
1786  	        this.init = init;
1787  	    }
1788  	    return VariableDeclarator;
1789  	}());
1790  	exports.VariableDeclarator = VariableDeclarator;
1791  	var WhileStatement = (function () {
1792  	    function WhileStatement(test, body) {
1793  	        this.type = syntax_1.Syntax.WhileStatement;
1794  	        this.test = test;
1795  	        this.body = body;
1796  	    }
1797  	    return WhileStatement;
1798  	}());
1799  	exports.WhileStatement = WhileStatement;
1800  	var WithStatement = (function () {
1801  	    function WithStatement(object, body) {
1802  	        this.type = syntax_1.Syntax.WithStatement;
1803  	        this.object = object;
1804  	        this.body = body;
1805  	    }
1806  	    return WithStatement;
1807  	}());
1808  	exports.WithStatement = WithStatement;
1809  	var YieldExpression = (function () {
1810  	    function YieldExpression(argument, delegate) {
1811  	        this.type = syntax_1.Syntax.YieldExpression;
1812  	        this.argument = argument;
1813  	        this.delegate = delegate;
1814  	    }
1815  	    return YieldExpression;
1816  	}());
1817  	exports.YieldExpression = YieldExpression;
1818  
1819  
1820  /***/ },
1821  /* 8 */
1822  /***/ function(module, exports, __webpack_require__) {
1823  
1824  	"use strict";
1825  	Object.defineProperty(exports, "__esModule", { value: true });
1826  	var assert_1 = __webpack_require__(9);
1827  	var error_handler_1 = __webpack_require__(10);
1828  	var messages_1 = __webpack_require__(11);
1829  	var Node = __webpack_require__(7);
1830  	var scanner_1 = __webpack_require__(12);
1831  	var syntax_1 = __webpack_require__(2);
1832  	var token_1 = __webpack_require__(13);
1833  	var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
1834  	var Parser = (function () {
1835  	    function Parser(code, options, delegate) {
1836  	        if (options === void 0) { options = {}; }
1837  	        this.config = {
1838  	            range: (typeof options.range === 'boolean') && options.range,
1839  	            loc: (typeof options.loc === 'boolean') && options.loc,
1840  	            source: null,
1841  	            tokens: (typeof options.tokens === 'boolean') && options.tokens,
1842  	            comment: (typeof options.comment === 'boolean') && options.comment,
1843  	            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
1844  	        };
1845  	        if (this.config.loc && options.source && options.source !== null) {
1846  	            this.config.source = String(options.source);
1847  	        }
1848  	        this.delegate = delegate;
1849  	        this.errorHandler = new error_handler_1.ErrorHandler();
1850  	        this.errorHandler.tolerant = this.config.tolerant;
1851  	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
1852  	        this.scanner.trackComment = this.config.comment;
1853  	        this.operatorPrecedence = {
1854  	            ')': 0,
1855  	            ';': 0,
1856  	            ',': 0,
1857  	            '=': 0,
1858  	            ']': 0,
1859  	            '||': 1,
1860  	            '&&': 2,
1861  	            '|': 3,
1862  	            '^': 4,
1863  	            '&': 5,
1864  	            '==': 6,
1865  	            '!=': 6,
1866  	            '===': 6,
1867  	            '!==': 6,
1868  	            '<': 7,
1869  	            '>': 7,
1870  	            '<=': 7,
1871  	            '>=': 7,
1872  	            '<<': 8,
1873  	            '>>': 8,
1874  	            '>>>': 8,
1875  	            '+': 9,
1876  	            '-': 9,
1877  	            '*': 11,
1878  	            '/': 11,
1879  	            '%': 11
1880  	        };
1881  	        this.lookahead = {
1882  	            type: 2 /* EOF */,
1883  	            value: '',
1884  	            lineNumber: this.scanner.lineNumber,
1885  	            lineStart: 0,
1886  	            start: 0,
1887  	            end: 0
1888  	        };
1889  	        this.hasLineTerminator = false;
1890  	        this.context = {
1891  	            isModule: false,
1892  	            await: false,
1893  	            allowIn: true,
1894  	            allowStrictDirective: true,
1895  	            allowYield: true,
1896  	            firstCoverInitializedNameError: null,
1897  	            isAssignmentTarget: false,
1898  	            isBindingElement: false,
1899  	            inFunctionBody: false,
1900  	            inIteration: false,
1901  	            inSwitch: false,
1902  	            labelSet: {},
1903  	            strict: false
1904  	        };
1905  	        this.tokens = [];
1906  	        this.startMarker = {
1907  	            index: 0,
1908  	            line: this.scanner.lineNumber,
1909  	            column: 0
1910  	        };
1911  	        this.lastMarker = {
1912  	            index: 0,
1913  	            line: this.scanner.lineNumber,
1914  	            column: 0
1915  	        };
1916  	        this.nextToken();
1917  	        this.lastMarker = {
1918  	            index: this.scanner.index,
1919  	            line: this.scanner.lineNumber,
1920  	            column: this.scanner.index - this.scanner.lineStart
1921  	        };
1922  	    }
1923  	    Parser.prototype.throwError = function (messageFormat) {
1924  	        var values = [];
1925  	        for (var _i = 1; _i < arguments.length; _i++) {
1926  	            values[_i - 1] = arguments[_i];
1927  	        }
1928  	        var args = Array.prototype.slice.call(arguments, 1);
1929  	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
1930  	            assert_1.assert(idx < args.length, 'Message reference must be in range');
1931  	            return args[idx];
1932  	        });
1933  	        var index = this.lastMarker.index;
1934  	        var line = this.lastMarker.line;
1935  	        var column = this.lastMarker.column + 1;
1936  	        throw this.errorHandler.createError(index, line, column, msg);
1937  	    };
1938  	    Parser.prototype.tolerateError = function (messageFormat) {
1939  	        var values = [];
1940  	        for (var _i = 1; _i < arguments.length; _i++) {
1941  	            values[_i - 1] = arguments[_i];
1942  	        }
1943  	        var args = Array.prototype.slice.call(arguments, 1);
1944  	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
1945  	            assert_1.assert(idx < args.length, 'Message reference must be in range');
1946  	            return args[idx];
1947  	        });
1948  	        var index = this.lastMarker.index;
1949  	        var line = this.scanner.lineNumber;
1950  	        var column = this.lastMarker.column + 1;
1951  	        this.errorHandler.tolerateError(index, line, column, msg);
1952  	    };
1953  	    // Throw an exception because of the token.
1954  	    Parser.prototype.unexpectedTokenError = function (token, message) {
1955  	        var msg = message || messages_1.Messages.UnexpectedToken;
1956  	        var value;
1957  	        if (token) {
1958  	            if (!message) {
1959  	                msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
1960  	                    (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
1961  	                        (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
1962  	                            (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
1963  	                                (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
1964  	                                    messages_1.Messages.UnexpectedToken;
1965  	                if (token.type === 4 /* Keyword */) {
1966  	                    if (this.scanner.isFutureReservedWord(token.value)) {
1967  	                        msg = messages_1.Messages.UnexpectedReserved;
1968  	                    }
1969  	                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
1970  	                        msg = messages_1.Messages.StrictReservedWord;
1971  	                    }
1972  	                }
1973  	            }
1974  	            value = token.value;
1975  	        }
1976  	        else {
1977  	            value = 'ILLEGAL';
1978  	        }
1979  	        msg = msg.replace('%0', value);
1980  	        if (token && typeof token.lineNumber === 'number') {
1981  	            var index = token.start;
1982  	            var line = token.lineNumber;
1983  	            var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
1984  	            var column = token.start - lastMarkerLineStart + 1;
1985  	            return this.errorHandler.createError(index, line, column, msg);
1986  	        }
1987  	        else {
1988  	            var index = this.lastMarker.index;
1989  	            var line = this.lastMarker.line;
1990  	            var column = this.lastMarker.column + 1;
1991  	            return this.errorHandler.createError(index, line, column, msg);
1992  	        }
1993  	    };
1994  	    Parser.prototype.throwUnexpectedToken = function (token, message) {
1995  	        throw this.unexpectedTokenError(token, message);
1996  	    };
1997  	    Parser.prototype.tolerateUnexpectedToken = function (token, message) {
1998  	        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
1999  	    };
2000  	    Parser.prototype.collectComments = function () {
2001  	        if (!this.config.comment) {
2002  	            this.scanner.scanComments();
2003  	        }
2004  	        else {
2005  	            var comments = this.scanner.scanComments();
2006  	            if (comments.length > 0 && this.delegate) {
2007  	                for (var i = 0; i < comments.length; ++i) {
2008  	                    var e = comments[i];
2009  	                    var node = void 0;
2010  	                    node = {
2011  	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
2012  	                        value: this.scanner.source.slice(e.slice[0], e.slice[1])
2013  	                    };
2014  	                    if (this.config.range) {
2015  	                        node.range = e.range;
2016  	                    }
2017  	                    if (this.config.loc) {
2018  	                        node.loc = e.loc;
2019  	                    }
2020  	                    var metadata = {
2021  	                        start: {
2022  	                            line: e.loc.start.line,
2023  	                            column: e.loc.start.column,
2024  	                            offset: e.range[0]
2025  	                        },
2026  	                        end: {
2027  	                            line: e.loc.end.line,
2028  	                            column: e.loc.end.column,
2029  	                            offset: e.range[1]
2030  	                        }
2031  	                    };
2032  	                    this.delegate(node, metadata);
2033  	                }
2034  	            }
2035  	        }
2036  	    };
2037  	    // From internal representation to an external structure
2038  	    Parser.prototype.getTokenRaw = function (token) {
2039  	        return this.scanner.source.slice(token.start, token.end);
2040  	    };
2041  	    Parser.prototype.convertToken = function (token) {
2042  	        var t = {
2043  	            type: token_1.TokenName[token.type],
2044  	            value: this.getTokenRaw(token)
2045  	        };
2046  	        if (this.config.range) {
2047  	            t.range = [token.start, token.end];
2048  	        }
2049  	        if (this.config.loc) {
2050  	            t.loc = {
2051  	                start: {
2052  	                    line: this.startMarker.line,
2053  	                    column: this.startMarker.column
2054  	                },
2055  	                end: {
2056  	                    line: this.scanner.lineNumber,
2057  	                    column: this.scanner.index - this.scanner.lineStart
2058  	                }
2059  	            };
2060  	        }
2061  	        if (token.type === 9 /* RegularExpression */) {
2062  	            var pattern = token.pattern;
2063  	            var flags = token.flags;
2064  	            t.regex = { pattern: pattern, flags: flags };
2065  	        }
2066  	        return t;
2067  	    };
2068  	    Parser.prototype.nextToken = function () {
2069  	        var token = this.lookahead;
2070  	        this.lastMarker.index = this.scanner.index;
2071  	        this.lastMarker.line = this.scanner.lineNumber;
2072  	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
2073  	        this.collectComments();
2074  	        if (this.scanner.index !== this.startMarker.index) {
2075  	            this.startMarker.index = this.scanner.index;
2076  	            this.startMarker.line = this.scanner.lineNumber;
2077  	            this.startMarker.column = this.scanner.index - this.scanner.lineStart;
2078  	        }
2079  	        var next = this.scanner.lex();
2080  	        this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
2081  	        if (next && this.context.strict && next.type === 3 /* Identifier */) {
2082  	            if (this.scanner.isStrictModeReservedWord(next.value)) {
2083  	                next.type = 4 /* Keyword */;
2084  	            }
2085  	        }
2086  	        this.lookahead = next;
2087  	        if (this.config.tokens && next.type !== 2 /* EOF */) {
2088  	            this.tokens.push(this.convertToken(next));
2089  	        }
2090  	        return token;
2091  	    };
2092  	    Parser.prototype.nextRegexToken = function () {
2093  	        this.collectComments();
2094  	        var token = this.scanner.scanRegExp();
2095  	        if (this.config.tokens) {
2096  	            // Pop the previous token, '/' or '/='
2097  	            // This is added from the lookahead token.
2098  	            this.tokens.pop();
2099  	            this.tokens.push(this.convertToken(token));
2100  	        }
2101  	        // Prime the next lookahead.
2102  	        this.lookahead = token;
2103  	        this.nextToken();
2104  	        return token;
2105  	    };
2106  	    Parser.prototype.createNode = function () {
2107  	        return {
2108  	            index: this.startMarker.index,
2109  	            line: this.startMarker.line,
2110  	            column: this.startMarker.column
2111  	        };
2112  	    };
2113  	    Parser.prototype.startNode = function (token, lastLineStart) {
2114  	        if (lastLineStart === void 0) { lastLineStart = 0; }
2115  	        var column = token.start - token.lineStart;
2116  	        var line = token.lineNumber;
2117  	        if (column < 0) {
2118  	            column += lastLineStart;
2119  	            line--;
2120  	        }
2121  	        return {
2122  	            index: token.start,
2123  	            line: line,
2124  	            column: column
2125  	        };
2126  	    };
2127  	    Parser.prototype.finalize = function (marker, node) {
2128  	        if (this.config.range) {
2129  	            node.range = [marker.index, this.lastMarker.index];
2130  	        }
2131  	        if (this.config.loc) {
2132  	            node.loc = {
2133  	                start: {
2134  	                    line: marker.line,
2135  	                    column: marker.column,
2136  	                },
2137  	                end: {
2138  	                    line: this.lastMarker.line,
2139  	                    column: this.lastMarker.column
2140  	                }
2141  	            };
2142  	            if (this.config.source) {
2143  	                node.loc.source = this.config.source;
2144  	            }
2145  	        }
2146  	        if (this.delegate) {
2147  	            var metadata = {
2148  	                start: {
2149  	                    line: marker.line,
2150  	                    column: marker.column,
2151  	                    offset: marker.index
2152  	                },
2153  	                end: {
2154  	                    line: this.lastMarker.line,
2155  	                    column: this.lastMarker.column,
2156  	                    offset: this.lastMarker.index
2157  	                }
2158  	            };
2159  	            this.delegate(node, metadata);
2160  	        }
2161  	        return node;
2162  	    };
2163  	    // Expect the next token to match the specified punctuator.
2164  	    // If not, an exception will be thrown.
2165  	    Parser.prototype.expect = function (value) {
2166  	        var token = this.nextToken();
2167  	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
2168  	            this.throwUnexpectedToken(token);
2169  	        }
2170  	    };
2171  	    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
2172  	    Parser.prototype.expectCommaSeparator = function () {
2173  	        if (this.config.tolerant) {
2174  	            var token = this.lookahead;
2175  	            if (token.type === 7 /* Punctuator */ && token.value === ',') {
2176  	                this.nextToken();
2177  	            }
2178  	            else if (token.type === 7 /* Punctuator */ && token.value === ';') {
2179  	                this.nextToken();
2180  	                this.tolerateUnexpectedToken(token);
2181  	            }
2182  	            else {
2183  	                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
2184  	            }
2185  	        }
2186  	        else {
2187  	            this.expect(',');
2188  	        }
2189  	    };
2190  	    // Expect the next token to match the specified keyword.
2191  	    // If not, an exception will be thrown.
2192  	    Parser.prototype.expectKeyword = function (keyword) {
2193  	        var token = this.nextToken();
2194  	        if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
2195  	            this.throwUnexpectedToken(token);
2196  	        }
2197  	    };
2198  	    // Return true if the next token matches the specified punctuator.
2199  	    Parser.prototype.match = function (value) {
2200  	        return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
2201  	    };
2202  	    // Return true if the next token matches the specified keyword
2203  	    Parser.prototype.matchKeyword = function (keyword) {
2204  	        return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
2205  	    };
2206  	    // Return true if the next token matches the specified contextual keyword
2207  	    // (where an identifier is sometimes a keyword depending on the context)
2208  	    Parser.prototype.matchContextualKeyword = function (keyword) {
2209  	        return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
2210  	    };
2211  	    // Return true if the next token is an assignment operator
2212  	    Parser.prototype.matchAssign = function () {
2213  	        if (this.lookahead.type !== 7 /* Punctuator */) {
2214  	            return false;
2215  	        }
2216  	        var op = this.lookahead.value;
2217  	        return op === '=' ||
2218  	            op === '*=' ||
2219  	            op === '**=' ||
2220  	            op === '/=' ||
2221  	            op === '%=' ||
2222  	            op === '+=' ||
2223  	            op === '-=' ||
2224  	            op === '<<=' ||
2225  	            op === '>>=' ||
2226  	            op === '>>>=' ||
2227  	            op === '&=' ||
2228  	            op === '^=' ||
2229  	            op === '|=';
2230  	    };
2231  	    // Cover grammar support.
2232  	    //
2233  	    // When an assignment expression position starts with an left parenthesis, the determination of the type
2234  	    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
2235  	    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
2236  	    //
2237  	    // There are three productions that can be parsed in a parentheses pair that needs to be determined
2238  	    // after the outermost pair is closed. They are:
2239  	    //
2240  	    //   1. AssignmentExpression
2241  	    //   2. BindingElements
2242  	    //   3. AssignmentTargets
2243  	    //
2244  	    // In order to avoid exponential backtracking, we use two flags to denote if the production can be
2245  	    // binding element or assignment target.
2246  	    //
2247  	    // The three productions have the relationship:
2248  	    //
2249  	    //   BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
2250  	    //
2251  	    // with a single exception that CoverInitializedName when used directly in an Expression, generates
2252  	    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
2253  	    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
2254  	    //
2255  	    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
2256  	    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
2257  	    // the CoverInitializedName check is conducted.
2258  	    //
2259  	    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
2260  	    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
2261  	    // pattern. The CoverInitializedName check is deferred.
2262  	    Parser.prototype.isolateCoverGrammar = function (parseFunction) {
2263  	        var previousIsBindingElement = this.context.isBindingElement;
2264  	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
2265  	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
2266  	        this.context.isBindingElement = true;
2267  	        this.context.isAssignmentTarget = true;
2268  	        this.context.firstCoverInitializedNameError = null;
2269  	        var result = parseFunction.call(this);
2270  	        if (this.context.firstCoverInitializedNameError !== null) {
2271  	            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
2272  	        }
2273  	        this.context.isBindingElement = previousIsBindingElement;
2274  	        this.context.isAssignmentTarget = previousIsAssignmentTarget;
2275  	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
2276  	        return result;
2277  	    };
2278  	    Parser.prototype.inheritCoverGrammar = function (parseFunction) {
2279  	        var previousIsBindingElement = this.context.isBindingElement;
2280  	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
2281  	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
2282  	        this.context.isBindingElement = true;
2283  	        this.context.isAssignmentTarget = true;
2284  	        this.context.firstCoverInitializedNameError = null;
2285  	        var result = parseFunction.call(this);
2286  	        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
2287  	        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
2288  	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
2289  	        return result;
2290  	    };
2291  	    Parser.prototype.consumeSemicolon = function () {
2292  	        if (this.match(';')) {
2293  	            this.nextToken();
2294  	        }
2295  	        else if (!this.hasLineTerminator) {
2296  	            if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
2297  	                this.throwUnexpectedToken(this.lookahead);
2298  	            }
2299  	            this.lastMarker.index = this.startMarker.index;
2300  	            this.lastMarker.line = this.startMarker.line;
2301  	            this.lastMarker.column = this.startMarker.column;
2302  	        }
2303  	    };
2304  	    // https://tc39.github.io/ecma262/#sec-primary-expression
2305  	    Parser.prototype.parsePrimaryExpression = function () {
2306  	        var node = this.createNode();
2307  	        var expr;
2308  	        var token, raw;
2309  	        switch (this.lookahead.type) {
2310  	            case 3 /* Identifier */:
2311  	                if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
2312  	                    this.tolerateUnexpectedToken(this.lookahead);
2313  	                }
2314  	                expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
2315  	                break;
2316  	            case 6 /* NumericLiteral */:
2317  	            case 8 /* StringLiteral */:
2318  	                if (this.context.strict && this.lookahead.octal) {
2319  	                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
2320  	                }
2321  	                this.context.isAssignmentTarget = false;
2322  	                this.context.isBindingElement = false;
2323  	                token = this.nextToken();
2324  	                raw = this.getTokenRaw(token);
2325  	                expr = this.finalize(node, new Node.Literal(token.value, raw));
2326  	                break;
2327  	            case 1 /* BooleanLiteral */:
2328  	                this.context.isAssignmentTarget = false;
2329  	                this.context.isBindingElement = false;
2330  	                token = this.nextToken();
2331  	                raw = this.getTokenRaw(token);
2332  	                expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
2333  	                break;
2334  	            case 5 /* NullLiteral */:
2335  	                this.context.isAssignmentTarget = false;
2336  	                this.context.isBindingElement = false;
2337  	                token = this.nextToken();
2338  	                raw = this.getTokenRaw(token);
2339  	                expr = this.finalize(node, new Node.Literal(null, raw));
2340  	                break;
2341  	            case 10 /* Template */:
2342  	                expr = this.parseTemplateLiteral();
2343  	                break;
2344  	            case 7 /* Punctuator */:
2345  	                switch (this.lookahead.value) {
2346  	                    case '(':
2347  	                        this.context.isBindingElement = false;
2348  	                        expr = this.inheritCoverGrammar(this.parseGroupExpression);
2349  	                        break;
2350  	                    case '[':
2351  	                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);
2352  	                        break;
2353  	                    case '{':
2354  	                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);
2355  	                        break;
2356  	                    case '/':
2357  	                    case '/=':
2358  	                        this.context.isAssignmentTarget = false;
2359  	                        this.context.isBindingElement = false;
2360  	                        this.scanner.index = this.startMarker.index;
2361  	                        token = this.nextRegexToken();
2362  	                        raw = this.getTokenRaw(token);
2363  	                        expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
2364  	                        break;
2365  	                    default:
2366  	                        expr = this.throwUnexpectedToken(this.nextToken());
2367  	                }
2368  	                break;
2369  	            case 4 /* Keyword */:
2370  	                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
2371  	                    expr = this.parseIdentifierName();
2372  	                }
2373  	                else if (!this.context.strict && this.matchKeyword('let')) {
2374  	                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
2375  	                }
2376  	                else {
2377  	                    this.context.isAssignmentTarget = false;
2378  	                    this.context.isBindingElement = false;
2379  	                    if (this.matchKeyword('function')) {
2380  	                        expr = this.parseFunctionExpression();
2381  	                    }
2382  	                    else if (this.matchKeyword('this')) {
2383  	                        this.nextToken();
2384  	                        expr = this.finalize(node, new Node.ThisExpression());
2385  	                    }
2386  	                    else if (this.matchKeyword('class')) {
2387  	                        expr = this.parseClassExpression();
2388  	                    }
2389  	                    else {
2390  	                        expr = this.throwUnexpectedToken(this.nextToken());
2391  	                    }
2392  	                }
2393  	                break;
2394  	            default:
2395  	                expr = this.throwUnexpectedToken(this.nextToken());
2396  	        }
2397  	        return expr;
2398  	    };
2399  	    // https://tc39.github.io/ecma262/#sec-array-initializer
2400  	    Parser.prototype.parseSpreadElement = function () {
2401  	        var node = this.createNode();
2402  	        this.expect('...');
2403  	        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
2404  	        return this.finalize(node, new Node.SpreadElement(arg));
2405  	    };
2406  	    Parser.prototype.parseArrayInitializer = function () {
2407  	        var node = this.createNode();
2408  	        var elements = [];
2409  	        this.expect('[');
2410  	        while (!this.match(']')) {
2411  	            if (this.match(',')) {
2412  	                this.nextToken();
2413  	                elements.push(null);
2414  	            }
2415  	            else if (this.match('...')) {
2416  	                var element = this.parseSpreadElement();
2417  	                if (!this.match(']')) {
2418  	                    this.context.isAssignmentTarget = false;
2419  	                    this.context.isBindingElement = false;
2420  	                    this.expect(',');
2421  	                }
2422  	                elements.push(element);
2423  	            }
2424  	            else {
2425  	                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
2426  	                if (!this.match(']')) {
2427  	                    this.expect(',');
2428  	                }
2429  	            }
2430  	        }
2431  	        this.expect(']');
2432  	        return this.finalize(node, new Node.ArrayExpression(elements));
2433  	    };
2434  	    // https://tc39.github.io/ecma262/#sec-object-initializer
2435  	    Parser.prototype.parsePropertyMethod = function (params) {
2436  	        this.context.isAssignmentTarget = false;
2437  	        this.context.isBindingElement = false;
2438  	        var previousStrict = this.context.strict;
2439  	        var previousAllowStrictDirective = this.context.allowStrictDirective;
2440  	        this.context.allowStrictDirective = params.simple;
2441  	        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
2442  	        if (this.context.strict && params.firstRestricted) {
2443  	            this.tolerateUnexpectedToken(params.firstRestricted, params.message);
2444  	        }
2445  	        if (this.context.strict && params.stricted) {
2446  	            this.tolerateUnexpectedToken(params.stricted, params.message);
2447  	        }
2448  	        this.context.strict = previousStrict;
2449  	        this.context.allowStrictDirective = previousAllowStrictDirective;
2450  	        return body;
2451  	    };
2452  	    Parser.prototype.parsePropertyMethodFunction = function () {
2453  	        var isGenerator = false;
2454  	        var node = this.createNode();
2455  	        var previousAllowYield = this.context.allowYield;
2456  	        this.context.allowYield = true;
2457  	        var params = this.parseFormalParameters();
2458  	        var method = this.parsePropertyMethod(params);
2459  	        this.context.allowYield = previousAllowYield;
2460  	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
2461  	    };
2462  	    Parser.prototype.parsePropertyMethodAsyncFunction = function () {
2463  	        var node = this.createNode();
2464  	        var previousAllowYield = this.context.allowYield;
2465  	        var previousAwait = this.context.await;
2466  	        this.context.allowYield = false;
2467  	        this.context.await = true;
2468  	        var params = this.parseFormalParameters();
2469  	        var method = this.parsePropertyMethod(params);
2470  	        this.context.allowYield = previousAllowYield;
2471  	        this.context.await = previousAwait;
2472  	        return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
2473  	    };
2474  	    Parser.prototype.parseObjectPropertyKey = function () {
2475  	        var node = this.createNode();
2476  	        var token = this.nextToken();
2477  	        var key;
2478  	        switch (token.type) {
2479  	            case 8 /* StringLiteral */:
2480  	            case 6 /* NumericLiteral */:
2481  	                if (this.context.strict && token.octal) {
2482  	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
2483  	                }
2484  	                var raw = this.getTokenRaw(token);
2485  	                key = this.finalize(node, new Node.Literal(token.value, raw));
2486  	                break;
2487  	            case 3 /* Identifier */:
2488  	            case 1 /* BooleanLiteral */:
2489  	            case 5 /* NullLiteral */:
2490  	            case 4 /* Keyword */:
2491  	                key = this.finalize(node, new Node.Identifier(token.value));
2492  	                break;
2493  	            case 7 /* Punctuator */:
2494  	                if (token.value === '[') {
2495  	                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);
2496  	                    this.expect(']');
2497  	                }
2498  	                else {
2499  	                    key = this.throwUnexpectedToken(token);
2500  	                }
2501  	                break;
2502  	            default:
2503  	                key = this.throwUnexpectedToken(token);
2504  	        }
2505  	        return key;
2506  	    };
2507  	    Parser.prototype.isPropertyKey = function (key, value) {
2508  	        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
2509  	            (key.type === syntax_1.Syntax.Literal && key.value === value);
2510  	    };
2511  	    Parser.prototype.parseObjectProperty = function (hasProto) {
2512  	        var node = this.createNode();
2513  	        var token = this.lookahead;
2514  	        var kind;
2515  	        var key = null;
2516  	        var value = null;
2517  	        var computed = false;
2518  	        var method = false;
2519  	        var shorthand = false;
2520  	        var isAsync = false;
2521  	        if (token.type === 3 /* Identifier */) {
2522  	            var id = token.value;
2523  	            this.nextToken();
2524  	            computed = this.match('[');
2525  	            isAsync = !this.hasLineTerminator && (id === 'async') &&
2526  	                !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
2527  	            key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
2528  	        }
2529  	        else if (this.match('*')) {
2530  	            this.nextToken();
2531  	        }
2532  	        else {
2533  	            computed = this.match('[');
2534  	            key = this.parseObjectPropertyKey();
2535  	        }
2536  	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
2537  	        if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
2538  	            kind = 'get';
2539  	            computed = this.match('[');
2540  	            key = this.parseObjectPropertyKey();
2541  	            this.context.allowYield = false;
2542  	            value = this.parseGetterMethod();
2543  	        }
2544  	        else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
2545  	            kind = 'set';
2546  	            computed = this.match('[');
2547  	            key = this.parseObjectPropertyKey();
2548  	            value = this.parseSetterMethod();
2549  	        }
2550  	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
2551  	            kind = 'init';
2552  	            computed = this.match('[');
2553  	            key = this.parseObjectPropertyKey();
2554  	            value = this.parseGeneratorMethod();
2555  	            method = true;
2556  	        }
2557  	        else {
2558  	            if (!key) {
2559  	                this.throwUnexpectedToken(this.lookahead);
2560  	            }
2561  	            kind = 'init';
2562  	            if (this.match(':') && !isAsync) {
2563  	                if (!computed && this.isPropertyKey(key, '__proto__')) {
2564  	                    if (hasProto.value) {
2565  	                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
2566  	                    }
2567  	                    hasProto.value = true;
2568  	                }
2569  	                this.nextToken();
2570  	                value = this.inheritCoverGrammar(this.parseAssignmentExpression);
2571  	            }
2572  	            else if (this.match('(')) {
2573  	                value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
2574  	                method = true;
2575  	            }
2576  	            else if (token.type === 3 /* Identifier */) {
2577  	                var id = this.finalize(node, new Node.Identifier(token.value));
2578  	                if (this.match('=')) {
2579  	                    this.context.firstCoverInitializedNameError = this.lookahead;
2580  	                    this.nextToken();
2581  	                    shorthand = true;
2582  	                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
2583  	                    value = this.finalize(node, new Node.AssignmentPattern(id, init));
2584  	                }
2585  	                else {
2586  	                    shorthand = true;
2587  	                    value = id;
2588  	                }
2589  	            }
2590  	            else {
2591  	                this.throwUnexpectedToken(this.nextToken());
2592  	            }
2593  	        }
2594  	        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
2595  	    };
2596  	    Parser.prototype.parseObjectInitializer = function () {
2597  	        var node = this.createNode();
2598  	        this.expect('{');
2599  	        var properties = [];
2600  	        var hasProto = { value: false };
2601  	        while (!this.match('}')) {
2602  	            properties.push(this.parseObjectProperty(hasProto));
2603  	            if (!this.match('}')) {
2604  	                this.expectCommaSeparator();
2605  	            }
2606  	        }
2607  	        this.expect('}');
2608  	        return this.finalize(node, new Node.ObjectExpression(properties));
2609  	    };
2610  	    // https://tc39.github.io/ecma262/#sec-template-literals
2611  	    Parser.prototype.parseTemplateHead = function () {
2612  	        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
2613  	        var node = this.createNode();
2614  	        var token = this.nextToken();
2615  	        var raw = token.value;
2616  	        var cooked = token.cooked;
2617  	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
2618  	    };
2619  	    Parser.prototype.parseTemplateElement = function () {
2620  	        if (this.lookahead.type !== 10 /* Template */) {
2621  	            this.throwUnexpectedToken();
2622  	        }
2623  	        var node = this.createNode();
2624  	        var token = this.nextToken();
2625  	        var raw = token.value;
2626  	        var cooked = token.cooked;
2627  	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
2628  	    };
2629  	    Parser.prototype.parseTemplateLiteral = function () {
2630  	        var node = this.createNode();
2631  	        var expressions = [];
2632  	        var quasis = [];
2633  	        var quasi = this.parseTemplateHead();
2634  	        quasis.push(quasi);
2635  	        while (!quasi.tail) {
2636  	            expressions.push(this.parseExpression());
2637  	            quasi = this.parseTemplateElement();
2638  	            quasis.push(quasi);
2639  	        }
2640  	        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
2641  	    };
2642  	    // https://tc39.github.io/ecma262/#sec-grouping-operator
2643  	    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
2644  	        switch (expr.type) {
2645  	            case syntax_1.Syntax.Identifier:
2646  	            case syntax_1.Syntax.MemberExpression:
2647  	            case syntax_1.Syntax.RestElement:
2648  	            case syntax_1.Syntax.AssignmentPattern:
2649  	                break;
2650  	            case syntax_1.Syntax.SpreadElement:
2651  	                expr.type = syntax_1.Syntax.RestElement;
2652  	                this.reinterpretExpressionAsPattern(expr.argument);
2653  	                break;
2654  	            case syntax_1.Syntax.ArrayExpression:
2655  	                expr.type = syntax_1.Syntax.ArrayPattern;
2656  	                for (var i = 0; i < expr.elements.length; i++) {
2657  	                    if (expr.elements[i] !== null) {
2658  	                        this.reinterpretExpressionAsPattern(expr.elements[i]);
2659  	                    }
2660  	                }
2661  	                break;
2662  	            case syntax_1.Syntax.ObjectExpression:
2663  	                expr.type = syntax_1.Syntax.ObjectPattern;
2664  	                for (var i = 0; i < expr.properties.length; i++) {
2665  	                    this.reinterpretExpressionAsPattern(expr.properties[i].value);
2666  	                }
2667  	                break;
2668  	            case syntax_1.Syntax.AssignmentExpression:
2669  	                expr.type = syntax_1.Syntax.AssignmentPattern;
2670  	                delete expr.operator;
2671  	                this.reinterpretExpressionAsPattern(expr.left);
2672  	                break;
2673  	            default:
2674  	                // Allow other node type for tolerant parsing.
2675  	                break;
2676  	        }
2677  	    };
2678  	    Parser.prototype.parseGroupExpression = function () {
2679  	        var expr;
2680  	        this.expect('(');
2681  	        if (this.match(')')) {
2682  	            this.nextToken();
2683  	            if (!this.match('=>')) {
2684  	                this.expect('=>');
2685  	            }
2686  	            expr = {
2687  	                type: ArrowParameterPlaceHolder,
2688  	                params: [],
2689  	                async: false
2690  	            };
2691  	        }
2692  	        else {
2693  	            var startToken = this.lookahead;
2694  	            var params = [];
2695  	            if (this.match('...')) {
2696  	                expr = this.parseRestElement(params);
2697  	                this.expect(')');
2698  	                if (!this.match('=>')) {
2699  	                    this.expect('=>');
2700  	                }
2701  	                expr = {
2702  	                    type: ArrowParameterPlaceHolder,
2703  	                    params: [expr],
2704  	                    async: false
2705  	                };
2706  	            }
2707  	            else {
2708  	                var arrow = false;
2709  	                this.context.isBindingElement = true;
2710  	                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
2711  	                if (this.match(',')) {
2712  	                    var expressions = [];
2713  	                    this.context.isAssignmentTarget = false;
2714  	                    expressions.push(expr);
2715  	                    while (this.lookahead.type !== 2 /* EOF */) {
2716  	                        if (!this.match(',')) {
2717  	                            break;
2718  	                        }
2719  	                        this.nextToken();
2720  	                        if (this.match(')')) {
2721  	                            this.nextToken();
2722  	                            for (var i = 0; i < expressions.length; i++) {
2723  	                                this.reinterpretExpressionAsPattern(expressions[i]);
2724  	                            }
2725  	                            arrow = true;
2726  	                            expr = {
2727  	                                type: ArrowParameterPlaceHolder,
2728  	                                params: expressions,
2729  	                                async: false
2730  	                            };
2731  	                        }
2732  	                        else if (this.match('...')) {
2733  	                            if (!this.context.isBindingElement) {
2734  	                                this.throwUnexpectedToken(this.lookahead);
2735  	                            }
2736  	                            expressions.push(this.parseRestElement(params));
2737  	                            this.expect(')');
2738  	                            if (!this.match('=>')) {
2739  	                                this.expect('=>');
2740  	                            }
2741  	                            this.context.isBindingElement = false;
2742  	                            for (var i = 0; i < expressions.length; i++) {
2743  	                                this.reinterpretExpressionAsPattern(expressions[i]);
2744  	                            }
2745  	                            arrow = true;
2746  	                            expr = {
2747  	                                type: ArrowParameterPlaceHolder,
2748  	                                params: expressions,
2749  	                                async: false
2750  	                            };
2751  	                        }
2752  	                        else {
2753  	                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
2754  	                        }
2755  	                        if (arrow) {
2756  	                            break;
2757  	                        }
2758  	                    }
2759  	                    if (!arrow) {
2760  	                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
2761  	                    }
2762  	                }
2763  	                if (!arrow) {
2764  	                    this.expect(')');
2765  	                    if (this.match('=>')) {
2766  	                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
2767  	                            arrow = true;
2768  	                            expr = {
2769  	                                type: ArrowParameterPlaceHolder,
2770  	                                params: [expr],
2771  	                                async: false
2772  	                            };
2773  	                        }
2774  	                        if (!arrow) {
2775  	                            if (!this.context.isBindingElement) {
2776  	                                this.throwUnexpectedToken(this.lookahead);
2777  	                            }
2778  	                            if (expr.type === syntax_1.Syntax.SequenceExpression) {
2779  	                                for (var i = 0; i < expr.expressions.length; i++) {
2780  	                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);
2781  	                                }
2782  	                            }
2783  	                            else {
2784  	                                this.reinterpretExpressionAsPattern(expr);
2785  	                            }
2786  	                            var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
2787  	                            expr = {
2788  	                                type: ArrowParameterPlaceHolder,
2789  	                                params: parameters,
2790  	                                async: false
2791  	                            };
2792  	                        }
2793  	                    }
2794  	                    this.context.isBindingElement = false;
2795  	                }
2796  	            }
2797  	        }
2798  	        return expr;
2799  	    };
2800  	    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
2801  	    Parser.prototype.parseArguments = function () {
2802  	        this.expect('(');
2803  	        var args = [];
2804  	        if (!this.match(')')) {
2805  	            while (true) {
2806  	                var expr = this.match('...') ? this.parseSpreadElement() :
2807  	                    this.isolateCoverGrammar(this.parseAssignmentExpression);
2808  	                args.push(expr);
2809  	                if (this.match(')')) {
2810  	                    break;
2811  	                }
2812  	                this.expectCommaSeparator();
2813  	                if (this.match(')')) {
2814  	                    break;
2815  	                }
2816  	            }
2817  	        }
2818  	        this.expect(')');
2819  	        return args;
2820  	    };
2821  	    Parser.prototype.isIdentifierName = function (token) {
2822  	        return token.type === 3 /* Identifier */ ||
2823  	            token.type === 4 /* Keyword */ ||
2824  	            token.type === 1 /* BooleanLiteral */ ||
2825  	            token.type === 5 /* NullLiteral */;
2826  	    };
2827  	    Parser.prototype.parseIdentifierName = function () {
2828  	        var node = this.createNode();
2829  	        var token = this.nextToken();
2830  	        if (!this.isIdentifierName(token)) {
2831  	            this.throwUnexpectedToken(token);
2832  	        }
2833  	        return this.finalize(node, new Node.Identifier(token.value));
2834  	    };
2835  	    Parser.prototype.parseNewExpression = function () {
2836  	        var node = this.createNode();
2837  	        var id = this.parseIdentifierName();
2838  	        assert_1.assert(id.name === 'new', 'New expression must start with `new`');
2839  	        var expr;
2840  	        if (this.match('.')) {
2841  	            this.nextToken();
2842  	            if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
2843  	                var property = this.parseIdentifierName();
2844  	                expr = new Node.MetaProperty(id, property);
2845  	            }
2846  	            else {
2847  	                this.throwUnexpectedToken(this.lookahead);
2848  	            }
2849  	        }
2850  	        else {
2851  	            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
2852  	            var args = this.match('(') ? this.parseArguments() : [];
2853  	            expr = new Node.NewExpression(callee, args);
2854  	            this.context.isAssignmentTarget = false;
2855  	            this.context.isBindingElement = false;
2856  	        }
2857  	        return this.finalize(node, expr);
2858  	    };
2859  	    Parser.prototype.parseAsyncArgument = function () {
2860  	        var arg = this.parseAssignmentExpression();
2861  	        this.context.firstCoverInitializedNameError = null;
2862  	        return arg;
2863  	    };
2864  	    Parser.prototype.parseAsyncArguments = function () {
2865  	        this.expect('(');
2866  	        var args = [];
2867  	        if (!this.match(')')) {
2868  	            while (true) {
2869  	                var expr = this.match('...') ? this.parseSpreadElement() :
2870  	                    this.isolateCoverGrammar(this.parseAsyncArgument);
2871  	                args.push(expr);
2872  	                if (this.match(')')) {
2873  	                    break;
2874  	                }
2875  	                this.expectCommaSeparator();
2876  	                if (this.match(')')) {
2877  	                    break;
2878  	                }
2879  	            }
2880  	        }
2881  	        this.expect(')');
2882  	        return args;
2883  	    };
2884  	    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
2885  	        var startToken = this.lookahead;
2886  	        var maybeAsync = this.matchContextualKeyword('async');
2887  	        var previousAllowIn = this.context.allowIn;
2888  	        this.context.allowIn = true;
2889  	        var expr;
2890  	        if (this.matchKeyword('super') && this.context.inFunctionBody) {
2891  	            expr = this.createNode();
2892  	            this.nextToken();
2893  	            expr = this.finalize(expr, new Node.Super());
2894  	            if (!this.match('(') && !this.match('.') && !this.match('[')) {
2895  	                this.throwUnexpectedToken(this.lookahead);
2896  	            }
2897  	        }
2898  	        else {
2899  	            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
2900  	        }
2901  	        while (true) {
2902  	            if (this.match('.')) {
2903  	                this.context.isBindingElement = false;
2904  	                this.context.isAssignmentTarget = true;
2905  	                this.expect('.');
2906  	                var property = this.parseIdentifierName();
2907  	                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
2908  	            }
2909  	            else if (this.match('(')) {
2910  	                var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
2911  	                this.context.isBindingElement = false;
2912  	                this.context.isAssignmentTarget = false;
2913  	                var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
2914  	                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
2915  	                if (asyncArrow && this.match('=>')) {
2916  	                    for (var i = 0; i < args.length; ++i) {
2917  	                        this.reinterpretExpressionAsPattern(args[i]);
2918  	                    }
2919  	                    expr = {
2920  	                        type: ArrowParameterPlaceHolder,
2921  	                        params: args,
2922  	                        async: true
2923  	                    };
2924  	                }
2925  	            }
2926  	            else if (this.match('[')) {
2927  	                this.context.isBindingElement = false;
2928  	                this.context.isAssignmentTarget = true;
2929  	                this.expect('[');
2930  	                var property = this.isolateCoverGrammar(this.parseExpression);
2931  	                this.expect(']');
2932  	                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
2933  	            }
2934  	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
2935  	                var quasi = this.parseTemplateLiteral();
2936  	                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
2937  	            }
2938  	            else {
2939  	                break;
2940  	            }
2941  	        }
2942  	        this.context.allowIn = previousAllowIn;
2943  	        return expr;
2944  	    };
2945  	    Parser.prototype.parseSuper = function () {
2946  	        var node = this.createNode();
2947  	        this.expectKeyword('super');
2948  	        if (!this.match('[') && !this.match('.')) {
2949  	            this.throwUnexpectedToken(this.lookahead);
2950  	        }
2951  	        return this.finalize(node, new Node.Super());
2952  	    };
2953  	    Parser.prototype.parseLeftHandSideExpression = function () {
2954  	        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
2955  	        var node = this.startNode(this.lookahead);
2956  	        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
2957  	            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
2958  	        while (true) {
2959  	            if (this.match('[')) {
2960  	                this.context.isBindingElement = false;
2961  	                this.context.isAssignmentTarget = true;
2962  	                this.expect('[');
2963  	                var property = this.isolateCoverGrammar(this.parseExpression);
2964  	                this.expect(']');
2965  	                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
2966  	            }
2967  	            else if (this.match('.')) {
2968  	                this.context.isBindingElement = false;
2969  	                this.context.isAssignmentTarget = true;
2970  	                this.expect('.');
2971  	                var property = this.parseIdentifierName();
2972  	                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
2973  	            }
2974  	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
2975  	                var quasi = this.parseTemplateLiteral();
2976  	                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
2977  	            }
2978  	            else {
2979  	                break;
2980  	            }
2981  	        }
2982  	        return expr;
2983  	    };
2984  	    // https://tc39.github.io/ecma262/#sec-update-expressions
2985  	    Parser.prototype.parseUpdateExpression = function () {
2986  	        var expr;
2987  	        var startToken = this.lookahead;
2988  	        if (this.match('++') || this.match('--')) {
2989  	            var node = this.startNode(startToken);
2990  	            var token = this.nextToken();
2991  	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
2992  	            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
2993  	                this.tolerateError(messages_1.Messages.StrictLHSPrefix);
2994  	            }
2995  	            if (!this.context.isAssignmentTarget) {
2996  	                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
2997  	            }
2998  	            var prefix = true;
2999  	            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
3000  	            this.context.isAssignmentTarget = false;
3001  	            this.context.isBindingElement = false;
3002  	        }
3003  	        else {
3004  	            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
3005  	            if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
3006  	                if (this.match('++') || this.match('--')) {
3007  	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
3008  	                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);
3009  	                    }
3010  	                    if (!this.context.isAssignmentTarget) {
3011  	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
3012  	                    }
3013  	                    this.context.isAssignmentTarget = false;
3014  	                    this.context.isBindingElement = false;
3015  	                    var operator = this.nextToken().value;
3016  	                    var prefix = false;
3017  	                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
3018  	                }
3019  	            }
3020  	        }
3021  	        return expr;
3022  	    };
3023  	    // https://tc39.github.io/ecma262/#sec-unary-operators
3024  	    Parser.prototype.parseAwaitExpression = function () {
3025  	        var node = this.createNode();
3026  	        this.nextToken();
3027  	        var argument = this.parseUnaryExpression();
3028  	        return this.finalize(node, new Node.AwaitExpression(argument));
3029  	    };
3030  	    Parser.prototype.parseUnaryExpression = function () {
3031  	        var expr;
3032  	        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
3033  	            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
3034  	            var node = this.startNode(this.lookahead);
3035  	            var token = this.nextToken();
3036  	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
3037  	            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
3038  	            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
3039  	                this.tolerateError(messages_1.Messages.StrictDelete);
3040  	            }
3041  	            this.context.isAssignmentTarget = false;
3042  	            this.context.isBindingElement = false;
3043  	        }
3044  	        else if (this.context.await && this.matchContextualKeyword('await')) {
3045  	            expr = this.parseAwaitExpression();
3046  	        }
3047  	        else {
3048  	            expr = this.parseUpdateExpression();
3049  	        }
3050  	        return expr;
3051  	    };
3052  	    Parser.prototype.parseExponentiationExpression = function () {
3053  	        var startToken = this.lookahead;
3054  	        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
3055  	        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
3056  	            this.nextToken();
3057  	            this.context.isAssignmentTarget = false;
3058  	            this.context.isBindingElement = false;
3059  	            var left = expr;
3060  	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
3061  	            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
3062  	        }
3063  	        return expr;
3064  	    };
3065  	    // https://tc39.github.io/ecma262/#sec-exp-operator
3066  	    // https://tc39.github.io/ecma262/#sec-multiplicative-operators
3067  	    // https://tc39.github.io/ecma262/#sec-additive-operators
3068  	    // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
3069  	    // https://tc39.github.io/ecma262/#sec-relational-operators
3070  	    // https://tc39.github.io/ecma262/#sec-equality-operators
3071  	    // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
3072  	    // https://tc39.github.io/ecma262/#sec-binary-logical-operators
3073  	    Parser.prototype.binaryPrecedence = function (token) {
3074  	        var op = token.value;
3075  	        var precedence;
3076  	        if (token.type === 7 /* Punctuator */) {
3077  	            precedence = this.operatorPrecedence[op] || 0;
3078  	        }
3079  	        else if (token.type === 4 /* Keyword */) {
3080  	            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
3081  	        }
3082  	        else {
3083  	            precedence = 0;
3084  	        }
3085  	        return precedence;
3086  	    };
3087  	    Parser.prototype.parseBinaryExpression = function () {
3088  	        var startToken = this.lookahead;
3089  	        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
3090  	        var token = this.lookahead;
3091  	        var prec = this.binaryPrecedence(token);
3092  	        if (prec > 0) {
3093  	            this.nextToken();
3094  	            this.context.isAssignmentTarget = false;
3095  	            this.context.isBindingElement = false;
3096  	            var markers = [startToken, this.lookahead];
3097  	            var left = expr;
3098  	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
3099  	            var stack = [left, token.value, right];
3100  	            var precedences = [prec];
3101  	            while (true) {
3102  	                prec = this.binaryPrecedence(this.lookahead);
3103  	                if (prec <= 0) {
3104  	                    break;
3105  	                }
3106  	                // Reduce: make a binary expression from the three topmost entries.
3107  	                while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
3108  	                    right = stack.pop();
3109  	                    var operator = stack.pop();
3110  	                    precedences.pop();
3111  	                    left = stack.pop();
3112  	                    markers.pop();
3113  	                    var node = this.startNode(markers[markers.length - 1]);
3114  	                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
3115  	                }
3116  	                // Shift.
3117  	                stack.push(this.nextToken().value);
3118  	                precedences.push(prec);
3119  	                markers.push(this.lookahead);
3120  	                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
3121  	            }
3122  	            // Final reduce to clean-up the stack.
3123  	            var i = stack.length - 1;
3124  	            expr = stack[i];
3125  	            var lastMarker = markers.pop();
3126  	            while (i > 1) {
3127  	                var marker = markers.pop();
3128  	                var lastLineStart = lastMarker && lastMarker.lineStart;
3129  	                var node = this.startNode(marker, lastLineStart);
3130  	                var operator = stack[i - 1];
3131  	                expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
3132  	                i -= 2;
3133  	                lastMarker = marker;
3134  	            }
3135  	        }
3136  	        return expr;
3137  	    };
3138  	    // https://tc39.github.io/ecma262/#sec-conditional-operator
3139  	    Parser.prototype.parseConditionalExpression = function () {
3140  	        var startToken = this.lookahead;
3141  	        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
3142  	        if (this.match('?')) {
3143  	            this.nextToken();
3144  	            var previousAllowIn = this.context.allowIn;
3145  	            this.context.allowIn = true;
3146  	            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
3147  	            this.context.allowIn = previousAllowIn;
3148  	            this.expect(':');
3149  	            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
3150  	            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
3151  	            this.context.isAssignmentTarget = false;
3152  	            this.context.isBindingElement = false;
3153  	        }
3154  	        return expr;
3155  	    };
3156  	    // https://tc39.github.io/ecma262/#sec-assignment-operators
3157  	    Parser.prototype.checkPatternParam = function (options, param) {
3158  	        switch (param.type) {
3159  	            case syntax_1.Syntax.Identifier:
3160  	                this.validateParam(options, param, param.name);
3161  	                break;
3162  	            case syntax_1.Syntax.RestElement:
3163  	                this.checkPatternParam(options, param.argument);
3164  	                break;
3165  	            case syntax_1.Syntax.AssignmentPattern:
3166  	                this.checkPatternParam(options, param.left);
3167  	                break;
3168  	            case syntax_1.Syntax.ArrayPattern:
3169  	                for (var i = 0; i < param.elements.length; i++) {
3170  	                    if (param.elements[i] !== null) {
3171  	                        this.checkPatternParam(options, param.elements[i]);
3172  	                    }
3173  	                }
3174  	                break;
3175  	            case syntax_1.Syntax.ObjectPattern:
3176  	                for (var i = 0; i < param.properties.length; i++) {
3177  	                    this.checkPatternParam(options, param.properties[i].value);
3178  	                }
3179  	                break;
3180  	            default:
3181  	                break;
3182  	        }
3183  	        options.simple = options.simple && (param instanceof Node.Identifier);
3184  	    };
3185  	    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
3186  	        var params = [expr];
3187  	        var options;
3188  	        var asyncArrow = false;
3189  	        switch (expr.type) {
3190  	            case syntax_1.Syntax.Identifier:
3191  	                break;
3192  	            case ArrowParameterPlaceHolder:
3193  	                params = expr.params;
3194  	                asyncArrow = expr.async;
3195  	                break;
3196  	            default:
3197  	                return null;
3198  	        }
3199  	        options = {
3200  	            simple: true,
3201  	            paramSet: {}
3202  	        };
3203  	        for (var i = 0; i < params.length; ++i) {
3204  	            var param = params[i];
3205  	            if (param.type === syntax_1.Syntax.AssignmentPattern) {
3206  	                if (param.right.type === syntax_1.Syntax.YieldExpression) {
3207  	                    if (param.right.argument) {
3208  	                        this.throwUnexpectedToken(this.lookahead);
3209  	                    }
3210  	                    param.right.type = syntax_1.Syntax.Identifier;
3211  	                    param.right.name = 'yield';
3212  	                    delete param.right.argument;
3213  	                    delete param.right.delegate;
3214  	                }
3215  	            }
3216  	            else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
3217  	                this.throwUnexpectedToken(this.lookahead);
3218  	            }
3219  	            this.checkPatternParam(options, param);
3220  	            params[i] = param;
3221  	        }
3222  	        if (this.context.strict || !this.context.allowYield) {
3223  	            for (var i = 0; i < params.length; ++i) {
3224  	                var param = params[i];
3225  	                if (param.type === syntax_1.Syntax.YieldExpression) {
3226  	                    this.throwUnexpectedToken(this.lookahead);
3227  	                }
3228  	            }
3229  	        }
3230  	        if (options.message === messages_1.Messages.StrictParamDupe) {
3231  	            var token = this.context.strict ? options.stricted : options.firstRestricted;
3232  	            this.throwUnexpectedToken(token, options.message);
3233  	        }
3234  	        return {
3235  	            simple: options.simple,
3236  	            params: params,
3237  	            stricted: options.stricted,
3238  	            firstRestricted: options.firstRestricted,
3239  	            message: options.message
3240  	        };
3241  	    };
3242  	    Parser.prototype.parseAssignmentExpression = function () {
3243  	        var expr;
3244  	        if (!this.context.allowYield && this.matchKeyword('yield')) {
3245  	            expr = this.parseYieldExpression();
3246  	        }
3247  	        else {
3248  	            var startToken = this.lookahead;
3249  	            var token = startToken;
3250  	            expr = this.parseConditionalExpression();
3251  	            if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
3252  	                if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
3253  	                    var arg = this.parsePrimaryExpression();
3254  	                    this.reinterpretExpressionAsPattern(arg);
3255  	                    expr = {
3256  	                        type: ArrowParameterPlaceHolder,
3257  	                        params: [arg],
3258  	                        async: true
3259  	                    };
3260  	                }
3261  	            }
3262  	            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
3263  	                // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
3264  	                this.context.isAssignmentTarget = false;
3265  	                this.context.isBindingElement = false;
3266  	                var isAsync = expr.async;
3267  	                var list = this.reinterpretAsCoverFormalsList(expr);
3268  	                if (list) {
3269  	                    if (this.hasLineTerminator) {
3270  	                        this.tolerateUnexpectedToken(this.lookahead);
3271  	                    }
3272  	                    this.context.firstCoverInitializedNameError = null;
3273  	                    var previousStrict = this.context.strict;
3274  	                    var previousAllowStrictDirective = this.context.allowStrictDirective;
3275  	                    this.context.allowStrictDirective = list.simple;
3276  	                    var previousAllowYield = this.context.allowYield;
3277  	                    var previousAwait = this.context.await;
3278  	                    this.context.allowYield = true;
3279  	                    this.context.await = isAsync;
3280  	                    var node = this.startNode(startToken);
3281  	                    this.expect('=>');
3282  	                    var body = void 0;
3283  	                    if (this.match('{')) {
3284  	                        var previousAllowIn = this.context.allowIn;
3285  	                        this.context.allowIn = true;
3286  	                        body = this.parseFunctionSourceElements();
3287  	                        this.context.allowIn = previousAllowIn;
3288  	                    }
3289  	                    else {
3290  	                        body = this.isolateCoverGrammar(this.parseAssignmentExpression);
3291  	                    }
3292  	                    var expression = body.type !== syntax_1.Syntax.BlockStatement;
3293  	                    if (this.context.strict && list.firstRestricted) {
3294  	                        this.throwUnexpectedToken(list.firstRestricted, list.message);
3295  	                    }
3296  	                    if (this.context.strict && list.stricted) {
3297  	                        this.tolerateUnexpectedToken(list.stricted, list.message);
3298  	                    }
3299  	                    expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
3300  	                        this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
3301  	                    this.context.strict = previousStrict;
3302  	                    this.context.allowStrictDirective = previousAllowStrictDirective;
3303  	                    this.context.allowYield = previousAllowYield;
3304  	                    this.context.await = previousAwait;
3305  	                }
3306  	            }
3307  	            else {
3308  	                if (this.matchAssign()) {
3309  	                    if (!this.context.isAssignmentTarget) {
3310  	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
3311  	                    }
3312  	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
3313  	                        var id = expr;
3314  	                        if (this.scanner.isRestrictedWord(id.name)) {
3315  	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
3316  	                        }
3317  	                        if (this.scanner.isStrictModeReservedWord(id.name)) {
3318  	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
3319  	                        }
3320  	                    }
3321  	                    if (!this.match('=')) {
3322  	                        this.context.isAssignmentTarget = false;
3323  	                        this.context.isBindingElement = false;
3324  	                    }
3325  	                    else {
3326  	                        this.reinterpretExpressionAsPattern(expr);
3327  	                    }
3328  	                    token = this.nextToken();
3329  	                    var operator = token.value;
3330  	                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
3331  	                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
3332  	                    this.context.firstCoverInitializedNameError = null;
3333  	                }
3334  	            }
3335  	        }
3336  	        return expr;
3337  	    };
3338  	    // https://tc39.github.io/ecma262/#sec-comma-operator
3339  	    Parser.prototype.parseExpression = function () {
3340  	        var startToken = this.lookahead;
3341  	        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
3342  	        if (this.match(',')) {
3343  	            var expressions = [];
3344  	            expressions.push(expr);
3345  	            while (this.lookahead.type !== 2 /* EOF */) {
3346  	                if (!this.match(',')) {
3347  	                    break;
3348  	                }
3349  	                this.nextToken();
3350  	                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
3351  	            }
3352  	            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
3353  	        }
3354  	        return expr;
3355  	    };
3356  	    // https://tc39.github.io/ecma262/#sec-block
3357  	    Parser.prototype.parseStatementListItem = function () {
3358  	        var statement;
3359  	        this.context.isAssignmentTarget = true;
3360  	        this.context.isBindingElement = true;
3361  	        if (this.lookahead.type === 4 /* Keyword */) {
3362  	            switch (this.lookahead.value) {
3363  	                case 'export':
3364  	                    if (!this.context.isModule) {
3365  	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
3366  	                    }
3367  	                    statement = this.parseExportDeclaration();
3368  	                    break;
3369  	                case 'import':
3370  	                    if (!this.context.isModule) {
3371  	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
3372  	                    }
3373  	                    statement = this.parseImportDeclaration();
3374  	                    break;
3375  	                case 'const':
3376  	                    statement = this.parseLexicalDeclaration({ inFor: false });
3377  	                    break;
3378  	                case 'function':
3379  	                    statement = this.parseFunctionDeclaration();
3380  	                    break;
3381  	                case 'class':
3382  	                    statement = this.parseClassDeclaration();
3383  	                    break;
3384  	                case 'let':
3385  	                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
3386  	                    break;
3387  	                default:
3388  	                    statement = this.parseStatement();
3389  	                    break;
3390  	            }
3391  	        }
3392  	        else {
3393  	            statement = this.parseStatement();
3394  	        }
3395  	        return statement;
3396  	    };
3397  	    Parser.prototype.parseBlock = function () {
3398  	        var node = this.createNode();
3399  	        this.expect('{');
3400  	        var block = [];
3401  	        while (true) {
3402  	            if (this.match('}')) {
3403  	                break;
3404  	            }
3405  	            block.push(this.parseStatementListItem());
3406  	        }
3407  	        this.expect('}');
3408  	        return this.finalize(node, new Node.BlockStatement(block));
3409  	    };
3410  	    // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
3411  	    Parser.prototype.parseLexicalBinding = function (kind, options) {
3412  	        var node = this.createNode();
3413  	        var params = [];
3414  	        var id = this.parsePattern(params, kind);
3415  	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
3416  	            if (this.scanner.isRestrictedWord(id.name)) {
3417  	                this.tolerateError(messages_1.Messages.StrictVarName);
3418  	            }
3419  	        }
3420  	        var init = null;
3421  	        if (kind === 'const') {
3422  	            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
3423  	                if (this.match('=')) {
3424  	                    this.nextToken();
3425  	                    init = this.isolateCoverGrammar(this.parseAssignmentExpression);
3426  	                }
3427  	                else {
3428  	                    this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
3429  	                }
3430  	            }
3431  	        }
3432  	        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
3433  	            this.expect('=');
3434  	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
3435  	        }
3436  	        return this.finalize(node, new Node.VariableDeclarator(id, init));
3437  	    };
3438  	    Parser.prototype.parseBindingList = function (kind, options) {
3439  	        var list = [this.parseLexicalBinding(kind, options)];
3440  	        while (this.match(',')) {
3441  	            this.nextToken();
3442  	            list.push(this.parseLexicalBinding(kind, options));
3443  	        }
3444  	        return list;
3445  	    };
3446  	    Parser.prototype.isLexicalDeclaration = function () {
3447  	        var state = this.scanner.saveState();
3448  	        this.scanner.scanComments();
3449  	        var next = this.scanner.lex();
3450  	        this.scanner.restoreState(state);
3451  	        return (next.type === 3 /* Identifier */) ||
3452  	            (next.type === 7 /* Punctuator */ && next.value === '[') ||
3453  	            (next.type === 7 /* Punctuator */ && next.value === '{') ||
3454  	            (next.type === 4 /* Keyword */ && next.value === 'let') ||
3455  	            (next.type === 4 /* Keyword */ && next.value === 'yield');
3456  	    };
3457  	    Parser.prototype.parseLexicalDeclaration = function (options) {
3458  	        var node = this.createNode();
3459  	        var kind = this.nextToken().value;
3460  	        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
3461  	        var declarations = this.parseBindingList(kind, options);
3462  	        this.consumeSemicolon();
3463  	        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
3464  	    };
3465  	    // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
3466  	    Parser.prototype.parseBindingRestElement = function (params, kind) {
3467  	        var node = this.createNode();
3468  	        this.expect('...');
3469  	        var arg = this.parsePattern(params, kind);
3470  	        return this.finalize(node, new Node.RestElement(arg));
3471  	    };
3472  	    Parser.prototype.parseArrayPattern = function (params, kind) {
3473  	        var node = this.createNode();
3474  	        this.expect('[');
3475  	        var elements = [];
3476  	        while (!this.match(']')) {
3477  	            if (this.match(',')) {
3478  	                this.nextToken();
3479  	                elements.push(null);
3480  	            }
3481  	            else {
3482  	                if (this.match('...')) {
3483  	                    elements.push(this.parseBindingRestElement(params, kind));
3484  	                    break;
3485  	                }
3486  	                else {
3487  	                    elements.push(this.parsePatternWithDefault(params, kind));
3488  	                }
3489  	                if (!this.match(']')) {
3490  	                    this.expect(',');
3491  	                }
3492  	            }
3493  	        }
3494  	        this.expect(']');
3495  	        return this.finalize(node, new Node.ArrayPattern(elements));
3496  	    };
3497  	    Parser.prototype.parsePropertyPattern = function (params, kind) {
3498  	        var node = this.createNode();
3499  	        var computed = false;
3500  	        var shorthand = false;
3501  	        var method = false;
3502  	        var key;
3503  	        var value;
3504  	        if (this.lookahead.type === 3 /* Identifier */) {
3505  	            var keyToken = this.lookahead;
3506  	            key = this.parseVariableIdentifier();
3507  	            var init = this.finalize(node, new Node.Identifier(keyToken.value));
3508  	            if (this.match('=')) {
3509  	                params.push(keyToken);
3510  	                shorthand = true;
3511  	                this.nextToken();
3512  	                var expr = this.parseAssignmentExpression();
3513  	                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
3514  	            }
3515  	            else if (!this.match(':')) {
3516  	                params.push(keyToken);
3517  	                shorthand = true;
3518  	                value = init;
3519  	            }
3520  	            else {
3521  	                this.expect(':');
3522  	                value = this.parsePatternWithDefault(params, kind);
3523  	            }
3524  	        }
3525  	        else {
3526  	            computed = this.match('[');
3527  	            key = this.parseObjectPropertyKey();
3528  	            this.expect(':');
3529  	            value = this.parsePatternWithDefault(params, kind);
3530  	        }
3531  	        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
3532  	    };
3533  	    Parser.prototype.parseObjectPattern = function (params, kind) {
3534  	        var node = this.createNode();
3535  	        var properties = [];
3536  	        this.expect('{');
3537  	        while (!this.match('}')) {
3538  	            properties.push(this.parsePropertyPattern(params, kind));
3539  	            if (!this.match('}')) {
3540  	                this.expect(',');
3541  	            }
3542  	        }
3543  	        this.expect('}');
3544  	        return this.finalize(node, new Node.ObjectPattern(properties));
3545  	    };
3546  	    Parser.prototype.parsePattern = function (params, kind) {
3547  	        var pattern;
3548  	        if (this.match('[')) {
3549  	            pattern = this.parseArrayPattern(params, kind);
3550  	        }
3551  	        else if (this.match('{')) {
3552  	            pattern = this.parseObjectPattern(params, kind);
3553  	        }
3554  	        else {
3555  	            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
3556  	                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
3557  	            }
3558  	            params.push(this.lookahead);
3559  	            pattern = this.parseVariableIdentifier(kind);
3560  	        }
3561  	        return pattern;
3562  	    };
3563  	    Parser.prototype.parsePatternWithDefault = function (params, kind) {
3564  	        var startToken = this.lookahead;
3565  	        var pattern = this.parsePattern(params, kind);
3566  	        if (this.match('=')) {
3567  	            this.nextToken();
3568  	            var previousAllowYield = this.context.allowYield;
3569  	            this.context.allowYield = true;
3570  	            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
3571  	            this.context.allowYield = previousAllowYield;
3572  	            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
3573  	        }
3574  	        return pattern;
3575  	    };
3576  	    // https://tc39.github.io/ecma262/#sec-variable-statement
3577  	    Parser.prototype.parseVariableIdentifier = function (kind) {
3578  	        var node = this.createNode();
3579  	        var token = this.nextToken();
3580  	        if (token.type === 4 /* Keyword */ && token.value === 'yield') {
3581  	            if (this.context.strict) {
3582  	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
3583  	            }
3584  	            else if (!this.context.allowYield) {
3585  	                this.throwUnexpectedToken(token);
3586  	            }
3587  	        }
3588  	        else if (token.type !== 3 /* Identifier */) {
3589  	            if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
3590  	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
3591  	            }
3592  	            else {
3593  	                if (this.context.strict || token.value !== 'let' || kind !== 'var') {
3594  	                    this.throwUnexpectedToken(token);
3595  	                }
3596  	            }
3597  	        }
3598  	        else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
3599  	            this.tolerateUnexpectedToken(token);
3600  	        }
3601  	        return this.finalize(node, new Node.Identifier(token.value));
3602  	    };
3603  	    Parser.prototype.parseVariableDeclaration = function (options) {
3604  	        var node = this.createNode();
3605  	        var params = [];
3606  	        var id = this.parsePattern(params, 'var');
3607  	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
3608  	            if (this.scanner.isRestrictedWord(id.name)) {
3609  	                this.tolerateError(messages_1.Messages.StrictVarName);
3610  	            }
3611  	        }
3612  	        var init = null;
3613  	        if (this.match('=')) {
3614  	            this.nextToken();
3615  	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
3616  	        }
3617  	        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
3618  	            this.expect('=');
3619  	        }
3620  	        return this.finalize(node, new Node.VariableDeclarator(id, init));
3621  	    };
3622  	    Parser.prototype.parseVariableDeclarationList = function (options) {
3623  	        var opt = { inFor: options.inFor };
3624  	        var list = [];
3625  	        list.push(this.parseVariableDeclaration(opt));
3626  	        while (this.match(',')) {
3627  	            this.nextToken();
3628  	            list.push(this.parseVariableDeclaration(opt));
3629  	        }
3630  	        return list;
3631  	    };
3632  	    Parser.prototype.parseVariableStatement = function () {
3633  	        var node = this.createNode();
3634  	        this.expectKeyword('var');
3635  	        var declarations = this.parseVariableDeclarationList({ inFor: false });
3636  	        this.consumeSemicolon();
3637  	        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
3638  	    };
3639  	    // https://tc39.github.io/ecma262/#sec-empty-statement
3640  	    Parser.prototype.parseEmptyStatement = function () {
3641  	        var node = this.createNode();
3642  	        this.expect(';');
3643  	        return this.finalize(node, new Node.EmptyStatement());
3644  	    };
3645  	    // https://tc39.github.io/ecma262/#sec-expression-statement
3646  	    Parser.prototype.parseExpressionStatement = function () {
3647  	        var node = this.createNode();
3648  	        var expr = this.parseExpression();
3649  	        this.consumeSemicolon();
3650  	        return this.finalize(node, new Node.ExpressionStatement(expr));
3651  	    };
3652  	    // https://tc39.github.io/ecma262/#sec-if-statement
3653  	    Parser.prototype.parseIfClause = function () {
3654  	        if (this.context.strict && this.matchKeyword('function')) {
3655  	            this.tolerateError(messages_1.Messages.StrictFunction);
3656  	        }
3657  	        return this.parseStatement();
3658  	    };
3659  	    Parser.prototype.parseIfStatement = function () {
3660  	        var node = this.createNode();
3661  	        var consequent;
3662  	        var alternate = null;
3663  	        this.expectKeyword('if');
3664  	        this.expect('(');
3665  	        var test = this.parseExpression();
3666  	        if (!this.match(')') && this.config.tolerant) {
3667  	            this.tolerateUnexpectedToken(this.nextToken());
3668  	            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
3669  	        }
3670  	        else {
3671  	            this.expect(')');
3672  	            consequent = this.parseIfClause();
3673  	            if (this.matchKeyword('else')) {
3674  	                this.nextToken();
3675  	                alternate = this.parseIfClause();
3676  	            }
3677  	        }
3678  	        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
3679  	    };
3680  	    // https://tc39.github.io/ecma262/#sec-do-while-statement
3681  	    Parser.prototype.parseDoWhileStatement = function () {
3682  	        var node = this.createNode();
3683  	        this.expectKeyword('do');
3684  	        var previousInIteration = this.context.inIteration;
3685  	        this.context.inIteration = true;
3686  	        var body = this.parseStatement();
3687  	        this.context.inIteration = previousInIteration;
3688  	        this.expectKeyword('while');
3689  	        this.expect('(');
3690  	        var test = this.parseExpression();
3691  	        if (!this.match(')') && this.config.tolerant) {
3692  	            this.tolerateUnexpectedToken(this.nextToken());
3693  	        }
3694  	        else {
3695  	            this.expect(')');
3696  	            if (this.match(';')) {
3697  	                this.nextToken();
3698  	            }
3699  	        }
3700  	        return this.finalize(node, new Node.DoWhileStatement(body, test));
3701  	    };
3702  	    // https://tc39.github.io/ecma262/#sec-while-statement
3703  	    Parser.prototype.parseWhileStatement = function () {
3704  	        var node = this.createNode();
3705  	        var body;
3706  	        this.expectKeyword('while');
3707  	        this.expect('(');
3708  	        var test = this.parseExpression();
3709  	        if (!this.match(')') && this.config.tolerant) {
3710  	            this.tolerateUnexpectedToken(this.nextToken());
3711  	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
3712  	        }
3713  	        else {
3714  	            this.expect(')');
3715  	            var previousInIteration = this.context.inIteration;
3716  	            this.context.inIteration = true;
3717  	            body = this.parseStatement();
3718  	            this.context.inIteration = previousInIteration;
3719  	        }
3720  	        return this.finalize(node, new Node.WhileStatement(test, body));
3721  	    };
3722  	    // https://tc39.github.io/ecma262/#sec-for-statement
3723  	    // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
3724  	    Parser.prototype.parseForStatement = function () {
3725  	        var init = null;
3726  	        var test = null;
3727  	        var update = null;
3728  	        var forIn = true;
3729  	        var left, right;
3730  	        var node = this.createNode();
3731  	        this.expectKeyword('for');
3732  	        this.expect('(');
3733  	        if (this.match(';')) {
3734  	            this.nextToken();
3735  	        }
3736  	        else {
3737  	            if (this.matchKeyword('var')) {
3738  	                init = this.createNode();
3739  	                this.nextToken();
3740  	                var previousAllowIn = this.context.allowIn;
3741  	                this.context.allowIn = false;
3742  	                var declarations = this.parseVariableDeclarationList({ inFor: true });
3743  	                this.context.allowIn = previousAllowIn;
3744  	                if (declarations.length === 1 && this.matchKeyword('in')) {
3745  	                    var decl = declarations[0];
3746  	                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
3747  	                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
3748  	                    }
3749  	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
3750  	                    this.nextToken();
3751  	                    left = init;
3752  	                    right = this.parseExpression();
3753  	                    init = null;
3754  	                }
3755  	                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
3756  	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
3757  	                    this.nextToken();
3758  	                    left = init;
3759  	                    right = this.parseAssignmentExpression();
3760  	                    init = null;
3761  	                    forIn = false;
3762  	                }
3763  	                else {
3764  	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
3765  	                    this.expect(';');
3766  	                }
3767  	            }
3768  	            else if (this.matchKeyword('const') || this.matchKeyword('let')) {
3769  	                init = this.createNode();
3770  	                var kind = this.nextToken().value;
3771  	                if (!this.context.strict && this.lookahead.value === 'in') {
3772  	                    init = this.finalize(init, new Node.Identifier(kind));
3773  	                    this.nextToken();
3774  	                    left = init;
3775  	                    right = this.parseExpression();
3776  	                    init = null;
3777  	                }
3778  	                else {
3779  	                    var previousAllowIn = this.context.allowIn;
3780  	                    this.context.allowIn = false;
3781  	                    var declarations = this.parseBindingList(kind, { inFor: true });
3782  	                    this.context.allowIn = previousAllowIn;
3783  	                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
3784  	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
3785  	                        this.nextToken();
3786  	                        left = init;
3787  	                        right = this.parseExpression();
3788  	                        init = null;
3789  	                    }
3790  	                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
3791  	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
3792  	                        this.nextToken();
3793  	                        left = init;
3794  	                        right = this.parseAssignmentExpression();
3795  	                        init = null;
3796  	                        forIn = false;
3797  	                    }
3798  	                    else {
3799  	                        this.consumeSemicolon();
3800  	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
3801  	                    }
3802  	                }
3803  	            }
3804  	            else {
3805  	                var initStartToken = this.lookahead;
3806  	                var previousAllowIn = this.context.allowIn;
3807  	                this.context.allowIn = false;
3808  	                init = this.inheritCoverGrammar(this.parseAssignmentExpression);
3809  	                this.context.allowIn = previousAllowIn;
3810  	                if (this.matchKeyword('in')) {
3811  	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
3812  	                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
3813  	                    }
3814  	                    this.nextToken();
3815  	                    this.reinterpretExpressionAsPattern(init);
3816  	                    left = init;
3817  	                    right = this.parseExpression();
3818  	                    init = null;
3819  	                }
3820  	                else if (this.matchContextualKeyword('of')) {
3821  	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
3822  	                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
3823  	                    }
3824  	                    this.nextToken();
3825  	                    this.reinterpretExpressionAsPattern(init);
3826  	                    left = init;
3827  	                    right = this.parseAssignmentExpression();
3828  	                    init = null;
3829  	                    forIn = false;
3830  	                }
3831  	                else {
3832  	                    if (this.match(',')) {
3833  	                        var initSeq = [init];
3834  	                        while (this.match(',')) {
3835  	                            this.nextToken();
3836  	                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
3837  	                        }
3838  	                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
3839  	                    }
3840  	                    this.expect(';');
3841  	                }
3842  	            }
3843  	        }
3844  	        if (typeof left === 'undefined') {
3845  	            if (!this.match(';')) {
3846  	                test = this.parseExpression();
3847  	            }
3848  	            this.expect(';');
3849  	            if (!this.match(')')) {
3850  	                update = this.parseExpression();
3851  	            }
3852  	        }
3853  	        var body;
3854  	        if (!this.match(')') && this.config.tolerant) {
3855  	            this.tolerateUnexpectedToken(this.nextToken());
3856  	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
3857  	        }
3858  	        else {
3859  	            this.expect(')');
3860  	            var previousInIteration = this.context.inIteration;
3861  	            this.context.inIteration = true;
3862  	            body = this.isolateCoverGrammar(this.parseStatement);
3863  	            this.context.inIteration = previousInIteration;
3864  	        }
3865  	        return (typeof left === 'undefined') ?
3866  	            this.finalize(node, new Node.ForStatement(init, test, update, body)) :
3867  	            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
3868  	                this.finalize(node, new Node.ForOfStatement(left, right, body));
3869  	    };
3870  	    // https://tc39.github.io/ecma262/#sec-continue-statement
3871  	    Parser.prototype.parseContinueStatement = function () {
3872  	        var node = this.createNode();
3873  	        this.expectKeyword('continue');
3874  	        var label = null;
3875  	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
3876  	            var id = this.parseVariableIdentifier();
3877  	            label = id;
3878  	            var key = '$' + id.name;
3879  	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
3880  	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
3881  	            }
3882  	        }
3883  	        this.consumeSemicolon();
3884  	        if (label === null && !this.context.inIteration) {
3885  	            this.throwError(messages_1.Messages.IllegalContinue);
3886  	        }
3887  	        return this.finalize(node, new Node.ContinueStatement(label));
3888  	    };
3889  	    // https://tc39.github.io/ecma262/#sec-break-statement
3890  	    Parser.prototype.parseBreakStatement = function () {
3891  	        var node = this.createNode();
3892  	        this.expectKeyword('break');
3893  	        var label = null;
3894  	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
3895  	            var id = this.parseVariableIdentifier();
3896  	            var key = '$' + id.name;
3897  	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
3898  	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
3899  	            }
3900  	            label = id;
3901  	        }
3902  	        this.consumeSemicolon();
3903  	        if (label === null && !this.context.inIteration && !this.context.inSwitch) {
3904  	            this.throwError(messages_1.Messages.IllegalBreak);
3905  	        }
3906  	        return this.finalize(node, new Node.BreakStatement(label));
3907  	    };
3908  	    // https://tc39.github.io/ecma262/#sec-return-statement
3909  	    Parser.prototype.parseReturnStatement = function () {
3910  	        if (!this.context.inFunctionBody) {
3911  	            this.tolerateError(messages_1.Messages.IllegalReturn);
3912  	        }
3913  	        var node = this.createNode();
3914  	        this.expectKeyword('return');
3915  	        var hasArgument = (!this.match(';') && !this.match('}') &&
3916  	            !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
3917  	            this.lookahead.type === 8 /* StringLiteral */ ||
3918  	            this.lookahead.type === 10 /* Template */;
3919  	        var argument = hasArgument ? this.parseExpression() : null;
3920  	        this.consumeSemicolon();
3921  	        return this.finalize(node, new Node.ReturnStatement(argument));
3922  	    };
3923  	    // https://tc39.github.io/ecma262/#sec-with-statement
3924  	    Parser.prototype.parseWithStatement = function () {
3925  	        if (this.context.strict) {
3926  	            this.tolerateError(messages_1.Messages.StrictModeWith);
3927  	        }
3928  	        var node = this.createNode();
3929  	        var body;
3930  	        this.expectKeyword('with');
3931  	        this.expect('(');
3932  	        var object = this.parseExpression();
3933  	        if (!this.match(')') && this.config.tolerant) {
3934  	            this.tolerateUnexpectedToken(this.nextToken());
3935  	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
3936  	        }
3937  	        else {
3938  	            this.expect(')');
3939  	            body = this.parseStatement();
3940  	        }
3941  	        return this.finalize(node, new Node.WithStatement(object, body));
3942  	    };
3943  	    // https://tc39.github.io/ecma262/#sec-switch-statement
3944  	    Parser.prototype.parseSwitchCase = function () {
3945  	        var node = this.createNode();
3946  	        var test;
3947  	        if (this.matchKeyword('default')) {
3948  	            this.nextToken();
3949  	            test = null;
3950  	        }
3951  	        else {
3952  	            this.expectKeyword('case');
3953  	            test = this.parseExpression();
3954  	        }
3955  	        this.expect(':');
3956  	        var consequent = [];
3957  	        while (true) {
3958  	            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
3959  	                break;
3960  	            }
3961  	            consequent.push(this.parseStatementListItem());
3962  	        }
3963  	        return this.finalize(node, new Node.SwitchCase(test, consequent));
3964  	    };
3965  	    Parser.prototype.parseSwitchStatement = function () {
3966  	        var node = this.createNode();
3967  	        this.expectKeyword('switch');
3968  	        this.expect('(');
3969  	        var discriminant = this.parseExpression();
3970  	        this.expect(')');
3971  	        var previousInSwitch = this.context.inSwitch;
3972  	        this.context.inSwitch = true;
3973  	        var cases = [];
3974  	        var defaultFound = false;
3975  	        this.expect('{');
3976  	        while (true) {
3977  	            if (this.match('}')) {
3978  	                break;
3979  	            }
3980  	            var clause = this.parseSwitchCase();
3981  	            if (clause.test === null) {
3982  	                if (defaultFound) {
3983  	                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
3984  	                }
3985  	                defaultFound = true;
3986  	            }
3987  	            cases.push(clause);
3988  	        }
3989  	        this.expect('}');
3990  	        this.context.inSwitch = previousInSwitch;
3991  	        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
3992  	    };
3993  	    // https://tc39.github.io/ecma262/#sec-labelled-statements
3994  	    Parser.prototype.parseLabelledStatement = function () {
3995  	        var node = this.createNode();
3996  	        var expr = this.parseExpression();
3997  	        var statement;
3998  	        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
3999  	            this.nextToken();
4000  	            var id = expr;
4001  	            var key = '$' + id.name;
4002  	            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
4003  	                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
4004  	            }
4005  	            this.context.labelSet[key] = true;
4006  	            var body = void 0;
4007  	            if (this.matchKeyword('class')) {
4008  	                this.tolerateUnexpectedToken(this.lookahead);
4009  	                body = this.parseClassDeclaration();
4010  	            }
4011  	            else if (this.matchKeyword('function')) {
4012  	                var token = this.lookahead;
4013  	                var declaration = this.parseFunctionDeclaration();
4014  	                if (this.context.strict) {
4015  	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
4016  	                }
4017  	                else if (declaration.generator) {
4018  	                    this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
4019  	                }
4020  	                body = declaration;
4021  	            }
4022  	            else {
4023  	                body = this.parseStatement();
4024  	            }
4025  	            delete this.context.labelSet[key];
4026  	            statement = new Node.LabeledStatement(id, body);
4027  	        }
4028  	        else {
4029  	            this.consumeSemicolon();
4030  	            statement = new Node.ExpressionStatement(expr);
4031  	        }
4032  	        return this.finalize(node, statement);
4033  	    };
4034  	    // https://tc39.github.io/ecma262/#sec-throw-statement
4035  	    Parser.prototype.parseThrowStatement = function () {
4036  	        var node = this.createNode();
4037  	        this.expectKeyword('throw');
4038  	        if (this.hasLineTerminator) {
4039  	            this.throwError(messages_1.Messages.NewlineAfterThrow);
4040  	        }
4041  	        var argument = this.parseExpression();
4042  	        this.consumeSemicolon();
4043  	        return this.finalize(node, new Node.ThrowStatement(argument));
4044  	    };
4045  	    // https://tc39.github.io/ecma262/#sec-try-statement
4046  	    Parser.prototype.parseCatchClause = function () {
4047  	        var node = this.createNode();
4048  	        this.expectKeyword('catch');
4049  	        this.expect('(');
4050  	        if (this.match(')')) {
4051  	            this.throwUnexpectedToken(this.lookahead);
4052  	        }
4053  	        var params = [];
4054  	        var param = this.parsePattern(params);
4055  	        var paramMap = {};
4056  	        for (var i = 0; i < params.length; i++) {
4057  	            var key = '$' + params[i].value;
4058  	            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
4059  	                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
4060  	            }
4061  	            paramMap[key] = true;
4062  	        }
4063  	        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
4064  	            if (this.scanner.isRestrictedWord(param.name)) {
4065  	                this.tolerateError(messages_1.Messages.StrictCatchVariable);
4066  	            }
4067  	        }
4068  	        this.expect(')');
4069  	        var body = this.parseBlock();
4070  	        return this.finalize(node, new Node.CatchClause(param, body));
4071  	    };
4072  	    Parser.prototype.parseFinallyClause = function () {
4073  	        this.expectKeyword('finally');
4074  	        return this.parseBlock();
4075  	    };
4076  	    Parser.prototype.parseTryStatement = function () {
4077  	        var node = this.createNode();
4078  	        this.expectKeyword('try');
4079  	        var block = this.parseBlock();
4080  	        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
4081  	        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
4082  	        if (!handler && !finalizer) {
4083  	            this.throwError(messages_1.Messages.NoCatchOrFinally);
4084  	        }
4085  	        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
4086  	    };
4087  	    // https://tc39.github.io/ecma262/#sec-debugger-statement
4088  	    Parser.prototype.parseDebuggerStatement = function () {
4089  	        var node = this.createNode();
4090  	        this.expectKeyword('debugger');
4091  	        this.consumeSemicolon();
4092  	        return this.finalize(node, new Node.DebuggerStatement());
4093  	    };
4094  	    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
4095  	    Parser.prototype.parseStatement = function () {
4096  	        var statement;
4097  	        switch (this.lookahead.type) {
4098  	            case 1 /* BooleanLiteral */:
4099  	            case 5 /* NullLiteral */:
4100  	            case 6 /* NumericLiteral */:
4101  	            case 8 /* StringLiteral */:
4102  	            case 10 /* Template */:
4103  	            case 9 /* RegularExpression */:
4104  	                statement = this.parseExpressionStatement();
4105  	                break;
4106  	            case 7 /* Punctuator */:
4107  	                var value = this.lookahead.value;
4108  	                if (value === '{') {
4109  	                    statement = this.parseBlock();
4110  	                }
4111  	                else if (value === '(') {
4112  	                    statement = this.parseExpressionStatement();
4113  	                }
4114  	                else if (value === ';') {
4115  	                    statement = this.parseEmptyStatement();
4116  	                }
4117  	                else {
4118  	                    statement = this.parseExpressionStatement();
4119  	                }
4120  	                break;
4121  	            case 3 /* Identifier */:
4122  	                statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
4123  	                break;
4124  	            case 4 /* Keyword */:
4125  	                switch (this.lookahead.value) {
4126  	                    case 'break':
4127  	                        statement = this.parseBreakStatement();
4128  	                        break;
4129  	                    case 'continue':
4130  	                        statement = this.parseContinueStatement();
4131  	                        break;
4132  	                    case 'debugger':
4133  	                        statement = this.parseDebuggerStatement();
4134  	                        break;
4135  	                    case 'do':
4136  	                        statement = this.parseDoWhileStatement();
4137  	                        break;
4138  	                    case 'for':
4139  	                        statement = this.parseForStatement();
4140  	                        break;
4141  	                    case 'function':
4142  	                        statement = this.parseFunctionDeclaration();
4143  	                        break;
4144  	                    case 'if':
4145  	                        statement = this.parseIfStatement();
4146  	                        break;
4147  	                    case 'return':
4148  	                        statement = this.parseReturnStatement();
4149  	                        break;
4150  	                    case 'switch':
4151  	                        statement = this.parseSwitchStatement();
4152  	                        break;
4153  	                    case 'throw':
4154  	                        statement = this.parseThrowStatement();
4155  	                        break;
4156  	                    case 'try':
4157  	                        statement = this.parseTryStatement();
4158  	                        break;
4159  	                    case 'var':
4160  	                        statement = this.parseVariableStatement();
4161  	                        break;
4162  	                    case 'while':
4163  	                        statement = this.parseWhileStatement();
4164  	                        break;
4165  	                    case 'with':
4166  	                        statement = this.parseWithStatement();
4167  	                        break;
4168  	                    default:
4169  	                        statement = this.parseExpressionStatement();
4170  	                        break;
4171  	                }
4172  	                break;
4173  	            default:
4174  	                statement = this.throwUnexpectedToken(this.lookahead);
4175  	        }
4176  	        return statement;
4177  	    };
4178  	    // https://tc39.github.io/ecma262/#sec-function-definitions
4179  	    Parser.prototype.parseFunctionSourceElements = function () {
4180  	        var node = this.createNode();
4181  	        this.expect('{');
4182  	        var body = this.parseDirectivePrologues();
4183  	        var previousLabelSet = this.context.labelSet;
4184  	        var previousInIteration = this.context.inIteration;
4185  	        var previousInSwitch = this.context.inSwitch;
4186  	        var previousInFunctionBody = this.context.inFunctionBody;
4187  	        this.context.labelSet = {};
4188  	        this.context.inIteration = false;
4189  	        this.context.inSwitch = false;
4190  	        this.context.inFunctionBody = true;
4191  	        while (this.lookahead.type !== 2 /* EOF */) {
4192  	            if (this.match('}')) {
4193  	                break;
4194  	            }
4195  	            body.push(this.parseStatementListItem());
4196  	        }
4197  	        this.expect('}');
4198  	        this.context.labelSet = previousLabelSet;
4199  	        this.context.inIteration = previousInIteration;
4200  	        this.context.inSwitch = previousInSwitch;
4201  	        this.context.inFunctionBody = previousInFunctionBody;
4202  	        return this.finalize(node, new Node.BlockStatement(body));
4203  	    };
4204  	    Parser.prototype.validateParam = function (options, param, name) {
4205  	        var key = '$' + name;
4206  	        if (this.context.strict) {
4207  	            if (this.scanner.isRestrictedWord(name)) {
4208  	                options.stricted = param;
4209  	                options.message = messages_1.Messages.StrictParamName;
4210  	            }
4211  	            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
4212  	                options.stricted = param;
4213  	                options.message = messages_1.Messages.StrictParamDupe;
4214  	            }
4215  	        }
4216  	        else if (!options.firstRestricted) {
4217  	            if (this.scanner.isRestrictedWord(name)) {
4218  	                options.firstRestricted = param;
4219  	                options.message = messages_1.Messages.StrictParamName;
4220  	            }
4221  	            else if (this.scanner.isStrictModeReservedWord(name)) {
4222  	                options.firstRestricted = param;
4223  	                options.message = messages_1.Messages.StrictReservedWord;
4224  	            }
4225  	            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
4226  	                options.stricted = param;
4227  	                options.message = messages_1.Messages.StrictParamDupe;
4228  	            }
4229  	        }
4230  	        /* istanbul ignore next */
4231  	        if (typeof Object.defineProperty === 'function') {
4232  	            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
4233  	        }
4234  	        else {
4235  	            options.paramSet[key] = true;
4236  	        }
4237  	    };
4238  	    Parser.prototype.parseRestElement = function (params) {
4239  	        var node = this.createNode();
4240  	        this.expect('...');
4241  	        var arg = this.parsePattern(params);
4242  	        if (this.match('=')) {
4243  	            this.throwError(messages_1.Messages.DefaultRestParameter);
4244  	        }
4245  	        if (!this.match(')')) {
4246  	            this.throwError(messages_1.Messages.ParameterAfterRestParameter);
4247  	        }
4248  	        return this.finalize(node, new Node.RestElement(arg));
4249  	    };
4250  	    Parser.prototype.parseFormalParameter = function (options) {
4251  	        var params = [];
4252  	        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
4253  	        for (var i = 0; i < params.length; i++) {
4254  	            this.validateParam(options, params[i], params[i].value);
4255  	        }
4256  	        options.simple = options.simple && (param instanceof Node.Identifier);
4257  	        options.params.push(param);
4258  	    };
4259  	    Parser.prototype.parseFormalParameters = function (firstRestricted) {
4260  	        var options;
4261  	        options = {
4262  	            simple: true,
4263  	            params: [],
4264  	            firstRestricted: firstRestricted
4265  	        };
4266  	        this.expect('(');
4267  	        if (!this.match(')')) {
4268  	            options.paramSet = {};
4269  	            while (this.lookahead.type !== 2 /* EOF */) {
4270  	                this.parseFormalParameter(options);
4271  	                if (this.match(')')) {
4272  	                    break;
4273  	                }
4274  	                this.expect(',');
4275  	                if (this.match(')')) {
4276  	                    break;
4277  	                }
4278  	            }
4279  	        }
4280  	        this.expect(')');
4281  	        return {
4282  	            simple: options.simple,
4283  	            params: options.params,
4284  	            stricted: options.stricted,
4285  	            firstRestricted: options.firstRestricted,
4286  	            message: options.message
4287  	        };
4288  	    };
4289  	    Parser.prototype.matchAsyncFunction = function () {
4290  	        var match = this.matchContextualKeyword('async');
4291  	        if (match) {
4292  	            var state = this.scanner.saveState();
4293  	            this.scanner.scanComments();
4294  	            var next = this.scanner.lex();
4295  	            this.scanner.restoreState(state);
4296  	            match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
4297  	        }
4298  	        return match;
4299  	    };
4300  	    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
4301  	        var node = this.createNode();
4302  	        var isAsync = this.matchContextualKeyword('async');
4303  	        if (isAsync) {
4304  	            this.nextToken();
4305  	        }
4306  	        this.expectKeyword('function');
4307  	        var isGenerator = isAsync ? false : this.match('*');
4308  	        if (isGenerator) {
4309  	            this.nextToken();
4310  	        }
4311  	        var message;
4312  	        var id = null;
4313  	        var firstRestricted = null;
4314  	        if (!identifierIsOptional || !this.match('(')) {
4315  	            var token = this.lookahead;
4316  	            id = this.parseVariableIdentifier();
4317  	            if (this.context.strict) {
4318  	                if (this.scanner.isRestrictedWord(token.value)) {
4319  	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
4320  	                }
4321  	            }
4322  	            else {
4323  	                if (this.scanner.isRestrictedWord(token.value)) {
4324  	                    firstRestricted = token;
4325  	                    message = messages_1.Messages.StrictFunctionName;
4326  	                }
4327  	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
4328  	                    firstRestricted = token;
4329  	                    message = messages_1.Messages.StrictReservedWord;
4330  	                }
4331  	            }
4332  	        }
4333  	        var previousAllowAwait = this.context.await;
4334  	        var previousAllowYield = this.context.allowYield;
4335  	        this.context.await = isAsync;
4336  	        this.context.allowYield = !isGenerator;
4337  	        var formalParameters = this.parseFormalParameters(firstRestricted);
4338  	        var params = formalParameters.params;
4339  	        var stricted = formalParameters.stricted;
4340  	        firstRestricted = formalParameters.firstRestricted;
4341  	        if (formalParameters.message) {
4342  	            message = formalParameters.message;
4343  	        }
4344  	        var previousStrict = this.context.strict;
4345  	        var previousAllowStrictDirective = this.context.allowStrictDirective;
4346  	        this.context.allowStrictDirective = formalParameters.simple;
4347  	        var body = this.parseFunctionSourceElements();
4348  	        if (this.context.strict && firstRestricted) {
4349  	            this.throwUnexpectedToken(firstRestricted, message);
4350  	        }
4351  	        if (this.context.strict && stricted) {
4352  	            this.tolerateUnexpectedToken(stricted, message);
4353  	        }
4354  	        this.context.strict = previousStrict;
4355  	        this.context.allowStrictDirective = previousAllowStrictDirective;
4356  	        this.context.await = previousAllowAwait;
4357  	        this.context.allowYield = previousAllowYield;
4358  	        return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
4359  	            this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
4360  	    };
4361  	    Parser.prototype.parseFunctionExpression = function () {
4362  	        var node = this.createNode();
4363  	        var isAsync = this.matchContextualKeyword('async');
4364  	        if (isAsync) {
4365  	            this.nextToken();
4366  	        }
4367  	        this.expectKeyword('function');
4368  	        var isGenerator = isAsync ? false : this.match('*');
4369  	        if (isGenerator) {
4370  	            this.nextToken();
4371  	        }
4372  	        var message;
4373  	        var id = null;
4374  	        var firstRestricted;
4375  	        var previousAllowAwait = this.context.await;
4376  	        var previousAllowYield = this.context.allowYield;
4377  	        this.context.await = isAsync;
4378  	        this.context.allowYield = !isGenerator;
4379  	        if (!this.match('(')) {
4380  	            var token = this.lookahead;
4381  	            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
4382  	            if (this.context.strict) {
4383  	                if (this.scanner.isRestrictedWord(token.value)) {
4384  	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
4385  	                }
4386  	            }
4387  	            else {
4388  	                if (this.scanner.isRestrictedWord(token.value)) {
4389  	                    firstRestricted = token;
4390  	                    message = messages_1.Messages.StrictFunctionName;
4391  	                }
4392  	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
4393  	                    firstRestricted = token;
4394  	                    message = messages_1.Messages.StrictReservedWord;
4395  	                }
4396  	            }
4397  	        }
4398  	        var formalParameters = this.parseFormalParameters(firstRestricted);
4399  	        var params = formalParameters.params;
4400  	        var stricted = formalParameters.stricted;
4401  	        firstRestricted = formalParameters.firstRestricted;
4402  	        if (formalParameters.message) {
4403  	            message = formalParameters.message;
4404  	        }
4405  	        var previousStrict = this.context.strict;
4406  	        var previousAllowStrictDirective = this.context.allowStrictDirective;
4407  	        this.context.allowStrictDirective = formalParameters.simple;
4408  	        var body = this.parseFunctionSourceElements();
4409  	        if (this.context.strict && firstRestricted) {
4410  	            this.throwUnexpectedToken(firstRestricted, message);
4411  	        }
4412  	        if (this.context.strict && stricted) {
4413  	            this.tolerateUnexpectedToken(stricted, message);
4414  	        }
4415  	        this.context.strict = previousStrict;
4416  	        this.context.allowStrictDirective = previousAllowStrictDirective;
4417  	        this.context.await = previousAllowAwait;
4418  	        this.context.allowYield = previousAllowYield;
4419  	        return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
4420  	            this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
4421  	    };
4422  	    // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
4423  	    Parser.prototype.parseDirective = function () {
4424  	        var token = this.lookahead;
4425  	        var node = this.createNode();
4426  	        var expr = this.parseExpression();
4427  	        var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
4428  	        this.consumeSemicolon();
4429  	        return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
4430  	    };
4431  	    Parser.prototype.parseDirectivePrologues = function () {
4432  	        var firstRestricted = null;
4433  	        var body = [];
4434  	        while (true) {
4435  	            var token = this.lookahead;
4436  	            if (token.type !== 8 /* StringLiteral */) {
4437  	                break;
4438  	            }
4439  	            var statement = this.parseDirective();
4440  	            body.push(statement);
4441  	            var directive = statement.directive;
4442  	            if (typeof directive !== 'string') {
4443  	                break;
4444  	            }
4445  	            if (directive === 'use strict') {
4446  	                this.context.strict = true;
4447  	                if (firstRestricted) {
4448  	                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
4449  	                }
4450  	                if (!this.context.allowStrictDirective) {
4451  	                    this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
4452  	                }
4453  	            }
4454  	            else {
4455  	                if (!firstRestricted && token.octal) {
4456  	                    firstRestricted = token;
4457  	                }
4458  	            }
4459  	        }
4460  	        return body;
4461  	    };
4462  	    // https://tc39.github.io/ecma262/#sec-method-definitions
4463  	    Parser.prototype.qualifiedPropertyName = function (token) {
4464  	        switch (token.type) {
4465  	            case 3 /* Identifier */:
4466  	            case 8 /* StringLiteral */:
4467  	            case 1 /* BooleanLiteral */:
4468  	            case 5 /* NullLiteral */:
4469  	            case 6 /* NumericLiteral */:
4470  	            case 4 /* Keyword */:
4471  	                return true;
4472  	            case 7 /* Punctuator */:
4473  	                return token.value === '[';
4474  	            default:
4475  	                break;
4476  	        }
4477  	        return false;
4478  	    };
4479  	    Parser.prototype.parseGetterMethod = function () {
4480  	        var node = this.createNode();
4481  	        var isGenerator = false;
4482  	        var previousAllowYield = this.context.allowYield;
4483  	        this.context.allowYield = !isGenerator;
4484  	        var formalParameters = this.parseFormalParameters();
4485  	        if (formalParameters.params.length > 0) {
4486  	            this.tolerateError(messages_1.Messages.BadGetterArity);
4487  	        }
4488  	        var method = this.parsePropertyMethod(formalParameters);
4489  	        this.context.allowYield = previousAllowYield;
4490  	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
4491  	    };
4492  	    Parser.prototype.parseSetterMethod = function () {
4493  	        var node = this.createNode();
4494  	        var isGenerator = false;
4495  	        var previousAllowYield = this.context.allowYield;
4496  	        this.context.allowYield = !isGenerator;
4497  	        var formalParameters = this.parseFormalParameters();
4498  	        if (formalParameters.params.length !== 1) {
4499  	            this.tolerateError(messages_1.Messages.BadSetterArity);
4500  	        }
4501  	        else if (formalParameters.params[0] instanceof Node.RestElement) {
4502  	            this.tolerateError(messages_1.Messages.BadSetterRestParameter);
4503  	        }
4504  	        var method = this.parsePropertyMethod(formalParameters);
4505  	        this.context.allowYield = previousAllowYield;
4506  	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
4507  	    };
4508  	    Parser.prototype.parseGeneratorMethod = function () {
4509  	        var node = this.createNode();
4510  	        var isGenerator = true;
4511  	        var previousAllowYield = this.context.allowYield;
4512  	        this.context.allowYield = true;
4513  	        var params = this.parseFormalParameters();
4514  	        this.context.allowYield = false;
4515  	        var method = this.parsePropertyMethod(params);
4516  	        this.context.allowYield = previousAllowYield;
4517  	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
4518  	    };
4519  	    // https://tc39.github.io/ecma262/#sec-generator-function-definitions
4520  	    Parser.prototype.isStartOfExpression = function () {
4521  	        var start = true;
4522  	        var value = this.lookahead.value;
4523  	        switch (this.lookahead.type) {
4524  	            case 7 /* Punctuator */:
4525  	                start = (value === '[') || (value === '(') || (value === '{') ||
4526  	                    (value === '+') || (value === '-') ||
4527  	                    (value === '!') || (value === '~') ||
4528  	                    (value === '++') || (value === '--') ||
4529  	                    (value === '/') || (value === '/='); // regular expression literal
4530  	                break;
4531  	            case 4 /* Keyword */:
4532  	                start = (value === 'class') || (value === 'delete') ||
4533  	                    (value === 'function') || (value === 'let') || (value === 'new') ||
4534  	                    (value === 'super') || (value === 'this') || (value === 'typeof') ||
4535  	                    (value === 'void') || (value === 'yield');
4536  	                break;
4537  	            default:
4538  	                break;
4539  	        }
4540  	        return start;
4541  	    };
4542  	    Parser.prototype.parseYieldExpression = function () {
4543  	        var node = this.createNode();
4544  	        this.expectKeyword('yield');
4545  	        var argument = null;
4546  	        var delegate = false;
4547  	        if (!this.hasLineTerminator) {
4548  	            var previousAllowYield = this.context.allowYield;
4549  	            this.context.allowYield = false;
4550  	            delegate = this.match('*');
4551  	            if (delegate) {
4552  	                this.nextToken();
4553  	                argument = this.parseAssignmentExpression();
4554  	            }
4555  	            else if (this.isStartOfExpression()) {
4556  	                argument = this.parseAssignmentExpression();
4557  	            }
4558  	            this.context.allowYield = previousAllowYield;
4559  	        }
4560  	        return this.finalize(node, new Node.YieldExpression(argument, delegate));
4561  	    };
4562  	    // https://tc39.github.io/ecma262/#sec-class-definitions
4563  	    Parser.prototype.parseClassElement = function (hasConstructor) {
4564  	        var token = this.lookahead;
4565  	        var node = this.createNode();
4566  	        var kind = '';
4567  	        var key = null;
4568  	        var value = null;
4569  	        var computed = false;
4570  	        var method = false;
4571  	        var isStatic = false;
4572  	        var isAsync = false;
4573  	        if (this.match('*')) {
4574  	            this.nextToken();
4575  	        }
4576  	        else {
4577  	            computed = this.match('[');
4578  	            key = this.parseObjectPropertyKey();
4579  	            var id = key;
4580  	            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
4581  	                token = this.lookahead;
4582  	                isStatic = true;
4583  	                computed = this.match('[');
4584  	                if (this.match('*')) {
4585  	                    this.nextToken();
4586  	                }
4587  	                else {
4588  	                    key = this.parseObjectPropertyKey();
4589  	                }
4590  	            }
4591  	            if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
4592  	                var punctuator = this.lookahead.value;
4593  	                if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
4594  	                    isAsync = true;
4595  	                    token = this.lookahead;
4596  	                    key = this.parseObjectPropertyKey();
4597  	                    if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
4598  	                        this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
4599  	                    }
4600  	                }
4601  	            }
4602  	        }
4603  	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
4604  	        if (token.type === 3 /* Identifier */) {
4605  	            if (token.value === 'get' && lookaheadPropertyKey) {
4606  	                kind = 'get';
4607  	                computed = this.match('[');
4608  	                key = this.parseObjectPropertyKey();
4609  	                this.context.allowYield = false;
4610  	                value = this.parseGetterMethod();
4611  	            }
4612  	            else if (token.value === 'set' && lookaheadPropertyKey) {
4613  	                kind = 'set';
4614  	                computed = this.match('[');
4615  	                key = this.parseObjectPropertyKey();
4616  	                value = this.parseSetterMethod();
4617  	            }
4618  	        }
4619  	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
4620  	            kind = 'init';
4621  	            computed = this.match('[');
4622  	            key = this.parseObjectPropertyKey();
4623  	            value = this.parseGeneratorMethod();
4624  	            method = true;
4625  	        }
4626  	        if (!kind && key && this.match('(')) {
4627  	            kind = 'init';
4628  	            value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
4629  	            method = true;
4630  	        }
4631  	        if (!kind) {
4632  	            this.throwUnexpectedToken(this.lookahead);
4633  	        }
4634  	        if (kind === 'init') {
4635  	            kind = 'method';
4636  	        }
4637  	        if (!computed) {
4638  	            if (isStatic && this.isPropertyKey(key, 'prototype')) {
4639  	                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
4640  	            }
4641  	            if (!isStatic && this.isPropertyKey(key, 'constructor')) {
4642  	                if (kind !== 'method' || !method || (value && value.generator)) {
4643  	                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
4644  	                }
4645  	                if (hasConstructor.value) {
4646  	                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
4647  	                }
4648  	                else {
4649  	                    hasConstructor.value = true;
4650  	                }
4651  	                kind = 'constructor';
4652  	            }
4653  	        }
4654  	        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
4655  	    };
4656  	    Parser.prototype.parseClassElementList = function () {
4657  	        var body = [];
4658  	        var hasConstructor = { value: false };
4659  	        this.expect('{');
4660  	        while (!this.match('}')) {
4661  	            if (this.match(';')) {
4662  	                this.nextToken();
4663  	            }
4664  	            else {
4665  	                body.push(this.parseClassElement(hasConstructor));
4666  	            }
4667  	        }
4668  	        this.expect('}');
4669  	        return body;
4670  	    };
4671  	    Parser.prototype.parseClassBody = function () {
4672  	        var node = this.createNode();
4673  	        var elementList = this.parseClassElementList();
4674  	        return this.finalize(node, new Node.ClassBody(elementList));
4675  	    };
4676  	    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
4677  	        var node = this.createNode();
4678  	        var previousStrict = this.context.strict;
4679  	        this.context.strict = true;
4680  	        this.expectKeyword('class');
4681  	        var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
4682  	        var superClass = null;
4683  	        if (this.matchKeyword('extends')) {
4684  	            this.nextToken();
4685  	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
4686  	        }
4687  	        var classBody = this.parseClassBody();
4688  	        this.context.strict = previousStrict;
4689  	        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
4690  	    };
4691  	    Parser.prototype.parseClassExpression = function () {
4692  	        var node = this.createNode();
4693  	        var previousStrict = this.context.strict;
4694  	        this.context.strict = true;
4695  	        this.expectKeyword('class');
4696  	        var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
4697  	        var superClass = null;
4698  	        if (this.matchKeyword('extends')) {
4699  	            this.nextToken();
4700  	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
4701  	        }
4702  	        var classBody = this.parseClassBody();
4703  	        this.context.strict = previousStrict;
4704  	        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
4705  	    };
4706  	    // https://tc39.github.io/ecma262/#sec-scripts
4707  	    // https://tc39.github.io/ecma262/#sec-modules
4708  	    Parser.prototype.parseModule = function () {
4709  	        this.context.strict = true;
4710  	        this.context.isModule = true;
4711  	        this.scanner.isModule = true;
4712  	        var node = this.createNode();
4713  	        var body = this.parseDirectivePrologues();
4714  	        while (this.lookahead.type !== 2 /* EOF */) {
4715  	            body.push(this.parseStatementListItem());
4716  	        }
4717  	        return this.finalize(node, new Node.Module(body));
4718  	    };
4719  	    Parser.prototype.parseScript = function () {
4720  	        var node = this.createNode();
4721  	        var body = this.parseDirectivePrologues();
4722  	        while (this.lookahead.type !== 2 /* EOF */) {
4723  	            body.push(this.parseStatementListItem());
4724  	        }
4725  	        return this.finalize(node, new Node.Script(body));
4726  	    };
4727  	    // https://tc39.github.io/ecma262/#sec-imports
4728  	    Parser.prototype.parseModuleSpecifier = function () {
4729  	        var node = this.createNode();
4730  	        if (this.lookahead.type !== 8 /* StringLiteral */) {
4731  	            this.throwError(messages_1.Messages.InvalidModuleSpecifier);
4732  	        }
4733  	        var token = this.nextToken();
4734  	        var raw = this.getTokenRaw(token);
4735  	        return this.finalize(node, new Node.Literal(token.value, raw));
4736  	    };
4737  	    // import {<foo as bar>} ...;
4738  	    Parser.prototype.parseImportSpecifier = function () {
4739  	        var node = this.createNode();
4740  	        var imported;
4741  	        var local;
4742  	        if (this.lookahead.type === 3 /* Identifier */) {
4743  	            imported = this.parseVariableIdentifier();
4744  	            local = imported;
4745  	            if (this.matchContextualKeyword('as')) {
4746  	                this.nextToken();
4747  	                local = this.parseVariableIdentifier();
4748  	            }
4749  	        }
4750  	        else {
4751  	            imported = this.parseIdentifierName();
4752  	            local = imported;
4753  	            if (this.matchContextualKeyword('as')) {
4754  	                this.nextToken();
4755  	                local = this.parseVariableIdentifier();
4756  	            }
4757  	            else {
4758  	                this.throwUnexpectedToken(this.nextToken());
4759  	            }
4760  	        }
4761  	        return this.finalize(node, new Node.ImportSpecifier(local, imported));
4762  	    };
4763  	    // {foo, bar as bas}
4764  	    Parser.prototype.parseNamedImports = function () {
4765  	        this.expect('{');
4766  	        var specifiers = [];
4767  	        while (!this.match('}')) {
4768  	            specifiers.push(this.parseImportSpecifier());
4769  	            if (!this.match('}')) {
4770  	                this.expect(',');
4771  	            }
4772  	        }
4773  	        this.expect('}');
4774  	        return specifiers;
4775  	    };
4776  	    // import <foo> ...;
4777  	    Parser.prototype.parseImportDefaultSpecifier = function () {
4778  	        var node = this.createNode();
4779  	        var local = this.parseIdentifierName();
4780  	        return this.finalize(node, new Node.ImportDefaultSpecifier(local));
4781  	    };
4782  	    // import <* as foo> ...;
4783  	    Parser.prototype.parseImportNamespaceSpecifier = function () {
4784  	        var node = this.createNode();
4785  	        this.expect('*');
4786  	        if (!this.matchContextualKeyword('as')) {
4787  	            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
4788  	        }
4789  	        this.nextToken();
4790  	        var local = this.parseIdentifierName();
4791  	        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
4792  	    };
4793  	    Parser.prototype.parseImportDeclaration = function () {
4794  	        if (this.context.inFunctionBody) {
4795  	            this.throwError(messages_1.Messages.IllegalImportDeclaration);
4796  	        }
4797  	        var node = this.createNode();
4798  	        this.expectKeyword('import');
4799  	        var src;
4800  	        var specifiers = [];
4801  	        if (this.lookahead.type === 8 /* StringLiteral */) {
4802  	            // import 'foo';
4803  	            src = this.parseModuleSpecifier();
4804  	        }
4805  	        else {
4806  	            if (this.match('{')) {
4807  	                // import {bar}
4808  	                specifiers = specifiers.concat(this.parseNamedImports());
4809  	            }
4810  	            else if (this.match('*')) {
4811  	                // import * as foo
4812  	                specifiers.push(this.parseImportNamespaceSpecifier());
4813  	            }
4814  	            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
4815  	                // import foo
4816  	                specifiers.push(this.parseImportDefaultSpecifier());
4817  	                if (this.match(',')) {
4818  	                    this.nextToken();
4819  	                    if (this.match('*')) {
4820  	                        // import foo, * as foo
4821  	                        specifiers.push(this.parseImportNamespaceSpecifier());
4822  	                    }
4823  	                    else if (this.match('{')) {
4824  	                        // import foo, {bar}
4825  	                        specifiers = specifiers.concat(this.parseNamedImports());
4826  	                    }
4827  	                    else {
4828  	                        this.throwUnexpectedToken(this.lookahead);
4829  	                    }
4830  	                }
4831  	            }
4832  	            else {
4833  	                this.throwUnexpectedToken(this.nextToken());
4834  	            }
4835  	            if (!this.matchContextualKeyword('from')) {
4836  	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
4837  	                this.throwError(message, this.lookahead.value);
4838  	            }
4839  	            this.nextToken();
4840  	            src = this.parseModuleSpecifier();
4841  	        }
4842  	        this.consumeSemicolon();
4843  	        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
4844  	    };
4845  	    // https://tc39.github.io/ecma262/#sec-exports
4846  	    Parser.prototype.parseExportSpecifier = function () {
4847  	        var node = this.createNode();
4848  	        var local = this.parseIdentifierName();
4849  	        var exported = local;
4850  	        if (this.matchContextualKeyword('as')) {
4851  	            this.nextToken();
4852  	            exported = this.parseIdentifierName();
4853  	        }
4854  	        return this.finalize(node, new Node.ExportSpecifier(local, exported));
4855  	    };
4856  	    Parser.prototype.parseExportDeclaration = function () {
4857  	        if (this.context.inFunctionBody) {
4858  	            this.throwError(messages_1.Messages.IllegalExportDeclaration);
4859  	        }
4860  	        var node = this.createNode();
4861  	        this.expectKeyword('export');
4862  	        var exportDeclaration;
4863  	        if (this.matchKeyword('default')) {
4864  	            // export default ...
4865  	            this.nextToken();
4866  	            if (this.matchKeyword('function')) {
4867  	                // export default function foo () {}
4868  	                // export default function () {}
4869  	                var declaration = this.parseFunctionDeclaration(true);
4870  	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
4871  	            }
4872  	            else if (this.matchKeyword('class')) {
4873  	                // export default class foo {}
4874  	                var declaration = this.parseClassDeclaration(true);
4875  	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
4876  	            }
4877  	            else if (this.matchContextualKeyword('async')) {
4878  	                // export default async function f () {}
4879  	                // export default async function () {}
4880  	                // export default async x => x
4881  	                var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
4882  	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
4883  	            }
4884  	            else {
4885  	                if (this.matchContextualKeyword('from')) {
4886  	                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
4887  	                }
4888  	                // export default {};
4889  	                // export default [];
4890  	                // export default (1 + 2);
4891  	                var declaration = this.match('{') ? this.parseObjectInitializer() :
4892  	                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
4893  	                this.consumeSemicolon();
4894  	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
4895  	            }
4896  	        }
4897  	        else if (this.match('*')) {
4898  	            // export * from 'foo';
4899  	            this.nextToken();
4900  	            if (!this.matchContextualKeyword('from')) {
4901  	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
4902  	                this.throwError(message, this.lookahead.value);
4903  	            }
4904  	            this.nextToken();
4905  	            var src = this.parseModuleSpecifier();
4906  	            this.consumeSemicolon();
4907  	            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
4908  	        }
4909  	        else if (this.lookahead.type === 4 /* Keyword */) {
4910  	            // export var f = 1;
4911  	            var declaration = void 0;
4912  	            switch (this.lookahead.value) {
4913  	                case 'let':
4914  	                case 'const':
4915  	                    declaration = this.parseLexicalDeclaration({ inFor: false });
4916  	                    break;
4917  	                case 'var':
4918  	                case 'class':
4919  	                case 'function':
4920  	                    declaration = this.parseStatementListItem();
4921  	                    break;
4922  	                default:
4923  	                    this.throwUnexpectedToken(this.lookahead);
4924  	            }
4925  	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
4926  	        }
4927  	        else if (this.matchAsyncFunction()) {
4928  	            var declaration = this.parseFunctionDeclaration();
4929  	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
4930  	        }
4931  	        else {
4932  	            var specifiers = [];
4933  	            var source = null;
4934  	            var isExportFromIdentifier = false;
4935  	            this.expect('{');
4936  	            while (!this.match('}')) {
4937  	                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
4938  	                specifiers.push(this.parseExportSpecifier());
4939  	                if (!this.match('}')) {
4940  	                    this.expect(',');
4941  	                }
4942  	            }
4943  	            this.expect('}');
4944  	            if (this.matchContextualKeyword('from')) {
4945  	                // export {default} from 'foo';
4946  	                // export {foo} from 'foo';
4947  	                this.nextToken();
4948  	                source = this.parseModuleSpecifier();
4949  	                this.consumeSemicolon();
4950  	            }
4951  	            else if (isExportFromIdentifier) {
4952  	                // export {default}; // missing fromClause
4953  	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
4954  	                this.throwError(message, this.lookahead.value);
4955  	            }
4956  	            else {
4957  	                // export {foo};
4958  	                this.consumeSemicolon();
4959  	            }
4960  	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
4961  	        }
4962  	        return exportDeclaration;
4963  	    };
4964  	    return Parser;
4965  	}());
4966  	exports.Parser = Parser;
4967  
4968  
4969  /***/ },
4970  /* 9 */
4971  /***/ function(module, exports) {
4972  
4973  	"use strict";
4974  	// Ensure the condition is true, otherwise throw an error.
4975  	// This is only to have a better contract semantic, i.e. another safety net
4976  	// to catch a logic error. The condition shall be fulfilled in normal case.
4977  	// Do NOT use this to enforce a certain condition on any user input.
4978  	Object.defineProperty(exports, "__esModule", { value: true });
4979  	function assert(condition, message) {
4980  	    /* istanbul ignore if */
4981  	    if (!condition) {
4982  	        throw new Error('ASSERT: ' + message);
4983  	    }
4984  	}
4985  	exports.assert = assert;
4986  
4987  
4988  /***/ },
4989  /* 10 */
4990  /***/ function(module, exports) {
4991  
4992  	"use strict";
4993  	/* tslint:disable:max-classes-per-file */
4994  	Object.defineProperty(exports, "__esModule", { value: true });
4995  	var ErrorHandler = (function () {
4996  	    function ErrorHandler() {
4997  	        this.errors = [];
4998  	        this.tolerant = false;
4999  	    }
5000  	    ErrorHandler.prototype.recordError = function (error) {
5001  	        this.errors.push(error);
5002  	    };
5003  	    ErrorHandler.prototype.tolerate = function (error) {
5004  	        if (this.tolerant) {
5005  	            this.recordError(error);
5006  	        }
5007  	        else {
5008  	            throw error;
5009  	        }
5010  	    };
5011  	    ErrorHandler.prototype.constructError = function (msg, column) {
5012  	        var error = new Error(msg);
5013  	        try {
5014  	            throw error;
5015  	        }
5016  	        catch (base) {
5017  	            /* istanbul ignore else */
5018  	            if (Object.create && Object.defineProperty) {
5019  	                error = Object.create(base);
5020  	                Object.defineProperty(error, 'column', { value: column });
5021  	            }
5022  	        }
5023  	        /* istanbul ignore next */
5024  	        return error;
5025  	    };
5026  	    ErrorHandler.prototype.createError = function (index, line, col, description) {
5027  	        var msg = 'Line ' + line + ': ' + description;
5028  	        var error = this.constructError(msg, col);
5029  	        error.index = index;
5030  	        error.lineNumber = line;
5031  	        error.description = description;
5032  	        return error;
5033  	    };
5034  	    ErrorHandler.prototype.throwError = function (index, line, col, description) {
5035  	        throw this.createError(index, line, col, description);
5036  	    };
5037  	    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
5038  	        var error = this.createError(index, line, col, description);
5039  	        if (this.tolerant) {
5040  	            this.recordError(error);
5041  	        }
5042  	        else {
5043  	            throw error;
5044  	        }
5045  	    };
5046  	    return ErrorHandler;
5047  	}());
5048  	exports.ErrorHandler = ErrorHandler;
5049  
5050  
5051  /***/ },
5052  /* 11 */
5053  /***/ function(module, exports) {
5054  
5055  	"use strict";
5056  	Object.defineProperty(exports, "__esModule", { value: true });
5057  	// Error messages should be identical to V8.
5058  	exports.Messages = {
5059  	    BadGetterArity: 'Getter must not have any formal parameters',
5060  	    BadSetterArity: 'Setter must have exactly one formal parameter',
5061  	    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
5062  	    ConstructorIsAsync: 'Class constructor may not be an async method',
5063  	    ConstructorSpecialMethod: 'Class constructor may not be an accessor',
5064  	    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
5065  	    DefaultRestParameter: 'Unexpected token =',
5066  	    DuplicateBinding: 'Duplicate binding %0',
5067  	    DuplicateConstructor: 'A class may only have one constructor',
5068  	    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
5069  	    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
5070  	    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
5071  	    IllegalBreak: 'Illegal break statement',
5072  	    IllegalContinue: 'Illegal continue statement',
5073  	    IllegalExportDeclaration: 'Unexpected token',
5074  	    IllegalImportDeclaration: 'Unexpected token',
5075  	    IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
5076  	    IllegalReturn: 'Illegal return statement',
5077  	    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
5078  	    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
5079  	    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
5080  	    InvalidLHSInForIn: 'Invalid left-hand side in for-in',
5081  	    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
5082  	    InvalidModuleSpecifier: 'Unexpected token',
5083  	    InvalidRegExp: 'Invalid regular expression',
5084  	    LetInLexicalBinding: 'let is disallowed as a lexically bound name',
5085  	    MissingFromClause: 'Unexpected token',
5086  	    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
5087  	    NewlineAfterThrow: 'Illegal newline after throw',
5088  	    NoAsAfterImportNamespace: 'Unexpected token',
5089  	    NoCatchOrFinally: 'Missing catch or finally after try',
5090  	    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
5091  	    Redeclaration: '%0 \'%1\' has already been declared',
5092  	    StaticPrototype: 'Classes may not have static property named prototype',
5093  	    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
5094  	    StrictDelete: 'Delete of an unqualified identifier in strict mode.',
5095  	    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
5096  	    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
5097  	    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
5098  	    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
5099  	    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
5100  	    StrictModeWith: 'Strict mode code may not include a with statement',
5101  	    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
5102  	    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
5103  	    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
5104  	    StrictReservedWord: 'Use of future reserved word in strict mode',
5105  	    StrictVarName: 'Variable name may not be eval or arguments in strict mode',
5106  	    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
5107  	    UnexpectedEOS: 'Unexpected end of input',
5108  	    UnexpectedIdentifier: 'Unexpected identifier',
5109  	    UnexpectedNumber: 'Unexpected number',
5110  	    UnexpectedReserved: 'Unexpected reserved word',
5111  	    UnexpectedString: 'Unexpected string',
5112  	    UnexpectedTemplate: 'Unexpected quasi %0',
5113  	    UnexpectedToken: 'Unexpected token %0',
5114  	    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
5115  	    UnknownLabel: 'Undefined label \'%0\'',
5116  	    UnterminatedRegExp: 'Invalid regular expression: missing /'
5117  	};
5118  
5119  
5120  /***/ },
5121  /* 12 */
5122  /***/ function(module, exports, __webpack_require__) {
5123  
5124  	"use strict";
5125  	Object.defineProperty(exports, "__esModule", { value: true });
5126  	var assert_1 = __webpack_require__(9);
5127  	var character_1 = __webpack_require__(4);
5128  	var messages_1 = __webpack_require__(11);
5129  	function hexValue(ch) {
5130  	    return '0123456789abcdef'.indexOf(ch.toLowerCase());
5131  	}
5132  	function octalValue(ch) {
5133  	    return '01234567'.indexOf(ch);
5134  	}
5135  	var Scanner = (function () {
5136  	    function Scanner(code, handler) {
5137  	        this.source = code;
5138  	        this.errorHandler = handler;
5139  	        this.trackComment = false;
5140  	        this.isModule = false;
5141  	        this.length = code.length;
5142  	        this.index = 0;
5143  	        this.lineNumber = (code.length > 0) ? 1 : 0;
5144  	        this.lineStart = 0;
5145  	        this.curlyStack = [];
5146  	    }
5147  	    Scanner.prototype.saveState = function () {
5148  	        return {
5149  	            index: this.index,
5150  	            lineNumber: this.lineNumber,
5151  	            lineStart: this.lineStart
5152  	        };
5153  	    };
5154  	    Scanner.prototype.restoreState = function (state) {
5155  	        this.index = state.index;
5156  	        this.lineNumber = state.lineNumber;
5157  	        this.lineStart = state.lineStart;
5158  	    };
5159  	    Scanner.prototype.eof = function () {
5160  	        return this.index >= this.length;
5161  	    };
5162  	    Scanner.prototype.throwUnexpectedToken = function (message) {
5163  	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
5164  	        return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
5165  	    };
5166  	    Scanner.prototype.tolerateUnexpectedToken = function (message) {
5167  	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
5168  	        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
5169  	    };
5170  	    // https://tc39.github.io/ecma262/#sec-comments
5171  	    Scanner.prototype.skipSingleLineComment = function (offset) {
5172  	        var comments = [];
5173  	        var start, loc;
5174  	        if (this.trackComment) {
5175  	            comments = [];
5176  	            start = this.index - offset;
5177  	            loc = {
5178  	                start: {
5179  	                    line: this.lineNumber,
5180  	                    column: this.index - this.lineStart - offset
5181  	                },
5182  	                end: {}
5183  	            };
5184  	        }
5185  	        while (!this.eof()) {
5186  	            var ch = this.source.charCodeAt(this.index);
5187  	            ++this.index;
5188  	            if (character_1.Character.isLineTerminator(ch)) {
5189  	                if (this.trackComment) {
5190  	                    loc.end = {
5191  	                        line: this.lineNumber,
5192  	                        column: this.index - this.lineStart - 1
5193  	                    };
5194  	                    var entry = {
5195  	                        multiLine: false,
5196  	                        slice: [start + offset, this.index - 1],
5197  	                        range: [start, this.index - 1],
5198  	                        loc: loc
5199  	                    };
5200  	                    comments.push(entry);
5201  	                }
5202  	                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
5203  	                    ++this.index;
5204  	                }
5205  	                ++this.lineNumber;
5206  	                this.lineStart = this.index;
5207  	                return comments;
5208  	            }
5209  	        }
5210  	        if (this.trackComment) {
5211  	            loc.end = {
5212  	                line: this.lineNumber,
5213  	                column: this.index - this.lineStart
5214  	            };
5215  	            var entry = {
5216  	                multiLine: false,
5217  	                slice: [start + offset, this.index],
5218  	                range: [start, this.index],
5219  	                loc: loc
5220  	            };
5221  	            comments.push(entry);
5222  	        }
5223  	        return comments;
5224  	    };
5225  	    Scanner.prototype.skipMultiLineComment = function () {
5226  	        var comments = [];
5227  	        var start, loc;
5228  	        if (this.trackComment) {
5229  	            comments = [];
5230  	            start = this.index - 2;
5231  	            loc = {
5232  	                start: {
5233  	                    line: this.lineNumber,
5234  	                    column: this.index - this.lineStart - 2
5235  	                },
5236  	                end: {}
5237  	            };
5238  	        }
5239  	        while (!this.eof()) {
5240  	            var ch = this.source.charCodeAt(this.index);
5241  	            if (character_1.Character.isLineTerminator(ch)) {
5242  	                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
5243  	                    ++this.index;
5244  	                }
5245  	                ++this.lineNumber;
5246  	                ++this.index;
5247  	                this.lineStart = this.index;
5248  	            }
5249  	            else if (ch === 0x2A) {
5250  	                // Block comment ends with '*/'.
5251  	                if (this.source.charCodeAt(this.index + 1) === 0x2F) {
5252  	                    this.index += 2;
5253  	                    if (this.trackComment) {
5254  	                        loc.end = {
5255  	                            line: this.lineNumber,
5256  	                            column: this.index - this.lineStart
5257  	                        };
5258  	                        var entry = {
5259  	                            multiLine: true,
5260  	                            slice: [start + 2, this.index - 2],
5261  	                            range: [start, this.index],
5262  	                            loc: loc
5263  	                        };
5264  	                        comments.push(entry);
5265  	                    }
5266  	                    return comments;
5267  	                }
5268  	                ++this.index;
5269  	            }
5270  	            else {
5271  	                ++this.index;
5272  	            }
5273  	        }
5274  	        // Ran off the end of the file - the whole thing is a comment
5275  	        if (this.trackComment) {
5276  	            loc.end = {
5277  	                line: this.lineNumber,
5278  	                column: this.index - this.lineStart
5279  	            };
5280  	            var entry = {
5281  	                multiLine: true,
5282  	                slice: [start + 2, this.index],
5283  	                range: [start, this.index],
5284  	                loc: loc
5285  	            };
5286  	            comments.push(entry);
5287  	        }
5288  	        this.tolerateUnexpectedToken();
5289  	        return comments;
5290  	    };
5291  	    Scanner.prototype.scanComments = function () {
5292  	        var comments;
5293  	        if (this.trackComment) {
5294  	            comments = [];
5295  	        }
5296  	        var start = (this.index === 0);
5297  	        while (!this.eof()) {
5298  	            var ch = this.source.charCodeAt(this.index);
5299  	            if (character_1.Character.isWhiteSpace(ch)) {
5300  	                ++this.index;
5301  	            }
5302  	            else if (character_1.Character.isLineTerminator(ch)) {
5303  	                ++this.index;
5304  	                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
5305  	                    ++this.index;
5306  	                }
5307  	                ++this.lineNumber;
5308  	                this.lineStart = this.index;
5309  	                start = true;
5310  	            }
5311  	            else if (ch === 0x2F) {
5312  	                ch = this.source.charCodeAt(this.index + 1);
5313  	                if (ch === 0x2F) {
5314  	                    this.index += 2;
5315  	                    var comment = this.skipSingleLineComment(2);
5316  	                    if (this.trackComment) {
5317  	                        comments = comments.concat(comment);
5318  	                    }
5319  	                    start = true;
5320  	                }
5321  	                else if (ch === 0x2A) {
5322  	                    this.index += 2;
5323  	                    var comment = this.skipMultiLineComment();
5324  	                    if (this.trackComment) {
5325  	                        comments = comments.concat(comment);
5326  	                    }
5327  	                }
5328  	                else {
5329  	                    break;
5330  	                }
5331  	            }
5332  	            else if (start && ch === 0x2D) {
5333  	                // U+003E is '>'
5334  	                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
5335  	                    // '-->' is a single-line comment
5336  	                    this.index += 3;
5337  	                    var comment = this.skipSingleLineComment(3);
5338  	                    if (this.trackComment) {
5339  	                        comments = comments.concat(comment);
5340  	                    }
5341  	                }
5342  	                else {
5343  	                    break;
5344  	                }
5345  	            }
5346  	            else if (ch === 0x3C && !this.isModule) {
5347  	                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
5348  	                    this.index += 4; // `<!--`
5349  	                    var comment = this.skipSingleLineComment(4);
5350  	                    if (this.trackComment) {
5351  	                        comments = comments.concat(comment);
5352  	                    }
5353  	                }
5354  	                else {
5355  	                    break;
5356  	                }
5357  	            }
5358  	            else {
5359  	                break;
5360  	            }
5361  	        }
5362  	        return comments;
5363  	    };
5364  	    // https://tc39.github.io/ecma262/#sec-future-reserved-words
5365  	    Scanner.prototype.isFutureReservedWord = function (id) {
5366  	        switch (id) {
5367  	            case 'enum':
5368  	            case 'export':
5369  	            case 'import':
5370  	            case 'super':
5371  	                return true;
5372  	            default:
5373  	                return false;
5374  	        }
5375  	    };
5376  	    Scanner.prototype.isStrictModeReservedWord = function (id) {
5377  	        switch (id) {
5378  	            case 'implements':
5379  	            case 'interface':
5380  	            case 'package':
5381  	            case 'private':
5382  	            case 'protected':
5383  	            case 'public':
5384  	            case 'static':
5385  	            case 'yield':
5386  	            case 'let':
5387  	                return true;
5388  	            default:
5389  	                return false;
5390  	        }
5391  	    };
5392  	    Scanner.prototype.isRestrictedWord = function (id) {
5393  	        return id === 'eval' || id === 'arguments';
5394  	    };
5395  	    // https://tc39.github.io/ecma262/#sec-keywords
5396  	    Scanner.prototype.isKeyword = function (id) {
5397  	        switch (id.length) {
5398  	            case 2:
5399  	                return (id === 'if') || (id === 'in') || (id === 'do');
5400  	            case 3:
5401  	                return (id === 'var') || (id === 'for') || (id === 'new') ||
5402  	                    (id === 'try') || (id === 'let');
5403  	            case 4:
5404  	                return (id === 'this') || (id === 'else') || (id === 'case') ||
5405  	                    (id === 'void') || (id === 'with') || (id === 'enum');
5406  	            case 5:
5407  	                return (id === 'while') || (id === 'break') || (id === 'catch') ||
5408  	                    (id === 'throw') || (id === 'const') || (id === 'yield') ||
5409  	                    (id === 'class') || (id === 'super');
5410  	            case 6:
5411  	                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
5412  	                    (id === 'switch') || (id === 'export') || (id === 'import');
5413  	            case 7:
5414  	                return (id === 'default') || (id === 'finally') || (id === 'extends');
5415  	            case 8:
5416  	                return (id === 'function') || (id === 'continue') || (id === 'debugger');
5417  	            case 10:
5418  	                return (id === 'instanceof');
5419  	            default:
5420  	                return false;
5421  	        }
5422  	    };
5423  	    Scanner.prototype.codePointAt = function (i) {
5424  	        var cp = this.source.charCodeAt(i);
5425  	        if (cp >= 0xD800 && cp <= 0xDBFF) {
5426  	            var second = this.source.charCodeAt(i + 1);
5427  	            if (second >= 0xDC00 && second <= 0xDFFF) {
5428  	                var first = cp;
5429  	                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
5430  	            }
5431  	        }
5432  	        return cp;
5433  	    };
5434  	    Scanner.prototype.scanHexEscape = function (prefix) {
5435  	        var len = (prefix === 'u') ? 4 : 2;
5436  	        var code = 0;
5437  	        for (var i = 0; i < len; ++i) {
5438  	            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
5439  	                code = code * 16 + hexValue(this.source[this.index++]);
5440  	            }
5441  	            else {
5442  	                return null;
5443  	            }
5444  	        }
5445  	        return String.fromCharCode(code);
5446  	    };
5447  	    Scanner.prototype.scanUnicodeCodePointEscape = function () {
5448  	        var ch = this.source[this.index];
5449  	        var code = 0;
5450  	        // At least, one hex digit is required.
5451  	        if (ch === '}') {
5452  	            this.throwUnexpectedToken();
5453  	        }
5454  	        while (!this.eof()) {
5455  	            ch = this.source[this.index++];
5456  	            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {
5457  	                break;
5458  	            }
5459  	            code = code * 16 + hexValue(ch);
5460  	        }
5461  	        if (code > 0x10FFFF || ch !== '}') {
5462  	            this.throwUnexpectedToken();
5463  	        }
5464  	        return character_1.Character.fromCodePoint(code);
5465  	    };
5466  	    Scanner.prototype.getIdentifier = function () {
5467  	        var start = this.index++;
5468  	        while (!this.eof()) {
5469  	            var ch = this.source.charCodeAt(this.index);
5470  	            if (ch === 0x5C) {
5471  	                // Blackslash (U+005C) marks Unicode escape sequence.
5472  	                this.index = start;
5473  	                return this.getComplexIdentifier();
5474  	            }
5475  	            else if (ch >= 0xD800 && ch < 0xDFFF) {
5476  	                // Need to handle surrogate pairs.
5477  	                this.index = start;
5478  	                return this.getComplexIdentifier();
5479  	            }
5480  	            if (character_1.Character.isIdentifierPart(ch)) {
5481  	                ++this.index;
5482  	            }
5483  	            else {
5484  	                break;
5485  	            }
5486  	        }
5487  	        return this.source.slice(start, this.index);
5488  	    };
5489  	    Scanner.prototype.getComplexIdentifier = function () {
5490  	        var cp = this.codePointAt(this.index);
5491  	        var id = character_1.Character.fromCodePoint(cp);
5492  	        this.index += id.length;
5493  	        // '\u' (U+005C, U+0075) denotes an escaped character.
5494  	        var ch;
5495  	        if (cp === 0x5C) {
5496  	            if (this.source.charCodeAt(this.index) !== 0x75) {
5497  	                this.throwUnexpectedToken();
5498  	            }
5499  	            ++this.index;
5500  	            if (this.source[this.index] === '{') {
5501  	                ++this.index;
5502  	                ch = this.scanUnicodeCodePointEscape();
5503  	            }
5504  	            else {
5505  	                ch = this.scanHexEscape('u');
5506  	                if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) {
5507  	                    this.throwUnexpectedToken();
5508  	                }
5509  	            }
5510  	            id = ch;
5511  	        }
5512  	        while (!this.eof()) {
5513  	            cp = this.codePointAt(this.index);
5514  	            if (!character_1.Character.isIdentifierPart(cp)) {
5515  	                break;
5516  	            }
5517  	            ch = character_1.Character.fromCodePoint(cp);
5518  	            id += ch;
5519  	            this.index += ch.length;
5520  	            // '\u' (U+005C, U+0075) denotes an escaped character.
5521  	            if (cp === 0x5C) {
5522  	                id = id.substr(0, id.length - 1);
5523  	                if (this.source.charCodeAt(this.index) !== 0x75) {
5524  	                    this.throwUnexpectedToken();
5525  	                }
5526  	                ++this.index;
5527  	                if (this.source[this.index] === '{') {
5528  	                    ++this.index;
5529  	                    ch = this.scanUnicodeCodePointEscape();
5530  	                }
5531  	                else {
5532  	                    ch = this.scanHexEscape('u');
5533  	                    if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
5534  	                        this.throwUnexpectedToken();
5535  	                    }
5536  	                }
5537  	                id += ch;
5538  	            }
5539  	        }
5540  	        return id;
5541  	    };
5542  	    Scanner.prototype.octalToDecimal = function (ch) {
5543  	        // \0 is not octal escape sequence
5544  	        var octal = (ch !== '0');
5545  	        var code = octalValue(ch);
5546  	        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
5547  	            octal = true;
5548  	            code = code * 8 + octalValue(this.source[this.index++]);
5549  	            // 3 digits are only allowed when string starts
5550  	            // with 0, 1, 2, 3
5551  	            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
5552  	                code = code * 8 + octalValue(this.source[this.index++]);
5553  	            }
5554  	        }
5555  	        return {
5556  	            code: code,
5557  	            octal: octal
5558  	        };
5559  	    };
5560  	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
5561  	    Scanner.prototype.scanIdentifier = function () {
5562  	        var type;
5563  	        var start = this.index;
5564  	        // Backslash (U+005C) starts an escaped character.
5565  	        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();
5566  	        // There is no keyword or literal with only one character.
5567  	        // Thus, it must be an identifier.
5568  	        if (id.length === 1) {
5569  	            type = 3 /* Identifier */;
5570  	        }
5571  	        else if (this.isKeyword(id)) {
5572  	            type = 4 /* Keyword */;
5573  	        }
5574  	        else if (id === 'null') {
5575  	            type = 5 /* NullLiteral */;
5576  	        }
5577  	        else if (id === 'true' || id === 'false') {
5578  	            type = 1 /* BooleanLiteral */;
5579  	        }
5580  	        else {
5581  	            type = 3 /* Identifier */;
5582  	        }
5583  	        if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) {
5584  	            var restore = this.index;
5585  	            this.index = start;
5586  	            this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord);
5587  	            this.index = restore;
5588  	        }
5589  	        return {
5590  	            type: type,
5591  	            value: id,
5592  	            lineNumber: this.lineNumber,
5593  	            lineStart: this.lineStart,
5594  	            start: start,
5595  	            end: this.index
5596  	        };
5597  	    };
5598  	    // https://tc39.github.io/ecma262/#sec-punctuators
5599  	    Scanner.prototype.scanPunctuator = function () {
5600  	        var start = this.index;
5601  	        // Check for most common single-character punctuators.
5602  	        var str = this.source[this.index];
5603  	        switch (str) {
5604  	            case '(':
5605  	            case '{':
5606  	                if (str === '{') {
5607  	                    this.curlyStack.push('{');
5608  	                }
5609  	                ++this.index;
5610  	                break;
5611  	            case '.':
5612  	                ++this.index;
5613  	                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {
5614  	                    // Spread operator: ...
5615  	                    this.index += 2;
5616  	                    str = '...';
5617  	                }
5618  	                break;
5619  	            case '}':
5620  	                ++this.index;
5621  	                this.curlyStack.pop();
5622  	                break;
5623  	            case ')':
5624  	            case ';':
5625  	            case ',':
5626  	            case '[':
5627  	            case ']':
5628  	            case ':':
5629  	            case '?':
5630  	            case '~':
5631  	                ++this.index;
5632  	                break;
5633  	            default:
5634  	                // 4-character punctuator.
5635  	                str = this.source.substr(this.index, 4);
5636  	                if (str === '>>>=') {
5637  	                    this.index += 4;
5638  	                }
5639  	                else {
5640  	                    // 3-character punctuators.
5641  	                    str = str.substr(0, 3);
5642  	                    if (str === '===' || str === '!==' || str === '>>>' ||
5643  	                        str === '<<=' || str === '>>=' || str === '**=') {
5644  	                        this.index += 3;
5645  	                    }
5646  	                    else {
5647  	                        // 2-character punctuators.
5648  	                        str = str.substr(0, 2);
5649  	                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||
5650  	                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||
5651  	                            str === '++' || str === '--' || str === '<<' || str === '>>' ||
5652  	                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||
5653  	                            str === '<=' || str === '>=' || str === '=>' || str === '**') {
5654  	                            this.index += 2;
5655  	                        }
5656  	                        else {
5657  	                            // 1-character punctuators.
5658  	                            str = this.source[this.index];
5659  	                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {
5660  	                                ++this.index;
5661  	                            }
5662  	                        }
5663  	                    }
5664  	                }
5665  	        }
5666  	        if (this.index === start) {
5667  	            this.throwUnexpectedToken();
5668  	        }
5669  	        return {
5670  	            type: 7 /* Punctuator */,
5671  	            value: str,
5672  	            lineNumber: this.lineNumber,
5673  	            lineStart: this.lineStart,
5674  	            start: start,
5675  	            end: this.index
5676  	        };
5677  	    };
5678  	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
5679  	    Scanner.prototype.scanHexLiteral = function (start) {
5680  	        var num = '';
5681  	        while (!this.eof()) {
5682  	            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
5683  	                break;
5684  	            }
5685  	            num += this.source[this.index++];
5686  	        }
5687  	        if (num.length === 0) {
5688  	            this.throwUnexpectedToken();
5689  	        }
5690  	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
5691  	            this.throwUnexpectedToken();
5692  	        }
5693  	        return {
5694  	            type: 6 /* NumericLiteral */,
5695  	            value: parseInt('0x' + num, 16),
5696  	            lineNumber: this.lineNumber,
5697  	            lineStart: this.lineStart,
5698  	            start: start,
5699  	            end: this.index
5700  	        };
5701  	    };
5702  	    Scanner.prototype.scanBinaryLiteral = function (start) {
5703  	        var num = '';
5704  	        var ch;
5705  	        while (!this.eof()) {
5706  	            ch = this.source[this.index];
5707  	            if (ch !== '0' && ch !== '1') {
5708  	                break;
5709  	            }
5710  	            num += this.source[this.index++];
5711  	        }
5712  	        if (num.length === 0) {
5713  	            // only 0b or 0B
5714  	            this.throwUnexpectedToken();
5715  	        }
5716  	        if (!this.eof()) {
5717  	            ch = this.source.charCodeAt(this.index);
5718  	            /* istanbul ignore else */
5719  	            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {
5720  	                this.throwUnexpectedToken();
5721  	            }
5722  	        }
5723  	        return {
5724  	            type: 6 /* NumericLiteral */,
5725  	            value: parseInt(num, 2),
5726  	            lineNumber: this.lineNumber,
5727  	            lineStart: this.lineStart,
5728  	            start: start,
5729  	            end: this.index
5730  	        };
5731  	    };
5732  	    Scanner.prototype.scanOctalLiteral = function (prefix, start) {
5733  	        var num = '';
5734  	        var octal = false;
5735  	        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {
5736  	            octal = true;
5737  	            num = '0' + this.source[this.index++];
5738  	        }
5739  	        else {
5740  	            ++this.index;
5741  	        }
5742  	        while (!this.eof()) {
5743  	            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
5744  	                break;
5745  	            }
5746  	            num += this.source[this.index++];
5747  	        }
5748  	        if (!octal && num.length === 0) {
5749  	            // only 0o or 0O
5750  	            this.throwUnexpectedToken();
5751  	        }
5752  	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
5753  	            this.throwUnexpectedToken();
5754  	        }
5755  	        return {
5756  	            type: 6 /* NumericLiteral */,
5757  	            value: parseInt(num, 8),
5758  	            octal: octal,
5759  	            lineNumber: this.lineNumber,
5760  	            lineStart: this.lineStart,
5761  	            start: start,
5762  	            end: this.index
5763  	        };
5764  	    };
5765  	    Scanner.prototype.isImplicitOctalLiteral = function () {
5766  	        // Implicit octal, unless there is a non-octal digit.
5767  	        // (Annex B.1.1 on Numeric Literals)
5768  	        for (var i = this.index + 1; i < this.length; ++i) {
5769  	            var ch = this.source[i];
5770  	            if (ch === '8' || ch === '9') {
5771  	                return false;
5772  	            }
5773  	            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
5774  	                return true;
5775  	            }
5776  	        }
5777  	        return true;
5778  	    };
5779  	    Scanner.prototype.scanNumericLiteral = function () {
5780  	        var start = this.index;
5781  	        var ch = this.source[start];
5782  	        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');
5783  	        var num = '';
5784  	        if (ch !== '.') {
5785  	            num = this.source[this.index++];
5786  	            ch = this.source[this.index];
5787  	            // Hex number starts with '0x'.
5788  	            // Octal number starts with '0'.
5789  	            // Octal number in ES6 starts with '0o'.
5790  	            // Binary number in ES6 starts with '0b'.
5791  	            if (num === '0') {
5792  	                if (ch === 'x' || ch === 'X') {
5793  	                    ++this.index;
5794  	                    return this.scanHexLiteral(start);
5795  	                }
5796  	                if (ch === 'b' || ch === 'B') {
5797  	                    ++this.index;
5798  	                    return this.scanBinaryLiteral(start);
5799  	                }
5800  	                if (ch === 'o' || ch === 'O') {
5801  	                    return this.scanOctalLiteral(ch, start);
5802  	                }
5803  	                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
5804  	                    if (this.isImplicitOctalLiteral()) {
5805  	                        return this.scanOctalLiteral(ch, start);
5806  	                    }
5807  	                }
5808  	            }
5809  	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
5810  	                num += this.source[this.index++];
5811  	            }
5812  	            ch = this.source[this.index];
5813  	        }
5814  	        if (ch === '.') {
5815  	            num += this.source[this.index++];
5816  	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
5817  	                num += this.source[this.index++];
5818  	            }
5819  	            ch = this.source[this.index];
5820  	        }
5821  	        if (ch === 'e' || ch === 'E') {
5822  	            num += this.source[this.index++];
5823  	            ch = this.source[this.index];
5824  	            if (ch === '+' || ch === '-') {
5825  	                num += this.source[this.index++];
5826  	            }
5827  	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
5828  	                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
5829  	                    num += this.source[this.index++];
5830  	                }
5831  	            }
5832  	            else {
5833  	                this.throwUnexpectedToken();
5834  	            }
5835  	        }
5836  	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
5837  	            this.throwUnexpectedToken();
5838  	        }
5839  	        return {
5840  	            type: 6 /* NumericLiteral */,
5841  	            value: parseFloat(num),
5842  	            lineNumber: this.lineNumber,
5843  	            lineStart: this.lineStart,
5844  	            start: start,
5845  	            end: this.index
5846  	        };
5847  	    };
5848  	    // https://tc39.github.io/ecma262/#sec-literals-string-literals
5849  	    Scanner.prototype.scanStringLiteral = function () {
5850  	        var start = this.index;
5851  	        var quote = this.source[start];
5852  	        assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote');
5853  	        ++this.index;
5854  	        var octal = false;
5855  	        var str = '';
5856  	        while (!this.eof()) {
5857  	            var ch = this.source[this.index++];
5858  	            if (ch === quote) {
5859  	                quote = '';
5860  	                break;
5861  	            }
5862  	            else if (ch === '\\') {
5863  	                ch = this.source[this.index++];
5864  	                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
5865  	                    switch (ch) {
5866  	                        case 'u':
5867  	                            if (this.source[this.index] === '{') {
5868  	                                ++this.index;
5869  	                                str += this.scanUnicodeCodePointEscape();
5870  	                            }
5871  	                            else {
5872  	                                var unescaped_1 = this.scanHexEscape(ch);
5873  	                                if (unescaped_1 === null) {
5874  	                                    this.throwUnexpectedToken();
5875  	                                }
5876  	                                str += unescaped_1;
5877  	                            }
5878  	                            break;
5879  	                        case 'x':
5880  	                            var unescaped = this.scanHexEscape(ch);
5881  	                            if (unescaped === null) {
5882  	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
5883  	                            }
5884  	                            str += unescaped;
5885  	                            break;
5886  	                        case 'n':
5887  	                            str += '\n';
5888  	                            break;
5889  	                        case 'r':
5890  	                            str += '\r';
5891  	                            break;
5892  	                        case 't':
5893  	                            str += '\t';
5894  	                            break;
5895  	                        case 'b':
5896  	                            str += '\b';
5897  	                            break;
5898  	                        case 'f':
5899  	                            str += '\f';
5900  	                            break;
5901  	                        case 'v':
5902  	                            str += '\x0B';
5903  	                            break;
5904  	                        case '8':
5905  	                        case '9':
5906  	                            str += ch;
5907  	                            this.tolerateUnexpectedToken();
5908  	                            break;
5909  	                        default:
5910  	                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
5911  	                                var octToDec = this.octalToDecimal(ch);
5912  	                                octal = octToDec.octal || octal;
5913  	                                str += String.fromCharCode(octToDec.code);
5914  	                            }
5915  	                            else {
5916  	                                str += ch;
5917  	                            }
5918  	                            break;
5919  	                    }
5920  	                }
5921  	                else {
5922  	                    ++this.lineNumber;
5923  	                    if (ch === '\r' && this.source[this.index] === '\n') {
5924  	                        ++this.index;
5925  	                    }
5926  	                    this.lineStart = this.index;
5927  	                }
5928  	            }
5929  	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
5930  	                break;
5931  	            }
5932  	            else {
5933  	                str += ch;
5934  	            }
5935  	        }
5936  	        if (quote !== '') {
5937  	            this.index = start;
5938  	            this.throwUnexpectedToken();
5939  	        }
5940  	        return {
5941  	            type: 8 /* StringLiteral */,
5942  	            value: str,
5943  	            octal: octal,
5944  	            lineNumber: this.lineNumber,
5945  	            lineStart: this.lineStart,
5946  	            start: start,
5947  	            end: this.index
5948  	        };
5949  	    };
5950  	    // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components
5951  	    Scanner.prototype.scanTemplate = function () {
5952  	        var cooked = '';
5953  	        var terminated = false;
5954  	        var start = this.index;
5955  	        var head = (this.source[start] === '`');
5956  	        var tail = false;
5957  	        var rawOffset = 2;
5958  	        ++this.index;
5959  	        while (!this.eof()) {
5960  	            var ch = this.source[this.index++];
5961  	            if (ch === '`') {
5962  	                rawOffset = 1;
5963  	                tail = true;
5964  	                terminated = true;
5965  	                break;
5966  	            }
5967  	            else if (ch === '$') {
5968  	                if (this.source[this.index] === '{') {
5969  	                    this.curlyStack.push('${');
5970  	                    ++this.index;
5971  	                    terminated = true;
5972  	                    break;
5973  	                }
5974  	                cooked += ch;
5975  	            }
5976  	            else if (ch === '\\') {
5977  	                ch = this.source[this.index++];
5978  	                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
5979  	                    switch (ch) {
5980  	                        case 'n':
5981  	                            cooked += '\n';
5982  	                            break;
5983  	                        case 'r':
5984  	                            cooked += '\r';
5985  	                            break;
5986  	                        case 't':
5987  	                            cooked += '\t';
5988  	                            break;
5989  	                        case 'u':
5990  	                            if (this.source[this.index] === '{') {
5991  	                                ++this.index;
5992  	                                cooked += this.scanUnicodeCodePointEscape();
5993  	                            }
5994  	                            else {
5995  	                                var restore = this.index;
5996  	                                var unescaped_2 = this.scanHexEscape(ch);
5997  	                                if (unescaped_2 !== null) {
5998  	                                    cooked += unescaped_2;
5999  	                                }
6000  	                                else {
6001  	                                    this.index = restore;
6002  	                                    cooked += ch;
6003  	                                }
6004  	                            }
6005  	                            break;
6006  	                        case 'x':
6007  	                            var unescaped = this.scanHexEscape(ch);
6008  	                            if (unescaped === null) {
6009  	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
6010  	                            }
6011  	                            cooked += unescaped;
6012  	                            break;
6013  	                        case 'b':
6014  	                            cooked += '\b';
6015  	                            break;
6016  	                        case 'f':
6017  	                            cooked += '\f';
6018  	                            break;
6019  	                        case 'v':
6020  	                            cooked += '\v';
6021  	                            break;
6022  	                        default:
6023  	                            if (ch === '0') {
6024  	                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
6025  	                                    // Illegal: \01 \02 and so on
6026  	                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
6027  	                                }
6028  	                                cooked += '\0';
6029  	                            }
6030  	                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
6031  	                                // Illegal: \1 \2
6032  	                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
6033  	                            }
6034  	                            else {
6035  	                                cooked += ch;
6036  	                            }
6037  	                            break;
6038  	                    }
6039  	                }
6040  	                else {
6041  	                    ++this.lineNumber;
6042  	                    if (ch === '\r' && this.source[this.index] === '\n') {
6043  	                        ++this.index;
6044  	                    }
6045  	                    this.lineStart = this.index;
6046  	                }
6047  	            }
6048  	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
6049  	                ++this.lineNumber;
6050  	                if (ch === '\r' && this.source[this.index] === '\n') {
6051  	                    ++this.index;
6052  	                }
6053  	                this.lineStart = this.index;
6054  	                cooked += '\n';
6055  	            }
6056  	            else {
6057  	                cooked += ch;
6058  	            }
6059  	        }
6060  	        if (!terminated) {
6061  	            this.throwUnexpectedToken();
6062  	        }
6063  	        if (!head) {
6064  	            this.curlyStack.pop();
6065  	        }
6066  	        return {
6067  	            type: 10 /* Template */,
6068  	            value: this.source.slice(start + 1, this.index - rawOffset),
6069  	            cooked: cooked,
6070  	            head: head,
6071  	            tail: tail,
6072  	            lineNumber: this.lineNumber,
6073  	            lineStart: this.lineStart,
6074  	            start: start,
6075  	            end: this.index
6076  	        };
6077  	    };
6078  	    // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
6079  	    Scanner.prototype.testRegExp = function (pattern, flags) {
6080  	        // The BMP character to use as a replacement for astral symbols when
6081  	        // translating an ES6 "u"-flagged pattern to an ES5-compatible
6082  	        // approximation.
6083  	        // Note: replacing with '\uFFFF' enables false positives in unlikely
6084  	        // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid
6085  	        // pattern that would not be detected by this substitution.
6086  	        var astralSubstitute = '\uFFFF';
6087  	        var tmp = pattern;
6088  	        var self = this;
6089  	        if (flags.indexOf('u') >= 0) {
6090  	            tmp = tmp
6091  	                .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {
6092  	                var codePoint = parseInt($1 || $2, 16);
6093  	                if (codePoint > 0x10FFFF) {
6094  	                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
6095  	                }
6096  	                if (codePoint <= 0xFFFF) {
6097  	                    return String.fromCharCode(codePoint);
6098  	                }
6099  	                return astralSubstitute;
6100  	            })
6101  	                .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute);
6102  	        }
6103  	        // First, detect invalid regular expressions.
6104  	        try {
6105  	            RegExp(tmp);
6106  	        }
6107  	        catch (e) {
6108  	            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
6109  	        }
6110  	        // Return a regular expression object for this pattern-flag pair, or
6111  	        // `null` in case the current environment doesn't support the flags it
6112  	        // uses.
6113  	        try {
6114  	            return new RegExp(pattern, flags);
6115  	        }
6116  	        catch (exception) {
6117  	            /* istanbul ignore next */
6118  	            return null;
6119  	        }
6120  	    };
6121  	    Scanner.prototype.scanRegExpBody = function () {
6122  	        var ch = this.source[this.index];
6123  	        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');
6124  	        var str = this.source[this.index++];
6125  	        var classMarker = false;
6126  	        var terminated = false;
6127  	        while (!this.eof()) {
6128  	            ch = this.source[this.index++];
6129  	            str += ch;
6130  	            if (ch === '\\') {
6131  	                ch = this.source[this.index++];
6132  	                // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
6133  	                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
6134  	                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
6135  	                }
6136  	                str += ch;
6137  	            }
6138  	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
6139  	                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
6140  	            }
6141  	            else if (classMarker) {
6142  	                if (ch === ']') {
6143  	                    classMarker = false;
6144  	                }
6145  	            }
6146  	            else {
6147  	                if (ch === '/') {
6148  	                    terminated = true;
6149  	                    break;
6150  	                }
6151  	                else if (ch === '[') {
6152  	                    classMarker = true;
6153  	                }
6154  	            }
6155  	        }
6156  	        if (!terminated) {
6157  	            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
6158  	        }
6159  	        // Exclude leading and trailing slash.
6160  	        return str.substr(1, str.length - 2);
6161  	    };
6162  	    Scanner.prototype.scanRegExpFlags = function () {
6163  	        var str = '';
6164  	        var flags = '';
6165  	        while (!this.eof()) {
6166  	            var ch = this.source[this.index];
6167  	            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
6168  	                break;
6169  	            }
6170  	            ++this.index;
6171  	            if (ch === '\\' && !this.eof()) {
6172  	                ch = this.source[this.index];
6173  	                if (ch === 'u') {
6174  	                    ++this.index;
6175  	                    var restore = this.index;
6176  	                    var char = this.scanHexEscape('u');
6177  	                    if (char !== null) {
6178  	                        flags += char;
6179  	                        for (str += '\\u'; restore < this.index; ++restore) {
6180  	                            str += this.source[restore];
6181  	                        }
6182  	                    }
6183  	                    else {
6184  	                        this.index = restore;
6185  	                        flags += 'u';
6186  	                        str += '\\u';
6187  	                    }
6188  	                    this.tolerateUnexpectedToken();
6189  	                }
6190  	                else {
6191  	                    str += '\\';
6192  	                    this.tolerateUnexpectedToken();
6193  	                }
6194  	            }
6195  	            else {
6196  	                flags += ch;
6197  	                str += ch;
6198  	            }
6199  	        }
6200  	        return flags;
6201  	    };
6202  	    Scanner.prototype.scanRegExp = function () {
6203  	        var start = this.index;
6204  	        var pattern = this.scanRegExpBody();
6205  	        var flags = this.scanRegExpFlags();
6206  	        var value = this.testRegExp(pattern, flags);
6207  	        return {
6208  	            type: 9 /* RegularExpression */,
6209  	            value: '',
6210  	            pattern: pattern,
6211  	            flags: flags,
6212  	            regex: value,
6213  	            lineNumber: this.lineNumber,
6214  	            lineStart: this.lineStart,
6215  	            start: start,
6216  	            end: this.index
6217  	        };
6218  	    };
6219  	    Scanner.prototype.lex = function () {
6220  	        if (this.eof()) {
6221  	            return {
6222  	                type: 2 /* EOF */,
6223  	                value: '',
6224  	                lineNumber: this.lineNumber,
6225  	                lineStart: this.lineStart,
6226  	                start: this.index,
6227  	                end: this.index
6228  	            };
6229  	        }
6230  	        var cp = this.source.charCodeAt(this.index);
6231  	        if (character_1.Character.isIdentifierStart(cp)) {
6232  	            return this.scanIdentifier();
6233  	        }
6234  	        // Very common: ( and ) and ;
6235  	        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {
6236  	            return this.scanPunctuator();
6237  	        }
6238  	        // String literal starts with single quote (U+0027) or double quote (U+0022).
6239  	        if (cp === 0x27 || cp === 0x22) {
6240  	            return this.scanStringLiteral();
6241  	        }
6242  	        // Dot (.) U+002E can also start a floating-point number, hence the need
6243  	        // to check the next character.
6244  	        if (cp === 0x2E) {
6245  	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {
6246  	                return this.scanNumericLiteral();
6247  	            }
6248  	            return this.scanPunctuator();
6249  	        }
6250  	        if (character_1.Character.isDecimalDigit(cp)) {
6251  	            return this.scanNumericLiteral();
6252  	        }
6253  	        // Template literals start with ` (U+0060) for template head
6254  	        // or } (U+007D) for template middle or template tail.
6255  	        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {
6256  	            return this.scanTemplate();
6257  	        }
6258  	        // Possible identifier start in a surrogate pair.
6259  	        if (cp >= 0xD800 && cp < 0xDFFF) {
6260  	            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {
6261  	                return this.scanIdentifier();
6262  	            }
6263  	        }
6264  	        return this.scanPunctuator();
6265  	    };
6266  	    return Scanner;
6267  	}());
6268  	exports.Scanner = Scanner;
6269  
6270  
6271  /***/ },
6272  /* 13 */
6273  /***/ function(module, exports) {
6274  
6275  	"use strict";
6276  	Object.defineProperty(exports, "__esModule", { value: true });
6277  	exports.TokenName = {};
6278  	exports.TokenName[1 /* BooleanLiteral */] = 'Boolean';
6279  	exports.TokenName[2 /* EOF */] = '<end>';
6280  	exports.TokenName[3 /* Identifier */] = 'Identifier';
6281  	exports.TokenName[4 /* Keyword */] = 'Keyword';
6282  	exports.TokenName[5 /* NullLiteral */] = 'Null';
6283  	exports.TokenName[6 /* NumericLiteral */] = 'Numeric';
6284  	exports.TokenName[7 /* Punctuator */] = 'Punctuator';
6285  	exports.TokenName[8 /* StringLiteral */] = 'String';
6286  	exports.TokenName[9 /* RegularExpression */] = 'RegularExpression';
6287  	exports.TokenName[10 /* Template */] = 'Template';
6288  
6289  
6290  /***/ },
6291  /* 14 */
6292  /***/ function(module, exports) {
6293  
6294  	"use strict";
6295  	// Generated by generate-xhtml-entities.js. DO NOT MODIFY!
6296  	Object.defineProperty(exports, "__esModule", { value: true });
6297  	exports.XHTMLEntities = {
6298  	    quot: '\u0022',
6299  	    amp: '\u0026',
6300  	    apos: '\u0027',
6301  	    gt: '\u003E',
6302  	    nbsp: '\u00A0',
6303  	    iexcl: '\u00A1',
6304  	    cent: '\u00A2',
6305  	    pound: '\u00A3',
6306  	    curren: '\u00A4',
6307  	    yen: '\u00A5',
6308  	    brvbar: '\u00A6',
6309  	    sect: '\u00A7',
6310  	    uml: '\u00A8',
6311  	    copy: '\u00A9',
6312  	    ordf: '\u00AA',
6313  	    laquo: '\u00AB',
6314  	    not: '\u00AC',
6315  	    shy: '\u00AD',
6316  	    reg: '\u00AE',
6317  	    macr: '\u00AF',
6318  	    deg: '\u00B0',
6319  	    plusmn: '\u00B1',
6320  	    sup2: '\u00B2',
6321  	    sup3: '\u00B3',
6322  	    acute: '\u00B4',
6323  	    micro: '\u00B5',
6324  	    para: '\u00B6',
6325  	    middot: '\u00B7',
6326  	    cedil: '\u00B8',
6327  	    sup1: '\u00B9',
6328  	    ordm: '\u00BA',
6329  	    raquo: '\u00BB',
6330  	    frac14: '\u00BC',
6331  	    frac12: '\u00BD',
6332  	    frac34: '\u00BE',
6333  	    iquest: '\u00BF',
6334  	    Agrave: '\u00C0',
6335  	    Aacute: '\u00C1',
6336  	    Acirc: '\u00C2',
6337  	    Atilde: '\u00C3',
6338  	    Auml: '\u00C4',
6339  	    Aring: '\u00C5',
6340  	    AElig: '\u00C6',
6341  	    Ccedil: '\u00C7',
6342  	    Egrave: '\u00C8',
6343  	    Eacute: '\u00C9',
6344  	    Ecirc: '\u00CA',
6345  	    Euml: '\u00CB',
6346  	    Igrave: '\u00CC',
6347  	    Iacute: '\u00CD',
6348  	    Icirc: '\u00CE',
6349  	    Iuml: '\u00CF',
6350  	    ETH: '\u00D0',
6351  	    Ntilde: '\u00D1',
6352  	    Ograve: '\u00D2',
6353  	    Oacute: '\u00D3',
6354  	    Ocirc: '\u00D4',
6355  	    Otilde: '\u00D5',
6356  	    Ouml: '\u00D6',
6357  	    times: '\u00D7',
6358  	    Oslash: '\u00D8',
6359  	    Ugrave: '\u00D9',
6360  	    Uacute: '\u00DA',
6361  	    Ucirc: '\u00DB',
6362  	    Uuml: '\u00DC',
6363  	    Yacute: '\u00DD',
6364  	    THORN: '\u00DE',
6365  	    szlig: '\u00DF',
6366  	    agrave: '\u00E0',
6367  	    aacute: '\u00E1',
6368  	    acirc: '\u00E2',
6369  	    atilde: '\u00E3',
6370  	    auml: '\u00E4',
6371  	    aring: '\u00E5',
6372  	    aelig: '\u00E6',
6373  	    ccedil: '\u00E7',
6374  	    egrave: '\u00E8',
6375  	    eacute: '\u00E9',
6376  	    ecirc: '\u00EA',
6377  	    euml: '\u00EB',
6378  	    igrave: '\u00EC',
6379  	    iacute: '\u00ED',
6380  	    icirc: '\u00EE',
6381  	    iuml: '\u00EF',
6382  	    eth: '\u00F0',
6383  	    ntilde: '\u00F1',
6384  	    ograve: '\u00F2',
6385  	    oacute: '\u00F3',
6386  	    ocirc: '\u00F4',
6387  	    otilde: '\u00F5',
6388  	    ouml: '\u00F6',
6389  	    divide: '\u00F7',
6390  	    oslash: '\u00F8',
6391  	    ugrave: '\u00F9',
6392  	    uacute: '\u00FA',
6393  	    ucirc: '\u00FB',
6394  	    uuml: '\u00FC',
6395  	    yacute: '\u00FD',
6396  	    thorn: '\u00FE',
6397  	    yuml: '\u00FF',
6398  	    OElig: '\u0152',
6399  	    oelig: '\u0153',
6400  	    Scaron: '\u0160',
6401  	    scaron: '\u0161',
6402  	    Yuml: '\u0178',
6403  	    fnof: '\u0192',
6404  	    circ: '\u02C6',
6405  	    tilde: '\u02DC',
6406  	    Alpha: '\u0391',
6407  	    Beta: '\u0392',
6408  	    Gamma: '\u0393',
6409  	    Delta: '\u0394',
6410  	    Epsilon: '\u0395',
6411  	    Zeta: '\u0396',
6412  	    Eta: '\u0397',
6413  	    Theta: '\u0398',
6414  	    Iota: '\u0399',
6415  	    Kappa: '\u039A',
6416  	    Lambda: '\u039B',
6417  	    Mu: '\u039C',
6418  	    Nu: '\u039D',
6419  	    Xi: '\u039E',
6420  	    Omicron: '\u039F',
6421  	    Pi: '\u03A0',
6422  	    Rho: '\u03A1',
6423  	    Sigma: '\u03A3',
6424  	    Tau: '\u03A4',
6425  	    Upsilon: '\u03A5',
6426  	    Phi: '\u03A6',
6427  	    Chi: '\u03A7',
6428  	    Psi: '\u03A8',
6429  	    Omega: '\u03A9',
6430  	    alpha: '\u03B1',
6431  	    beta: '\u03B2',
6432  	    gamma: '\u03B3',
6433  	    delta: '\u03B4',
6434  	    epsilon: '\u03B5',
6435  	    zeta: '\u03B6',
6436  	    eta: '\u03B7',
6437  	    theta: '\u03B8',
6438  	    iota: '\u03B9',
6439  	    kappa: '\u03BA',
6440  	    lambda: '\u03BB',
6441  	    mu: '\u03BC',
6442  	    nu: '\u03BD',
6443  	    xi: '\u03BE',
6444  	    omicron: '\u03BF',
6445  	    pi: '\u03C0',
6446  	    rho: '\u03C1',
6447  	    sigmaf: '\u03C2',
6448  	    sigma: '\u03C3',
6449  	    tau: '\u03C4',
6450  	    upsilon: '\u03C5',
6451  	    phi: '\u03C6',
6452  	    chi: '\u03C7',
6453  	    psi: '\u03C8',
6454  	    omega: '\u03C9',
6455  	    thetasym: '\u03D1',
6456  	    upsih: '\u03D2',
6457  	    piv: '\u03D6',
6458  	    ensp: '\u2002',
6459  	    emsp: '\u2003',
6460  	    thinsp: '\u2009',
6461  	    zwnj: '\u200C',
6462  	    zwj: '\u200D',
6463  	    lrm: '\u200E',
6464  	    rlm: '\u200F',
6465  	    ndash: '\u2013',
6466  	    mdash: '\u2014',
6467  	    lsquo: '\u2018',
6468  	    rsquo: '\u2019',
6469  	    sbquo: '\u201A',
6470  	    ldquo: '\u201C',
6471  	    rdquo: '\u201D',
6472  	    bdquo: '\u201E',
6473  	    dagger: '\u2020',
6474  	    Dagger: '\u2021',
6475  	    bull: '\u2022',
6476  	    hellip: '\u2026',
6477  	    permil: '\u2030',
6478  	    prime: '\u2032',
6479  	    Prime: '\u2033',
6480  	    lsaquo: '\u2039',
6481  	    rsaquo: '\u203A',
6482  	    oline: '\u203E',
6483  	    frasl: '\u2044',
6484  	    euro: '\u20AC',
6485  	    image: '\u2111',
6486  	    weierp: '\u2118',
6487  	    real: '\u211C',
6488  	    trade: '\u2122',
6489  	    alefsym: '\u2135',
6490  	    larr: '\u2190',
6491  	    uarr: '\u2191',
6492  	    rarr: '\u2192',
6493  	    darr: '\u2193',
6494  	    harr: '\u2194',
6495  	    crarr: '\u21B5',
6496  	    lArr: '\u21D0',
6497  	    uArr: '\u21D1',
6498  	    rArr: '\u21D2',
6499  	    dArr: '\u21D3',
6500  	    hArr: '\u21D4',
6501  	    forall: '\u2200',
6502  	    part: '\u2202',
6503  	    exist: '\u2203',
6504  	    empty: '\u2205',
6505  	    nabla: '\u2207',
6506  	    isin: '\u2208',
6507  	    notin: '\u2209',
6508  	    ni: '\u220B',
6509  	    prod: '\u220F',
6510  	    sum: '\u2211',
6511  	    minus: '\u2212',
6512  	    lowast: '\u2217',
6513  	    radic: '\u221A',
6514  	    prop: '\u221D',
6515  	    infin: '\u221E',
6516  	    ang: '\u2220',
6517  	    and: '\u2227',
6518  	    or: '\u2228',
6519  	    cap: '\u2229',
6520  	    cup: '\u222A',
6521  	    int: '\u222B',
6522  	    there4: '\u2234',
6523  	    sim: '\u223C',
6524  	    cong: '\u2245',
6525  	    asymp: '\u2248',
6526  	    ne: '\u2260',
6527  	    equiv: '\u2261',
6528  	    le: '\u2264',
6529  	    ge: '\u2265',
6530  	    sub: '\u2282',
6531  	    sup: '\u2283',
6532  	    nsub: '\u2284',
6533  	    sube: '\u2286',
6534  	    supe: '\u2287',
6535  	    oplus: '\u2295',
6536  	    otimes: '\u2297',
6537  	    perp: '\u22A5',
6538  	    sdot: '\u22C5',
6539  	    lceil: '\u2308',
6540  	    rceil: '\u2309',
6541  	    lfloor: '\u230A',
6542  	    rfloor: '\u230B',
6543  	    loz: '\u25CA',
6544  	    spades: '\u2660',
6545  	    clubs: '\u2663',
6546  	    hearts: '\u2665',
6547  	    diams: '\u2666',
6548  	    lang: '\u27E8',
6549  	    rang: '\u27E9'
6550  	};
6551  
6552  
6553  /***/ },
6554  /* 15 */
6555  /***/ function(module, exports, __webpack_require__) {
6556  
6557  	"use strict";
6558  	Object.defineProperty(exports, "__esModule", { value: true });
6559  	var error_handler_1 = __webpack_require__(10);
6560  	var scanner_1 = __webpack_require__(12);
6561  	var token_1 = __webpack_require__(13);
6562  	var Reader = (function () {
6563  	    function Reader() {
6564  	        this.values = [];
6565  	        this.curly = this.paren = -1;
6566  	    }
6567  	    // A function following one of those tokens is an expression.
6568  	    Reader.prototype.beforeFunctionExpression = function (t) {
6569  	        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
6570  	            'return', 'case', 'delete', 'throw', 'void',
6571  	            // assignment operators
6572  	            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',
6573  	            '&=', '|=', '^=', ',',
6574  	            // binary/unary operators
6575  	            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
6576  	            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
6577  	            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;
6578  	    };
6579  	    // Determine if forward slash (/) is an operator or part of a regular expression
6580  	    // https://github.com/mozilla/sweet.js/wiki/design
6581  	    Reader.prototype.isRegexStart = function () {
6582  	        var previous = this.values[this.values.length - 1];
6583  	        var regex = (previous !== null);
6584  	        switch (previous) {
6585  	            case 'this':
6586  	            case ']':
6587  	                regex = false;
6588  	                break;
6589  	            case ')':
6590  	                var keyword = this.values[this.paren - 1];
6591  	                regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with');
6592  	                break;
6593  	            case '}':
6594  	                // Dividing a function by anything makes little sense,
6595  	                // but we have to check for that.
6596  	                regex = false;
6597  	                if (this.values[this.curly - 3] === 'function') {
6598  	                    // Anonymous function, e.g. function(){} /42
6599  	                    var check = this.values[this.curly - 4];
6600  	                    regex = check ? !this.beforeFunctionExpression(check) : false;
6601  	                }
6602  	                else if (this.values[this.curly - 4] === 'function') {
6603  	                    // Named function, e.g. function f(){} /42/
6604  	                    var check = this.values[this.curly - 5];
6605  	                    regex = check ? !this.beforeFunctionExpression(check) : true;
6606  	                }
6607  	                break;
6608  	            default:
6609  	                break;
6610  	        }
6611  	        return regex;
6612  	    };
6613  	    Reader.prototype.push = function (token) {
6614  	        if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) {
6615  	            if (token.value === '{') {
6616  	                this.curly = this.values.length;
6617  	            }
6618  	            else if (token.value === '(') {
6619  	                this.paren = this.values.length;
6620  	            }
6621  	            this.values.push(token.value);
6622  	        }
6623  	        else {
6624  	            this.values.push(null);
6625  	        }
6626  	    };
6627  	    return Reader;
6628  	}());
6629  	var Tokenizer = (function () {
6630  	    function Tokenizer(code, config) {
6631  	        this.errorHandler = new error_handler_1.ErrorHandler();
6632  	        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;
6633  	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
6634  	        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;
6635  	        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;
6636  	        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;
6637  	        this.buffer = [];
6638  	        this.reader = new Reader();
6639  	    }
6640  	    Tokenizer.prototype.errors = function () {
6641  	        return this.errorHandler.errors;
6642  	    };
6643  	    Tokenizer.prototype.getNextToken = function () {
6644  	        if (this.buffer.length === 0) {
6645  	            var comments = this.scanner.scanComments();
6646  	            if (this.scanner.trackComment) {
6647  	                for (var i = 0; i < comments.length; ++i) {
6648  	                    var e = comments[i];
6649  	                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);
6650  	                    var comment = {
6651  	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
6652  	                        value: value
6653  	                    };
6654  	                    if (this.trackRange) {
6655  	                        comment.range = e.range;
6656  	                    }
6657  	                    if (this.trackLoc) {
6658  	                        comment.loc = e.loc;
6659  	                    }
6660  	                    this.buffer.push(comment);
6661  	                }
6662  	            }
6663  	            if (!this.scanner.eof()) {
6664  	                var loc = void 0;
6665  	                if (this.trackLoc) {
6666  	                    loc = {
6667  	                        start: {
6668  	                            line: this.scanner.lineNumber,
6669  	                            column: this.scanner.index - this.scanner.lineStart
6670  	                        },
6671  	                        end: {}
6672  	                    };
6673  	                }
6674  	                var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart();
6675  	                var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex();
6676  	                this.reader.push(token);
6677  	                var entry = {
6678  	                    type: token_1.TokenName[token.type],
6679  	                    value: this.scanner.source.slice(token.start, token.end)
6680  	                };
6681  	                if (this.trackRange) {
6682  	                    entry.range = [token.start, token.end];
6683  	                }
6684  	                if (this.trackLoc) {
6685  	                    loc.end = {
6686  	                        line: this.scanner.lineNumber,
6687  	                        column: this.scanner.index - this.scanner.lineStart
6688  	                    };
6689  	                    entry.loc = loc;
6690  	                }
6691  	                if (token.type === 9 /* RegularExpression */) {
6692  	                    var pattern = token.pattern;
6693  	                    var flags = token.flags;
6694  	                    entry.regex = { pattern: pattern, flags: flags };
6695  	                }
6696  	                this.buffer.push(entry);
6697  	            }
6698  	        }
6699  	        return this.buffer.shift();
6700  	    };
6701  	    return Tokenizer;
6702  	}());
6703  	exports.Tokenizer = Tokenizer;
6704  
6705  
6706  /***/ }
6707  /******/ ])
6708  });
6709  ;