parser.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.Parser = void 0;
  6. var _util = require("@glimmer/util");
  7. var _simpleHtmlTokenizer = require("simple-html-tokenizer");
  8. class Parser {
  9. constructor(source, entityParser = new _simpleHtmlTokenizer.EntityParser(_simpleHtmlTokenizer.HTML5NamedCharRefs), mode = 'precompile') {
  10. this.elementStack = [];
  11. this.currentAttribute = null;
  12. this.currentNode = null;
  13. this.source = source;
  14. this.lines = source.source.split(/(?:\r\n?|\n)/g);
  15. this.tokenizer = new _simpleHtmlTokenizer.EventedTokenizer(this, entityParser, mode);
  16. }
  17. offset() {
  18. let {
  19. line,
  20. column
  21. } = this.tokenizer;
  22. return this.source.offsetFor(line, column);
  23. }
  24. pos({
  25. line,
  26. column
  27. }) {
  28. return this.source.offsetFor(line, column);
  29. }
  30. finish(node) {
  31. return (0, _util.assign)({}, node, {
  32. loc: node.loc.until(this.offset())
  33. }); // node.loc = node.loc.withEnd(end);
  34. }
  35. get currentAttr() {
  36. return this.currentAttribute;
  37. }
  38. get currentTag() {
  39. let node = this.currentNode;
  40. false && (0, _util.assert)(node && (node.type === 'StartTag' || node.type === 'EndTag'), 'expected tag');
  41. return node;
  42. }
  43. get currentStartTag() {
  44. let node = this.currentNode;
  45. false && (0, _util.assert)(node && node.type === 'StartTag', 'expected start tag');
  46. return node;
  47. }
  48. get currentEndTag() {
  49. let node = this.currentNode;
  50. false && (0, _util.assert)(node && node.type === 'EndTag', 'expected end tag');
  51. return node;
  52. }
  53. get currentComment() {
  54. let node = this.currentNode;
  55. false && (0, _util.assert)(node && node.type === 'CommentStatement', 'expected a comment');
  56. return node;
  57. }
  58. get currentData() {
  59. let node = this.currentNode;
  60. false && (0, _util.assert)(node && node.type === 'TextNode', 'expected a text node');
  61. return node;
  62. }
  63. acceptTemplate(node) {
  64. return this[node.type](node);
  65. }
  66. acceptNode(node) {
  67. return this[node.type](node);
  68. }
  69. currentElement() {
  70. return this.elementStack[this.elementStack.length - 1];
  71. }
  72. sourceForNode(node, endNode) {
  73. let firstLine = node.loc.start.line - 1;
  74. let currentLine = firstLine - 1;
  75. let firstColumn = node.loc.start.column;
  76. let string = [];
  77. let line;
  78. let lastLine;
  79. let lastColumn;
  80. if (endNode) {
  81. lastLine = endNode.loc.end.line - 1;
  82. lastColumn = endNode.loc.end.column;
  83. } else {
  84. lastLine = node.loc.end.line - 1;
  85. lastColumn = node.loc.end.column;
  86. }
  87. while (currentLine < lastLine) {
  88. currentLine++;
  89. line = this.lines[currentLine];
  90. if (currentLine === firstLine) {
  91. if (firstLine === lastLine) {
  92. string.push(line.slice(firstColumn, lastColumn));
  93. } else {
  94. string.push(line.slice(firstColumn));
  95. }
  96. } else if (currentLine === lastLine) {
  97. string.push(line.slice(0, lastColumn));
  98. } else {
  99. string.push(line);
  100. }
  101. }
  102. return string.join('\n');
  103. }
  104. }
  105. exports.Parser = Parser;
  106. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFzQ00sTUFBQSxNQUFBLENBQXNCO0FBZTFCLEVBQUEsV0FBQSxDQUFBLE1BQUEsRUFFRSxZQUFZLEdBQUcsSUFBQSxpQ0FBQSxDQUZqQix1Q0FFaUIsQ0FGakIsRUFHRSxJQUFBLEdBSEYsWUFBQSxFQUcrQztBQWpCckMsU0FBQSxZQUFBLEdBQUEsRUFBQTtBQUdILFNBQUEsZ0JBQUEsR0FBQSxJQUFBO0FBQ0EsU0FBQSxXQUFBLEdBQUEsSUFBQTtBQWVMLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFDQSxTQUFBLEtBQUEsR0FBYSxNQUFNLENBQU4sTUFBQSxDQUFBLEtBQUEsQ0FBYixlQUFhLENBQWI7QUFDQSxTQUFBLFNBQUEsR0FBaUIsSUFBQSxxQ0FBQSxDQUFBLElBQUEsRUFBQSxZQUFBLEVBQWpCLElBQWlCLENBQWpCO0FBQ0Q7O0FBRUQsRUFBQSxNQUFNLEdBQUE7QUFDSixRQUFJO0FBQUEsTUFBQSxJQUFBO0FBQVEsTUFBQTtBQUFSLFFBQW1CLEtBQXZCLFNBQUE7QUFDQSxXQUFPLEtBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQVAsTUFBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxHQUFHLENBQUM7QUFBQSxJQUFBLElBQUE7QUFBUSxJQUFBO0FBQVIsR0FBRCxFQUFpQztBQUNsQyxXQUFPLEtBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQVAsTUFBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxNQUFNLENBQUEsSUFBQSxFQUEwRDtBQUM5RCxXQUFRLGtCQUFNLEVBQU4sRUFBTSxJQUFOLEVBQWlCO0FBQ3ZCLE1BQUEsR0FBRyxFQUFFLElBQUksQ0FBSixHQUFBLENBQUEsS0FBQSxDQUFlLEtBQWYsTUFBZSxFQUFmO0FBRGtCLEtBQWpCLENBQVIsQ0FEOEQsQ0FL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Q0FBSixLQUFBLENBQUEsV0FBQSxFQUFaLFVBQVksQ0FBWjtBQURGLFNBQUEsTUFFTztBQUNMLFVBQUEsTUFBTSxDQUFOLElBQUEsQ0FBWSxJQUFJLENBQUosS0FBQSxDQUFaLFdBQVksQ0FBWjtBQUNEO0FBTEgsT0FBQSxNQU1PLElBQUksV0FBVyxLQUFmLFFBQUEsRUFBOEI7QUFDbkMsUUFBQSxNQUFNLENBQU4sSUFBQSxDQUFZLElBQUksQ0FBSixLQUFBLENBQUEsQ0FBQSxFQUFaLFVBQVksQ0FBWjtBQURLLE9BQUEsTUFFQTtBQUNMLFFBQUEsTUFBTSxDQUFOLElBQUEsQ0FBQSxJQUFBO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPLE1BQU0sQ0FBTixJQUFBLENBQVAsSUFBTyxDQUFQO0FBQ0Q7O0FBckt5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NpZ24sIGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgRW50aXR5UGFyc2VyLFxuICBFdmVudGVkVG9rZW5pemVyLFxuICBIVE1MNU5hbWVkQ2hhclJlZnMgYXMgbmFtZWRDaGFyUmVmcyxcbn0gZnJvbSAnc2ltcGxlLWh0bWwtdG9rZW5pemVyJztcblxuaW1wb3J0IHsgU291cmNlUG9zaXRpb24gfSBmcm9tICcuL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuL3NvdXJjZS9zb3VyY2UnO1xuaW1wb3J0IHsgU291cmNlT2Zmc2V0LCBTb3VyY2VTcGFuIH0gZnJvbSAnLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL3YxL2FwaSc7XG5pbXBvcnQgKiBhcyBIQlMgZnJvbSAnLi92MS9oYW5kbGViYXJzLWFzdCc7XG5cbmV4cG9ydCB0eXBlIFBhcnNlck5vZGVCdWlsZGVyPE4gZXh0ZW5kcyB7IGxvYzogU291cmNlU3BhbiB9PiA9IE9taXQ8TiwgJ2xvYyc+ICYge1xuICBsb2M6IFNvdXJjZU9mZnNldDtcbn07XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnQgPSBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkJsb2NrIHwgQVNUdjEuRWxlbWVudE5vZGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFnPFQgZXh0ZW5kcyAnU3RhcnRUYWcnIHwgJ0VuZFRhZyc+IHtcbiAgcmVhZG9ubHkgdHlwZTogVDtcbiAgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhdHRyaWJ1dGVzOiBBU1R2MS5BdHRyTm9kZVtdO1xuICByZWFkb25seSBtb2RpZmllcnM6IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudFtdO1xuICByZWFkb25seSBjb21tZW50czogQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50W107XG4gIHNlbGZDbG9zaW5nOiBib29sZWFuO1xuICByZWFkb25seSBsb2M6IFNvdXJjZVNwYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjdXJyZW50UGFydDogQVNUdjEuVGV4dE5vZGUgfCBudWxsO1xuICBwYXJ0czogKEFTVHYxLk11c3RhY2hlU3RhdGVtZW50IHwgQVNUdjEuVGV4dE5vZGUpW107XG4gIGlzUXVvdGVkOiBib29sZWFuO1xuICBpc0R5bmFtaWM6IGJvb2xlYW47XG4gIHN0YXJ0OiBTb3VyY2VPZmZzZXQ7XG4gIHZhbHVlU3BhbjogU291cmNlU3Bhbjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhcnNlciB7XG4gIHByb3RlY3RlZCBlbGVtZW50U3RhY2s6IEVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIGxpbmVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgc291cmNlOiBTb3VyY2U7XG4gIHB1YmxpYyBjdXJyZW50QXR0cmlidXRlOiBPcHRpb248QXR0cmlidXRlPiA9IG51bGw7XG4gIHB1YmxpYyBjdXJyZW50Tm9kZTogT3B0aW9uPFxuICAgIFJlYWRvbmx5PFxuICAgICAgfCBQYXJzZXJOb2RlQnVpbGRlcjxBU1R2MS5Db21tZW50U3RhdGVtZW50PlxuICAgICAgfCBBU1R2MS5UZXh0Tm9kZVxuICAgICAgfCBQYXJzZXJOb2RlQnVpbGRlcjxUYWc8J1N0YXJ0VGFnJz4+XG4gICAgICB8IFBhcnNlck5vZGVCdWlsZGVyPFRhZzwnRW5kVGFnJz4+XG4gICAgPlxuICA+ID0gbnVsbDtcbiAgcHVibGljIHRva2VuaXplcjogRXZlbnRlZFRva2VuaXplcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2U6IFNvdXJjZSxcbiAgICBlbnRpdHlQYXJzZXIgPSBuZXcgRW50aXR5UGFyc2VyKG5hbWVkQ2hhclJlZnMpLFxuICAgIG1vZGU6ICdwcmVjb21waWxlJyB8ICdjb2RlbW9kJyA9ICdwcmVjb21waWxlJ1xuICApIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmxpbmVzID0gc291cmNlLnNvdXJjZS5zcGxpdCgvKD86XFxyXFxuP3xcXG4pL2cpO1xuICAgIHRoaXMudG9rZW5pemVyID0gbmV3IEV2ZW50ZWRUb2tlbml6ZXIodGhpcywgZW50aXR5UGFyc2VyLCBtb2RlKTtcbiAgfVxuXG4gIG9mZnNldCgpOiBTb3VyY2VPZmZzZXQge1xuICAgIGxldCB7IGxpbmUsIGNvbHVtbiB9ID0gdGhpcy50b2tlbml6ZXI7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm9mZnNldEZvcihsaW5lLCBjb2x1bW4pO1xuICB9XG5cbiAgcG9zKHsgbGluZSwgY29sdW1uIH06IFNvdXJjZVBvc2l0aW9uKTogU291cmNlT2Zmc2V0IHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uub2Zmc2V0Rm9yKGxpbmUsIGNvbHVtbik7XG4gIH1cblxuICBmaW5pc2g8VCBleHRlbmRzIHsgbG9jOiBTb3VyY2VTcGFuIH0+KG5vZGU6IFBhcnNlck5vZGVCdWlsZGVyPFQ+KTogVCB7XG4gICAgcmV0dXJuIChhc3NpZ24oe30sIG5vZGUsIHtcbiAgICAgIGxvYzogbm9kZS5sb2MudW50aWwodGhpcy5vZmZzZXQoKSksXG4gICAgfSBhcyBjb25zdCkgYXMgdW5rbm93bikgYXMgVDtcblxuICAgIC8vIG5vZGUubG9jID0gbm9kZS5sb2Mud2l0aEVuZChlbmQpO1xuICB9XG5cbiAgYWJzdHJhY3QgUHJvZ3JhbShub2RlOiBIQlMuUHJvZ3JhbSk6IEhCUy5PdXRwdXQ8J1Byb2dyYW0nPjtcbiAgYWJzdHJhY3QgTXVzdGFjaGVTdGF0ZW1lbnQobm9kZTogSEJTLk11c3RhY2hlU3RhdGVtZW50KTogSEJTLk91dHB1dDwnTXVzdGFjaGVTdGF0ZW1lbnQnPjtcbiAgYWJzdHJhY3QgRGVjb3JhdG9yKG5vZGU6IEhCUy5EZWNvcmF0b3IpOiBIQlMuT3V0cHV0PCdEZWNvcmF0b3InPjtcbiAgYWJzdHJhY3QgQmxvY2tTdGF0ZW1lbnQobm9kZTogSEJTLkJsb2NrU3RhdGVtZW50KTogSEJTLk91dHB1dDwnQmxvY2tTdGF0ZW1lbnQnPjtcbiAgYWJzdHJhY3QgRGVjb3JhdG9yQmxvY2sobm9kZTogSEJTLkRlY29yYXRvckJsb2NrKTogSEJTLk91dHB1dDwnRGVjb3JhdG9yQmxvY2snPjtcbiAgYWJzdHJhY3QgUGFydGlhbFN0YXRlbWVudChub2RlOiBIQlMuUGFydGlhbFN0YXRlbWVudCk6IEhCUy5PdXRwdXQ8J1BhcnRpYWxTdGF0ZW1lbnQnPjtcbiAgYWJzdHJhY3QgUGFydGlhbEJsb2NrU3RhdGVtZW50KFxuICAgIG5vZGU6IEhCUy5QYXJ0aWFsQmxvY2tTdGF0ZW1lbnRcbiAgKTogSEJTLk91dHB1dDwnUGFydGlhbEJsb2NrU3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IENvbnRlbnRTdGF0ZW1lbnQobm9kZTogSEJTLkNvbnRlbnRTdGF0ZW1lbnQpOiBIQlMuT3V0cHV0PCdDb250ZW50U3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IENvbW1lbnRTdGF0ZW1lbnQobm9kZTogSEJTLkNvbW1lbnRTdGF0ZW1lbnQpOiBIQlMuT3V0cHV0PCdDb21tZW50U3RhdGVtZW50Jz47XG4gIGFic3RyYWN0IFN1YkV4cHJlc3Npb24obm9kZTogSEJTLlN1YkV4cHJlc3Npb24pOiBIQlMuT3V0cHV0PCdTdWJFeHByZXNzaW9uJz47XG4gIGFic3RyYWN0IFBhdGhFeHByZXNzaW9uKG5vZGU6IEhCUy5QYXRoRXhwcmVzc2lvbik6IEhCUy5PdXRwdXQ8J1BhdGhFeHByZXNzaW9uJz47XG4gIGFic3RyYWN0IFN0cmluZ0xpdGVyYWwobm9kZTogSEJTLlN0cmluZ0xpdGVyYWwpOiBIQlMuT3V0cHV0PCdTdHJpbmdMaXRlcmFsJz47XG4gIGFic3RyYWN0IEJvb2xlYW5MaXRlcmFsKG5vZGU6IEhCUy5Cb29sZWFuTGl0ZXJhbCk6IEhCUy5PdXRwdXQ8J0Jvb2xlYW5MaXRlcmFsJz47XG4gIGFic3RyYWN0IE51bWJlckxpdGVyYWwobm9kZTogSEJTLk51bWJlckxpdGVyYWwpOiBIQlMuT3V0cHV0PCdOdW1iZXJMaXRlcmFsJz47XG4gIGFic3RyYWN0IFVuZGVmaW5lZExpdGVyYWwobm9kZTogSEJTLlVuZGVmaW5lZExpdGVyYWwpOiBIQlMuT3V0cHV0PCdVbmRlZmluZWRMaXRlcmFsJz47XG4gIGFic3RyYWN0IE51bGxMaXRlcmFsKG5vZGU6IEhCUy5OdWxsTGl0ZXJhbCk6IEhCUy5PdXRwdXQ8J051bGxMaXRlcmFsJz47XG5cbiAgYWJzdHJhY3QgcmVzZXQoKTogdm9pZDtcbiAgYWJzdHJhY3QgZmluaXNoRGF0YSgpOiB2b2lkO1xuICBhYnN0cmFjdCB0YWdPcGVuKCk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luRGF0YSgpOiB2b2lkO1xuICBhYnN0cmFjdCBhcHBlbmRUb0RhdGEoY2hhcjogc3RyaW5nKTogdm9pZDtcbiAgYWJzdHJhY3QgYmVnaW5TdGFydFRhZygpOiB2b2lkO1xuICBhYnN0cmFjdCBhcHBlbmRUb1RhZ05hbWUoY2hhcjogc3RyaW5nKTogdm9pZDtcbiAgYWJzdHJhY3QgYmVnaW5BdHRyaWJ1dGUoKTogdm9pZDtcbiAgYWJzdHJhY3QgYXBwZW5kVG9BdHRyaWJ1dGVOYW1lKGNoYXI6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGJlZ2luQXR0cmlidXRlVmFsdWUocXVvdGVkOiBib29sZWFuKTogdm9pZDtcbiAgYWJzdHJhY3QgYXBwZW5kVG9BdHRyaWJ1dGVWYWx1ZShjaGFyOiBzdHJpbmcpOiB2b2lkO1xuICBhYnN0cmFjdCBmaW5pc2hBdHRyaWJ1dGVWYWx1ZSgpOiB2b2lkO1xuICBhYnN0cmFjdCBtYXJrVGFnQXNTZWxmQ2xvc2luZygpOiB2b2lkO1xuICBhYnN0cmFjdCBiZWdpbkVuZFRhZygpOiB2b2lkO1xuICBhYnN0cmFjdCBmaW5pc2hUYWcoKTogdm9pZDtcbiAgYWJzdHJhY3QgYmVnaW5Db21tZW50KCk6IHZvaWQ7XG4gIGFic3RyYWN0IGFwcGVuZFRvQ29tbWVudERhdGEoY2hhcjogc3RyaW5nKTogdm9pZDtcbiAgYWJzdHJhY3QgZmluaXNoQ29tbWVudCgpOiB2b2lkO1xuICBhYnN0cmFjdCByZXBvcnRTeW50YXhFcnJvcihlcnJvcjogc3RyaW5nKTogdm9pZDtcblxuICBnZXQgY3VycmVudEF0dHIoKTogQXR0cmlidXRlIHtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXMuY3VycmVudEF0dHJpYnV0ZSwgJ2V4cGVjdGVkIGF0dHJpYnV0ZScpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRUYWcoKTogUGFyc2VyTm9kZUJ1aWxkZXI8VGFnPCdTdGFydFRhZycgfCAnRW5kVGFnJz4+IHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgYXNzZXJ0KG5vZGUgJiYgKG5vZGUudHlwZSA9PT0gJ1N0YXJ0VGFnJyB8fCBub2RlLnR5cGUgPT09ICdFbmRUYWcnKSwgJ2V4cGVjdGVkIHRhZycpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTdGFydFRhZygpOiBQYXJzZXJOb2RlQnVpbGRlcjxUYWc8J1N0YXJ0VGFnJz4+IHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgYXNzZXJ0KG5vZGUgJiYgbm9kZS50eXBlID09PSAnU3RhcnRUYWcnLCAnZXhwZWN0ZWQgc3RhcnQgdGFnJyk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBnZXQgY3VycmVudEVuZFRhZygpOiBQYXJzZXJOb2RlQnVpbGRlcjxUYWc8J0VuZFRhZyc+PiB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgIGFzc2VydChub2RlICYmIG5vZGUudHlwZSA9PT0gJ0VuZFRhZycsICdleHBlY3RlZCBlbmQgdGFnJyk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBnZXQgY3VycmVudENvbW1lbnQoKTogUGFyc2VyTm9kZUJ1aWxkZXI8QVNUdjEuQ29tbWVudFN0YXRlbWVudD4ge1xuICAgIGxldCBub2RlID0gdGhpcy5jdXJyZW50Tm9kZTtcbiAgICBhc3NlcnQobm9kZSAmJiBub2RlLnR5cGUgPT09ICdDb21tZW50U3RhdGVtZW50JywgJ2V4cGVjdGVkIGEgY29tbWVudCcpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnREYXRhKCk6IEFTVHYxLlRleHROb2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgYXNzZXJ0KG5vZGUgJiYgbm9kZS50eXBlID09PSAnVGV4dE5vZGUnLCAnZXhwZWN0ZWQgYSB0ZXh0IG5vZGUnKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGFjY2VwdFRlbXBsYXRlKG5vZGU6IEhCUy5Qcm9ncmFtKTogQVNUdjEuVGVtcGxhdGUge1xuICAgIHJldHVybiB0aGlzW25vZGUudHlwZSBhcyAnUHJvZ3JhbSddKG5vZGUpIGFzIEFTVHYxLlRlbXBsYXRlO1xuICB9XG5cbiAgYWNjZXB0Tm9kZShub2RlOiBIQlMuUHJvZ3JhbSk6IEFTVHYxLkJsb2NrIHwgQVNUdjEuVGVtcGxhdGU7XG4gIGFjY2VwdE5vZGU8VSBleHRlbmRzIEhCUy5Ob2RlIHwgQVNUdjEuTm9kZT4obm9kZTogSEJTLk5vZGUpOiBVO1xuICBhY2NlcHROb2RlPFQgZXh0ZW5kcyBIQlMuTm9kZVR5cGU+KG5vZGU6IEhCUy5Ob2RlPFQ+KTogSEJTLk91dHB1dDxUPiB7XG4gICAgcmV0dXJuICh0aGlzW25vZGUudHlwZSBhcyBUXSBhcyAobm9kZTogSEJTLk5vZGU8VD4pID0+IEhCUy5PdXRwdXQ8VD4pKG5vZGUpO1xuICB9XG5cbiAgY3VycmVudEVsZW1lbnQoKTogRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrW3RoaXMuZWxlbWVudFN0YWNrLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgc291cmNlRm9yTm9kZShub2RlOiBIQlMuTm9kZSwgZW5kTm9kZT86IHsgbG9jOiBIQlMuU291cmNlTG9jYXRpb24gfSk6IHN0cmluZyB7XG4gICAgbGV0IGZpcnN0TGluZSA9IG5vZGUubG9jLnN0YXJ0LmxpbmUgLSAxO1xuICAgIGxldCBjdXJyZW50TGluZSA9IGZpcnN0TGluZSAtIDE7XG4gICAgbGV0IGZpcnN0Q29sdW1uID0gbm9kZS5sb2Muc3RhcnQuY29sdW1uO1xuICAgIGxldCBzdHJpbmcgPSBbXTtcbiAgICBsZXQgbGluZTtcblxuICAgIGxldCBsYXN0TGluZTogbnVtYmVyO1xuICAgIGxldCBsYXN0Q29sdW1uOiBudW1iZXI7XG5cbiAgICBpZiAoZW5kTm9kZSkge1xuICAgICAgbGFzdExpbmUgPSBlbmROb2RlLmxvYy5lbmQubGluZSAtIDE7XG4gICAgICBsYXN0Q29sdW1uID0gZW5kTm9kZS5sb2MuZW5kLmNvbHVtbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdExpbmUgPSBub2RlLmxvYy5lbmQubGluZSAtIDE7XG4gICAgICBsYXN0Q29sdW1uID0gbm9kZS5sb2MuZW5kLmNvbHVtbjtcbiAgICB9XG5cbiAgICB3aGlsZSAoY3VycmVudExpbmUgPCBsYXN0TGluZSkge1xuICAgICAgY3VycmVudExpbmUrKztcbiAgICAgIGxpbmUgPSB0aGlzLmxpbmVzW2N1cnJlbnRMaW5lXTtcblxuICAgICAgaWYgKGN1cnJlbnRMaW5lID09PSBmaXJzdExpbmUpIHtcbiAgICAgICAgaWYgKGZpcnN0TGluZSA9PT0gbGFzdExpbmUpIHtcbiAgICAgICAgICBzdHJpbmcucHVzaChsaW5lLnNsaWNlKGZpcnN0Q29sdW1uLCBsYXN0Q29sdW1uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyaW5nLnB1c2gobGluZS5zbGljZShmaXJzdENvbHVtbikpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMaW5lID09PSBsYXN0TGluZSkge1xuICAgICAgICBzdHJpbmcucHVzaChsaW5lLnNsaWNlKDAsIGxhc3RDb2x1bW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmcuam9pbignXFxuJyk7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=