UNPKG

@glimmer/syntax

Version:
472 lines (418 loc) 45 kB
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=