@glimmer/syntax
Version:
472 lines (418 loc) • 45 kB
JavaScript
import { assert, assign, deprecate, isPresent } from '@glimmer/util';
import { SYNTHETIC_LOCATION } from '../source/location';
import { Source } from '../source/source';
import { SourceSpan } from '../source/span';
import { PathExpressionImplV1 } from './legacy-interop';
let _SOURCE;
function SOURCE() {
if (!_SOURCE) {
_SOURCE = new 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) && deprecate(`b.program is deprecated. Use b.blockItself instead.`));
}
defaultBlock = assign({}, _defaultBlock, {
type: 'Block'
});
} else {
defaultBlock = _defaultBlock;
}
if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') {
if (false
/* LOCAL_DEBUG */
) {
(false && !(false) && deprecate(`b.program is deprecated. Use b.blockItself instead.`));
}
elseBlock = 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 (!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 && 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 && assert(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`));
(false && 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 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, SourceSpan.broken());
(false && 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 PathExpressionImplV1([originalHead, ...tail].join('.'), head, tail, buildLoc(loc || null));
}
}
let {
head,
tail
} = buildHead(path, SourceSpan.broken());
return new 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 SourceSpan.forHbsLoc(SOURCE(), loc);
} else {
return SourceSpan.forHbsLoc(SOURCE(), SYNTHETIC_LOCATION);
}
} else {
let [startLine, startColumn, endLine, endColumn, _source] = args;
let source = _source ? new Source('', _source) : SOURCE();
return SourceSpan.forHbsLoc(source, {
start: {
line: startLine,
column: startColumn
},
end: {
line: endLine,
column: endColumn
}
});
}
}
export 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);
}
};
function literal(type) {
return function (value, loc) {
return buildLiteral(type, value, loc);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQVMsTUFBVCxFQUFpQixNQUFqQixFQUF5QixTQUF6QixFQUFvQyxTQUFwQyxRQUFxRCxlQUFyRDtBQUVBLFNBQXlDLGtCQUF6QyxRQUFtRSxvQkFBbkU7QUFDQSxTQUFTLE1BQVQsUUFBdUIsa0JBQXZCO0FBQ0EsU0FBUyxVQUFULFFBQTJCLGdCQUEzQjtBQUVBLFNBQVMsb0JBQVQsUUFBcUMsa0JBQXJDOztBQUVBLElBQUksT0FBSjs7QUFFQSxTQUFTLE1BQVQsR0FBZTtBQUNiLE1BQUksQ0FBQyxPQUFMLEVBQWM7QUFDWixJQUFBLE9BQU8sR0FBRyxJQUFJLE1BQUosQ0FBVyxFQUFYLEVBQWUsYUFBZixDQUFWO0FBQ0Q7O0FBRUQsU0FBTyxPQUFQO0FBQ0Q7O0FBU0QsU0FBUyxhQUFULENBQ0UsSUFERixFQUVFLE1BRkYsRUFHRSxJQUhGLEVBSUUsR0FKRixFQUtFLEdBTEYsRUFNRSxLQU5GLEVBTTBCO0FBRXhCLE1BQUksT0FBTyxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzVCLElBQUEsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFELENBQWhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQUFFLG1CQUREO0FBRUwsSUFBQSxJQUZLO0FBR0wsSUFBQSxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBSGI7QUFJTCxJQUFBLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDLEVBQUQsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxDQUFDLEdBTEw7QUFNTCxJQUFBLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FOUDtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksSUFBUixDQVBSO0FBUUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUUsTUFBQSxJ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LEVBQUEsUUFBUSxFQUFFLGNBeEJHO0FBeUJiLEVBQUEsSUFBSSxFQUFFLG1CQXpCTztBQTBCYixFQUFBLEVBQUUsRUFBRSxXQTFCUztBQTJCYixFQUFBLEdBQUcsRUFBRSxRQTNCUTtBQTRCYixFQUFBLElBQUksRUFBRSxTQTVCTztBQTZCYixFQUFBLFNBQVMsRUFBRSxtQkE3QkU7QUErQmIsRUFBQSxNQUFNLEVBQUUsT0FBTyxDQUFDLGVBQUQsQ0EvQkY7QUFnQ2IsRUFBQSxPQUFPLEVBQUUsT0FBTyxDQUFDLGdCQUFELENBaENIO0FBaUNiLEVBQUEsTUFBTSxFQUFFLE9BQU8sQ0FBQyxlQUFELENBakNGOztBQWtDYixFQUFBLFNBQVMsR0FBQTtBQUNQLFdBQU8sWUFBWSxDQUFDLGtCQUFELEVBQXFCLFNBQXJCLENBQW5CO0FBQ0QsR0FwQ1k7O0FBcUNiLEVBQUEsSUFBSSxHQUFBO0FBQ0YsV0FBTyxZQUFZLENBQUMsYUFBRCxFQUFnQixJQUFoQixDQUFuQjtBQUNEOztBQXZDWSxDQUFmOztBQTRDQSxTQUFTLE9BQVQsQ0FBMEMsSUFBMUMsRUFBeUQ7QUFDdkQsU0FBTyxVQUFVLEtBQVYsRUFBNkIsR0FBN0IsRUFBaUQ7QUFDdEQsV0FBTyxZQUFZLENBQUMsSUFBRCxFQUFPLEtBQVAsRUFBYyxHQUFkLENBQW5CO0FBQ0QsR0FGRDtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0NBTF9ERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBkZXByZWNhdGUsIGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBTb3VyY2VMb2NhdGlvbiwgU291cmNlUG9zaXRpb24sIFNZTlRIRVRJQ19MT0NBVElPTiB9IGZyb20gJy4uL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBQYXRoRXhwcmVzc2lvbkltcGxWMSB9IGZyb20gJy4vbGVnYWN5LWludGVyb3AnO1xuXG5sZXQgX1NPVVJDRTogU291cmNlIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBTT1VSQ0UoKTogU291cmNlIHtcbiAgaWYgKCFfU09VUkNFKSB7XG4gICAgX1NPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcoc3ludGhldGljKScpO1xuICB9XG5cbiAgcmV0dXJuIF9TT1VSQ0U7XG59XG5cbi8vIGNvbnN0IFNPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcodGVzdHMpJyk7XG5cbi8vIFN0YXRlbWVudHNcblxuZXhwb3J0IHR5cGUgQnVpbGRlckhlYWQgPSBzdHJpbmcgfCBBU1R2MS5FeHByZXNzaW9uO1xuZXhwb3J0IHR5cGUgVGFnRGVzY3JpcHRvciA9IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyBzZWxmQ2xvc2luZzogYm9vbGVhbiB9O1xuXG5mdW5jdGlvbiBidWlsZE11c3RhY2hlKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkxpdGVyYWwsXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIHJhdz86IGJvb2xlYW4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBzdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIHBhdGggPSBidWlsZFBhdGgocGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZVN0YXRlbWVudCcsXG4gICAgcGF0aCxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgZXNjYXBlZDogIXJhdyxcbiAgICB0cnVzdGluZzogISFyYXcsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgc3RyaXA6IHN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zOiBPcHRpb248QVNUdjEuRXhwcmVzc2lvbltdPixcbiAgaGFzaDogT3B0aW9uPEFTVHYxLkhhc2g+LFxuICBfZGVmYXVsdEJsb2NrOiBBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jayxcbiAgX2Vsc2VCbG9jaz86IE9wdGlvbjxBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jaz4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBvcGVuU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBpbnZlcnNlU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBjbG9zZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFnc1xuKTogQVNUdjEuQmxvY2tTdGF0ZW1lbnQge1xuICBsZXQgZGVmYXVsdEJsb2NrOiBBU1R2MS5CbG9jaztcbiAgbGV0IGVsc2VCbG9jazogT3B0aW9uPEFTVHYxLkJsb2NrPiB8IHVuZGVmaW5lZDtcblxuICBpZiAoX2RlZmF1bHRCbG9jay50eXBlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgICBkZXByZWNhdGUoYGIucHJvZ3JhbSBpcyBkZXByZWNhdGVkLiBVc2UgYi5ibG9ja0l0c2VsZiBpbnN0ZWFkLmApO1xuICAgIH1cblxuICAgIGRlZmF1bHRCbG9jayA9IChhc3NpZ24oe30sIF9kZWZhdWx0QmxvY2ssIHsgdHlwZTogJ0Jsb2NrJyB9KSBhcyB1bmtub3duKSBhcyBBU1R2MS5CbG9jaztcbiAgfSBlbHNlIHtcbiAgICBkZWZhdWx0QmxvY2sgPSBfZGVmYXVsdEJsb2NrO1xuICB9XG5cbiAgaWYgKF9lbHNlQmxvY2sgIT09IHVuZGVmaW5lZCAmJiBfZWxzZUJsb2NrICE9PSBudWxsICYmIF9lbHNlQmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBlbHNlQmxvY2sgPSAoYXNzaWduKHt9LCBfZWxzZUJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZWxzZUJsb2NrID0gX2Vsc2VCbG9jaztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIHByb2dyYW06IGRlZmF1bHRCbG9jayB8fCBudWxsLFxuICAgIGludmVyc2U6IGVsc2VCbG9jayB8fCBudWxsLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIG9wZW5TdHJpcDogb3BlblN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGludmVyc2VTdHJpcDogaW52ZXJzZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGNsb3NlU3RyaXA6IGNsb3NlU3RyaXAgfHwgeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudE1vZGlmaWVyKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGxvYz86IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj5cbik6IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0VsZW1lbnRNb2RpZmllclN0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXJ0aWFsKFxuICBuYW1lOiBBU1R2MS5QYXRoRXhwcmVzc2lvbixcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgaW5kZW50Pzogc3RyaW5nLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGFydGlhbFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1BhcnRpYWxTdGF0ZW1lbnQnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGluZGVudDogaW5kZW50IHx8ICcnLFxuICAgIHN0cmlwOiB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuQ29tbWVudFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZUNvbW1lbnQodmFsdWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb25jYXQoXG4gIHBhcnRzOiAoQVNUdjEuVGV4dE5vZGUgfCBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudClbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkNvbmNhdFN0YXRlbWVudCB7XG4gIGlmICghaXNQcmVzZW50KHBhcnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYi5jb25jYXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHBhcnRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbmNhdFN0YXRlbWVudCcsXG4gICAgcGFydHM6IHBhcnRzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBOb2Rlc1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UGFydHMgPVxuICB8IFsnYXR0cnMnLCAuLi5BdHRyU2V4cFtdXVxuICB8IFsnbW9kaWZpZXJzJywgLi4uTW9kaWZpZXJTZXhwW11dXG4gIHwgWydib2R5JywgLi4uQVNUdjEuU3RhdGVtZW50W11dXG4gIHwgWydjb21tZW50cycsIC4uLkVsZW1lbnRDb21tZW50W11dXG4gIHwgWydhcycsIC4uLnN0cmluZ1tdXVxuICB8IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBQYXRoU2V4cCA9IHN0cmluZyB8IFsncGF0aCcsIHN0cmluZywgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclNleHAgPVxuICB8IHN0cmluZ1xuICB8IFtQYXRoU2V4cCwgTG9jU2V4cD9dXG4gIHwgW1BhdGhTZXhwLCBBU1R2MS5FeHByZXNzaW9uW10sIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+LCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIEF0dHJTZXhwID0gW3N0cmluZywgQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10gfCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTG9jU2V4cCA9IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50Q29tbWVudCA9IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB8IFNvdXJjZUxvY2F0aW9uIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBTZXhwVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IEFTVHYxLkV4cHJlc3Npb25bXVxuICB8IERpY3Q8QVNUdjEuRXhwcmVzc2lvbj5cbiAgfCBMb2NTZXhwXG4gIHwgUGF0aFNleHBcbiAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbGVtZW50T3B0aW9ucyB7XG4gIGF0dHJzPzogQVNUdjEuQXR0ck5vZGVbXTtcbiAgbW9kaWZpZXJzPzogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50W107XG4gIGNoaWxkcmVuPzogQVNUdjEuU3RhdGVtZW50W107XG4gIGNvbW1lbnRzPzogRWxlbWVudENvbW1lbnRbXTtcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXTtcbiAgbG9jPzogU291cmNlU3Bhbjtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbGVtZW50KHRhZzogVGFnRGVzY3JpcHRvciwgb3B0aW9uczogQnVpbGRFbGVtZW50T3B0aW9ucyA9IHt9KTogQVNUdjEuRWxlbWVudE5vZGUge1xuICBsZXQgeyBhdHRycywgYmxvY2tQYXJhbXMsIG1vZGlmaWVycywgY29tbWVudHMsIGNoaWxkcmVuLCBsb2MgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IHRhZ05hbWU6IHN0cmluZztcblxuICAvLyB0aGlzIGlzIHVzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXQsIHByaW9yIHRvIGBzZWxmQ2xvc2luZ2AgYmVpbmcgcGFydCBvZiB0aGUgRWxlbWVudE5vZGUgQVNUXG4gIGxldCBzZWxmQ2xvc2luZyA9IGZhbHNlO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcpIHtcbiAgICBzZWxmQ2xvc2luZyA9IHRhZy5zZWxmQ2xvc2luZztcbiAgICB0YWdOYW1lID0gdGFnLm5hbWU7XG4gIH0gZWxzZSBpZiAodGFnLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgdGFnTmFtZSA9IHRhZy5zbGljZSgwLCAtMSk7XG4gICAgc2VsZkNsb3NpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRhZ05hbWUgPSB0YWc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50Tm9kZScsXG4gICAgdGFnOiB0YWdOYW1lLFxuICAgIHNlbGZDbG9zaW5nOiBzZWxmQ2xvc2luZyxcbiAgICBhdHRyaWJ1dGVzOiBhdHRycyB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbW9kaWZpZXJzOiBtb2RpZmllcnMgfHwgW10sXG4gICAgY29tbWVudHM6IChjb21tZW50cyBhcyBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnRbXSkgfHwgW10sXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEF0dHIoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuQXR0ck5vZGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdBdHRyTm9kZScsXG4gICAgbmFtZTogbmFtZSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGV4dChjaGFycz86IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5UZXh0Tm9kZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RleHROb2RlJyxcbiAgICBjaGFyczogY2hhcnMgfHwgJycsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbi8vIEV4cHJlc3Npb25zXG5cbmZ1bmN0aW9uIGJ1aWxkU2V4cHIoXG4gIHBhdGg6IEJ1aWxkZXJIZWFkLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuU3ViRXhwcmVzc2lvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1N1YkV4cHJlc3Npb24nLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGhlYWRUb1N0cmluZyhoZWFkOiBBU1R2MS5QYXRoSGVhZCk6IHsgb3JpZ2luYWw6IHN0cmluZzsgcGFydHM6IHN0cmluZ1tdIH0ge1xuICBzd2l0Y2ggKGhlYWQudHlwZSkge1xuICAgIGNhc2UgJ0F0SGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgICBjYXNlICdUaGlzSGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogYHRoaXNgLCBwYXJ0czogW10gfTtcbiAgICBjYXNlICdWYXJIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBoZWFkLm5hbWUsIHBhcnRzOiBbaGVhZC5uYW1lXSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGVhZChcbiAgb3JpZ2luYWw6IHN0cmluZyxcbiAgbG9jOiBTb3VyY2VMb2NhdGlvblxuKTogeyBoZWFkOiBBU1R2MS5QYXRoSGVhZDsgdGFpbDogc3RyaW5nW10gfSB7XG4gIGxldCBbaGVhZCwgLi4udGFpbF0gPSBvcmlnaW5hbC5zcGxpdCgnLicpO1xuICBsZXQgaGVhZE5vZGU6IEFTVHYxLlBhdGhIZWFkO1xuXG4gIGlmIChoZWFkID09PSAndGhpcycpIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdUaGlzSGVhZCcsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKGhlYWRbMF0gPT09ICdAJykge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ0F0SGVhZCcsXG4gICAgICBuYW1lOiBoZWFkLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICAgIG5hbWU6IGhlYWQsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkOiBoZWFkTm9kZSxcbiAgICB0YWlsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRoaXMobG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEF0TmFtZShuYW1lOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIC8vIHRoZSBgQGAgc2hvdWxkIGJlIGluY2x1ZGVkIHNvIHdlIGhhdmUgYSBjb21wbGV0ZSBzb3VyY2UgcmFuZ2VcbiAgYXNzZXJ0KG5hbWVbMF0gPT09ICdAJywgYGNhbGwgYnVpbGRlcnMuYXQoKSB3aXRoIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ0AnYCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQXRIZWFkJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFZhcihuYW1lOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIGFzc2VydChuYW1lICE9PSAndGhpcycsIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGApO1xuICBhc3NlcnQoXG4gICAgbmFtZVswXSAhPT0gJ0AnLFxuICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJyR7bmFtZX0nLiBDYWxsIGJ1aWxkZXJzLmF0KCcke25hbWV9JykgaW5zdGVhZGBcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhlYWRGcm9tU3RyaW5nKGhlYWQ6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgaWYgKGhlYWRbMF0gPT09ICdAJykge1xuICAgIHJldHVybiBidWlsZEF0TmFtZShoZWFkLCBsb2MpO1xuICB9IGVsc2UgaWYgKGhlYWQgPT09ICd0aGlzJykge1xuICAgIHJldHVybiBidWlsZFRoaXMobG9jKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVpbGRWYXIoaGVhZCwgbG9jKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZE5hbWVkQmxvY2tOYW1lKG5hbWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5OYW1lZEJsb2NrTmFtZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ05hbWVkQmxvY2tOYW1lJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZENsZWFuUGF0aChcbiAgaGVhZDogQVNUdjEuUGF0aEhlYWQsXG4gIHRhaWw6IHN0cmluZ1tdLFxuICBsb2M6IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB7XG4gIGxldCB7IG9yaWdpbmFsOiBvcmlnaW5hbEhlYWQsIHBhcnRzOiBoZWFkUGFydHMgfSA9IGhlYWRUb1N0cmluZyhoZWFkKTtcbiAgbGV0IHBhcnRzID0gWy4uLmhlYWRQYXJ0cywgLi4udGFpbF07XG4gIGxldCBvcmlnaW5hbCA9IFsuLi5vcmlnaW5hbEhlYWQsIC4uLnBhcnRzXS5qb2luKCcuJyk7XG5cbiAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShvcmlnaW5hbCwgaGVhZCwgdGFpbCwgYnVpbGRMb2MobG9jIHx8IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXRoKFxuICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IHN0cmluZyB8IHsgaGVhZDogc3RyaW5nOyB0YWlsOiBzdHJpbmdbXSB9LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGF0aEV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgocGF0aDogQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5FeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGg6IEJ1aWxkZXJIZWFkIHwgQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5FeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24gfCB7IGhlYWQ6IHN0cmluZzsgdGFpbDogc3RyaW5nW10gfSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkV4cHJlc3Npb24ge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCd0eXBlJyBpbiBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHsgaGVhZCwgdGFpbCB9ID0gYnVpbGRIZWFkKHBhdGguaGVhZCwgU291cmNlU3Bhbi5icm9rZW4oKSk7XG5cbiAgICAgIGFzc2VydChcbiAgICAgICAgdGFpbC5sZW5ndGggPT09IDAsXG4gICAgICAgIGBidWlsZGVyLnBhdGgoeyBoZWFkLCB0YWlsIH0pIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggYSBoZWFkIHdpdGggZG90cyBpbiBpdGBcbiAgICAgICk7XG5cbiAgICAgIGxldCB7IG9yaWdpbmFsOiBvcmlnaW5hbEhlYWQgfSA9IGhlYWRUb1N0cmluZyhoZWFkKTtcblxuICAgICAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShcbiAgICAgICAgW29yaWdpbmFsSGVhZCwgLi4udGFpbF0uam9pbignLicpLFxuICAgICAgICBoZWFkLFxuICAgICAgICB0YWlsLFxuICAgICAgICBidWlsZExvYyhsb2MgfHwgbnVsbClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHsgaGVhZCwgdGFpbCB9ID0gYnVpbGRIZWFkKHBhdGgsIFNvdXJjZVNwYW4uYnJva2VuKCkpO1xuXG4gIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEocGF0aCwgaGVhZCwgdGFpbCwgYnVpbGRMb2MobG9jIHx8IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPihcbiAgdHlwZTogVFsndHlwZSddLFxuICB2YWx1ZTogVFsndmFsdWUnXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IFQge1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdmFsdWUsXG4gICAgb3JpZ2luYWw6IHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9IGFzIFQ7XG59XG5cbi8vIE1pc2NlbGxhbmVvdXNcblxuZnVuY3Rpb24gYnVpbGRIYXNoKHBhaXJzPzogQVNUdjEuSGFzaFBhaXJbXSwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5IYXNoIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnSGFzaCcsXG4gICAgcGFpcnM6IHBhaXJzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBhaXIoa2V5OiBzdHJpbmcsIHZhbHVlOiBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkhhc2hQYWlyIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnSGFzaFBhaXInLFxuICAgIGtleToga2V5LFxuICAgIHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFByb2dyYW0oXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlRlbXBsYXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrSXRzZWxmKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGNoYWluZWQgPSBmYWxzZSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkJsb2NrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQmxvY2snLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGNoYWluZWQsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGUoXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlRlbXBsYXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBvc2l0aW9uKGxpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXIpOiBTb3VyY2VQb3NpdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbGluZSxcbiAgICBjb2x1bW4sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTG9jKGxvYzogT3B0aW9uPFNvdXJjZUxvY2F0aW9uPik6IFNvdXJjZVNwYW47XG5mdW5jdGlvbiBidWlsZExvYyhcbiAgc3RhcnRMaW5lOiBudW1iZXIsXG4gIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gIGVuZExpbmU/OiBudW1iZXIsXG4gIGVuZENvbHVtbj86IG51bWJlcixcbiAgc291cmNlPzogc3RyaW5nXG4pOiBTb3VyY2VTcGFuO1xuXG5mdW5jdGlvbiBidWlsZExvYyguLi5hcmdzOiBhbnlbXSk6IFNvdXJjZVNwYW4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBsZXQgbG9jID0gYXJnc1swXTtcblxuICAgIGlmIChsb2MgJiYgdHlwZW9mIGxvYyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhTT1VSQ0UoKSwgbG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKFNPVVJDRSgpLCBTWU5USEVUSUNfTE9DQVRJT04pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgW3N0YXJ0TGluZSwgc3RhcnRDb2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgX3NvdXJjZV0gPSBhcmdzO1xuICAgIGxldCBzb3VyY2UgPSBfc291cmNlID8gbmV3IFNvdXJjZSgnJywgX3NvdXJjZSkgOiBTT1VSQ0UoKTtcblxuICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhzb3VyY2UsIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgY29sdW1uOiBzdGFydENvbHVtbixcbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgbGluZTogZW5kTGluZSxcbiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbXVzdGFjaGU6IGJ1aWxkTXVzdGFjaGUsXG4gIGJsb2NrOiBidWlsZEJsb2NrLFxuICBwYXJ0aWFsOiBidWlsZFBhcnRpYWwsXG4gIGNvbW1lbnQ6IGJ1aWxkQ29tbWVudCxcbiAgbXVzdGFjaGVDb21tZW50OiBidWlsZE11c3RhY2hlQ29tbWVudCxcbiAgZWxlbWVudDogYnVpbGRFbGVtZW50LFxuICBlbGVtZW50TW9kaWZpZXI6IGJ1aWxkRWxlbWVudE1vZGlmaWVyLFxuICBhdHRyOiBidWlsZEF0dHIsXG4gIHRleHQ6IGJ1aWxkVGV4dCxcbiAgc2V4cHI6IGJ1aWxkU2V4cHIsXG5cbiAgY29uY2F0OiBidWlsZENvbmNhdCxcbiAgaGFzaDogYnVpbGRIYXNoLFxuICBwYWlyOiBidWlsZFBhaXIsXG4gIGxpdGVyYWw6IGJ1aWxkTGl0ZXJhbCxcbiAgcHJvZ3JhbTogYnVpbGRQcm9ncmFtLFxuICBibG9ja0l0c2VsZjogYnVpbGRCbG9ja0l0c2VsZixcbiAgdGVtcGxhdGU6IGJ1aWxkVGVtcGxhdGUsXG4gIGxvYzogYnVpbGRMb2MsXG4gIHBvczogYnVpbGRQb3NpdGlvbixcblxuICBwYXRoOiBidWlsZFBhdGgsXG5cbiAgZnVsbFBhdGg6IGJ1aWxkQ2xlYW5QYXRoLFxuICBoZWFkOiBidWlsZEhlYWRGcm9tU3RyaW5nLFxuICBhdDogYnVpbGRBdE5hbWUsXG4gIHZhcjogYnVpbGRWYXIsXG4gIHRoaXM6IGJ1aWxkVGhpcyxcbiAgYmxvY2tOYW1lOiBidWlsZE5hbWVkQmxvY2tOYW1lLFxuXG4gIHN0cmluZzogbGl0ZXJhbCgnU3RyaW5nTGl0ZXJhbCcpIGFzICh2YWx1ZTogc3RyaW5nKSA9PiBBU1R2MS5TdHJpbmdMaXRlcmFsLFxuICBib29sZWFuOiBsaXRlcmFsKCdCb29sZWFuTGl0ZXJhbCcpIGFzICh2YWx1ZTogYm9vbGVhbikgPT4gQVNUdjEuQm9vbGVhbkxpdGVyYWwsXG4gIG51bWJlcjogbGl0ZXJhbCgnTnVtYmVyTGl0ZXJhbCcpIGFzICh2YWx1ZTogbnVtYmVyKSA9PiBBU1R2MS5OdW1iZXJMaXRlcmFsLFxuICB1bmRlZmluZWQoKTogQVNUdjEuVW5kZWZpbmVkTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCgnVW5kZWZpbmVkTGl0ZXJhbCcsIHVuZGVmaW5lZCk7XG4gIH0sXG4gIG51bGwoKTogQVNUdjEuTnVsbExpdGVyYWwge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwoJ051bGxMaXRlcmFsJywgbnVsbCk7XG4gIH0sXG59O1xuXG50eXBlIEJ1aWxkTGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4gPSAodmFsdWU6IFRbJ3ZhbHVlJ10pID0+IFQ7XG5cbmZ1bmN0aW9uIGxpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+KHR5cGU6IFRbJ3R5cGUnXSk6IEJ1aWxkTGl0ZXJhbDxUPiB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWU6IFRbJ3ZhbHVlJ10sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogVCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCh0eXBlLCB2YWx1ZSwgbG9jKTtcbiAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=