@glimmer/syntax
Version:
484 lines (424 loc) • 44.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _util = require("@glimmer/util");
var _location = require("../source/location");
var _source2 = require("../source/source");
var _span = require("../source/span");
var _legacyInterop = require("./legacy-interop");
let _SOURCE;
function SOURCE() {
if (!_SOURCE) {
_SOURCE = new _source2.Source('', '(synthetic)');
}
return _SOURCE;
}
function buildMustache(path, params, hash, raw, loc, strip) {
if (typeof path === 'string') {
path = buildPath(path);
}
return {
type: 'MustacheStatement',
path,
params: params || [],
hash: hash || buildHash([]),
escaped: !raw,
trusting: !!raw,
loc: buildLoc(loc || null),
strip: strip || {
open: false,
close: false
}
};
}
function buildBlock(path, params, hash, _defaultBlock, _elseBlock, loc, openStrip, inverseStrip, closeStrip) {
let defaultBlock;
let elseBlock;
if (_defaultBlock.type === 'Template') {
if (false
/* LOCAL_DEBUG */
) {
false && !false && (0, _util.deprecate)(`b.program is deprecated. Use b.blockItself instead.`);
}
defaultBlock = (0, _util.assign)({}, _defaultBlock, {
type: 'Block'
});
} else {
defaultBlock = _defaultBlock;
}
if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') {
if (false
/* LOCAL_DEBUG */
) {
false && !false && (0, _util.deprecate)(`b.program is deprecated. Use b.blockItself instead.`);
}
elseBlock = (0, _util.assign)({}, _elseBlock, {
type: 'Block'
});
} else {
elseBlock = _elseBlock;
}
return {
type: 'BlockStatement',
path: buildPath(path),
params: params || [],
hash: hash || buildHash([]),
program: defaultBlock || null,
inverse: elseBlock || null,
loc: buildLoc(loc || null),
openStrip: openStrip || {
open: false,
close: false
},
inverseStrip: inverseStrip || {
open: false,
close: false
},
closeStrip: closeStrip || {
open: false,
close: false
}
};
}
function buildElementModifier(path, params, hash, loc) {
return {
type: 'ElementModifierStatement',
path: buildPath(path),
params: params || [],
hash: hash || buildHash([]),
loc: buildLoc(loc || null)
};
}
function buildPartial(name, params, hash, indent, loc) {
return {
type: 'PartialStatement',
name: name,
params: params || [],
hash: hash || buildHash([]),
indent: indent || '',
strip: {
open: false,
close: false
},
loc: buildLoc(loc || null)
};
}
function buildComment(value, loc) {
return {
type: 'CommentStatement',
value: value,
loc: buildLoc(loc || null)
};
}
function buildMustacheComment(value, loc) {
return {
type: 'MustacheCommentStatement',
value: value,
loc: buildLoc(loc || null)
};
}
function buildConcat(parts, loc) {
if (!(0, _util.isPresent)(parts)) {
throw new Error(`b.concat requires at least one part`);
}
return {
type: 'ConcatStatement',
parts: parts || [],
loc: buildLoc(loc || null)
};
}
function buildElement(tag, options = {}) {
let {
attrs,
blockParams,
modifiers,
comments,
children,
loc
} = options;
let tagName; // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST
let selfClosing = false;
if (typeof tag === 'object') {
selfClosing = tag.selfClosing;
tagName = tag.name;
} else if (tag.slice(-1) === '/') {
tagName = tag.slice(0, -1);
selfClosing = true;
} else {
tagName = tag;
}
return {
type: 'ElementNode',
tag: tagName,
selfClosing: selfClosing,
attributes: attrs || [],
blockParams: blockParams || [],
modifiers: modifiers || [],
comments: comments || [],
children: children || [],
loc: buildLoc(loc || null)
};
}
function buildAttr(name, value, loc) {
return {
type: 'AttrNode',
name: name,
value: value,
loc: buildLoc(loc || null)
};
}
function buildText(chars, loc) {
return {
type: 'TextNode',
chars: chars || '',
loc: buildLoc(loc || null)
};
} // Expressions
function buildSexpr(path, params, hash, loc) {
return {
type: 'SubExpression',
path: buildPath(path),
params: params || [],
hash: hash || buildHash([]),
loc: buildLoc(loc || null)
};
}
function headToString(head) {
switch (head.type) {
case 'AtHead':
return {
original: head.name,
parts: [head.name]
};
case 'ThisHead':
return {
original: `this`,
parts: []
};
case 'VarHead':
return {
original: head.name,
parts: [head.name]
};
}
}
function buildHead(original, loc) {
let [head, ...tail] = original.split('.');
let headNode;
if (head === 'this') {
headNode = {
type: 'ThisHead',
loc: buildLoc(loc || null)
};
} else if (head[0] === '@') {
headNode = {
type: 'AtHead',
name: head,
loc: buildLoc(loc || null)
};
} else {
headNode = {
type: 'VarHead',
name: head,
loc: buildLoc(loc || null)
};
}
return {
head: headNode,
tail
};
}
function buildThis(loc) {
return {
type: 'ThisHead',
loc: buildLoc(loc || null)
};
}
function buildAtName(name, loc) {
// the `@` should be included so we have a complete source range
false && (0, _util.assert)(name[0] === '@', `call builders.at() with a string that starts with '@'`);
return {
type: 'AtHead',
name,
loc: buildLoc(loc || null)
};
}
function buildVar(name, loc) {
false && (0, _util.assert)(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`);
false && (0, _util.assert)(name[0] !== '@', `You called builders.var() with '${name}'. Call builders.at('${name}') instead`);
return {
type: 'VarHead',
name,
loc: buildLoc(loc || null)
};
}
function buildHeadFromString(head, loc) {
if (head[0] === '@') {
return buildAtName(head, loc);
} else if (head === 'this') {
return buildThis(loc);
} else {
return buildVar(head, loc);
}
}
function buildNamedBlockName(name, loc) {
return {
type: 'NamedBlockName',
name,
loc: buildLoc(loc || null)
};
}
function buildCleanPath(head, tail, loc) {
let {
original: originalHead,
parts: headParts
} = headToString(head);
let parts = [...headParts, ...tail];
let original = [...originalHead, ...parts].join('.');
return new _legacyInterop.PathExpressionImplV1(original, head, tail, buildLoc(loc || null));
}
function buildPath(path, loc) {
if (typeof path !== 'string') {
if ('type' in path) {
return path;
} else {
let {
head,
tail
} = buildHead(path.head, _span.SourceSpan.broken());
false && (0, _util.assert)(tail.length === 0, `builder.path({ head, tail }) should not be called with a head with dots in it`);
let {
original: originalHead
} = headToString(head);
return new _legacyInterop.PathExpressionImplV1([originalHead, ...tail].join('.'), head, tail, buildLoc(loc || null));
}
}
let {
head,
tail
} = buildHead(path, _span.SourceSpan.broken());
return new _legacyInterop.PathExpressionImplV1(path, head, tail, buildLoc(loc || null));
}
function buildLiteral(type, value, loc) {
return {
type,
value,
original: value,
loc: buildLoc(loc || null)
};
} // Miscellaneous
function buildHash(pairs, loc) {
return {
type: 'Hash',
pairs: pairs || [],
loc: buildLoc(loc || null)
};
}
function buildPair(key, value, loc) {
return {
type: 'HashPair',
key: key,
value,
loc: buildLoc(loc || null)
};
}
function buildProgram(body, blockParams, loc) {
return {
type: 'Template',
body: body || [],
blockParams: blockParams || [],
loc: buildLoc(loc || null)
};
}
function buildBlockItself(body, blockParams, chained = false, loc) {
return {
type: 'Block',
body: body || [],
blockParams: blockParams || [],
chained,
loc: buildLoc(loc || null)
};
}
function buildTemplate(body, blockParams, loc) {
return {
type: 'Template',
body: body || [],
blockParams: blockParams || [],
loc: buildLoc(loc || null)
};
}
function buildPosition(line, column) {
return {
line,
column
};
}
function buildLoc(...args) {
if (args.length === 1) {
let loc = args[0];
if (loc && typeof loc === 'object') {
return _span.SourceSpan.forHbsLoc(SOURCE(), loc);
} else {
return _span.SourceSpan.forHbsLoc(SOURCE(), _location.SYNTHETIC_LOCATION);
}
} else {
let [startLine, startColumn, endLine, endColumn, _source] = args;
let source = _source ? new _source2.Source('', _source) : SOURCE();
return _span.SourceSpan.forHbsLoc(source, {
start: {
line: startLine,
column: startColumn
},
end: {
line: endLine,
column: endColumn
}
});
}
}
var _default = {
mustache: buildMustache,
block: buildBlock,
partial: buildPartial,
comment: buildComment,
mustacheComment: buildMustacheComment,
element: buildElement,
elementModifier: buildElementModifier,
attr: buildAttr,
text: buildText,
sexpr: buildSexpr,
concat: buildConcat,
hash: buildHash,
pair: buildPair,
literal: buildLiteral,
program: buildProgram,
blockItself: buildBlockItself,
template: buildTemplate,
loc: buildLoc,
pos: buildPosition,
path: buildPath,
fullPath: buildCleanPath,
head: buildHeadFromString,
at: buildAtName,
var: buildVar,
this: buildThis,
blockName: buildNamedBlockName,
string: literal('StringLiteral'),
boolean: literal('BooleanLiteral'),
number: literal('NumberLiteral'),
undefined() {
return buildLiteral('UndefinedLiteral', undefined);
},
null() {
return buildLiteral('NullLiteral', null);
}
};
exports.default = _default;
function literal(type) {
return function (value, loc) {
return buildLiteral(type, value, loc);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQSxJQUFBLE9BQUE7O0FBRUEsU0FBQSxNQUFBLEdBQWU7QUFDYixNQUFJLENBQUosT0FBQSxFQUFjO0FBQ1osSUFBQSxPQUFPLEdBQUcsSUFBQSxlQUFBLENBQUEsRUFBQSxFQUFWLGFBQVUsQ0FBVjtBQUNEOztBQUVELFNBQUEsT0FBQTtBQUNEOztBQVNELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsS0FBQSxFQU0wQjtBQUV4QixNQUFJLE9BQUEsSUFBQSxLQUFKLFFBQUEsRUFBOEI7QUFDNUIsSUFBQSxJQUFJLEdBQUcsU0FBUyxDQUFoQixJQUFnQixDQUFoQjtBQUNEOztBQUVELFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxtQkFBQTtBQUFBLElBQUEsSUFBQTtBQUdMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFIVCxFQUFBO0FBSUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FKbEIsRUFJa0IsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxDQUxKLEdBQUE7QUFNTCxJQUFBLFFBQVEsRUFBRSxDQUFDLENBTk4sR0FBQTtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBUFosSUFPUSxDQVBSO0FBUUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUUsTUFBQSxJQUFJLEVBQU4sS0FBQTtBQUFlLE1BQUEsS0FBSyxFQUFFO0FBQXRCO0FBUlgsR0FBUDtBQVVEOztBQUVELFNBQUEsVUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxFQUFBLGFBQUEsRUFBQSxVQUFBLEVBQUEsR0FBQSxFQUFBLFNBQUEs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TUFBTSxFQUFFLE9BQU8sQ0FqQ0YsZUFpQ0UsQ0FqQ0Y7O0FBa0NiLEVBQUEsU0FBUyxHQUFBO0FBQ1AsV0FBTyxZQUFZLENBQUEsa0JBQUEsRUFBbkIsU0FBbUIsQ0FBbkI7QUFuQ1csR0FBQTs7QUFxQ2IsRUFBQSxJQUFJLEdBQUE7QUFDRixXQUFPLFlBQVksQ0FBQSxhQUFBLEVBQW5CLElBQW1CLENBQW5CO0FBQ0Q7O0FBdkNZLEM7OztBQTRDZixTQUFBLE9BQUEsQ0FBQSxJQUFBLEVBQXlEO0FBQ3ZELFNBQU8sVUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFpRDtBQUN0RCxXQUFPLFlBQVksQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFuQixHQUFtQixDQUFuQjtBQURGLEdBQUE7QUFHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfREVCVUcgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2lnbiwgZGVwcmVjYXRlLCBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgU291cmNlTG9jYXRpb24sIFNvdXJjZVBvc2l0aW9uLCBTWU5USEVUSUNfTE9DQVRJT04gfSBmcm9tICcuLi9zb3VyY2UvbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vc291cmNlL3NvdXJjZSc7XG5pbXBvcnQgeyBTb3VyY2VTcGFuIH0gZnJvbSAnLi4vc291cmNlL3NwYW4nO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgUGF0aEV4cHJlc3Npb25JbXBsVjEgfSBmcm9tICcuL2xlZ2FjeS1pbnRlcm9wJztcblxubGV0IF9TT1VSQ0U6IFNvdXJjZSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gU09VUkNFKCk6IFNvdXJjZSB7XG4gIGlmICghX1NPVVJDRSkge1xuICAgIF9TT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHN5bnRoZXRpYyknKTtcbiAgfVxuXG4gIHJldHVybiBfU09VUkNFO1xufVxuXG4vLyBjb25zdCBTT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHRlc3RzKScpO1xuXG4vLyBTdGF0ZW1lbnRzXG5cbmV4cG9ydCB0eXBlIEJ1aWxkZXJIZWFkID0gc3RyaW5nIHwgQVNUdjEuRXhwcmVzc2lvbjtcbmV4cG9ydCB0eXBlIFRhZ0Rlc2NyaXB0b3IgPSBzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgc2VsZkNsb3Npbmc6IGJvb2xlYW4gfTtcblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZShcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5MaXRlcmFsLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICByYXc/OiBib29sZWFuLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgc3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzXG4pOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gYnVpbGRQYXRoKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVTdGF0ZW1lbnQnLFxuICAgIHBhdGgsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGVzY2FwZWQ6ICFyYXcsXG4gICAgdHJ1c3Rpbmc6ICEhcmF3LFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIHN0cmlwOiBzdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9jayhcbiAgcGF0aDogQnVpbGRlckhlYWQsXG4gIHBhcmFtczogT3B0aW9uPEFTVHYxLkV4cHJlc3Npb25bXT4sXG4gIGhhc2g6IE9wdGlvbjxBU1R2MS5IYXNoPixcbiAgX2RlZmF1bHRCbG9jazogQVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2ssXG4gIF9lbHNlQmxvY2s/OiBPcHRpb248QVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2s+LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgb3BlblN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgaW52ZXJzZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgY2xvc2VTdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLkJsb2NrU3RhdGVtZW50IHtcbiAgbGV0IGRlZmF1bHRCbG9jazogQVNUdjEuQmxvY2s7XG4gIGxldCBlbHNlQmxvY2s6IE9wdGlvbjxBU1R2MS5CbG9jaz4gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKF9kZWZhdWx0QmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0QmxvY2sgPSAoYXNzaWduKHt9LCBfZGVmYXVsdEJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdEJsb2NrID0gX2RlZmF1bHRCbG9jaztcbiAgfVxuXG4gIGlmIChfZWxzZUJsb2NrICE9PSB1bmRlZmluZWQgJiYgX2Vsc2VCbG9jayAhPT0gbnVsbCAmJiBfZWxzZUJsb2NrLnR5cGUgPT09ICdUZW1wbGF0ZScpIHtcbiAgICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICAgIGRlcHJlY2F0ZShgYi5wcm9ncmFtIGlzIGRlcHJlY2F0ZWQuIFVzZSBiLmJsb2NrSXRzZWxmIGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgZWxzZUJsb2NrID0gKGFzc2lnbih7fSwgX2Vsc2VCbG9jaywgeyB0eXBlOiAnQmxvY2snIH0pIGFzIHVua25vd24pIGFzIEFTVHYxLkJsb2NrO1xuICB9IGVsc2Uge1xuICAgIGVsc2VCbG9jayA9IF9lbHNlQmxvY2s7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCbG9ja1N0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBwcm9ncmFtOiBkZWZhdWx0QmxvY2sgfHwgbnVsbCxcbiAgICBpbnZlcnNlOiBlbHNlQmxvY2sgfHwgbnVsbCxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICBvcGVuU3RyaXA6IG9wZW5TdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBpbnZlcnNlU3RyaXA6IGludmVyc2VTdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBjbG9zZVN0cmlwOiBjbG9zZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnRNb2RpZmllcihcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBPcHRpb248U291cmNlTG9jYXRpb24+XG4pOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFydGlhbChcbiAgbmFtZTogQVNUdjEuUGF0aEV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGluZGVudD86IHN0cmluZyxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhcnRpYWxTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBpbmRlbnQ6IGluZGVudCB8fCAnJyxcbiAgICBzdHJpcDogeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29tbWVudCh2YWx1ZTogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTXVzdGFjaGVDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29uY2F0KFxuICBwYXJ0czogKEFTVHYxLlRleHROb2RlIHwgQVNUdjEuTXVzdGFjaGVTdGF0ZW1lbnQpW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5Db25jYXRTdGF0ZW1lbnQge1xuICBpZiAoIWlzUHJlc2VudChwYXJ0cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGIuY29uY2F0IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBwYXJ0YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb25jYXRTdGF0ZW1lbnQnLFxuICAgIHBhcnRzOiBwYXJ0cyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuLy8gTm9kZXNcblxuZXhwb3J0IHR5cGUgRWxlbWVudFBhcnRzID1cbiAgfCBbJ2F0dHJzJywgLi4uQXR0clNleHBbXV1cbiAgfCBbJ21vZGlmaWVycycsIC4uLk1vZGlmaWVyU2V4cFtdXVxuICB8IFsnYm9keScsIC4uLkFTVHYxLlN0YXRlbWVudFtdXVxuICB8IFsnY29tbWVudHMnLCAuLi5FbGVtZW50Q29tbWVudFtdXVxuICB8IFsnYXMnLCAuLi5zdHJpbmdbXV1cbiAgfCBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgUGF0aFNleHAgPSBzdHJpbmcgfCBbJ3BhdGgnLCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTW9kaWZpZXJTZXhwID1cbiAgfCBzdHJpbmdcbiAgfCBbUGF0aFNleHAsIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBMb2NTZXhwP11cbiAgfCBbUGF0aFNleHAsIEFTVHYxLkV4cHJlc3Npb25bXSwgRGljdDxBU1R2MS5FeHByZXNzaW9uPiwgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBBdHRyU2V4cCA9IFtzdHJpbmcsIEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddIHwgc3RyaW5nLCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIExvY1NleHAgPSBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgRWxlbWVudENvbW1lbnQgPSBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQgfCBTb3VyY2VMb2NhdGlvbiB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2V4cFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBBU1R2MS5FeHByZXNzaW9uW11cbiAgfCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+XG4gIHwgTG9jU2V4cFxuICB8IFBhdGhTZXhwXG4gIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRWxlbWVudE9wdGlvbnMge1xuICBhdHRycz86IEFTVHYxLkF0dHJOb2RlW107XG4gIG1vZGlmaWVycz86IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudFtdO1xuICBjaGlsZHJlbj86IEFTVHYxLlN0YXRlbWVudFtdO1xuICBjb21tZW50cz86IEVsZW1lbnRDb21tZW50W107XG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW107XG4gIGxvYz86IFNvdXJjZVNwYW47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudCh0YWc6IFRhZ0Rlc2NyaXB0b3IsIG9wdGlvbnM6IEJ1aWxkRWxlbWVudE9wdGlvbnMgPSB7fSk6IEFTVHYxLkVsZW1lbnROb2RlIHtcbiAgbGV0IHsgYXR0cnMsIGJsb2NrUGFyYW1zLCBtb2RpZmllcnMsIGNvbW1lbnRzLCBjaGlsZHJlbiwgbG9jIH0gPSBvcHRpb25zO1xuXG4gIGxldCB0YWdOYW1lOiBzdHJpbmc7XG5cbiAgLy8gdGhpcyBpcyB1c2VkIGZvciBiYWNrd2FyZHMgY29tcGF0LCBwcmlvciB0byBgc2VsZkNsb3NpbmdgIGJlaW5nIHBhcnQgb2YgdGhlIEVsZW1lbnROb2RlIEFTVFxuICBsZXQgc2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiB0YWcgPT09ICdvYmplY3QnKSB7XG4gICAgc2VsZkNsb3NpbmcgPSB0YWcuc2VsZkNsb3Npbmc7XG4gICAgdGFnTmFtZSA9IHRhZy5uYW1lO1xuICB9IGVsc2UgaWYgKHRhZy5zbGljZSgtMSkgPT09ICcvJykge1xuICAgIHRhZ05hbWUgPSB0YWcuc2xpY2UoMCwgLTEpO1xuICAgIHNlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0YWdOYW1lID0gdGFnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnRWxlbWVudE5vZGUnLFxuICAgIHRhZzogdGFnTmFtZSxcbiAgICBzZWxmQ2xvc2luZzogc2VsZkNsb3NpbmcsXG4gICAgYXR0cmlidXRlczogYXR0cnMgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIG1vZGlmaWVyczogbW9kaWZpZXJzIHx8IFtdLFxuICAgIGNvbW1lbnRzOiAoY29tbWVudHMgYXMgQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50W10pIHx8IFtdLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdHRyKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBBU1R2MS5BdHRyTm9kZVsndmFsdWUnXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkF0dHJOb2RlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQXR0ck5vZGUnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRleHQoY2hhcnM/OiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuVGV4dE5vZGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZXh0Tm9kZScsXG4gICAgY2hhcnM6IGNoYXJzIHx8ICcnLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBFeHByZXNzaW9uc1xuXG5mdW5jdGlvbiBidWlsZFNleHByKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlN1YkV4cHJlc3Npb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBoZWFkVG9TdHJpbmcoaGVhZDogQVNUdjEuUGF0aEhlYWQpOiB7IG9yaWdpbmFsOiBzdHJpbmc7IHBhcnRzOiBzdHJpbmdbXSB9IHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBdEhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gICAgY2FzZSAnVGhpc0hlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGB0aGlzYCwgcGFydHM6IFtdIH07XG4gICAgY2FzZSAnVmFySGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEhlYWQoXG4gIG9yaWdpbmFsOiBzdHJpbmcsXG4gIGxvYzogU291cmNlTG9jYXRpb25cbik6IHsgaGVhZDogQVNUdjEuUGF0aEhlYWQ7IHRhaWw6IHN0cmluZ1tdIH0ge1xuICBsZXQgW2hlYWQsIC4uLnRhaWxdID0gb3JpZ2luYWwuc3BsaXQoJy4nKTtcbiAgbGV0IGhlYWROb2RlOiBBU1R2MS5QYXRoSGVhZDtcblxuICBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgICAgbmFtZTogaGVhZCxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnVmFySGVhZCcsXG4gICAgICBuYW1lOiBoZWFkLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaGVhZDogaGVhZE5vZGUsXG4gICAgdGFpbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUaGlzKGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RoaXNIZWFkJyxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdE5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICAvLyB0aGUgYEBgIHNob3VsZCBiZSBpbmNsdWRlZCBzbyB3ZSBoYXZlIGEgY29tcGxldGUgc291cmNlIHJhbmdlXG4gIGFzc2VydChuYW1lWzBdID09PSAnQCcsIGBjYWxsIGJ1aWxkZXJzLmF0KCkgd2l0aCBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdAJ2ApO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0F0SGVhZCcsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWYXIobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICBhc3NlcnQobmFtZSAhPT0gJ3RoaXMnLCBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICd0aGlzJy4gQ2FsbCBidWlsZGVycy50aGlzIGluc3RlYWRgKTtcbiAgYXNzZXJ0KFxuICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVmFySGVhZCcsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIZWFkRnJvbVN0cmluZyhoZWFkOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICByZXR1cm4gYnVpbGRBdE5hbWUoaGVhZCwgbG9jKTtcbiAgfSBlbHNlIGlmIChoZWFkID09PSAndGhpcycpIHtcbiAgICByZXR1cm4gYnVpbGRUaGlzKGxvYyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1aWxkVmFyKGhlYWQsIGxvYyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROYW1lZEJsb2NrTmFtZShuYW1lOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTmFtZWRCbG9ja05hbWUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdOYW1lZEJsb2NrTmFtZScsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGVhblBhdGgoXG4gIGhlYWQ6IEFTVHYxLlBhdGhIZWFkLFxuICB0YWlsOiBzdHJpbmdbXSxcbiAgbG9jOiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGF0aEV4cHJlc3Npb24ge1xuICBsZXQgeyBvcmlnaW5hbDogb3JpZ2luYWxIZWFkLCBwYXJ0czogaGVhZFBhcnRzIH0gPSBoZWFkVG9TdHJpbmcoaGVhZCk7XG4gIGxldCBwYXJ0cyA9IFsuLi5oZWFkUGFydHMsIC4uLnRhaWxdO1xuICBsZXQgb3JpZ2luYWwgPSBbLi4ub3JpZ2luYWxIZWFkLCAuLi5wYXJ0c10uam9pbignLicpO1xuXG4gIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEob3JpZ2luYWwsIGhlYWQsIHRhaWwsIGJ1aWxkTG9jKGxvYyB8fCBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGF0aChcbiAgcGF0aDogQVNUdjEuUGF0aEV4cHJlc3Npb24gfCBzdHJpbmcgfCB7IGhlYWQ6IHN0cmluZzsgdGFpbDogc3RyaW5nW10gfSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhdGhFeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGg6IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uIHwgeyBoZWFkOiBzdHJpbmc7IHRhaWw6IHN0cmluZ1tdIH0sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5FeHByZXNzaW9uIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIGlmICgndHlwZScgaW4gcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IGhlYWQsIHRhaWwgfSA9IGJ1aWxkSGVhZChwYXRoLmhlYWQsIFNvdXJjZVNwYW4uYnJva2VuKCkpO1xuXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRhaWwubGVuZ3RoID09PSAwLFxuICAgICAgICBgYnVpbGRlci5wYXRoKHsgaGVhZCwgdGFpbCB9KSBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIGEgaGVhZCB3aXRoIGRvdHMgaW4gaXRgXG4gICAgICApO1xuXG4gICAgICBsZXQgeyBvcmlnaW5hbDogb3JpZ2luYWxIZWFkIH0gPSBoZWFkVG9TdHJpbmcoaGVhZCk7XG5cbiAgICAgIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEoXG4gICAgICAgIFtvcmlnaW5hbEhlYWQsIC4uLnRhaWxdLmpvaW4oJy4nKSxcbiAgICAgICAgaGVhZCxcbiAgICAgICAgdGFpbCxcbiAgICAgICAgYnVpbGRMb2MobG9jIHx8IG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCB7IGhlYWQsIHRhaWwgfSA9IGJ1aWxkSGVhZChwYXRoLCBTb3VyY2VTcGFuLmJyb2tlbigpKTtcblxuICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKHBhdGgsIGhlYWQsIHRhaWwsIGJ1aWxkTG9jKGxvYyB8fCBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4oXG4gIHR5cGU6IFRbJ3R5cGUnXSxcbiAgdmFsdWU6IFRbJ3ZhbHVlJ10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBUIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlLFxuICAgIHZhbHVlLFxuICAgIG9yaWdpbmFsOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfSBhcyBUO1xufVxuXG4vLyBNaXNjZWxsYW5lb3VzXG5cbmZ1bmN0aW9uIGJ1aWxkSGFzaChwYWlycz86IEFTVHYxLkhhc2hQYWlyW10sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuSGFzaCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0hhc2gnLFxuICAgIHBhaXJzOiBwYWlycyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYWlyKGtleTogc3RyaW5nLCB2YWx1ZTogQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5IYXNoUGFpciB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0hhc2hQYWlyJyxcbiAgICBrZXk6IGtleSxcbiAgICB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9ncmFtKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5UZW1wbGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RlbXBsYXRlJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0l0c2VsZihcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBjaGFpbmVkID0gZmFsc2UsXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5CbG9jayB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBjaGFpbmVkLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRlbXBsYXRlKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5UZW1wbGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RlbXBsYXRlJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQb3NpdGlvbihsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKTogU291cmNlUG9zaXRpb24ge1xuICByZXR1cm4ge1xuICAgIGxpbmUsXG4gICAgY29sdW1uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZExvYyhsb2M6IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj4pOiBTb3VyY2VTcGFuO1xuZnVuY3Rpb24gYnVpbGRMb2MoXG4gIHN0YXJ0TGluZTogbnVtYmVyLFxuICBzdGFydENvbHVtbjogbnVtYmVyLFxuICBlbmRMaW5lPzogbnVtYmVyLFxuICBlbmRDb2x1bW4/OiBudW1iZXIsXG4gIHNvdXJjZT86IHN0cmluZ1xuKTogU291cmNlU3BhbjtcblxuZnVuY3Rpb24gYnVpbGRMb2MoLi4uYXJnczogYW55W10pOiBTb3VyY2VTcGFuIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgbGV0IGxvYyA9IGFyZ3NbMF07XG5cbiAgICBpZiAobG9jICYmIHR5cGVvZiBsb2MgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2MoU09VUkNFKCksIGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhTT1VSQ0UoKSwgU1lOVEhFVElDX0xPQ0FUSU9OKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IFtzdGFydExpbmUsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIF9zb3VyY2VdID0gYXJncztcbiAgICBsZXQgc291cmNlID0gX3NvdXJjZSA/IG5ldyBTb3VyY2UoJycsIF9zb3VyY2UpIDogU09VUkNFKCk7XG5cbiAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2Moc291cmNlLCB7XG4gICAgICBzdGFydDoge1xuICAgICAgICBsaW5lOiBzdGFydExpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4sXG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIGNvbHVtbjogZW5kQ29sdW1uLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG11c3RhY2hlOiBidWlsZE11c3RhY2hlLFxuICBibG9jazogYnVpbGRCbG9jayxcbiAgcGFydGlhbDogYnVpbGRQYXJ0aWFsLFxuICBjb21tZW50OiBidWlsZENvbW1lbnQsXG4gIG11c3RhY2hlQ29tbWVudDogYnVpbGRNdXN0YWNoZUNvbW1lbnQsXG4gIGVsZW1lbnQ6IGJ1aWxkRWxlbWVudCxcbiAgZWxlbWVudE1vZGlmaWVyOiBidWlsZEVsZW1lbnRNb2RpZmllcixcbiAgYXR0cjogYnVpbGRBdHRyLFxuICB0ZXh0OiBidWlsZFRleHQsXG4gIHNleHByOiBidWlsZFNleHByLFxuXG4gIGNvbmNhdDogYnVpbGRDb25jYXQsXG4gIGhhc2g6IGJ1aWxkSGFzaCxcbiAgcGFpcjogYnVpbGRQYWlyLFxuICBsaXRlcmFsOiBidWlsZExpdGVyYWwsXG4gIHByb2dyYW06IGJ1aWxkUHJvZ3JhbSxcbiAgYmxvY2tJdHNlbGY6IGJ1aWxkQmxvY2tJdHNlbGYsXG4gIHRlbXBsYXRlOiBidWlsZFRlbXBsYXRlLFxuICBsb2M6IGJ1aWxkTG9jLFxuICBwb3M6IGJ1aWxkUG9zaXRpb24sXG5cbiAgcGF0aDogYnVpbGRQYXRoLFxuXG4gIGZ1bGxQYXRoOiBidWlsZENsZWFuUGF0aCxcbiAgaGVhZDogYnVpbGRIZWFkRnJvbVN0cmluZyxcbiAgYXQ6IGJ1aWxkQXROYW1lLFxuICB2YXI6IGJ1aWxkVmFyLFxuICB0aGlzOiBidWlsZFRoaXMsXG4gIGJsb2NrTmFtZTogYnVpbGROYW1lZEJsb2NrTmFtZSxcblxuICBzdHJpbmc6IGxpdGVyYWwoJ1N0cmluZ0xpdGVyYWwnKSBhcyAodmFsdWU6IHN0cmluZykgPT4gQVNUdjEuU3RyaW5nTGl0ZXJhbCxcbiAgYm9vbGVhbjogbGl0ZXJhbCgnQm9vbGVhbkxpdGVyYWwnKSBhcyAodmFsdWU6IGJvb2xlYW4pID0+IEFTVHYxLkJvb2xlYW5MaXRlcmFsLFxuICBudW1iZXI6IGxpdGVyYWwoJ051bWJlckxpdGVyYWwnKSBhcyAodmFsdWU6IG51bWJlcikgPT4gQVNUdjEuTnVtYmVyTGl0ZXJhbCxcbiAgdW5kZWZpbmVkKCk6IEFTVHYxLlVuZGVmaW5lZExpdGVyYWwge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwoJ1VuZGVmaW5lZExpdGVyYWwnLCB1bmRlZmluZWQpO1xuICB9LFxuICBudWxsKCk6IEFTVHYxLk51bGxMaXRlcmFsIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKCdOdWxsTGl0ZXJhbCcsIG51bGwpO1xuICB9LFxufTtcblxudHlwZSBCdWlsZExpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+ID0gKHZhbHVlOiBUWyd2YWx1ZSddKSA9PiBUO1xuXG5mdW5jdGlvbiBsaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPih0eXBlOiBUWyd0eXBlJ10pOiBCdWlsZExpdGVyYWw8VD4ge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlOiBUWyd2YWx1ZSddLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IFQge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwodHlwZSwgdmFsdWUsIGxvYyk7XG4gIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9