UNPKG

@glimmer/compiler

Version:
824 lines (744 loc) 71.7 kB
import { assertNever, dict, isPresent } from '@glimmer/util'; export var VariableKind; (function (VariableKind) { VariableKind["Local"] = "Local"; VariableKind["Free"] = "Free"; VariableKind["Arg"] = "Arg"; VariableKind["Block"] = "Block"; VariableKind["This"] = "This"; })(VariableKind || (VariableKind = {})); export function normalizeStatement(statement) { if (Array.isArray(statement)) { if (statementIsExpression(statement)) { return normalizeAppendExpression(statement); } else if (isSugaryArrayStatement(statement)) { return normalizeSugaryArrayStatement(statement); } else { return normalizeVerboseStatement(statement); } } else if (typeof statement === 'string') { return normalizeAppendHead(normalizeDottedPath(statement), false); } else { throw assertNever(statement); } } export function normalizeAppendHead(head, trusted) { if (head.type === "GetPath" /* GetPath */ ) { return { kind: "AppendPath" /* AppendPath */ , path: head, trusted: trusted }; } else { return { kind: "AppendExpr" /* AppendExpr */ , expr: head, trusted: trusted }; } } function isSugaryArrayStatement(statement) { if (Array.isArray(statement) && typeof statement[0] === 'string') { switch (statement[0][0]) { case '(': case '#': case '<': case '!': return true; default: return false; } } return false; } export function normalizeSugaryArrayStatement(statement) { var name = statement[0]; switch (name[0]) { case '(': { var params = null; var hash = null; if (statement.length === 3) { params = normalizeParams(statement[1]); hash = normalizeHash(statement[2]); } else if (statement.length === 2) { if (Array.isArray(statement[1])) { params = normalizeParams(statement[1]); } else { hash = normalizeHash(statement[1]); } } return { kind: "Call" /* Call */ , head: normalizeCallHead(name), params: params, hash: hash, trusted: false }; } case '#': { var _normalizeBuilderBloc = normalizeBuilderBlockStatement(statement), path = _normalizeBuilderBloc.head, _params = _normalizeBuilderBloc.params, _hash = _normalizeBuilderBloc.hash, blocks = _normalizeBuilderBloc.blocks, blockParams = _normalizeBuilderBloc.blockParams; return { kind: "Block" /* Block */ , head: path, params: _params, hash: _hash, blocks: blocks, blockParams: blockParams }; } case '!': { var _name = statement[0].slice(1); var _normalizeBuilderBloc2 = normalizeBuilderBlockStatement(statement), _params2 = _normalizeBuilderBloc2.params, _hash2 = _normalizeBuilderBloc2.hash, _blocks = _normalizeBuilderBloc2.blocks, _blockParams = _normalizeBuilderBloc2.blockParams; return { kind: "Keyword" /* Keyword */ , name: _name, params: _params2, hash: _hash2, blocks: _blocks, blockParams: _blockParams }; } case '<': { var attrs = dict(); var block = []; if (statement.length === 3) { attrs = normalizeAttrs(statement[1]); block = normalizeBlock(statement[2]); } else if (statement.length === 2) { if (Array.isArray(statement[1])) { block = normalizeBlock(statement[1]); } else { attrs = normalizeAttrs(statement[1]); } } return { kind: "Element" /* Element */ , name: extractElement(name), attrs: attrs, block: block }; } default: throw new Error("Unreachable " + JSON.stringify(statement) + " in normalizeSugaryArrayStatement"); } } function normalizeVerboseStatement(statement) { switch (statement[0]) { case 0 /* Literal */ : { return { kind: "Literal" /* Literal */ , value: statement[1] }; } case 2 /* Append */ : { return normalizeAppendExpression(statement[1], statement[2]); } case 3 /* Modifier */ : { return { kind: "Modifier" /* Modifier */ , params: normalizeParams(statement[1]), hash: normalizeHash(statement[2]) }; } case 4 /* DynamicComponent */ : { return { kind: "DynamicComponent" /* DynamicComponent */ , expr: normalizeExpression(statement[1]), hash: normalizeHash(statement[2]), block: normalizeBlock(statement[3]) }; } case 1 /* Comment */ : { return { kind: "Comment" /* Comment */ , value: statement[1] }; } } } function extractBlockHead(name) { var result = /^(#|!)(.*)$/.exec(name); if (result === null) { throw new Error("Unexpected missing # in block head"); } return normalizeDottedPath(result[2]); } function normalizeCallHead(name) { var result = /^\((.*)\)$/.exec(name); if (result === null) { throw new Error("Unexpected missing () in call head"); } return normalizeDottedPath(result[1]); } function normalizePath(head, tail) { if (tail === void 0) { tail = []; } var pathHead = normalizePathHead(head); if (isPresent(tail)) { return { type: "GetPath" /* GetPath */ , path: { head: pathHead, tail: tail } }; } else { return { type: "GetVar" /* GetVar */ , variable: pathHead }; } } function normalizeDottedPath(whole) { var _normalizePathHead = normalizePathHead(whole), kind = _normalizePathHead.kind, rest = _normalizePathHead.name; var _rest$split = rest.split('.'), name = _rest$split[0], tail = _rest$split.slice(1); var variable = { kind: kind, name: name, mode: 'loose' }; if (isPresent(tail)) { return { type: "GetPath" /* GetPath */ , path: { head: variable, tail: tail } }; } else { return { type: "GetVar" /* GetVar */ , variable: variable }; } } export function normalizePathHead(whole) { var kind; var name; if (/^this(\.|$)/.exec(whole)) { return { kind: VariableKind.This, name: whole, mode: 'loose' }; } switch (whole[0]) { case '^': kind = VariableKind.Free; name = whole.slice(1); break; case '@': kind = VariableKind.Arg; name = whole.slice(1); break; case '&': kind = VariableKind.Block; name = whole.slice(1); break; default: kind = VariableKind.Local; name = whole; } return { kind: kind, name: name, mode: 'loose' }; } export function normalizeBuilderBlockStatement(statement) { var head = statement[0]; var blocks = dict(); var params = null; var hash = null; var blockParams = null; if (statement.length === 2) { blocks = normalizeBlocks(statement[1]); } else if (statement.length === 3) { if (Array.isArray(statement[1])) { params = normalizeParams(statement[1]); } else { var _normalizeBlockHash = normalizeBlockHash(statement[1]); hash = _normalizeBlockHash.hash; blockParams = _normalizeBlockHash.blockParams; } blocks = normalizeBlocks(statement[2]); } else if (statement.length === 4) { params = normalizeParams(statement[1]); var _normalizeBlockHash2 = normalizeBlockHash(statement[2]); hash = _normalizeBlockHash2.hash; blockParams = _normalizeBlockHash2.blockParams; blocks = normalizeBlocks(statement[3]); } return { head: extractBlockHead(head), params: params, hash: hash, blockParams: blockParams, blocks: blocks }; } function normalizeBlockHash(hash) { if (hash === null) { return { hash: null, blockParams: null }; } var out = null; var blockParams = null; entries(hash, function (key, value) { if (key === 'as') { blockParams = Array.isArray(value) ? value : [value]; } else { out = out || dict(); out[key] = normalizeExpression(value); } }); return { hash: out, blockParams: blockParams }; } export function entries(dict, callback) { Object.keys(dict).forEach(function (key) { var value = dict[key]; callback(key, value); }); } function normalizeBlocks(value) { if (Array.isArray(value)) { return { "default": normalizeBlock(value) }; } else { return mapObject(value, normalizeBlock); } } function normalizeBlock(block) { return block.map(function (s) { return normalizeStatement(s); }); } function normalizeAttrs(attrs) { return mapObject(attrs, function (a) { return normalizeAttr(a).expr; }); } function normalizeAttr(attr) { if (attr === 'splat') { return { expr: "Splat" /* Splat */ , trusted: false }; } else { var expr = normalizeExpression(attr); return { expr: expr, trusted: false }; } } function mapObject(object, callback) { var out = dict(); Object.keys(object).forEach(function (k) { out[k] = callback(object[k], k); }); return out; } export function isElement(input) { var match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input[0]); return !!match && !!match[1]; } export function extractElement(input) { var match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input); return match ? match[1] : null; } export function extractAngleInvocation(input) { var match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]); return match ? match[1] : null; } export function isAngleInvocation(input) { // TODO Paths var match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]); return !!match && !!match[1]; } export function isBlock(input) { // TODO Paths var match = /^#[^]?([a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)$/.exec(input[0]); return !!match && !!match[1]; } export function normalizeAppendExpression(expression, forceTrusted) { if (forceTrusted === void 0) { forceTrusted = false; } if (expression === null || expression === undefined) { return { expr: { type: "Literal" /* Literal */ , value: expression }, kind: "AppendExpr" /* AppendExpr */ , trusted: false }; } else if (Array.isArray(expression)) { switch (expression[0]) { case 0 /* Literal */ : return { expr: { type: "Literal" /* Literal */ , value: expression[1] }, kind: "AppendExpr" /* AppendExpr */ , trusted: false }; case 5 /* Get */ : { return normalizeAppendHead(normalizePath(expression[1], expression[2]), forceTrusted); } case 6 /* Concat */ : { var expr = { type: "Concat" /* Concat */ , params: normalizeParams(expression.slice(1)) }; return { expr: expr, kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; } case 7 /* HasBlock */ : return { expr: { type: "HasBlock" /* HasBlock */ , name: expression[1] }, kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; case 8 /* HasBlockParams */ : return { expr: { type: "HasBlockParams" /* HasBlockParams */ , name: expression[1] }, kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; default: { if (isBuilderCallExpression(expression)) { return { expr: normalizeCallExpression(expression), kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; } else { throw new Error("Unexpected array in expression position (wasn't a tuple expression and " + expression[0] + " isn't wrapped in parens, so it isn't a call): " + JSON.stringify(expression)); } } // BuilderCallExpression } } else if (typeof expression !== 'object') { switch (typeof expression) { case 'string': { return normalizeAppendHead(normalizeDottedPath(expression), forceTrusted); } case 'boolean': case 'number': return { expr: { type: "Literal" /* Literal */ , value: expression }, kind: "AppendExpr" /* AppendExpr */ , trusted: true }; default: throw assertNever(expression); } } else { throw assertNever(expression); } } export function normalizeExpression(expression) { if (expression === null || expression === undefined) { return { type: "Literal" /* Literal */ , value: expression }; } else if (Array.isArray(expression)) { switch (expression[0]) { case 0 /* Literal */ : return { type: "Literal" /* Literal */ , value: expression[1] }; case 5 /* Get */ : { return normalizePath(expression[1], expression[2]); } case 6 /* Concat */ : { var expr = { type: "Concat" /* Concat */ , params: normalizeParams(expression.slice(1)) }; return expr; } case 7 /* HasBlock */ : return { type: "HasBlock" /* HasBlock */ , name: expression[1] }; case 8 /* HasBlockParams */ : return { type: "HasBlockParams" /* HasBlockParams */ , name: expression[1] }; default: { if (isBuilderCallExpression(expression)) { return normalizeCallExpression(expression); } else { throw new Error("Unexpected array in expression position (wasn't a tuple expression and " + expression[0] + " isn't wrapped in parens, so it isn't a call): " + JSON.stringify(expression)); } } // BuilderCallExpression } } else if (typeof expression !== 'object') { switch (typeof expression) { case 'string': { return normalizeDottedPath(expression); } case 'boolean': case 'number': return { type: "Literal" /* Literal */ , value: expression }; default: throw assertNever(expression); } } else { throw assertNever(expression); } } export function isBuilderExpression(expr) { return Array.isArray(expr); } export function isLiteral(expr) { return Array.isArray(expr) && expr[0] === 'literal'; } export function statementIsExpression(statement) { if (!Array.isArray(statement)) { return false; } var name = statement[0]; if (typeof name === 'number') { switch (name) { case 0 /* Literal */ : case 5 /* Get */ : case 6 /* Concat */ : case 7 /* HasBlock */ : case 8 /* HasBlockParams */ : return true; default: return false; } } if (name[0] === '(') { return true; } return false; } export function isBuilderCallExpression(value) { return typeof value[0] === 'string' && value[0][0] === '('; } export function normalizeParams(input) { return input.map(normalizeExpression); } export function normalizeHash(input) { if (input === null) return null; return mapObject(input, normalizeExpression); } export function normalizeCallExpression(expr) { switch (expr.length) { case 1: return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: null, hash: null }; case 2: { if (Array.isArray(expr[1])) { return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: normalizeParams(expr[1]), hash: null }; } else { return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: null, hash: normalizeHash(expr[1]) }; } } case 3: return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: normalizeParams(expr[1]), hash: normalizeHash(expr[2]) }; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXItaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQUEsV0FBQSxFQUFBLElBQUEsRUFBQSxTQUFBLFFBQUEsZUFBQTtBQXlDQSxPQUFBLElBQUEsWUFBQTs7QUFBQSxDQUFBLFVBQUEsWUFBQSxFQUF3QjtBQUN0QixFQUFBLFlBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBQTtBQUNBLEVBQUEsWUFBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBQTtBQUxGLENBQUEsRUFBWSxZQUFZLEtBQVosWUFBWSxHQUF4QixFQUF3QixDQUF4Qjs7QUFrRkEsT0FBTSxTQUFBLGtCQUFBLENBQUEsU0FBQSxFQUF3RDtBQUM1RCxNQUFJLEtBQUssQ0FBTCxPQUFBLENBQUosU0FBSSxDQUFKLEVBQThCO0FBQzVCLFFBQUkscUJBQXFCLENBQXpCLFNBQXlCLENBQXpCLEVBQXNDO0FBQ3BDLGFBQU8seUJBQXlCLENBQWhDLFNBQWdDLENBQWhDO0FBREYsS0FBQSxNQUVPLElBQUksc0JBQXNCLENBQTFCLFNBQTBCLENBQTFCLEVBQXVDO0FBQzVDLGFBQU8sNkJBQTZCLENBQXBDLFNBQW9DLENBQXBDO0FBREssS0FBQSxNQUVBO0FBQ0wsYUFBTyx5QkFBeUIsQ0FBaEMsU0FBZ0MsQ0FBaEM7QUFDRDtBQVBILEdBQUEsTUFRTyxJQUFJLE9BQUEsU0FBQSxLQUFKLFFBQUEsRUFBbUM7QUFDeEMsV0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBcEIsU0FBb0IsQ0FBcEIsRUFBMUIsS0FBMEIsQ0FBMUI7QUFESyxHQUFBLE1BRUE7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QztBQUVMLFlBQUEsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FGdkIsQ0FFdUIsQ0FBTCxDQUZsQjtBQUdMLFlBQUEsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBSHZCLENBR3VCLENBQUwsQ0FIbEI7QUFJTCxZQUFBLElBQUksRUFBRTtBQUpELFdBQVA7QUFERixTQUFBLE1BT087QUFDTCxpQkFBTztBQUNMLFlBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFlBQUEsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FGdkIsQ0FFdUIsQ0FBTCxDQUZsQjtBQUdMLFlBQUEsTUFBTSxFQUhELElBQUE7QUFJTCxZQUFBLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFMLENBQUssQ0FBTDtBQUpkLFdBQVA7QUFNRDtBQUNGOztBQUVELFNBQUEsQ0FBQTtBQUNFLGFBQU87QUFDTCxRQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxRQUFBLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBRnZCLENBRXVCLENBQUwsQ0FGbEI7QUFHTCxRQUFBLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUh2QixDQUd1QixDQUFMLENBSGxCO0FBSUwsUUFBQSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBTCxDQUFLLENBQUw7QUFKZCxPQUFQO0FBM0JKO0FBa0NEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgRGljdFZhbHVlLCBPcHRpb24sIFByZXNlbnRBcnJheSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGRpY3QsIGV4cGVjdCwgaXNQcmVzZW50IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCB0eXBlIEJ1aWxkZXJQYXJhbXMgPSBCdWlsZGVyRXhwcmVzc2lvbltdO1xuZXhwb3J0IHR5cGUgQnVpbGRlckhhc2ggPSBPcHRpb248RGljdDxCdWlsZGVyRXhwcmVzc2lvbj4+O1xuZXhwb3J0IHR5cGUgQnVpbGRlckJsb2NrSGFzaCA9IEJ1aWxkZXJIYXNoIHwgeyBhczogc3RyaW5nIHwgc3RyaW5nW10gfTtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJCbG9ja3MgPSBEaWN0PEJ1aWxkZXJCbG9jaz47XG5leHBvcnQgdHlwZSBCdWlsZGVyQXR0cnMgPSBEaWN0PEJ1aWxkZXJBdHRyPjtcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplZFBhcmFtcyA9IE5vcm1hbGl6ZWRFeHByZXNzaW9uW107XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkSGFzaCA9IERpY3Q8Tm9ybWFsaXplZEV4cHJlc3Npb24+O1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEJsb2NrID0gTm9ybWFsaXplZFN0YXRlbWVudFtdO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEJsb2NrcyA9IERpY3Q8Tm9ybWFsaXplZEJsb2NrPjtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRBdHRycyA9IERpY3Q8Tm9ybWFsaXplZEF0dHI+O1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEF0dHIgPSBIZWFkS2luZC5TcGxhdCB8IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRFbGVtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz47XG4gIGJsb2NrOiBPcHRpb248Tm9ybWFsaXplZEJsb2NrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkQW5nbGVJbnZvY2F0aW9uIHtcbiAgaGVhZDogTm9ybWFsaXplZEV4cHJlc3Npb247XG4gIGF0dHJzOiBPcHRpb248Tm9ybWFsaXplZEF0dHJzPjtcbiAgYmxvY2s6IE9wdGlvbjxOb3JtYWxpemVkQmxvY2s+O1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBIZWFkS2luZCB7XG4gIEJsb2NrID0gJ0Jsb2NrJyxcbiAgQ2FsbCA9ICdDYWxsJyxcbiAgRWxlbWVudCA9ICdFbGVtZW50JyxcbiAgQXBwZW5kUGF0aCA9ICdBcHBlbmRQYXRoJyxcbiAgQXBwZW5kRXhwciA9ICdBcHBlbmRFeHByJyxcbiAgTGl0ZXJhbCA9ICdMaXRlcmFsJyxcbiAgTW9kaWZpZXIgPSAnTW9kaWZpZXInLFxuICBEeW5hbWljQ29tcG9uZW50ID0gJ0R5bmFtaWNDb21wb25lbnQnLFxuICBDb21tZW50ID0gJ0NvbW1lbnQnLFxuICBTcGxhdCA9ICdTcGxhdCcsXG4gIEtleXdvcmQgPSAnS2V5d29yZCcsXG59XG5cbmV4cG9ydCBlbnVtIFZhcmlhYmxlS2luZCB7XG4gIExvY2FsID0gJ0xvY2FsJyxcbiAgRnJlZSA9ICdGcmVlJyxcbiAgQXJnID0gJ0FyZycsXG4gIEJsb2NrID0gJ0Jsb2NrJyxcbiAgVGhpcyA9ICdUaGlzJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZSB7XG4gIGtpbmQ6IFZhcmlhYmxlS2luZDtcbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogRGlmZmVyZW5jZXM6XG4gICAqXG4gICAqIC0gc3RyaWN0IG1vZGUgdmFyaWFibGVzIGFsd2F5cyByZWZlciB0byBpbi1zY29wZSB2YXJpYWJsZXNcbiAgICogLSBsb29zZSBtb2RlIHZhcmlhYmxlcyB1c2UgdGhpcyBhbGdvcml0aG06XG4gICAqICAgMS4gb3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gYHRoaXMuPG5hbWU+YFxuICAgKi9cbiAgbW9kZTogJ2xvb3NlJyB8ICdzdHJpY3QnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGgge1xuICBoZWFkOiBWYXJpYWJsZTtcbiAgdGFpbDogUHJlc2VudEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwZW5kRXhwciB7XG4gIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZEV4cHI7XG4gIGV4cHI6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICB0cnVzdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGVuZFBhdGgge1xuICBraW5kOiBIZWFkS2luZC5BcHBlbmRQYXRoO1xuICBwYXRoOiBOb3JtYWxpemVkUGF0aDtcbiAgdHJ1c3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudCB7XG4gIGtpbmQ6IEhlYWRLaW5kLktleXdvcmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gIGJsb2NrUGFyYW1zOiBPcHRpb248c3RyaW5nW10+O1xuICBibG9ja3M6IE5vcm1hbGl6ZWRCbG9ja3M7XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTdGF0ZW1lbnQgPVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkNhbGw7XG4gICAgICBoZWFkOiBOb3JtYWxpemVkSGVhZDtcbiAgICAgIHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+O1xuICAgICAgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPjtcbiAgICAgIHRydXN0ZWQ6IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkJsb2NrO1xuICAgICAgaGVhZDogTm9ybWFsaXplZEhlYWQ7XG4gICAgICBwYXJhbXM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPjtcbiAgICAgIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gICAgICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPjtcbiAgICAgIGJsb2NrczogTm9ybWFsaXplZEJsb2NrcztcbiAgICB9XG4gIHwgTm9ybWFsaXplZEtleXdvcmRTdGF0ZW1lbnRcbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5FbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgYXR0cnM6IE5vcm1hbGl6ZWRBdHRycztcbiAgICAgIGJsb2NrOiBOb3JtYWxpemVkQmxvY2s7XG4gICAgfVxuICB8IHsga2luZDogSGVhZEtpbmQuQ29tbWVudDsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiBIZWFkS2luZC5MaXRlcmFsOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCBBcHBlbmRQYXRoXG4gIHwgQXBwZW5kRXhwclxuICB8IHsga2luZDogSGVhZEtpbmQuTW9kaWZpZXI7IHBhcmFtczogTm9ybWFsaXplZFBhcmFtczsgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPiB9XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudDtcbiAgICAgIGV4cHI6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICAgICAgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPjtcbiAgICAgIGJsb2NrOiBOb3JtYWxpemVkQmxvY2s7XG4gICAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXRlbWVudChzdGF0ZW1lbnQ6IEJ1aWxkZXJTdGF0ZW1lbnQpOiBOb3JtYWxpemVkU3RhdGVtZW50IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50KSkge1xuICAgIGlmIChzdGF0ZW1lbnRJc0V4cHJlc3Npb24oc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZUFwcGVuZEV4cHJlc3Npb24oc3RhdGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVN1Z2FyeUFycmF5U3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVWZXJib3NlU3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUFwcGVuZEhlYWQobm9ybWFsaXplRG90dGVkUGF0aChzdGF0ZW1lbnQpLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgYXNzZXJ0TmV2ZXIoc3RhdGVtZW50KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXBwZW5kSGVhZChcbiAgaGVhZDogTm9ybWFsaXplZEhlYWQsXG4gIHRydXN0ZWQ6IGJvb2xlYW5cbik6IEFwcGVuZEV4cHIgfCBBcHBlbmRQYXRoIHtcbiAgaWYgKGhlYWQudHlwZSA9PT0gRXhwcmVzc2lvbktpbmQuR2V0UGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBIZWFkS2luZC5BcHBlbmRQYXRoLFxuICAgICAgcGF0aDogaGVhZCxcbiAgICAgIHRydXN0ZWQsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogSGVhZEtpbmQuQXBwZW5kRXhwcixcbiAgICAgIGV4cHI6IGhlYWQsXG4gICAgICB0cnVzdGVkLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTdWdhcnlBcnJheVN0YXRlbWVudChzdGF0ZW1lbnQ6IEJ1aWxkZXJTdGF0ZW1lbnQpOiBzdGF0ZW1lbnQgaXMgU3VnYXJ5QXJyYXlTdGF0ZW1lbnQge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnQpICYmIHR5cGVvZiBzdGF0ZW1lbnRbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgc3dpdGNoIChzdGF0ZW1lbnRbMF1bMF0pIHtcbiAgICAgIGNhc2UgJygnOlxuICAgICAgY2FzZSAnIyc6XG4gICAgICBjYXNlICc8JzpcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIFN1Z2FyeUFycmF5U3RhdGVtZW50ID0gQnVpbGRlckNhbGxFeHByZXNzaW9uIHwgQnVpbGRlckVsZW1lbnQgfCBCdWlsZGVyQmxvY2tTdGF0ZW1lbnQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdWdhcnlBcnJheVN0YXRlbWVudChcbiAgc3RhdGVtZW50OiBTdWdhcnlBcnJheVN0YXRlbWVudFxuKTogTm9ybWFsaXplZFN0YXRlbWVudCB7XG4gIGxldCBuYW1lID0gc3RhdGVtZW50WzBdO1xuXG4gIHN3aXRjaCAobmFtZVswXSkge1xuICAgIGNhc2UgJygnOiB7XG4gICAgICBsZXQgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz4gPSBudWxsO1xuICAgICAgbGV0IGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD4gPSBudWxsO1xuXG4gICAgICBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICBwYXJhbXMgPSBub3JtYWxpemVQYXJhbXMoc3RhdGVtZW50WzFdIGFzIFBhcmFtcyk7XG4gICAgICAgIGhhc2ggPSBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsyXSBhcyBIYXNoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRbMV0pKSB7XG4gICAgICAgICAgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSBhcyBQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc2ggPSBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsxXSBhcyBIYXNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5DYWxsLFxuICAgICAgICBoZWFkOiBub3JtYWxpemVDYWxsSGVhZChuYW1lKSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoYXNoLFxuICAgICAgICB0cnVzdGVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnIyc6IHtcbiAgICAgIGxldCB7IGhlYWQ6IHBhdGgsIHBhcmFtcywgaGFzaCwgYmxvY2tzLCBibG9ja1BhcmFtcyB9ID0gbm9ybWFsaXplQnVpbGRlckJsb2NrU3RhdGVtZW50KFxuICAgICAgICBzdGF0ZW1lbnQgYXMgQnVpbGRlckJsb2NrU3RhdGVtZW50XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5CbG9jayxcbiAgICAgICAgaGVhZDogcGF0aCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoYXNoLFxuICAgICAgICBibG9ja3MsXG4gICAgICAgIGJsb2NrUGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICchJzoge1xuICAgICAgbGV0IG5hbWUgPSBzdGF0ZW1lbnRbMF0uc2xpY2UoMSk7XG4gICAgICBsZXQgeyBwYXJhbXMsIGhhc2gsIGJsb2NrcywgYmxvY2tQYXJhbXMgfSA9IG5vcm1hbGl6ZUJ1aWxkZXJCbG9ja1N0YXRlbWVudChcbiAgICAgICAgc3RhdGVtZW50IGFzIEJ1aWxkZXJCbG9ja1N0YXRlbWVudFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuS2V5d29yZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoYXNoLFxuICAgICAgICBibG9ja3MsXG4gICAgICAgIGJsb2NrUGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICc8Jzoge1xuICAgICAgbGV0IGF0dHJzOiBOb3JtYWxpemVkQXR0cnMgPSBkaWN0KCk7XG4gICAgICBsZXQgYmxvY2s6IE5vcm1hbGl6ZWRCbG9jayA9IFtdO1xuXG4gICAgICBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICBhdHRycyA9IG5vcm1hbGl6ZUF0dHJzKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQXR0cnMpO1xuICAgICAgICBibG9jayA9IG5vcm1hbGl6ZUJsb2NrKHN0YXRlbWVudFsyXSBhcyBCdWlsZGVyQmxvY2spO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0YXRlbWVudFsxXSkpIHtcbiAgICAgICAgICBibG9jayA9IG5vcm1hbGl6ZUJsb2NrKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF0dHJzID0gbm9ybWFsaXplQXR0cnMoc3RhdGVtZW50WzFdIGFzIEJ1aWxkZXJBdHRycyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuRWxlbWVudCxcbiAgICAgICAgbmFtZTogZXhwZWN0KGV4dHJhY3RFbGVtZW50KG5hbWUpLCBgQlVHOiBleHBlY3RlZCAke25hbWV9IHRvIGxvb2sgbGlrZSBhIHRhZyBuYW1lYCksXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBibG9jayxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWFjaGFibGUgJHtKU09OLnN0cmluZ2lmeShzdGF0ZW1lbnQpfSBpbiBub3JtYWxpemVTdWdhcnlBcnJheVN0YXRlbWVudGApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZlcmJvc2VTdGF0ZW1lbnQoc3RhdGVtZW50OiBWZXJib3NlU3RhdGVtZW50KTogTm9ybWFsaXplZFN0YXRlbWVudCB7XG4gIHN3aXRjaCAoc3RhdGVtZW50WzBdKSB7XG4gICAgY2FzZSBCdWlsZGVyLkxpdGVyYWw6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkxpdGVyYWwsXG4gICAgICAgIHZhbHVlOiBzdGF0ZW1lbnRbMV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5BcHBlbmQ6IHtcbiAgICAgIHJldHVybiBub3JtYWxpemVBcHBlbmRFeHByZXNzaW9uKHN0YXRlbWVudFsxXSwgc3RhdGVtZW50WzJdKTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuTW9kaWZpZXI6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLk1vZGlmaWVyLFxuICAgICAgICBwYXJhbXM6IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0pLFxuICAgICAgICBoYXNoOiBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsyXSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5EeW5hbWljQ29tcG9uZW50OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5EeW5hbWljQ29tcG9uZW50LFxuICAgICAgICBleHByOiBub3JtYWxpemVFeHByZXNzaW9uKHN0YXRlbWVudFsxXSksXG4gICAgICAgIGhhc2g6IG5vcm1hbGl6ZUhhc2goc3RhdGVtZW50WzJdKSxcbiAgICAgICAgYmxvY2s6IG5vcm1hbGl6ZUJsb2NrKHN0YXRlbWVudFszXSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5Db21tZW50OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5Db21tZW50LFxuICAgICAgICB2YWx1ZTogc3RhdGVtZW50WzFdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEJsb2NrSGVhZChuYW1lOiBzdHJpbmcpOiBOb3JtYWxpemVkSGVhZCB7XG4gIGxldCByZXN1bHQgPSAvXigjfCEpKC4qKSQvLmV4ZWMobmFtZSk7XG5cbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBtaXNzaW5nICMgaW4gYmxvY2sgaGVhZGApO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZURvdHRlZFBhdGgocmVzdWx0WzJdKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaX