import { assert, assign } from '@glimmer/util'; import { EntityParser, EventedTokenizer, HTML5NamedCharRefs as namedCharRefs } from 'simple-html-tokenizer'; export class Parser { constructor(source, entityParser = new EntityParser(namedCharRefs), mode = 'precompile') { this.elementStack = []; this.currentAttribute = null; this.currentNode = null; this.source = source; this.lines = source.source.split(/(?:\r\n?|\n)/g); this.tokenizer = new EventedTokenizer(this, entityParser, mode); } offset() { let { line, column } = this.tokenizer; return this.source.offsetFor(line, column); } pos({ line, column }) { return this.source.offsetFor(line, column); } finish(node) { return assign({}, node, { loc: node.loc.until(this.offset()) }); // node.loc = node.loc.withEnd(end); } get currentAttr() { return this.currentAttribute; } get currentTag() { let node = this.currentNode; (false && assert(node && (node.type === 'StartTag' || node.type === 'EndTag'), 'expected tag')); return node; } get currentStartTag() { let node = this.currentNode; (false && assert(node && node.type === 'StartTag', 'expected start tag')); return node; } get currentEndTag() { let node = this.currentNode; (false && assert(node && node.type === 'EndTag', 'expected end tag')); return node; } get currentComment() { let node = this.currentNode; (false && assert(node && node.type === 'CommentStatement', 'expected a comment')); return node; } get currentData() { let node = this.currentNode; (false && assert(node && node.type === 'TextNode', 'expected a text node')); return node; } acceptTemplate(node) { return this[node.type](node); } acceptNode(node) { return this[node.type](node); } currentElement() { return this.elementStack[this.elementStack.length - 1]; } sourceForNode(node, endNode) { let firstLine = node.loc.start.line - 1; let currentLine = firstLine - 1; let firstColumn = node.loc.start.column; let string = []; let line; let lastLine; let lastColumn; if (endNode) { lastLine = endNode.loc.end.line - 1; lastColumn = endNode.loc.end.column; } else { lastLine = node.loc.end.line - 1; lastColumn = node.loc.end.column; } while (currentLine < lastLine) { currentLine++; line = this.lines[currentLine]; if (currentLine === firstLine) { if (firstLine === lastLine) { string.push(line.slice(firstColumn, lastColumn)); } else { string.push(line.slice(firstColumn)); } } else if (currentLine === lastLine) { string.push(line.slice(0, lastColumn)); } else { string.push(line); } } return string.join('\n'); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsTUFBVCxFQUFpQixNQUFqQixRQUF1QyxlQUF2QztBQUNBLFNBQ0UsWUFERixFQUVFLGdCQUZGLEVBR0Usa0JBQWtCLElBQUksYUFIeEIsUUFJTyx1QkFKUDtBQXNDQSxPQUFNLE1BQWdCLE1BQWhCLENBQXNCO0FBZTFCLEVBQUEsV0FBQSxDQUNFLE1BREYsRUFFRSxZQUFZLEdBQUcsSUFBSSxZQUFKLENBQWlCLGFBQWpCLENBRmpCLEVBR0UsSUFBQSxHQUFpQyxZQUhuQyxFQUcrQztBQWpCckMsU0FBQSxZQUFBLEdBQTBCLEVBQTFCO0FBR0gsU0FBQSxnQkFBQSxHQUFzQyxJQUF0QztBQUNBLFNBQUEsV0FBQSxHQU9ILElBUEc7QUFlTCxTQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsU0FBSyxLQUFMLEdBQWEsTUFBTSxDQUFDLE1BQVAsQ0FBYyxLQUFkLENBQW9CLGVBQXBCLENBQWI7QUFDQSxTQUFLLFNBQUwsR0FBaUIsSUFBSSxnQkFBSixDQUFxQixJQUFyQixFQUEyQixZQUEzQixFQUF5QyxJQUF6QyxDQUFqQjtBQUNEOztBQUVELEVBQUEsTUFBTSxHQUFBO0FBQ0osUUFBSTtBQUFFLE1BQUEsSUFBRjtBQUFRLE1BQUE7QUFBUixRQUFtQixLQUFLLFNBQTVCO0FBQ0EsV0FBTyxLQUFLLE1BQUwsQ0FBWSxTQUFaLENBQXNCLElBQXRCLEVBQTRCLE1BQTVCLENBQVA7QUFDRDs7QUFFRCxFQUFBLEdBQUcsQ0FBQztBQUFFLElBQUEsSUFBRjtBQUFRLElBQUE7QUFBUixHQUFELEVBQWlDO0FBQ2xDLFdBQU8sS0FBSyxNQUFMLENBQVksU0FBWixDQUFzQixJQUF0QixFQUE0QixNQUE1QixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxNQUFNLENBQWdDLElBQWhDLEVBQTBEO0FBQzlELFdBQVEsTUFBTSxDQUFDLEVBQUQsRUFBSyxJQUFMLEVBQVc7QUFDdkIsTUFBQSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUwsQ0FBUyxLQUFULENBQWUsS0FBSyxNQUFMLEVBQWY7QUFEa0IsS0FBWCxDQUFkLENBRDhELENBSzlEO0FBQ0Q7O0FBeUNELE1BQUksV0FBSixHQUFlO0FBQ2IsV0FBYyxLQUFLLGdCQUFuQjtBQUNEOztBQUVELE1BQUksVUFBSixHQUFjO0FBQ1osUUFBSSxJQUFJLEdBQUcsS0FBSyxXQUFoQjtBQURZLGNBRVosTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBTCxLQUFjLFVBQWQsSUFBNEIsSUFBSSxDQUFDLElBQUwsS0FBYyxRQUEvQyxDQUFMLEVBQStELGNBQS9ELENBRk07QUFHWixXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFJLGVBQUosR0FBbUI7QUFDakIsUUFBSSxJQUFJLEdBQUcsS0FBSyxXQUFoQjtBQURpQixjQUVqQixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFMLEtBQWMsVUFBdkIsRUFBbUMsb0JBQW5DLENBRlc7QUFHakIsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsTUFBSSxhQUFKLEdBQWlCO0FBQ2YsUUFBSSxJQUFJLEdBQUcsS0FBSyxXQUFoQjtBQURlLGNBRWYsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBTCxLQUFjLFFBQXZCLEVBQWlDLGtCQUFqQyxDQUZTO0FBR2YsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsTUFBSSxjQUFKLEdBQWtCO0FBQ2hCLFFBQUksSUFBSSxHQUFHLEtBQUssV0FBaEI7QUFEZ0IsY0FFaEIsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBTCxLQUFjLGtCQUF2QixFQUEyQyxvQkFBM0MsQ0FGVTtBQUdoQixXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFJLFdBQUosR0FBZTtBQUNiLFFBQUksSUFBSSxHQUFHLEtBQUssV0FBaEI7QUFEYSxjQUViLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUwsS0FBYyxVQUF2QixFQUFtQyxzQkFBbkMsQ0FGTztBQUdiLFdBQU8sSUFBUDtBQUNEOztBQUVELEVBQUEsY0FBYyxDQUFDLElBQUQsRUFBa0I7QUFDOUIsV0FBTyxLQUFLLElBQUksQ0FBQyxJQUFWLEVBQTZCLElBQTdCLENBQVA7QUFDRDs7QUFJRCxFQUFBLFVBQVUsQ0FBeUIsSUFBekIsRUFBMEM7QUFDbEQsV0FBUSxLQUFLLElBQUksQ0FBQyxJQUFWLEVBQThELElBQTlELENBQVI7QUFDRDs7QUFFRCxFQUFBLGNBQWMsR0FBQTtBQUNaLFdBQU8sS0FBSyxZQUFMLENBQWtCLEtBQUssWUFBTCxDQUFrQixNQUFsQixHQUEyQixDQUE3QyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxhQUFhLENBQUMsSUFBRCxFQUFpQixPQUFqQixFQUFzRDtBQUNqRSxRQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBTCxDQUFTLEtBQVQsQ0FBZSxJQUFmLEdBQXNCLENBQXRDO0FBQ0EsUUFBSSxXQUFXLEdBQUcsU0FBUyxHQUFHLENBQTlCO0FBQ0EsUUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxLQUFULENBQWUsTUFBakM7QUFDQSxRQUFJLE1BQU0sR0FBRyxFQUFiO0FBQ0EsUUFBSSxJQUFKO0FBRUEsUUFBSSxRQUFKO0FBQ0EsUUFBSSxVQUFKOztBQUVBLFFBQUksT0FBSixFQUFhO0FBQ1gsTUFBQSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQVIsQ0FBWSxHQUFaLENBQWdCLElBQWhCLEdBQXVCLENBQWxDO0FBQ0EsTUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQVIsQ0FBWSxHQUFaLENBQWdCLE1BQTdCO0FBQ0QsS0FIRCxNQUdPO0FBQ0wsTUFBQSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxHQUFULENBQWEsSUFBYixHQUFvQixDQUEvQjtBQUNBLE1BQUEsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFMLENBQVMsR0FBVCxDQUFhLE1BQTFCO0FBQ0Q7O0FBRUQsV0FBTyxXQUFXLEdBQUcsUUFBckIsRUFBK0I7QUFDN0IsTUFBQSxXQUFXO0FBQ1gsTUFBQSxJQUFJLEdBQUcsS0FBSyxLQUFMLENBQVcsV0FBWCxDQUFQOztBQUVBLFVBQUksV0FBVyxLQUFLLFNBQXBCLEVBQStCO0FBQzdCLFlBQUksU0FBUyxLQUFLLFFBQWxCLEVBQTRCO0FBQzFCLFVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFJLENBQUMsS0FBTCxDQUFXLFdBQVgsRUFBd0IsVUFBeEIsQ0FBWjtBQUNELFNBRkQsTUFFTztBQUNMLFVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFJLENBQUMsS0FBTCxDQUFXLFdBQVgsQ0FBWjtBQUNEO0FBQ0YsT0FORCxNQU1PLElBQUksV0FBVyxLQUFLLFFBQXBCLEVBQThCO0FBQ25DLFFBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFJLENBQUMsS0FBTCxDQUFXLENBQVgsRUFBYyxVQUFkLENBQVo7QUFDRCxPQUZNLE1BRUE7QUFDTCxRQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVksSUFBWjtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxNQUFNLENBQUMsSUFBUCxDQUFZLElBQVosQ0FBUDtBQUNEOztBQXJLeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBleHBlY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7XG4gIEVudGl0eVBhcnNlcixcbiAgRXZlbnRlZFRva2VuaXplcixcbiAgSFRNTDVOYW1lZENoYXJSZWZzIGFzIG5hbWVkQ2hhclJlZnMsXG59IGZyb20gJ3NpbXBsZS1odG1sLXRva2VuaXplcic7XG5cbmltcG9ydCB7IFNvdXJjZVBvc2l0aW9uIH0gZnJvbSAnLi9zb3VyY2UvbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IFNvdXJjZU9mZnNldCwgU291cmNlU3BhbiB9IGZyb20gJy4vc291cmNlL3NwYW4nO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuaW1wb3J0ICogYXMgSEJTIGZyb20gJy4vdjEvaGFuZGxlYmFycy1hc3QnO1xuXG5leHBvcnQgdHlwZSBQYXJzZXJOb2RlQnVpbGRlcjxOIGV4dGVuZHMgeyBsb2M6IFNvdXJjZVNwYW4gfT4gPSBPbWl0PE4sICdsb2MnPiAmIHtcbiAgbG9jOiBTb3VyY2VPZmZzZXQ7XG59O1xuXG5leHBvcnQgdHlwZSBFbGVtZW50ID0gQVNUdjEuVGVtcGxhdGUgfCBBU1R2MS5CbG9jayB8IEFTVHYxLkVsZW1lbnROb2RlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhZzxUIGV4dGVuZHMgJ1N0YXJ0VGFnJyB8ICdFbmRUYWcnPiB7XG4gIHJlYWRvbmx5IHR5cGU6IFQ7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0cmlidXRlczogQVNUdjEuQXR0ck5vZGVbXTtcbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnRbXTtcbiAgcmVhZG9ubHkgY29tbWVudHM6IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudFtdO1xuICBzZWxmQ2xvc2luZzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbG9jOiBTb3VyY2VTcGFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3VycmVudFBhcnQ6IEFTVHYxLlRleHROb2RlIHwgbnVsbDtcbiAgcGFydHM6IChBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB8IEFTVHYxLlRleHROb2RlKVtdO1xuICBpc1F1b3RlZDogYm9vbGVhbjtcbiAgaXNEeW5hbWljOiBib29sZWFuO1xuICBzdGFydDogU291cmNlT2Zmc2V0O1xuICB2YWx1ZVNwYW46IFNvdXJjZVNwYW47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYXJzZXIge1xuICBwcm90ZWN0ZWQgZWxlbWVudFN0YWNrOiBFbGVtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHNvdXJjZTogU291cmNlO1xuICBwdWJsaWMgY3VycmVudEF0dHJpYnV0ZTogT3B0aW9uPEF0dHJpYnV0ZT4gPSBudWxsO1xuICBwdWJsaWMgY3VycmVudE5vZGU6IE9wdGlvbjxcbiAgICBSZWFkb25seTxcbiAgICAgIHwgUGFyc2VyTm9kZUJ1aWxkZXI8QVNUdjEuQ29tbWVudFN0YXRlbWVudD5cbiAgICAgIHwgQVNUdjEuVGV4dE5vZGVcbiAgICAgIHwgUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdTdGFydFRhZyc+PlxuICAgICAgfCBQYXJzZXJOb2RlQnVpbGRlcjxUYWc8J0VuZFRhZyc+PlxuICAgID5cbiAgPiA9IG51bGw7XG4gIHB1YmxpYyB0b2tlbml6ZXI6IEV2ZW50ZWRUb2tlbml6ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc291cmNlOiBTb3VyY2UsXG4gICAgZW50aXR5UGFyc2VyID0gbmV3IEVudGl0eVBhcnNlcihuYW1lZENoYXJSZWZzKSxcbiAgICBtb2RlOiAncHJlY29tcGlsZScgfCAnY29kZW1vZCcgPSAncHJlY29tcGlsZSdcbiAgKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5saW5lcyA9IHNvdXJjZS5zb3VyY2Uuc3BsaXQoLyg/Olxcclxcbj98XFxuKS9nKTtcbiAgICB0aGlzLnRva2VuaXplciA9IG5ldyBFdmVudGVkVG9rZW5pemVyKHRoaXMsIGVudGl0eVBhcnNlciwgbW9kZSk7XG4gIH1cblxuICBvZmZzZXQoKTogU291cmNlT2Zmc2V0IHtcbiAgICBsZXQgeyBsaW5lLCBjb2x1bW4gfSA9IHRoaXMudG9rZW5pemVyO1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5vZmZzZXRGb3IobGluZSwgY29sdW1uKTtcbiAgfVxuXG4gIHBvcyh7IGxpbmUsIGNvbHVtbiB9OiBTb3VyY2VQb3NpdGlvbik6IFNvdXJjZU9mZnNldCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm9mZnNldEZvcihsaW5lLCBjb2x1bW4pO1xuICB9XG5cbiAgZmluaXNoPFQgZXh0ZW5kcyB7IGxvYzogU291cmNlU3BhbiB9Pihub2RlOiBQYXJzZXJOb2RlQnVpbGRlcjxUPik6IFQge1xuICAgIHJldHVybiAoYXNzaWduKHt9LCBub2RlLCB7XG4gICAgICBsb2M6IG5vZGUubG9jLnVudGlsKHRoaXMub2Zmc2V0KCkpLFxuICAgIH0gYXMgY29uc3QpIGFzIHVua25vd24pIGFzIFQ7XG5cbiAgICAvLyBub2RlLmxvYyA9IG5vZGUubG9jLndpdGhFbmQoZW5kKTtcbiAgfVxuXG4gIGFic3RyYWN0IFByb2dyYW0obm9kZTogSEJTLlByb2dyYW0pOiBIQlMuT3V0cHV0PCdQcm9ncmFtJz47XG4gIGFic3RyYWN0IE11c3RhY2hlU3RhdGVtZW50KG5vZGU6IEhCUy5NdXN0YWNoZVN0YXRlbWVudCk6IEhCUy5PdXRwdXQ8J011c3RhY2hlU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IERlY29yYXRvcihub2RlOiBIQlMuRGVjb3JhdG9yKTogSEJTLk91dHB1dDwnRGVjb3JhdG9yJz47XG4gIGFic3RyYWN0IEJsb2NrU3RhdGVtZW50KG5vZGU6IEhCUy5CbG9ja1N0YXRlbWVudCk6IEhCUy5PdXRwdXQ8J0Jsb2NrU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IERlY29yYXRvckJsb2NrKG5vZGU6IEhCUy5EZWNvcmF0b3JCbG9jayk6IEhCUy5PdXRwdXQ8J0RlY29yYXRvckJsb2NrJz47XG4gIGFic3RyYWN0IFBhcnRpYWxTdGF0ZW1lbnQobm9kZTogSEJTLlBhcnRpYWxTdGF0ZW1lbnQpOiBIQlMuT3V0cHV0PCdQYXJ0aWFsU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IFBhcnRpYWxCbG9ja1N0YXRlbWVudChcbiAgICBub2RlOiBIQlMuUGFydGlhbEJsb2NrU3RhdGVtZW50XG4gICk6IEhCUy5PdXRwdXQ8J1BhcnRpYWxCbG9ja1N0YXRlbWVudCc+O1xuICBhYnN0cmFjdCBDb250ZW50U3RhdGVtZW50KG5vZGU6IEhCUy5Db250ZW50U3RhdGVtZW50KTogSEJTLk91dHB1dDwnQ29udGVudFN0YXRlbWVudCc+O1xuICBhYnN0cmFjdCBDb21tZW50U3RhdGVtZW50KG5vZGU6IEhCUy5Db21tZW50U3RhdGVtZW50KTogSEJTLk91dHB1dDwnQ29tbWVudFN0YXRlbWVudCc+O1xuICBhYnN0cmFjdCBTdWJFeHByZXNzaW9uKG5vZGU6IEhCUy5TdWJFeHByZXNzaW9uKTogSEJTLk91dHB1dDwnU3ViRXhwcmVzc2lvbic+O1xuICBhYnN0cmFjdCBQYXRoRXhwcmVzc2lvbihub2RlOiBIQlMuUGF0aEV4cHJlc3Npb24pOiBIQlMuT3V0cHV0PCdQYXRoRXhwcmVzc2lvbic+O1xuICBhYnN0cmFjdCBTdHJpbmdMaXRlcmFsKG5vZGU6IEhCUy5TdHJpbmdMaXRlcmFsKTogSEJTLk91dHB1dDwnU3RyaW5nTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBCb29sZWFuTGl0ZXJhbChub2RlOiBIQlMuQm9vbGVhbkxpdGVyYWwpOiBIQlMuT3V0cHV0PCdCb29sZWFuTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBOdW1iZXJMaXRlcmFsKG5vZGU6IEhCUy5OdW1iZXJMaXRlcmFsKTogSEJTLk91dHB1dDwnTnVtYmVyTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBVbmRlZmluZWRMaXRlcmFsKG5vZGU6IEhCUy5VbmRlZmluZWRMaXRlcmFsKTogSEJTLk91dHB1dDwnVW5kZWZpbmVkTGl0ZXJhbCc+O1xuICBhYnN0cmFjdCBOdWxsTGl0ZXJhbChub2RlOiBIQlMuTnVsbExpdGVyYWwpOiBIQlMuT3V0cHV0PCdOdWxsTGl0ZXJhbCc+O1xuXG4gIGFic3RyYWN0IHJlc2V0KCk6IHZvaWQ7XG4gIGFic3RyYWN0IGZpbmlzaERhdGEoKTogdm9pZDtcbiAgYWJzdHJhY3QgdGFnT3BlbigpOiB2b2lkO1xuICBhYnN0cmFjdCBiZWdpbkRhdGEoKTogdm9pZDtcbiAgYWJzdHJhY3QgYXBwZW5kVG9EYXRhKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luU3RhcnRUYWcoKTogdm9pZDtcbiAgYWJzdHJhY3QgYXBwZW5kVG9UYWdOYW1lKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luQXR0cmlidXRlKCk6IHZvaWQ7XG4gIGFic3RyYWN0IGFwcGVuZFRvQXR0cmlidXRlTmFtZShjaGFyOiBzdHJpbmcpOiB2b2lkO1xuICBhYnN0cmFjdCBiZWdpbkF0dHJpYnV0ZVZhbHVlKHF1b3RlZDogYm9vbGVhbik6IHZvaWQ7XG4gIGFic3RyYWN0IGFwcGVuZFRvQXR0cmlidXRlVmFsdWUoY2hhcjogc3RyaW5nKTogdm9pZDtcbiAgYWJzdHJhY3QgZmluaXNoQXR0cmlidXRlVmFsdWUoKTogdm9pZDtcbiAgYWJzdHJhY3QgbWFya1RhZ0FzU2VsZkNsb3NpbmcoKTogdm9pZDtcbiAgYWJzdHJhY3QgYmVnaW5FbmRUYWcoKTogdm9pZDtcbiAgYWJzdHJhY3QgZmluaXNoVGFnKCk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luQ29tbWVudCgpOiB2b2lkO1xuICBhYnN0cmFjdCBhcHBlbmRUb0NvbW1lbnREYXRhKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGZpbmlzaENvbW1lbnQoKTogdm9pZDtcbiAgYWJzdHJhY3QgcmVwb3J0U3ludGF4RXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQ7XG5cbiAgZ2V0IGN1cnJlbnRBdHRyKCk6IEF0dHJpYnV0ZSB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzLmN1cnJlbnRBdHRyaWJ1dGUsICdleHBlY3RlZCBhdHRyaWJ1dGUnKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VGFnKCk6IFBhcnNlck5vZGVCdWlsZGVyPFRhZzwnU3RhcnRUYWcnIHwgJ0VuZFRhZyc+PiB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIChub2RlLnR5cGUgPT09ICdTdGFydFRhZycgfHwgbm9kZS50eXBlID09PSAnRW5kVGFnJyksICdleHBlY3RlZCB0YWcnKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50U3RhcnRUYWcoKTogUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdTdGFydFRhZyc+PiB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIG5vZGUudHlwZSA9PT0gJ1N0YXJ0VGFnJywgJ2V4cGVjdGVkIHN0YXJ0IHRhZycpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRFbmRUYWcoKTogUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdFbmRUYWcnPj4ge1xuICAgIGxldCBub2RlID0gdGhpcy5jdXJyZW50Tm9kZTtcbiAgICBhc3NlcnQobm9kZSAmJiBub2RlLnR5cGUgPT09ICdFbmRUYWcnLCAnZXhwZWN0ZWQgZW5kIHRhZycpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRDb21tZW50KCk6IFBhcnNlck5vZGVCdWlsZGVyPEFTVHYxLkNvbW1lbnRTdGF0ZW1lbnQ+IHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgYXNzZXJ0KG5vZGUgJiYgbm9kZS50eXBlID09PSAnQ29tbWVudFN0YXRlbWVudCcsICdleHBlY3RlZCBhIGNvbW1lbnQnKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50RGF0YSgpOiBBU1R2MS5UZXh0Tm9kZSB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIG5vZGUudHlwZSA9PT0gJ1RleHROb2RlJywgJ2V4cGVjdGVkIGEgdGV4dCBub2RlJyk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhY2NlcHRUZW1wbGF0ZShub2RlOiBIQlMuUHJvZ3JhbSk6IEFTVHYxLlRlbXBsYXRlIHtcbiAgICByZXR1cm4gdGhpc1tub2RlLnR5cGUgYXMgJ1Byb2dyYW0nXShub2RlKSBhcyBBU1R2MS5UZW1wbGF0ZTtcbiAgfVxuXG4gIGFjY2VwdE5vZGUobm9kZTogSEJTLlByb2dyYW0pOiBBU1R2MS5CbG9jayB8IEFTVHYxLlRlbXBsYXRlO1xuICBhY2NlcHROb2RlPFUgZXh0ZW5kcyBIQlMuTm9kZSB8IEFTVHYxLk5vZGU+KG5vZGU6IEhCUy5Ob2RlKTogVTtcbiAgYWNjZXB0Tm9kZTxUIGV4dGVuZHMgSEJTLk5vZGVUeXBlPihub2RlOiBIQlMuTm9kZTxUPik6IEhCUy5PdXRwdXQ8VD4ge1xuICAgIHJldHVybiAodGhpc1tub2RlLnR5cGUgYXMgVF0gYXMgKG5vZGU6IEhCUy5Ob2RlPFQ+KSA9PiBIQlMuT3V0cHV0PFQ+KShub2RlKTtcbiAgfVxuXG4gIGN1cnJlbnRFbGVtZW50KCk6IEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRTdGFja1t0aGlzLmVsZW1lbnRTdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHNvdXJjZUZvck5vZGUobm9kZTogSEJTLk5vZGUsIGVuZE5vZGU/OiB7IGxvYzogSEJTLlNvdXJjZUxvY2F0aW9uIH0pOiBzdHJpbmcge1xuICAgIGxldCBmaXJzdExpbmUgPSBub2RlLmxvYy5zdGFydC5saW5lIC0gMTtcbiAgICBsZXQgY3VycmVudExpbmUgPSBmaXJzdExpbmUgLSAxO1xuICAgIGxldCBmaXJzdENvbHVtbiA9IG5vZGUubG9jLnN0YXJ0LmNvbHVtbjtcbiAgICBsZXQgc3RyaW5nID0gW107XG4gICAgbGV0IGxpbmU7XG5cbiAgICBsZXQgbGFzdExpbmU6IG51bWJlcjtcbiAgICBsZXQgbGFzdENvbHVtbjogbnVtYmVyO1xuXG4gICAgaWYgKGVuZE5vZGUpIHtcbiAgICAgIGxhc3RMaW5lID0gZW5kTm9kZS5sb2MuZW5kLmxpbmUgLSAxO1xuICAgICAgbGFzdENvbHVtbiA9IGVuZE5vZGUubG9jLmVuZC5jb2x1bW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RMaW5lID0gbm9kZS5sb2MuZW5kLmxpbmUgLSAxO1xuICAgICAgbGFzdENvbHVtbiA9IG5vZGUubG9jLmVuZC5jb2x1bW47XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnJlbnRMaW5lIDwgbGFzdExpbmUpIHtcbiAgICAgIGN1cnJlbnRMaW5lKys7XG4gICAgICBsaW5lID0gdGhpcy5saW5lc1tjdXJyZW50TGluZV07XG5cbiAgICAgIGlmIChjdXJyZW50TGluZSA9PT0gZmlyc3RMaW5lKSB7XG4gICAgICAgIGlmIChmaXJzdExpbmUgPT09IGxhc3RMaW5lKSB7XG4gICAgICAgICAgc3RyaW5nLnB1c2gobGluZS5zbGljZShmaXJzdENvbHVtbiwgbGFzdENvbHVtbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmluZy5wdXNoKGxpbmUuc2xpY2UoZmlyc3RDb2x1bW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50TGluZSA9PT0gbGFzdExpbmUpIHtcbiAgICAgICAgc3RyaW5nLnB1c2gobGluZS5zbGljZSgwLCBsYXN0Q29sdW1uKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJpbmcucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nLmpvaW4oJ1xcbicpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9