@glimmer/compiler
Version:
851 lines (763 loc) • 70.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.normalizeStatement = normalizeStatement;
exports.normalizeAppendHead = normalizeAppendHead;
exports.normalizeSugaryArrayStatement = normalizeSugaryArrayStatement;
exports.normalizePathHead = normalizePathHead;
exports.normalizeBuilderBlockStatement = normalizeBuilderBlockStatement;
exports.entries = entries;
exports.isElement = isElement;
exports.extractElement = extractElement;
exports.extractAngleInvocation = extractAngleInvocation;
exports.isAngleInvocation = isAngleInvocation;
exports.isBlock = isBlock;
exports.normalizeAppendExpression = normalizeAppendExpression;
exports.normalizeExpression = normalizeExpression;
exports.isBuilderExpression = isBuilderExpression;
exports.isLiteral = isLiteral;
exports.statementIsExpression = statementIsExpression;
exports.isBuilderCallExpression = isBuilderCallExpression;
exports.normalizeParams = normalizeParams;
exports.normalizeHash = normalizeHash;
exports.normalizeCallExpression = normalizeCallExpression;
exports.VariableKind = void 0;
var _util = require("@glimmer/util");
var VariableKind;
exports.VariableKind = VariableKind;
(function (VariableKind) {
VariableKind["Local"] = "Local";
VariableKind["Free"] = "Free";
VariableKind["Arg"] = "Arg";
VariableKind["Block"] = "Block";
VariableKind["This"] = "This";
})(VariableKind || (exports.VariableKind = VariableKind = {}));
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 (0, _util.assertNever)(statement);
}
}
function normalizeAppendHead(head, trusted) {
if (head.type === "GetPath"
/* GetPath */
) {
return {
kind: "AppendPath"
/* AppendPath */
,
path: head,
trusted
};
} else {
return {
kind: "AppendExpr"
/* AppendExpr */
,
expr: head,
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;
}
function normalizeSugaryArrayStatement(statement) {
let name = statement[0];
switch (name[0]) {
case '(':
{
let params = null;
let 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,
hash,
trusted: false
};
}
case '#':
{
let {
head: path,
params,
hash,
blocks,
blockParams
} = normalizeBuilderBlockStatement(statement);
return {
kind: "Block"
/* Block */
,
head: path,
params,
hash,
blocks,
blockParams
};
}
case '!':
{
let name = statement[0].slice(1);
let {
params,
hash,
blocks,
blockParams
} = normalizeBuilderBlockStatement(statement);
return {
kind: "Keyword"
/* Keyword */
,
name,
params,
hash,
blocks,
blockParams
};
}
case '<':
{
let attrs = (0, _util.dict)();
let 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,
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) {
let result = /^(#|!)(.*)$/.exec(name);
if (result === null) {
throw new Error(`Unexpected missing # in block head`);
}
return normalizeDottedPath(result[2]);
}
function normalizeCallHead(name) {
let result = /^\((.*)\)$/.exec(name);
if (result === null) {
throw new Error(`Unexpected missing () in call head`);
}
return normalizeDottedPath(result[1]);
}
function normalizePath(head, tail = []) {
let pathHead = normalizePathHead(head);
if ((0, _util.isPresent)(tail)) {
return {
type: "GetPath"
/* GetPath */
,
path: {
head: pathHead,
tail
}
};
} else {
return {
type: "GetVar"
/* GetVar */
,
variable: pathHead
};
}
}
function normalizeDottedPath(whole) {
let {
kind,
name: rest
} = normalizePathHead(whole);
let [name, ...tail] = rest.split('.');
let variable = {
kind,
name,
mode: 'loose'
};
if ((0, _util.isPresent)(tail)) {
return {
type: "GetPath"
/* GetPath */
,
path: {
head: variable,
tail
}
};
} else {
return {
type: "GetVar"
/* GetVar */
,
variable
};
}
}
function normalizePathHead(whole) {
let kind;
let 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,
name,
mode: 'loose'
};
}
function normalizeBuilderBlockStatement(statement) {
let head = statement[0];
let blocks = (0, _util.dict)();
let params = null;
let hash = null;
let 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 {
({
hash,
blockParams
} = normalizeBlockHash(statement[1]));
}
blocks = normalizeBlocks(statement[2]);
} else if (statement.length === 4) {
params = normalizeParams(statement[1]);
({
hash,
blockParams
} = normalizeBlockHash(statement[2]));
blocks = normalizeBlocks(statement[3]);
}
return {
head: extractBlockHead(head),
params,
hash,
blockParams,
blocks
};
}
function normalizeBlockHash(hash) {
if (hash === null) {
return {
hash: null,
blockParams: null
};
}
let out = null;
let blockParams = null;
entries(hash, (key, value) => {
if (key === 'as') {
blockParams = Array.isArray(value) ? value : [value];
} else {
out = out || (0, _util.dict)();
out[key] = normalizeExpression(value);
}
});
return {
hash: out,
blockParams
};
}
function entries(dict, callback) {
Object.keys(dict).forEach(key => {
let 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(s => normalizeStatement(s));
}
function normalizeAttrs(attrs) {
return mapObject(attrs, a => normalizeAttr(a).expr);
}
function normalizeAttr(attr) {
if (attr === 'splat') {
return {
expr: "Splat"
/* Splat */
,
trusted: false
};
} else {
let expr = normalizeExpression(attr);
return {
expr,
trusted: false
};
}
}
function mapObject(object, callback) {
let out = (0, _util.dict)();
Object.keys(object).forEach(k => {
out[k] = callback(object[k], k);
});
return out;
}
function isElement(input) {
let match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return !!match && !!match[1];
}
function extractElement(input) {
let match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input);
return match ? match[1] : null;
}
function extractAngleInvocation(input) {
let match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return match ? match[1] : null;
}
function isAngleInvocation(input) {
// TODO Paths
let match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return !!match && !!match[1];
}
function isBlock(input) {
// TODO Paths
let match = /^#[^]?([a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)$/.exec(input[0]);
return !!match && !!match[1];
}
function normalizeAppendExpression(expression, 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 */
:
{
let expr = {
type: "Concat"
/* Concat */
,
params: normalizeParams(expression.slice(1))
};
return {
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 (0, _util.assertNever)(expression);
}
} else {
throw (0, _util.assertNever)(expression);
}
}
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 */
:
{
let 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 (0, _util.assertNever)(expression);
}
} else {
throw (0, _util.assertNever)(expression);
}
}
function isBuilderExpression(expr) {
return Array.isArray(expr);
}
function isLiteral(expr) {
return Array.isArray(expr) && expr[0] === 'literal';
}
function statementIsExpression(statement) {
if (!Array.isArray(statement)) {
return false;
}
let 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;
}
function isBuilderCallExpression(value) {
return typeof value[0] === 'string' && value[0][0] === '(';
}
function normalizeParams(input) {
return input.map(normalizeExpression);
}
function normalizeHash(input) {
if (input === null) return null;
return mapObject(input, normalizeExpression);
}
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXItaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBOztBQXlDQSxJQUFBLFlBQUE7OztBQUFBLENBQUEsVUFBQSxZQUFBLEVBQXdCO0FBQ3RCLEVBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsS0FBQTtBQUNBLEVBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFBO0FBTEYsQ0FBQSxFQUFZLFlBQVksNEJBQVosWUFBWSxHQUF4QixFQUF3QixDQUF4Qjs7QUFrRk0sU0FBQSxrQkFBQSxDQUFBLFNBQUEsRUFBd0Q7QUFDNUQsTUFBSSxLQUFLLENBQUwsT0FBQSxDQUFKLFNBQUksQ0FBSixFQUE4QjtBQUM1QixRQUFJLHFCQUFxQixDQUF6QixTQUF5QixDQUF6QixFQUFzQztBQUNwQyxhQUFPLHlCQUF5QixDQUFoQyxTQUFnQyxDQUFoQztBQURGLEtBQUEsTUFFTyxJQUFJLHNCQUFzQixDQUExQixTQUEwQixDQUExQixFQUF1QztBQUM1QyxhQUFPLDZCQUE2QixDQUFwQyxTQUFvQyxDQUFwQztBQURLLEtBQUEsTUFFQTtBQUNMLGFBQU8seUJBQXlCLENBQWhDLFNBQWdDLENBQWhDO0FBQ0Q7QUFQSCxHQUFBLE1BUU8sSUFBSSxPQUFBLFNBQUEsS0FBSixRQUFBLEVBQW1DO0FBQ3hDLFdBQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQXBCLFNBQW9CLENBQXBCLEVBQTFCLEtBQTBCLENBQTFCO0FBREssR0FBQSxNQUVBO0FBQ0wsVUFBTSx1QkFBTixTQUFN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SUFBSSxDQUZ2QixDQUV1QixDQUFMLENBRmxCO0FBR0wsUUFBQSxNQUFNLEVBSEQsSUFBQTtBQUlMLFFBQUEsSUFBSSxFQUFFO0FBSkQsT0FBUDs7QUFNRixTQUFBLENBQUE7QUFBUTtBQUNOLFlBQUksS0FBSyxDQUFMLE9BQUEsQ0FBYyxJQUFJLENBQXRCLENBQXNCLENBQWxCLENBQUosRUFBNEI7QUFDMUIsaUJBQU87QUFDTCxZQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxZQUFBLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBRnZCLENBRXVCLENBQUwsQ0FGbEI7QUFHTCxZQUFBLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUh2QixDQUd1QixDQUFMLENBSGxCO0FBSUwsWUFBQSxJQUFJLEVBQUU7QUFKRCxXQUFQO0FBREYsU0FBQSxNQU9PO0FBQ0wsaUJBQU87QUFDTCxZQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxZQUFBLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBRnZCLENBRXVCLENBQUwsQ0FGbEI7QUFHTCxZQUFBLE1BQU0sRUFIRCxJQUFBO0FBSUwsWUFBQSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBTCxDQUFLLENBQUw7QUFKZCxXQUFQO0FBTUQ7QUFDRjs7QUFFRCxTQUFBLENBQUE7QUFDRSxhQUFPO0FBQ0wsUUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsUUFBQSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUZ2QixDQUV1QixDQUFMLENBRmxCO0FBR0wsUUFBQSxNQUFNLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FIdkIsQ0FHdUIsQ0FBTCxDQUhsQjtBQUlMLFFBQUEsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUwsQ0FBSyxDQUFMO0FBSmQsT0FBUDtBQTNCSjtBQWtDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIERpY3RWYWx1ZSwgT3B0aW9uLCBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydE5ldmVyLCBkaWN0LCBleHBlY3QsIGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5leHBvcnQgdHlwZSBCdWlsZGVyUGFyYW1zID0gQnVpbGRlckV4cHJlc3Npb25bXTtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJIYXNoID0gT3B0aW9uPERpY3Q8QnVpbGRlckV4cHJlc3Npb24+PjtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJCbG9ja0hhc2ggPSBCdWlsZGVySGFzaCB8IHsgYXM6IHN0cmluZyB8IHN0cmluZ1tdIH07XG5leHBvcnQgdHlwZSBCdWlsZGVyQmxvY2tzID0gRGljdDxCdWlsZGVyQmxvY2s+O1xuZXhwb3J0IHR5cGUgQnVpbGRlckF0dHJzID0gRGljdDxCdWlsZGVyQXR0cj47XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRQYXJhbXMgPSBOb3JtYWxpemVkRXhwcmVzc2lvbltdO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEhhc2ggPSBEaWN0PE5vcm1hbGl6ZWRFeHByZXNzaW9uPjtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRCbG9jayA9IE5vcm1hbGl6ZWRTdGF0ZW1lbnRbXTtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRCbG9ja3MgPSBEaWN0PE5vcm1hbGl6ZWRCbG9jaz47XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQXR0cnMgPSBEaWN0PE5vcm1hbGl6ZWRBdHRyPjtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRBdHRyID0gSGVhZEtpbmQuU3BsYXQgfCBOb3JtYWxpemVkRXhwcmVzc2lvbjtcblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkRWxlbWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXR0cnM6IE9wdGlvbjxOb3JtYWxpemVkQXR0cnM+O1xuICBibG9jazogT3B0aW9uPE5vcm1hbGl6ZWRCbG9jaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbiB7XG4gIGhlYWQ6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICBhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz47XG4gIGJsb2NrOiBPcHRpb248Tm9ybWFsaXplZEJsb2NrPjtcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gSGVhZEtpbmQge1xuICBCbG9jayA9ICdCbG9jaycsXG4gIENhbGwgPSAnQ2FsbCcsXG4gIEVsZW1lbnQgPSAnRWxlbWVudCcsXG4gIEFwcGVuZFBhdGggPSAnQXBwZW5kUGF0aCcsXG4gIEFwcGVuZEV4cHIgPSAnQXBwZW5kRXhwcicsXG4gIExpdGVyYWwgPSAnTGl0ZXJhbCcsXG4gIE1vZGlmaWVyID0gJ01vZGlmaWVyJyxcbiAgRHluYW1pY0NvbXBvbmVudCA9ICdEeW5hbWljQ29tcG9uZW50JyxcbiAgQ29tbWVudCA9ICdDb21tZW50JyxcbiAgU3BsYXQgPSAnU3BsYXQnLFxuICBLZXl3b3JkID0gJ0tleXdvcmQnLFxufVxuXG5leHBvcnQgZW51bSBWYXJpYWJsZUtpbmQge1xuICBMb2NhbCA9ICdMb2NhbCcsXG4gIEZyZWUgPSAnRnJlZScsXG4gIEFyZyA9ICdBcmcnLFxuICBCbG9jayA9ICdCbG9jaycsXG4gIFRoaXMgPSAnVGhpcycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGUge1xuICBraW5kOiBWYXJpYWJsZUtpbmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAtIHN0cmljdCBtb2RlIHZhcmlhYmxlcyBhbHdheXMgcmVmZXIgdG8gaW4tc2NvcGUgdmFyaWFibGVzXG4gICAqIC0gbG9vc2UgbW9kZSB2YXJpYWJsZXMgdXNlIHRoaXMgYWxnb3JpdGhtOlxuICAgKiAgIDEuIG90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGB0aGlzLjxuYW1lPmBcbiAgICovXG4gIG1vZGU6ICdsb29zZScgfCAnc3RyaWN0Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXRoIHtcbiAgaGVhZDogVmFyaWFibGU7XG4gIHRhaWw6IFByZXNlbnRBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGVuZEV4cHIge1xuICBraW5kOiBIZWFkS2luZC5BcHBlbmRFeHByO1xuICBleHByOiBOb3JtYWxpemVkRXhwcmVzc2lvbjtcbiAgdHJ1c3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBlbmRQYXRoIHtcbiAga2luZDogSGVhZEtpbmQuQXBwZW5kUGF0aDtcbiAgcGF0aDogTm9ybWFsaXplZFBhdGg7XG4gIHRydXN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEtleXdvcmRTdGF0ZW1lbnQge1xuICBraW5kOiBIZWFkS2luZC5LZXl3b3JkO1xuICBuYW1lOiBzdHJpbmc7XG4gIHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+O1xuICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPjtcbiAgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkU3RhdGVtZW50ID1cbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5DYWxsO1xuICAgICAgaGVhZDogTm9ybWFsaXplZEhlYWQ7XG4gICAgICBwYXJhbXM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPjtcbiAgICAgIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gICAgICB0cnVzdGVkOiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5CbG9jaztcbiAgICAgIGhlYWQ6IE5vcm1hbGl6ZWRIZWFkO1xuICAgICAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgYmxvY2tQYXJhbXM6IE9wdGlvbjxzdHJpbmdbXT47XG4gICAgICBibG9ja3M6IE5vcm1hbGl6ZWRCbG9ja3M7XG4gICAgfVxuICB8IE5vcm1hbGl6ZWRLZXl3b3JkU3RhdGVtZW50XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGF0dHJzOiBOb3JtYWxpemVkQXR0cnM7XG4gICAgICBibG9jazogTm9ybWFsaXplZEJsb2NrO1xuICAgIH1cbiAgfCB7IGtpbmQ6IEhlYWRLaW5kLkNvbW1lbnQ7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogSGVhZEtpbmQuTGl0ZXJhbDsgdmFsdWU6IHN0cmluZyB9XG4gIHwgQXBwZW5kUGF0aFxuICB8IEFwcGVuZEV4cHJcbiAgfCB7IGtpbmQ6IEhlYWRLaW5kLk1vZGlmaWVyOyBwYXJhbXM6IE5vcm1hbGl6ZWRQYXJhbXM7IGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD4gfVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkR5bmFtaWNDb21wb25lbnQ7XG4gICAgICBleHByOiBOb3JtYWxpemVkRXhwcmVzc2lvbjtcbiAgICAgIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gICAgICBibG9jazogTm9ybWFsaXplZEJsb2NrO1xuICAgIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdGF0ZW1lbnQoc3RhdGVtZW50OiBCdWlsZGVyU3RhdGVtZW50KTogTm9ybWFsaXplZFN0YXRlbWVudCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlbWVudCkpIHtcbiAgICBpZiAoc3RhdGVtZW50SXNFeHByZXNzaW9uKHN0YXRlbWVudCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVBcHBlbmRFeHByZXNzaW9uKHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIGlmIChpc1N1Z2FyeUFycmF5U3RhdGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVTdWdhcnlBcnJheVN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplVmVyYm9zZVN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RhdGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBub3JtYWxpemVBcHBlbmRIZWFkKG5vcm1hbGl6ZURvdHRlZFBhdGgoc3RhdGVtZW50KSwgZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGFzc2VydE5ldmVyKHN0YXRlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFwcGVuZEhlYWQoXG4gIGhlYWQ6IE5vcm1hbGl6ZWRIZWFkLFxuICB0cnVzdGVkOiBib29sZWFuXG4pOiBBcHBlbmRFeHByIHwgQXBwZW5kUGF0aCB7XG4gIGlmIChoZWFkLnR5cGUgPT09IEV4cHJlc3Npb25LaW5kLkdldFBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogSGVhZEtpbmQuQXBwZW5kUGF0aCxcbiAgICAgIHBhdGg6IGhlYWQsXG4gICAgICB0cnVzdGVkLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZEV4cHIsXG4gICAgICBleHByOiBoZWFkLFxuICAgICAgdHJ1c3RlZCxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoc3RhdGVtZW50OiBCdWlsZGVyU3RhdGVtZW50KTogc3RhdGVtZW50IGlzIFN1Z2FyeUFycmF5U3RhdGVtZW50IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50KSAmJiB0eXBlb2Ygc3RhdGVtZW50WzBdID09PSAnc3RyaW5nJykge1xuICAgIHN3aXRjaCAoc3RhdGVtZW50WzBdWzBdKSB7XG4gICAgICBjYXNlICcoJzpcbiAgICAgIGNhc2UgJyMnOlxuICAgICAgY2FzZSAnPCc6XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgdHlwZSBTdWdhcnlBcnJheVN0YXRlbWVudCA9IEJ1aWxkZXJDYWxsRXhwcmVzc2lvbiB8IEJ1aWxkZXJFbGVtZW50IHwgQnVpbGRlckJsb2NrU3RhdGVtZW50O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoXG4gIHN0YXRlbWVudDogU3VnYXJ5QXJyYXlTdGF0ZW1lbnRcbik6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBsZXQgbmFtZSA9IHN0YXRlbWVudFswXTtcblxuICBzd2l0Y2ggKG5hbWVbMF0pIHtcbiAgICBjYXNlICcoJzoge1xuICAgICAgbGV0IHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+ID0gbnVsbDtcbiAgICAgIGxldCBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+ID0gbnVsbDtcblxuICAgICAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSBhcyBQYXJhbXMpO1xuICAgICAgICBoYXNoID0gbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMl0gYXMgSGFzaCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50WzFdKSkge1xuICAgICAgICAgIHBhcmFtcyA9IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0gYXMgUGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNoID0gbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMV0gYXMgSGFzaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQ2FsbCxcbiAgICAgICAgaGVhZDogbm9ybWFsaXplQ2FsbEhlYWQobmFtZSksXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgdHJ1c3RlZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJyMnOiB7XG4gICAgICBsZXQgeyBoZWFkOiBwYXRoLCBwYXJhbXMsIGhhc2gsIGJsb2NrcywgYmxvY2tQYXJhbXMgfSA9IG5vcm1hbGl6ZUJ1aWxkZXJCbG9ja1N0YXRlbWVudChcbiAgICAgICAgc3RhdGVtZW50IGFzIEJ1aWxkZXJCbG9ja1N0YXRlbWVudFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQmxvY2ssXG4gICAgICAgIGhlYWQ6IHBhdGgsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYmxvY2tzLFxuICAgICAgICBibG9ja1BhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnISc6IHtcbiAgICAgIGxldCBuYW1lID0gc3RhdGVtZW50WzBdLnNsaWNlKDEpO1xuICAgICAgbGV0IHsgcGFyYW1zLCBoYXNoLCBibG9ja3MsIGJsb2NrUGFyYW1zIH0gPSBub3JtYWxpemVCdWlsZGVyQmxvY2tTdGF0ZW1lbnQoXG4gICAgICAgIHN0YXRlbWVudCBhcyBCdWlsZGVyQmxvY2tTdGF0ZW1lbnRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLktleXdvcmQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYmxvY2tzLFxuICAgICAgICBibG9ja1BhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnPCc6IHtcbiAgICAgIGxldCBhdHRyczogTm9ybWFsaXplZEF0dHJzID0gZGljdCgpO1xuICAgICAgbGV0IGJsb2NrOiBOb3JtYWxpemVkQmxvY2sgPSBbXTtcblxuICAgICAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgYXR0cnMgPSBub3JtYWxpemVBdHRycyhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckF0dHJzKTtcbiAgICAgICAgYmxvY2sgPSBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbMl0gYXMgQnVpbGRlckJsb2NrKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRbMV0pKSB7XG4gICAgICAgICAgYmxvY2sgPSBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckJsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRycyA9IG5vcm1hbGl6ZUF0dHJzKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQXR0cnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkVsZW1lbnQsXG4gICAgICAgIG5hbWU6IGV4cGVjdChleHRyYWN0RWxlbWVudChuYW1lKSwgYEJVRzogZXhwZWN0ZWQgJHtuYW1lfSB0byBsb29rIGxpa2UgYSB0YWcgbmFtZWApLFxuICAgICAgICBhdHRycyxcbiAgICAgICAgYmxvY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVhY2hhYmxlICR7SlNPTi5zdHJpbmdpZnkoc3RhdGVtZW50KX0gaW4gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWZXJib3NlU3RhdGVtZW50KHN0YXRlbWVudDogVmVyYm9zZVN0YXRlbWVudCk6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBzd2l0Y2ggKHN0YXRlbWVudFswXSkge1xuICAgIGNhc2UgQnVpbGRlci5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5MaXRlcmFsLFxuICAgICAgICB2YWx1ZTogc3RhdGVtZW50WzFdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuQXBwZW5kOiB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQXBwZW5kRXhwcmVzc2lvbihzdGF0ZW1lbnRbMV0sIHN0YXRlbWVudFsyXSk7XG4gICAgfVxuXG4gICAgY2FzZSBCdWlsZGVyLk1vZGlmaWVyOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5Nb2RpZmllcixcbiAgICAgICAgcGFyYW1zOiBub3JtYWxpemVQYXJhbXMoc3RhdGVtZW50WzFdKSxcbiAgICAgICAgaGFzaDogbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMl0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuRHluYW1pY0NvbXBvbmVudDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudCxcbiAgICAgICAgZXhwcjogbm9ybWFsaXplRXhwcmVzc2lvbihzdGF0ZW1lbnRbMV0pLFxuICAgICAgICBoYXNoOiBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsyXSksXG4gICAgICAgIGJsb2NrOiBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbM10pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuQ29tbWVudDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQ29tbWVudCxcbiAgICAgICAgdmFsdWU6IHN0YXRlbWVudFsxXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RCbG9ja0hlYWQobmFtZTogc3RyaW5nKTogTm9ybWFsaXplZEhlYWQge1xuICBsZXQgcmVzdWx0ID0gL14oI3whKSguKikkLy5leGVjKG5hbWUpO1xuXG4gIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbWlzc2luZyAjIGluIGJsb2NrIGhlYWRgKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVEb3R0ZWRQYXRoKHJlc3VsdFsyXSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNhbGxIZWFkKG5hbWU6IHN0cmluZyk6IE5vcm1hbGl6ZWRIZWFkIHtcbiAgbGV0IHJlc3VsdCA9IC9eXFwoKC4qKVxcKSQvLmV4ZWMobmFtZSk7XG5cbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBtaXNzaW5nICgpIGluIGNhbGwgaGVhZGApO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZURvdHRlZFBhdGgocmVzdWx0WzFdKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChoZWFkOiBzdHJpbmcsIHRhaWw6IHN0cmluZ1tdID0gW10pOiBOb3JtYWxpemVkSGVhZCB7XG4gIGxldCBwYXRoSGVhZCA9IG5vcm1hbGl6ZVBhdGhIZWFkKGhlYWQpO1xuXG4gIGlmIChpc1ByZXNlbnQodGFpbCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogRXhwcmVzc2lvbktpbmQuR2V0UGF0aCxcbiAgICAgIHBhdGg6IHtcbiAgICAgICAgaGVhZDogcGF0aEhlYWQsXG4gICAgICAgIHRhaWwsXG4gICAgICB9LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEV4cHJlc3Npb25LaW5kLkdldFZhcixcbiAgICAgIHZhcmlhYmxlOiBwYXRoSGVhZCxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURvdHRlZFBh