"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.voidMap = void 0; var _util = require("./util"); function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var voidMap = Object.create(null); exports.voidMap = voidMap; var voidTagNames = 'area base br col command embed hr img input keygen link meta param source track wbr'; voidTagNames.split(' ').forEach(function (tagName) { voidMap[tagName] = true; }); var NON_WHITESPACE = /\S/; var Printer = /*#__PURE__*/function () { function Printer(options) { this.buffer = ''; this.options = options; } /* This is used by _all_ methods on this Printer class that add to `this.buffer`, it allows consumers of the printer to use alternate string representations for a given node. The primary use case for this are things like source -> source codemod utilities. For example, ember-template-recast attempts to always preserve the original string formatting in each AST node if no modifications are made to it. */ var _proto = Printer.prototype; _proto.handledByOverride = function handledByOverride(node, ensureLeadingWhitespace) { if (ensureLeadingWhitespace === void 0) { ensureLeadingWhitespace = false; } if (this.options.override !== undefined) { var result = this.options.override(node, this.options); if (typeof result === 'string') { if (ensureLeadingWhitespace && result !== '' && NON_WHITESPACE.test(result[0])) { result = " " + result; } this.buffer += result; return true; } } return false; }; _proto.Node = function Node(node) { switch (node.type) { case 'MustacheStatement': case 'BlockStatement': case 'PartialStatement': case 'MustacheCommentStatement': case 'CommentStatement': case 'TextNode': case 'ElementNode': case 'AttrNode': case 'Block': case 'Template': return this.TopLevelStatement(node); case 'StringLiteral': case 'BooleanLiteral': case 'NumberLiteral': case 'UndefinedLiteral': case 'NullLiteral': case 'PathExpression': case 'SubExpression': return this.Expression(node); case 'Program': return this.Block(node); case 'ConcatStatement': // should have an AttrNode parent return this.ConcatStatement(node); case 'Hash': return this.Hash(node); case 'HashPair': return this.HashPair(node); case 'ElementModifierStatement': return this.ElementModifierStatement(node); } }; _proto.Expression = function Expression(expression) { switch (expression.type) { case 'StringLiteral': case 'BooleanLiteral': case 'NumberLiteral': case 'UndefinedLiteral': case 'NullLiteral': return this.Literal(expression); case 'PathExpression': return this.PathExpression(expression); case 'SubExpression': return this.SubExpression(expression); } }; _proto.Literal = function Literal(literal) { switch (literal.type) { case 'StringLiteral': return this.StringLiteral(literal); case 'BooleanLiteral': return this.BooleanLiteral(literal); case 'NumberLiteral': return this.NumberLiteral(literal); case 'UndefinedLiteral': return this.UndefinedLiteral(literal); case 'NullLiteral': return this.NullLiteral(literal); } }; _proto.TopLevelStatement = function TopLevelStatement(statement) { switch (statement.type) { case 'MustacheStatement': return this.MustacheStatement(statement); case 'BlockStatement': return this.BlockStatement(statement); case 'PartialStatement': return this.PartialStatement(statement); case 'MustacheCommentStatement': return this.MustacheCommentStatement(statement); case 'CommentStatement': return this.CommentStatement(statement); case 'TextNode': return this.TextNode(statement); case 'ElementNode': return this.ElementNode(statement); case 'Block': case 'Template': return this.Block(statement); case 'AttrNode': // should have element return this.AttrNode(statement); } }; _proto.Block = function Block(block) { /* When processing a template like: ```hbs {{#if whatever}} whatever {{else if somethingElse}} something else {{else}} fallback {{/if}} ``` The AST still _effectively_ looks like: ```hbs {{#if whatever}} whatever {{else}}{{#if somethingElse}} something else {{else}} fallback {{/if}}{{/if}} ``` The only way we can tell if that is the case is by checking for `block.chained`, but unfortunately when the actual statements are processed the `block.body[0]` node (which will always be a `BlockStatement`) has no clue that its ancestor `Block` node was chained. This "forwards" the `chained` setting so that we can check it later when processing the `BlockStatement`. */ if (block.chained) { var firstChild = block.body[0]; firstChild.chained = true; } if (this.handledByOverride(block)) { return; } this.TopLevelStatements(block.body); }; _proto.TopLevelStatements = function TopLevelStatements(statements) { var _this = this; statements.forEach(function (statement) { return _this.TopLevelStatement(statement); }); }; _proto.ElementNode = function ElementNode(el) { if (this.handledByOverride(el)) { return; } this.OpenElementNode(el); this.TopLevelStatements(el.children); this.CloseElementNode(el); }; _proto.OpenElementNode = function OpenElementNode(el) { this.buffer += "<" + el.tag; var parts = [].concat(el.attributes, el.modifiers, el.comments).sort(_util.sortByLoc); for (var _iterator = _createForOfIteratorHelperLoose(parts), _step; !(_step = _iterator()).done;) { var part = _step.value; this.buffer += ' '; switch (part.type) { case 'AttrNode': this.AttrNode(part); break; case 'ElementModifierStatement': this.ElementModifierStatement(part); break; case 'MustacheCommentStatement': this.MustacheCommentStatement(part); break; } } if (el.blockParams.length) { this.BlockParams(el.blockParams); } if (el.selfClosing) { this.buffer += ' /'; } this.buffer += '>'; }; _proto.CloseElementNode = function CloseElementNode(el) { if (el.selfClosing || voidMap[el.tag.toLowerCase()]) { return; } this.buffer += ""; }; _proto.AttrNode = function AttrNode(attr) { if (this.handledByOverride(attr)) { return; } var name = attr.name, value = attr.value; this.buffer += name; if (value.type !== 'TextNode' || value.chars.length > 0) { this.buffer += '='; this.AttrNodeValue(value); } }; _proto.AttrNodeValue = function AttrNodeValue(value) { if (value.type === 'TextNode') { this.buffer += '"'; this.TextNode(value, true); this.buffer += '"'; } else { this.Node(value); } }; _proto.TextNode = function TextNode(text, isAttr) { if (this.handledByOverride(text)) { return; } if (this.options.entityEncoding === 'raw') { this.buffer += text.chars; } else if (isAttr) { this.buffer += (0, _util.escapeAttrValue)(text.chars); } else { this.buffer += (0, _util.escapeText)(text.chars); } }; _proto.MustacheStatement = function MustacheStatement(mustache) { if (this.handledByOverride(mustache)) { return; } this.buffer += mustache.escaped ? '{{' : '{{{'; if (mustache.strip.open) { this.buffer += '~'; } this.Expression(mustache.path); this.Params(mustache.params); this.Hash(mustache.hash); if (mustache.strip.close) { this.buffer += '~'; } this.buffer += mustache.escaped ? '}}' : '}}}'; }; _proto.BlockStatement = function BlockStatement(block) { if (this.handledByOverride(block)) { return; } if (block.chained) { this.buffer += block.inverseStrip.open ? '{{~' : '{{'; this.buffer += 'else '; } else { this.buffer += block.openStrip.open ? '{{~#' : '{{#'; } this.Expression(block.path); this.Params(block.params); this.Hash(block.hash); if (block.program.blockParams.length) { this.BlockParams(block.program.blockParams); } if (block.chained) { this.buffer += block.inverseStrip.close ? '~}}' : '}}'; } else { this.buffer += block.openStrip.close ? '~}}' : '}}'; } this.Block(block.program); if (block.inverse) { if (!block.inverse.chained) { this.buffer += block.inverseStrip.open ? '{{~' : '{{'; this.buffer += 'else'; this.buffer += block.inverseStrip.close ? '~}}' : '}}'; } this.Block(block.inverse); } if (!block.chained) { this.buffer += block.closeStrip.open ? '{{~/' : '{{/'; this.Expression(block.path); this.buffer += block.closeStrip.close ? '~}}' : '}}'; } }; _proto.BlockParams = function BlockParams(blockParams) { this.buffer += " as |" + blockParams.join(' ') + "|"; }; _proto.PartialStatement = function PartialStatement(partial) { if (this.handledByOverride(partial)) { return; } this.buffer += '{{>'; this.Expression(partial.name); this.Params(partial.params); this.Hash(partial.hash); this.buffer += '}}'; }; _proto.ConcatStatement = function ConcatStatement(concat) { var _this2 = this; if (this.handledByOverride(concat)) { return; } this.buffer += '"'; concat.parts.forEach(function (part) { if (part.type === 'TextNode') { _this2.TextNode(part, true); } else { _this2.Node(part); } }); this.buffer += '"'; }; _proto.MustacheCommentStatement = function MustacheCommentStatement(comment) { if (this.handledByOverride(comment)) { return; } this.buffer += "{{!--" + comment.value + "--}}"; }; _proto.ElementModifierStatement = function ElementModifierStatement(mod) { if (this.handledByOverride(mod)) { return; } this.buffer += '{{'; this.Expression(mod.path); this.Params(mod.params); this.Hash(mod.hash); this.buffer += '}}'; }; _proto.CommentStatement = function CommentStatement(comment) { if (this.handledByOverride(comment)) { return; } this.buffer += ""; }; _proto.PathExpression = function PathExpression(path) { if (this.handledByOverride(path)) { return; } this.buffer += path.original; }; _proto.SubExpression = function SubExpression(sexp) { if (this.handledByOverride(sexp)) { return; } this.buffer += '('; this.Expression(sexp.path); this.Params(sexp.params); this.Hash(sexp.hash); this.buffer += ')'; }; _proto.Params = function Params(params) { var _this3 = this; // TODO: implement a top level Params AST node (just like the Hash object) // so that this can also be overridden if (params.length) { params.forEach(function (param) { _this3.buffer += ' '; _this3.Expression(param); }); } }; _proto.Hash = function Hash(hash) { var _this4 = this; if (this.handledByOverride(hash, true)) { return; } hash.pairs.forEach(function (pair) { _this4.buffer += ' '; _this4.HashPair(pair); }); }; _proto.HashPair = function HashPair(pair) { if (this.handledByOverride(pair)) { return; } this.buffer += pair.key; this.buffer += '='; this.Node(pair.value); }; _proto.StringLiteral = function StringLiteral(str) { if (this.handledByOverride(str)) { return; } this.buffer += JSON.stringify(str.value); }; _proto.BooleanLiteral = function BooleanLiteral(bool) { if (this.handledByOverride(bool)) { return; } this.buffer += bool.value; }; _proto.NumberLiteral = function NumberLiteral(number) { if (this.handledByOverride(number)) { return; } this.buffer += number.value; }; _proto.UndefinedLiteral = function UndefinedLiteral(node) { if (this.handledByOverride(node)) { return; } this.buffer += 'undefined'; }; _proto.NullLiteral = function NullLiteral(node) { if (this.handledByOverride(node)) { return; } this.buffer += 'null'; }; _proto.print = function print(node) { var options = this.options; if (options.override) { var result = options.override(node, options); if (result !== undefined) { return result; } } this.buffer = ''; this.Node(node); return this.buffer; }; return Printer; }(); exports.default = Printer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvZ2VuZXJhdGlvbi9wcmludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVPLElBQU0sT0FBTyxHQUVoQixNQUFNLENBQU4sTUFBQSxDQUZHLElBRUgsQ0FGRzs7QUFJUCxJQUFJLFlBQVksR0FBaEIscUZBQUE7QUFFQSxZQUFZLENBQVosS0FBQSxDQUFBLEdBQUEsRUFBQSxPQUFBLENBQWlDLFVBQUQsT0FBQyxFQUFXO0FBQzFDLEVBQUEsT0FBTyxDQUFQLE9BQU8sQ0FBUCxHQUFBLElBQUE7QUFERixDQUFBO0FBSUEsSUFBTSxjQUFjLEdBQXBCLElBQUE7O0lBc0JjLE87QUFJWixXQUFBLE9BQUEsQ0FBQSxPQUFBLEVBQW1DO0FBSDNCLFNBQUEsTUFBQSxHQUFBLEVBQUE7QUFJTixTQUFBLE9BQUEsR0FBQSxPQUFBO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7O1NBU0EsaUIsR0FBQSxTQUFBLGlCQUFBLENBQUEsSUFBQSxFQUFBLHVCQUFBLEVBQW1FO0FBQUEsUUFBL0IsdUJBQStCLEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFBL0IsTUFBQSx1QkFBK0IsR0FBbEQsS0FBbUI7QUFBK0I7O0FBQ2pFLFFBQUksS0FBQSxPQUFBLENBQUEsUUFBQSxLQUFKLFNBQUEsRUFBeUM7QUFDdkMsVUFBSSxNQUFNLEdBQUcsS0FBQSxPQUFBLENBQUEsUUFBQSxDQUFBLElBQUEsRUFBNEIsS0FBekMsT0FBYSxDQUFiOztBQUNBLFVBQUksT0FBQSxNQUFBLEtBQUosUUFBQSxFQUFnQztBQUM5QixZQUFJLHVCQUF1QixJQUFJLE1BQU0sS0FBakMsRUFBQSxJQUE0QyxjQUFjLENBQWQsSUFBQSxDQUFvQixNQUFNLENBQTFFLENBQTBFLENBQTFCLENBQWhELEVBQWdGO0FBQzlFLFVBQUEsTUFB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QSxXQUFBOzs7U0FHRixXLEdBQUEsU0FBQSxXQUFBLENBQUEsSUFBQSxFQUFtQztBQUNqQyxRQUFJLEtBQUEsaUJBQUEsQ0FBSixJQUFJLENBQUosRUFBa0M7QUFDaEM7QUFDRDs7QUFFRCxTQUFBLE1BQUEsSUFBQSxNQUFBOzs7U0FHRixLLEdBQUEsU0FBQSxLQUFBLENBQUEsSUFBQSxFQUFzQjtBQUFBLFFBQ2QsT0FEYyxHQUFBLEtBQUEsT0FBQTs7QUFHcEIsUUFBSSxPQUFPLENBQVgsUUFBQSxFQUFzQjtBQUNwQixVQUFJLE1BQU0sR0FBRyxPQUFPLENBQVAsUUFBQSxDQUFBLElBQUEsRUFBYixPQUFhLENBQWI7O0FBRUEsVUFBSSxNQUFNLEtBQVYsU0FBQSxFQUEwQjtBQUN4QixlQUFBLE1BQUE7QUFDRDtBQUNGOztBQUVELFNBQUEsTUFBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsV0FBTyxLQUFQLE1BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuLi92MS9hcGknO1xuaW1wb3J0IHsgZXNjYXBlQXR0clZhbHVlLCBlc2NhcGVUZXh0LCBzb3J0QnlMb2MgfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgY29uc3Qgdm9pZE1hcDoge1xuICBbdGFnTmFtZTogc3RyaW5nXTogYm9vbGVhbjtcbn0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5sZXQgdm9pZFRhZ05hbWVzID1cbiAgJ2FyZWEgYmFzZSBiciBjb2wgY29tbWFuZCBlbWJlZCBociBpbWcgaW5wdXQga2V5Z2VuIGxpbmsgbWV0YSBwYXJhbSBzb3VyY2UgdHJhY2sgd2JyJztcbnZvaWRUYWdOYW1lcy5zcGxpdCgnICcpLmZvckVhY2goKHRhZ05hbWUpID0+IHtcbiAgdm9pZE1hcFt0YWdOYW1lXSA9IHRydWU7XG59KTtcblxuY29uc3QgTk9OX1dISVRFU1BBQ0UgPSAvXFxTLztcblxuZXhwb3J0IGludGVyZmFjZSBQcmludGVyT3B0aW9ucyB7XG4gIGVudGl0eUVuY29kaW5nOiAndHJhbnNmb3JtZWQnIHwgJ3Jhdyc7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gb3ZlcnJpZGUgdGhlIG1lY2hhbmlzbSBvZiBwcmludGluZyBhIGdpdmVuIEFTVC5Ob2RlLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgZ2VuZXJhbGx5IG9ubHkgYmUgdXNlZnVsIHRvIHNvdXJjZSAtPiBzb3VyY2UgY29kZW1vZHNcbiAgICogd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gc3BlY2lhbGl6ZS9vdmVycmlkZSB0aGUgd2F5IGEgZ2l2ZW4gbm9kZSBpc1xuICAgKiBwcmludGVkIChlLmcuIHlvdSB3b3VsZCBsaWtlIHRvIHByZXNlcnZlIGFzIG11Y2ggb2YgdGhlIG9yaWdpbmFsXG4gICAqIGZvcm1hdHRpbmcgYXMgcG9zc2libGUpLlxuICAgKlxuICAgKiBXaGVuIHRoZSBwcm92aWRlZCBvdmVycmlkZSByZXR1cm5zIHVuZGVmaW5lZCwgdGhlIGRlZmF1bHQgYnVpbHQgaW4gcHJpbnRpbmdcbiAgICogd2lsbCBiZSBkb25lIGZvciB0aGUgQVNULk5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBhc3QgdGhlIGFzdCBub2RlIHRvIGJlIHByaW50ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGR1cmluZyB0aGUgcHJpbnQoKSBpbnZvY2F0aW9uXG4gICAqL1xuICBvdmVycmlkZT8oYXN0OiBBU1R2MS5Ob2RlLCBvcHRpb25zOiBQcmludGVyT3B0aW9ucyk6IHZvaWQgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByaW50ZXIge1xuICBwcml2YXRlIGJ1ZmZlciA9ICcnO1xuICBwcml2YXRlIG9wdGlvbnM6IFByaW50ZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFByaW50ZXJPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qXG4gICAgVGhpcyBpcyB1c2VkIGJ5IF9hbGxfIG1ldGhvZHMgb24gdGhpcyBQcmludGVyIGNsYXNzIHRoYXQgYWRkIHRvIGB0aGlzLmJ1ZmZlcmAsXG4gICAgaXQgYWxsb3dzIGNvbnN1bWVycyBvZiB0aGUgcHJpbnRlciB0byB1c2UgYWx0ZXJuYXRlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgZm9yXG4gICAgYSBnaXZlbiBub2RlLlxuXG4gICAgVGhlIHByaW1hcnkgdXNlIGNhc2UgZm9yIHRoaXMgYXJlIHRoaW5ncyBsaWtlIHNvdXJjZSAtPiBzb3VyY2UgY29kZW1vZCB1dGlsaXRpZXMuXG4gICAgRm9yIGV4YW1wbGUsIGVtYmVyLXRlbXBsYXRlLXJlY2FzdCBhdHRlbXB0cyB0byBhbHdheXMgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHN0cmluZ1xuICAgIGZvcm1hdHRpbmcgaW4gZWFjaCBBU1Qgbm9kZSBpZiBubyBtb2RpZmljYXRpb25zIGFyZSBtYWRlIHRvIGl0LlxuICAqL1xuICBoYW5kbGVkQnlPdmVycmlkZShub2RlOiBBU1R2MS5Ob2RlLCBlbnN1cmVMZWFkaW5nV2hpdGVzcGFjZSA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlKG5vZGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGVuc3VyZUxlYWRpbmdXaGl0ZXNwYWNlICYmIHJlc3VsdCAhPT0gJycgJiYgTk9OX1dISVRFU1BBQ0UudGVzdChyZXN1bHRbMF0pKSB7XG4gICAgICAgICAgcmVzdWx0ID0gYCAke3Jlc3VsdH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWZmZXIgKz0gcmVzdWx0O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBOb2RlKG5vZGU6IEFTVHYxLk5vZGUpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnTXVzdGFjaGVTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnUGFydGlhbFN0YXRlbWVudCc6XG4gICAgICBjYXNlICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQ29tbWVudFN0YXRlbWVudCc6XG4gICAgICBjYXNlICdUZXh0Tm9kZSc6XG4gICAgICBjYXNlICdFbGVtZW50Tm9kZSc6XG4gICAgICBjYXNlICdBdHRyTm9kZSc6XG4gICAgICBjYXNlICdCbG9jayc6XG4gICAgICBjYXNlICdUZW1wbGF0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLlRvcExldmVsU3RhdGVtZW50KG5vZGUpO1xuICAgICAgY2FzZSAnU3RyaW5nTGl0ZXJhbCc6XG4gICAgICBjYXNlICdCb29sZWFuTGl0ZXJhbCc6XG4gICAgICBjYXNlICdOdW1iZXJMaXRlcmFsJzpcbiAgICAgIGNhc2UgJ1VuZGVmaW5lZExpdGVyYWwnOlxuICAgICAgY2FzZSAnTnVsbExpdGVyYWwnOlxuICAgICAgY2FzZSAnUGF0aEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnU3ViRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiB0aGlzLkV4cHJlc3Npb24obm9kZSk7XG4gICAgICBjYXNlICdQcm9ncmFtJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2sobm9kZSk7XG4gICAgICBjYXNlICdDb25jYXRTdGF0ZW1lbnQnOlxuICAgICAgICAvLyBzaG91bGQgaGF2ZSBhbiBBdHRyTm9kZSBwYXJlbnRcbiAgICAgICAgcmV0dXJuIHRoaXMuQ29uY2F0U3RhdGVtZW50KG5vZGUpO1xuICAgICAgY2FzZSAnSGFzaCc6XG4gICAgICAgIHJldHVybiB0aGlzLkhhc2gobm9kZSk7XG4gICAgICBjYXNlICdIYXNoUGFpcic6XG4gICAgICAgIHJldHVybiB0aGlzLkhhc2hQYWlyKG5vZGUpO1xuICAgICAgY2FzZSAnRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50KG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIEV4cHJlc3Npb24oZXhwcmVzc2lvbjogQVNUdjEuRXhwcmVzc2lvbik6IHZvaWQge1xuICAgIHN3aXRjaCAoZXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICBjYXNlICdTdHJpbmdMaXRlcmFsJzpcbiAgICAgIGNhc2UgJ0Jvb2xlYW5MaXRlcmFsJzpcbiAgICAgIGNhc2UgJ051bWJlckxpdGVyYWwnOlxuICAgICAgY2FzZSAnVW5kZWZpbmVkTGl0ZXJhbCc6XG4gICAgICBjYXNlICdOdWxsTGl0ZXJhbCc6XG4gICAgICAgIHJldHVybiB0aGlzLkxpdGVyYWwoZXhwcmVzc2lvbik7XG4gICAgICBjYXNlICdQYXRoRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiB0aGlzLlBhdGhFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICAgICAgY2FzZSAnU3ViRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiB0aGlzLlN1YkV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgfVxuICB9XG5cbiAgTGl0ZXJhbChsaXRlcmFsOiBBU1R2MS5MaXRlcmFsKTogdm9pZCB7XG4gICAgc3dpdGNoIChsaXRlcmFsLnR5cGUpIHtcbiAgICAgIGNhc2UgJ1N0cmluZ0xpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5TdHJpbmdMaXRlcmFsKGxpdGVyYWwpO1xuICAgICAgY2FzZSAnQm9vbGVhbkxpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5Cb29sZWFuTGl0ZXJhbChsaXRlcmFsKTtcbiAgICAgIGNhc2UgJ051bWJlckxpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5OdW1iZXJMaXRlcmFsKGxpdGVyYWwpO1xuICAgICAgY2FzZSAnVW5kZWZpbmVkTGl0ZXJhbCc6XG4gICAgICAgIHJldHVybiB0aGlzLlVuZGVmaW5lZExpdGVyYWwobGl0ZXJhbCk7XG4gICAgICBjYXNlICdOdWxsTGl0ZXJhbCc6XG4gICAgICAgIHJldHVybiB0aGlzLk51bGxMaXRlcmFsKGxpdGVyYWwpO1xuICAgIH1cbiAgfVxuXG4gIFRvcExldmVsU3RhdGVtZW50KHN0YXRlbWVudDogQVNUdjEuVG9wTGV2ZWxTdGF0ZW1lbnQgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkF0dHJOb2RlKTogdm9pZCB7XG4gICAgc3dpdGNoIChzdGF0ZW1lbnQudHlwZSkge1xuICAgICAgY2FzZSAnTXVzdGFjaGVTdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5NdXN0YWNoZVN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5CbG9ja1N0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgICAgY2FzZSAnUGFydGlhbFN0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLlBhcnRpYWxTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ011c3RhY2hlQ29tbWVudFN0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgICAgY2FzZSAnQ29tbWVudFN0YXRlbWVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLkNvbW1lbnRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ1RleHROb2RlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuVGV4dE5vZGUoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ0VsZW1lbnROb2RlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRWxlbWVudE5vZGUoc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ0Jsb2NrJzpcbiAgICAgIGNhc2UgJ1RlbXBsYXRlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQmxvY2soc3RhdGVtZW50KTtcbiAgICAgIGNhc2UgJ0F0dHJOb2RlJzpcbiAgICAgICAgLy8gc2hvdWxkIGhhdmUgZWxlbWVudFxuICAgICAgICByZXR1cm4gdGhpcy5BdHRyTm9kZShzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIEJsb2NrKGJsb2NrOiBBU1R2MS5CbG9jayB8IEFTVHYxLlByb2dyYW0gfCBBU1R2MS5UZW1wbGF0ZSk6IHZvaWQge1xuICAgIC8qXG4gICAgICBXaGVuIHByb2Nlc3NpbmcgYSB0ZW1wbGF0ZSBsaWtlOlxuXG4gICAgICBgYGBoYnNcbiAgICAgIHt7I2lmIHdoYXRldmVyfX1cbiAgICAgICAgd2hhdGV2ZXJcbiAgICAgIHt7ZWxzZSBpZiBzb21ldGhpbmdFbHNlfX1cbiAgICAgICAgc29tZXRoaW5nIGVsc2VcbiAgICAgIHt7ZWxzZX19XG4gICAgICAgIGZhbGxiYWNrXG4gICAgICB7ey9pZn19XG4gICAgICBgYGBcblxuICAgICAgVGhlIEFTVCBzdGlsbCBfZWZmZWN0aXZlbHlfIGxvb2tzIGxpa2U6XG5cbiAgICAgIGBgYGhic1xuICAgICAge3sjaWYgd2hhdGV2ZXJ9fVxuICAgICAgICB3aGF0ZXZlclxuICAgICAge3tlbHNlfX17eyNpZiBzb21ldGhpbmdFbHNlfX1cbiAgICAgICAgc29tZXRoaW5nIGVsc2VcbiAgICAgIHt7ZWxzZX19XG4gICAgICAgIGZhbGxiYWNrXG4gICAgICB7ey9pZn19e3svaWZ9fVxuICAgICAgYGBgXG5cbiAgICAgIFRoZSBvbmx5IHdheSB3ZSBjYW4gdGVsbCBpZiB0aGF0IGlzIHRoZSBjYXNlIGlzIGJ5IGNoZWNraW5nIGZvclxuICAgICAgYGJsb2NrLmNoYWluZWRgLCBidXQgdW5mb3J0dW5hdGVseSB3aGVuIHRoZSBhY3R1YWwgc3RhdGVtZW50cyBhcmVcbiAgICAgIHByb2Nlc3NlZCB0aGUgYGJsb2NrLmJvZHlbMF1gIG5vZGUgKHdoaWNoIHdpbGwgYWx3YXlzIGJlIGFcbiAgICAgIGBCbG9ja1N0YXRlbWVudGApIGhhcyBubyBjbHVlIHRoYXQgaXRzIGFuY2VzdG9yIGBCbG9ja2Agbm9kZSB3YXNcbiAgICAgIGNoYWluZWQuXG5cbiAgICAgIFRoaXMgXCJmb3J3YXJkc1wiIHRoZSBgY2hhaW5lZGAgc2V0dGluZyBzbyB0aGF0IHdlIGNhbiBjaGVja1xuICAgICAgaXQgbGF0ZXIgd2hlbiBwcm9jZXNzaW5nIHRoZSBgQmxvY2tTdGF0ZW1lbnRgLlxuICAgICovXG4gICAgaWYgKGJsb2NrLmNoYWluZWQpIHtcbiAgICAgIGxldCBmaXJzdENoaWxkID0gYmxvY2suYm9keVswXSBhcyBBU1R2MS5CbG9ja1N0YXRlbWVudDtcbiAgICAgIGZpcnN0Q2hpbGQuY2hhaW5lZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoYmxvY2spKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5Ub3BMZXZlbFN0YXRlbWVudHMoYmxvY2suYm9keSk7XG4gIH1cblxuICBUb3BMZXZlbFN0YXRlbWVudHMoc3RhdGVtZW50czogQVNUdjEuVG9wTGV2ZWxTdGF0ZW1lbnRbXSk6IHZvaWQge1xuICAgIHN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50KSA9PiB0aGlzLlRvcExldmVsU3RhdGVtZW50KHN0YXRlbWVudCkpO1xuICB9XG5cbiAgRWxlbWVudE5vZGUoZWw6IEFTVHYxLkVsZW1lbnROb2RlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5PcGVuRWxlbWVudE5vZGUoZWwpO1xuICAgIHRoaXMuVG9wTGV2ZWxTdGF0ZW1lbnRzKGVsLmNoaWxkcmVuKTtcbiAgICB0aGlzLkNsb3NlRWxlbWVudE5vZGUoZWwpO1xuICB9XG5cbiAgT3BlbkVsZW1lbnROb2RlKGVsOiBBU1R2MS5FbGVtZW50Tm9kZSk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyICs9IGA8JHtlbC50YWd9YDtcbiAgICBjb25zdCBwYXJ0cyA9IFsuLi5lbC5hdHRyaWJ1dGVzLCAuLi5lbC5tb2RpZmllcnMsIC4uLmVsLmNvbW1lbnRzXS5zb3J0KHNvcnRCeUxvYyk7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9ICcgJztcbiAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0F0dHJOb2RlJzpcbiAgICAgICAgICB0aGlzLkF0dHJOb2RlKHBhcnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnOlxuICAgICAgICAgIHRoaXMuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50KHBhcnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnOlxuICAgICAgICAgIHRoaXMuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50KHBhcnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWwuYmxvY2tQYXJhbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLkJsb2NrUGFyYW1zKGVsLmJsb2NrUGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKGVsLnNlbGZDbG9zaW5nKSB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSAnIC8nO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciArPSAnPic7XG4gIH1cblxuICBDbG9zZUVsZW1lbnROb2RlKGVsOiBBU1R2MS5FbGVtZW50Tm9kZSk6IHZvaWQge1xuICAgIGlmIChlbC5zZWxmQ2xvc2luZyB8fCB2b2lkTWFwW2VsLnRhZy50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciArPSBgPC8ke2VsLnRhZ30+YDtcbiAgfVxuXG4gIEF0dHJOb2RlKGF0dHI6IEFTVHYxLkF0dHJOb2RlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoYXR0cikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgeyBuYW1lLCB2YWx1ZSB9ID0gYXR0cjtcblxuICAgIHRoaXMuYnVmZmVyICs9IG5hbWU7XG4gICAgaWYgKHZhbHVlLnR5cGUgIT09ICdUZXh0Tm9kZScgfHwgdmFsdWUuY2hhcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5idWZmZXIgKz0gJz0nO1xuICAgICAgdGhpcy5BdHRyTm9kZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBBdHRyTm9kZVZhbHVlKHZhbHVlOiBBU1R2MS5BdHRyTm9kZVsndmFsdWUnXSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZS50eXBlID09PSAnVGV4dE5vZGUnKSB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSAnXCInO1xuICAgICAgdGhpcy5UZXh0Tm9kZSh2YWx1ZSwgdHJ1ZSk7XG4gICAgICB0aGlzLmJ1ZmZlciArPSAnXCInO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLk5vZGUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIFRleHROb2RlKHRleHQ6IEFTVHYxLlRleHROb2RlLCBpc0F0dHI/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUodGV4dCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmVudGl0eUVuY29kaW5nID09PSAncmF3Jykge1xuICAgICAgdGhpcy5idWZmZXIgKz0gdGV4dC5jaGFycztcbiAgICB9IGVsc2UgaWYgKGlzQXR0cikge1xuICAgICAgdGhpcy5idWZmZXIgKz0gZXNjYXBlQXR0clZhbHVlKHRleHQuY2hhcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSBlc2NhcGVUZXh0KHRleHQuY2hhcnMpO1xuICAgIH1cbiAgfVxuXG4gIE11c3RhY2hlU3RhdGVtZW50KG11c3RhY2hlOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKG11c3RhY2hlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IG11c3RhY2hlLmVzY2FwZWQgPyAne3snIDogJ3t7eyc7XG5cbiAgICBpZiAobXVzdGFjaGUuc3RyaXAub3Blbikge1xuICAgICAgdGhpcy5idWZmZXIgKz0gJ34nO1xuICAgIH1cblxuICAgIHRoaXMuRXhwcmVzc2lvbihtdXN0YWNoZS5wYXRoKTtcbiAgICB0aGlzLlBhcmFtcyhtdXN0YWNoZS5wYXJhbXMpO1xuICAgIHRoaXMuSGFzaChtdXN0YWNoZS5oYXNoKTtcblxuICAgIGlmIChtdXN0YWNoZS5zdHJpcC5jbG9zZSkge1xuICAgICAgdGhpcy5idWZmZXIgKz0gJ34nO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IG11c3RhY2hlLmVzY2FwZWQgPyAnfX0nIDogJ319fSc7XG4gIH1cblxuICBCbG9ja1N0YXRlbWVudChibG9jazogQVNUdjEuQmxvY2tTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShibG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2suY2hhaW5lZCkge1xuICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2suaW52ZXJzZVN0cmlwLm9wZW4gPyAne3t+JyA6ICd7eyc7XG4gICAgICB0aGlzLmJ1ZmZlciArPSAnZWxzZSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlciArPSBibG9jay5vcGVuU3RyaXAub3BlbiA/ICd7e34jJyA6ICd7eyMnO1xuICAgIH1cblxuICAgIHRoaXMuRXhwcmVzc2lvbihibG9jay5wYXRoKTtcbiAgICB0aGlzLlBhcmFtcyhibG9jay5wYXJhbXMpO1xuICAgIHRoaXMuSGFzaChibG9jay5oYXNoKTtcbiAgICBpZiAoYmxvY2sucHJvZ3JhbS5ibG9ja1BhcmFtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuQmxvY2tQYXJhbXMoYmxvY2sucHJvZ3JhbS5ibG9ja1BhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrLmNoYWluZWQpIHtcbiAgICAgIHRoaXMuYnVmZmVyICs9IGJsb2NrLmludmVyc2VTdHJpcC5jbG9zZSA/ICd+fX0nIDogJ319JztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2sub3BlblN0cmlwLmNsb3NlID8gJ359fScgOiAnfX0nO1xuICAgIH1cblxuICAgIHRoaXMuQmxvY2soYmxvY2sucHJvZ3JhbSk7XG5cbiAgICBpZiAoYmxvY2suaW52ZXJzZSkge1xuICAgICAgaWYgKCFibG9jay5pbnZlcnNlLmNoYWluZWQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2suaW52ZXJzZVN0cmlwLm9wZW4gPyAne3t+JyA6ICd7eyc7XG4gICAgICAgIHRoaXMuYnVmZmVyICs9ICdlbHNlJztcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2suaW52ZXJzZVN0cmlwLmNsb3NlID8gJ359fScgOiAnfX0nO1xuICAgICAgfVxuXG4gICAgICB0aGlzLkJsb2NrKGJsb2NrLmludmVyc2UpO1xuICAgIH1cblxuICAgIGlmICghYmxvY2suY2hhaW5lZCkge1xuICAgICAgdGhpcy5idWZmZXIgKz0gYmxvY2suY2xvc2VTdHJpcC5vcGVuID8gJ3t7fi8nIDogJ3t7Lyc7XG4gICAgICB0aGlzLkV4cHJlc3Npb24oYmxvY2sucGF0aCk7XG4gICAgICB0aGlzLmJ1ZmZlciArPSBibG9jay5jbG9zZVN0cmlwLmNsb3NlID8gJ359fScgOiAnfX0nO1xuICAgIH1cbiAgfVxuXG4gIEJsb2NrUGFyYW1zKGJsb2NrUGFyYW1zOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyICs9IGAgYXMgfCR7YmxvY2tQYXJhbXMuam9pbignICcpfXxgO1xuICB9XG5cbiAgUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsOiBBU1R2MS5QYXJ0aWFsU3RhdGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUocGFydGlhbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSAne3s+JztcbiAgICB0aGlzLkV4cHJlc3Npb24ocGFydGlhbC5uYW1lKTtcbiAgICB0aGlzLlBhcmFtcyhwYXJ0aWFsLnBhcmFtcyk7XG4gICAgdGhpcy5IYXNoKHBhcnRpYWwuaGFzaCk7XG4gICAgdGhpcy5idWZmZXIgKz0gJ319JztcbiAgfVxuXG4gIENvbmNhdFN0YXRlbWVudChjb25jYXQ6IEFTVHYxLkNvbmNhdFN0YXRlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGNvbmNhdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSAnXCInO1xuICAgIGNvbmNhdC5wYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICBpZiAocGFydC50eXBlID09PSAnVGV4dE5vZGUnKSB7XG4gICAgICAgIHRoaXMuVGV4dE5vZGUocGFydCwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLk5vZGUocGFydCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5idWZmZXIgKz0gJ1wiJztcbiAgfVxuXG4gIE11c3RhY2hlQ29tbWVudFN0YXRlbWVudChjb21tZW50OiBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShjb21tZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IGB7eyEtLSR7Y29tbWVudC52YWx1ZX0tLX19YDtcbiAgfVxuXG4gIEVsZW1lbnRNb2RpZmllclN0YXRlbWVudChtb2Q6IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKG1vZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSAne3snO1xuICAgIHRoaXMuRXhwcmVzc2lvbihtb2QucGF0aCk7XG4gICAgdGhpcy5QYXJhbXMobW9kLnBhcmFtcyk7XG4gICAgdGhpcy5IYXNoKG1vZC5oYXNoKTtcbiAgICB0aGlzLmJ1ZmZlciArPSAnfX0nO1xuICB9XG5cbiAgQ29tbWVudFN0YXRlbWVudChjb21tZW50OiBBU1R2MS5Db21tZW50U3RhdGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoY29tbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciArPSBgPCEtLSR7Y29tbWVudC52YWx1ZX0tLT5gO1xuICB9XG5cbiAgUGF0aEV4cHJlc3Npb24ocGF0aDogQVNUdjEuUGF0aEV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShwYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IHBhdGgub3JpZ2luYWw7XG4gIH1cblxuICBTdWJFeHByZXNzaW9uKHNleHA6IEFTVHYxLlN1YkV4cHJlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVkQnlPdmVycmlkZShzZXhwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9ICcoJztcbiAgICB0aGlzLkV4cHJlc3Npb24oc2V4cC5wYXRoKTtcbiAgICB0aGlzLlBhcmFtcyhzZXhwLnBhcmFtcyk7XG4gICAgdGhpcy5IYXNoKHNleHAuaGFzaCk7XG4gICAgdGhpcy5idWZmZXIgKz0gJyknO1xuICB9XG5cbiAgUGFyYW1zKHBhcmFtczogQVNUdjEuRXhwcmVzc2lvbltdKTogdm9pZCB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IGEgdG9wIGxldmVsIFBhcmFtcyBBU1Qgbm9kZSAoanVzdCBsaWtlIHRoZSBIYXNoIG9iamVjdClcbiAgICAvLyBzbyB0aGF0IHRoaXMgY2FuIGFsc28gYmUgb3ZlcnJpZGRlblxuICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gJyAnO1xuICAgICAgICB0aGlzLkV4cHJlc3Npb24ocGFyYW0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgSGFzaChoYXNoOiBBU1R2MS5IYXNoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoaGFzaCwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBoYXNoLnBhaXJzLmZvckVhY2goKHBhaXIpID0+IHtcbiAgICAgIHRoaXMuYnVmZmVyICs9ICcgJztcbiAgICAgIHRoaXMuSGFzaFBhaXIocGFpcik7XG4gICAgfSk7XG4gIH1cblxuICBIYXNoUGFpcihwYWlyOiBBU1R2MS5IYXNoUGFpcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKHBhaXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gcGFpci5rZXk7XG4gICAgdGhpcy5idWZmZXIgKz0gJz0nO1xuICAgIHRoaXMuTm9kZShwYWlyLnZhbHVlKTtcbiAgfVxuXG4gIFN0cmluZ0xpdGVyYWwoc3RyOiBBU1R2MS5TdHJpbmdMaXRlcmFsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUoc3RyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IEpTT04uc3RyaW5naWZ5KHN0ci52YWx1ZSk7XG4gIH1cblxuICBCb29sZWFuTGl0ZXJhbChib29sOiBBU1R2MS5Cb29sZWFuTGl0ZXJhbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKGJvb2wpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gYm9vbC52YWx1ZTtcbiAgfVxuXG4gIE51bWJlckxpdGVyYWwobnVtYmVyOiBBU1R2MS5OdW1iZXJMaXRlcmFsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlZEJ5T3ZlcnJpZGUobnVtYmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyICs9IG51bWJlci52YWx1ZTtcbiAgfVxuXG4gIFVuZGVmaW5lZExpdGVyYWwobm9kZTogQVNUdjEuVW5kZWZpbmVkTGl0ZXJhbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBOdWxsTGl0ZXJhbChub2RlOiBBU1R2MS5OdWxsTGl0ZXJhbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZWRCeU92ZXJyaWRlKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgKz0gJ251bGwnO1xuICB9XG5cbiAgcHJpbnQobm9kZTogQVNUdjEuTm9kZSk6IHN0cmluZyB7XG4gICAgbGV0IHsgb3B0aW9ucyB9ID0gdGhpcztcblxuICAgIGlmIChvcHRpb25zLm92ZXJyaWRlKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gb3B0aW9ucy5vdmVycmlkZShub2RlLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICB0aGlzLk5vZGUobm9kZSk7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9