@glimmer/compiler
Version:
868 lines (770 loc) • 73.1 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: 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;
}
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 = (0, _util.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 ((0, _util.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 ((0, _util.isPresent)(tail)) {
return {
type: "GetPath"
/* GetPath */
,
path: {
head: variable,
tail: tail
}
};
} else {
return {
type: "GetVar"
/* GetVar */
,
variable: variable
};
}
}
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'
};
}
function normalizeBuilderBlockStatement(statement) {
var head = statement[0];
var blocks = (0, _util.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 || (0, _util.dict)();
out[key] = normalizeExpression(value);
}
});
return {
hash: out,
blockParams: blockParams
};
}
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 = (0, _util.dict)();
Object.keys(object).forEach(function (k) {
out[k] = callback(object[k], k);
});
return out;
}
function isElement(input) {
var match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return !!match && !!match[1];
}
function extractElement(input) {
var match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input);
return match ? match[1] : null;
}
function extractAngleInvocation(input) {
var match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return match ? match[1] : null;
}
function isAngleInvocation(input) {
// TODO Paths
var match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return !!match && !!match[1];
}
function isBlock(input) {
// TODO Paths
var match = /^#[^]?([a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)$/.exec(input[0]);
return !!match && !!match[1];
}
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 (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 */
:
{
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 (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;
}
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;
}
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXItaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBOztBQXlDQSxJQUFBLFlBQUE7OztBQUFBLENBQUEsVUFBQSxZQUFBLEVBQXdCO0FBQ3RCLEVBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsS0FBQTtBQUNBLEVBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFBO0FBTEYsQ0FBQSxFQUFZLFlBQVksNEJBQVosWUFBWSxHQUF4QixFQUF3QixDQUF4Qjs7QUFrRk0sU0FBQSxrQkFBQSxDQUFBLFNBQUEsRUFBd0Q7QUFDNUQsTUFBSSxLQUFLLENBQUwsT0FBQSxDQUFKLFNBQUksQ0FBSixFQUE4QjtBQUM1QixRQUFJLHFCQUFxQixDQUF6QixTQUF5QixDQUF6QixFQUFzQztBQUNwQyxhQUFPLHlCQUF5QixDQUFoQyxTQUFnQyxDQUFoQztBQURGLEtBQUEsTUFFTyxJQUFJLHNCQUFzQixDQUExQixTQUEwQixDQUExQixFQUF1QztBQUM1QyxhQUFPLDZCQUE2QixDQUFwQyxTQUFvQyxDQUFwQztBQURLLEtBQUEsTUFFQTtBQUNMLGFBQU8seUJBQXlCLENBQWhDLFNBQWdDLENBQWhDO0FBQ0Q7QUFQSCxHQUFBLE1BUU8sSUFBSSxPQUFBLFNBQUEsS0FBSixRQUFBLEVBQW1DO0FBQ3hDLFdBQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQXBCLFNBQW9CLENBQXBCLEVBQTFCLEtBQTBCLENBQTFCO0FBREssR0FBQSxNQUVBO0FBQ0wsVUFBTSx1QkFBTixTQUFNLENBQU47QUFDRDtBQUNGOztBQUVLLFNBQUEsbUJBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxFQUVZO0FBRWhCLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBUztBQUFBO0FBQWIsSUFBMEM7QUFDeEMsYUFBTztBQUNMLFFBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFFBQUEsSUFBSSxFQUZDLElBQUE7QUFHTCxRQUFBLE9BQUEsRUFBQTtBQUhLLE9BQVA7QUFERixLQUFBLE1BTU87QUFDTCxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsTUFBQSxJQUFJLEVBRkMsSUFBQTtBQUdMLE1BQUEsT0FBQSxFQUFBO0FBSEssS0FBUDtBQUtEO0FBQ0Y7O0FBRUQsU0FBQSxzQkFBQSxDQUFBLFNBQUEsRUFBMkQ7QUFDekQsTUFBSSxLQUFLLENBQUwsT0FBQSxDQUFBLFNBQUEsS0FBNEIsT0FBTyxTQUFTLENBQWhCLENBQWdCLENBQWhCLEtBQWhDLFFBQUEsRUFBa0U7QUFDaEUsWUFBUSxTQUFTLENBQVQsQ0FBUyxDQUFULENBQVIsQ0FBUSxDQUFSO0FBQ0UsV0FBQSxHQUFBO0FBQ0EsV0FBQSxHQUFBO0FBQ0EsV0FBQSxHQUFBO0FBQ0EsV0FBQSxHQUFBO0FBQ0UsZUFBQSxJQUFBOztBQUNGO0FBQ0UsZUFBQSxLQUFBO0FBUEo7QUFTRDs7QUFFRCxTQUFBLEtBQUE7QUFDRDs7QUFJSyxTQUFBLDZCQUFBLENBQUEsU0FBQSxFQUMyQjtBQUUvQixNQUFJLElBQUksR0FBRyxTQUFTLENBQXBCLENBQW9CLENBQXBCOztBQUVBLFVBQVEsSUFBSSxDQUFaLENBQVksQ0FBWjtBQUNFLFNBQUEsR0FBQTtBQUFVO0FBQ1IsWUFBSSxNQUFNLEdBQVYsSUFBQTtBQUNBLFlBQUksSUFBSSxHQUFSLElBQUE7O0FBRUEsWUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDMUIsVUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBbEMsQ0FBa0MsQ0FBVixDQUF4QjtBQUNBLFVBQUEsSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQTlCLENBQThCLENBQVYsQ0FBcEI7QUFGRixTQUFBLE1BR08sSUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDakMsY0FBSSxLQUFLLENBQUwsT0FBQSxDQUFjLFNBQVMsQ0FBM0IsQ0FBMkIsQ0FBdkIsQ0FBSixFQUFpQztBQUMvQixZQUFBLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFsQyxDQUFrQyxDQUFWLENBQXhCO0FBREYsV0FBQSxNQUVPO0FBQ0wsWUFBQSxJQUFJLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBOUIsQ0FBOEIsQ0FBVixDQUFwQjtBQUNEO0FBQ0Y7O0FBRUQsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsSUFBSSxFQUFFLGlCQUFpQixDQUZsQixJQUVrQixDQUZsQjtBQUdMLFVBQUEsTUFISyxFQUFBLE1BQUE7QUFJTCxVQUFBLElBSkssRUFBQSxJQUFBO0FBS0wsVUFBQSxPQUFPLEVBQUU7QUFMSixTQUFQO0FBT0Q7O0FBRUQsU0FBQSxHQUFBO0FBQVU7QUFBQSxZQUFBLHFCQUFBLEdBQ2dELDhCQUE4QixDQUQ5RSxTQUM4RSxDQUQ5RTtBQUFBLFlBQ0osSUFESSxHQUFBLHFCQUFBLENBQUEsSUFBQTtBQUFBLFlBQ0osT0FESSxHQUFBLHFCQUFBLENBQUEsTUFBQTtBQUFBLFlBQ0osS0FESSxHQUFBLHFCQUFBLENBQUEsSUFBQTtBQUFBLFlBQ0osTUFESSxHQUFBLHFCQUFBLENBQUEsTUFBQTtBQUFBLFlBQ2dDLFdBRGhDLEdBQUEscUJBQUEsQ0FBQSxXQUFBOztBQUtSLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLElBQUksRUFGQyxJQUFBO0FBR0wsVUFBQSxNQUhLLEVBQUEsT0FBQTtBQUlMLFVBQUEsSUFKSyxFQUFBLEtBQUE7QUFLTCxVQUFBLE1BTEssRUFBQSxNQUFBO0FBTUwsVUFBQSxXQUFBLEVBQUE7QUFOSyxTQUFQO0FBUUQ7O0FBRUQsU0FBQSxHQUFBO0FBQVU7QUFDUixZQUFJLEtBQUksR0FBRyxTQUFTLENBQVQsQ0FBUyxDQUFULENBQUEsS0FBQSxDQUFYLENBQVcsQ0FBWDs7QUFEUSxZQUFBLHNCQUFBLEdBRW9DLDhCQUE4QixDQUZsRSxTQUVrRSxDQUZsRTtBQUFBLFlBRUosUUFGSSxHQUFBLHNCQUFBLENBQUEsTUFBQTtBQUFBLFlBRUosTUFGSSxHQUFBLHNCQUFBLENBQUEsSUFBQTtBQUFBLFlBRUosT0FGSSxHQUFBLHNCQUFBLENBQUEsTUFBQTtBQUFBLFlBRW9CLFlBRnBCLEdBQUEsc0JBQUEsQ0FBQSxXQUFBOztBQU1SLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLElBRkssRUFBQSxLQUFBO0FBR0wsVUFBQSxNQUhLLEVBQUEsUUFBQTtBQUlMLFVBQUEsSUFKSyxFQUFBLE1BQUE7QUFLTCxVQUFBLE1BTEssRUFBQSxPQUFBO0FBTUwsVUFBQSxXQUFBLEVBQUE7QUFOSyxTQUFQO0FBUUQ7O0FBRUQsU0FBQSxHQUFBO0FBQVU7QUFDUixZQUFJLEtBQUssR0FBVCxpQkFBQTtBQUNBLFlBQUksS0FBSyxHQUFULEVBQUE7O0FBRUEsWUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDMUIsVUFBQSxLQUFLLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBaEMsQ0FBZ0MsQ0FBVixDQUF0QjtBQUNBLFVBQUEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQWhDLENBQWdDLENBQVYsQ0FBdEI7QUFGRixTQUFBLE1BR08sSUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDakMsY0FBSSxLQUFLLENBQUwsT0FBQSxDQUFjLFNBQVMsQ0FBM0IsQ0FBMkIsQ0FBdkIsQ0FBSixFQUFpQztBQUMvQixZQUFBLEtBQUssR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFoQyxDQUFnQyxDQUFWLENBQXRCO0FBREYsV0FBQSxNQUVPO0FBQ0wsWUFBQSxLQUFLLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBaEMsQ0FBZ0MsQ0FBVixDQUF0QjtBQUNEO0FBQ0Y7O0FBRUQsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsSUFBSSxFQUFTLGNBQWMsQ0FGdEIsSUFFc0IsQ0FGdEI7QUFHTCxVQUFBLEtBSEssRUFBQSxLQUFBO0FBSUwsVUFBQSxLQUFBLEVBQUE7QUFKSyxTQUFQO0FBTUQ7O0FBRUQ7QUFDRSxZQUFNLElBQUEsS0FBQSxDQUFBLGlCQUF5QixJQUFJLENBQUosU0FBQSxDQUEvQixTQUErQixDQUF6QixHQUFOLG1DQUFNLENBQU47QUFoRko7QUFrRkQ7O0FBRUQsU0FBQSx5QkFBQSxDQUFBLFNBQUEsRUFBOEQ7QUFDNUQsVUFBUSxTQUFTLENBQWpCLENBQWlCLENBQWpCO0FBQ0UsU0FBQTtBQUFBO0FBQUE7QUFBc0I7QUFDcEIsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsS0FBSyxFQUFFLFNBQVMsQ0FBQSxDQUFBO0FBRlgsU0FBUDtBQUlEOztBQUVELFNBQUE7QUFBQTtBQUFBO0FBQXFCO0FBQ25CLGVBQU8seUJBQXlCLENBQUMsU0FBUyxDQUFWLENBQVUsQ0FBVixFQUFlLFNBQVMsQ0FBeEQsQ0FBd0QsQ0FBeEIsQ0FBaEM7QUFDRDs7QUFFRCxTQUFBO0FBQUE7QUFBQTtBQUF1QjtBQUNyQixlQUFPO0FBQ0wsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsVUFBQSxNQUFNLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FGNUIsQ0FFNEIsQ0FBVixDQUZsQjtBQUdMLFVBQUEsSUFBSSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQVYsQ0FBVSxDQUFWO0FBSGQsU0FBUDtBQUtEOztBQUVELFNBQUE7QUFBQTtBQUFBO0FBQStCO0FBQzdCLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBRjlCLENBRThCLENBQVYsQ0FGcEI7QUFHTCxVQUFBLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxDQUh4QixDQUd3QixDQUFWLENBSGQ7QUFJTCxVQUFBLEtBQUssRUFBRSxjQUFjLENBQUMsU0FBUyxDQUFWLENBQVUsQ0FBVjtBQUpoQixTQUFQO0FBTUQ7O0FBRUQsU0FBQTtBQUFBO0FBQUE7QUFBc0I7QUFDcEIsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsS0FBSyxFQUFFLFNBQVMsQ0FBQSxDQUFBO0FBRlgsU0FBUDtBQUlEO0FBbENIO0FBb0NEOztBQUVELFNBQUEsZ0JBQUEsQ0FBQSxJQUFBLEVBQXNDO0FBQ3BDLE1BQUksTUFBTSxHQUFHLGNBQUEsSUFBQSxDQUFiLElBQWEsQ0FBYjs7QUFFQSxNQUFJLE1BQU0sS0FBVixJQUFBLEVBQXFCO0FBQ25CLFVBQU0sSUFBTixLQUFNLENBQU4sb0NBQU0sQ0FBTjtBQUNEOztBQUVELFNBQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFqQyxDQUFpQyxDQUFQLENBQTFCO0FBQ0Q7O0FBRUQsU0FBQSxpQkFBQSxDQUFBLElBQUEsRUFBdUM7QUFDckMsTUFBSSxNQUFNLEdBQUcsYUFBQSxJQUFBLENBQWIsSUFBYSxDQUFiOztBQUVBLE1BQUksTUFBTSxLQUFWLElBQUEsRUFBcUI7QUFDbkIsVUFBTSxJQUFOLEtBQU0sQ0FBTixvQ0FBTSxDQUFOO0FBQ0Q7O0FBRUQsU0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQWpDLENBQWlDLENBQVAsQ0FBMUI7QUFDRDs7QUFFRCxTQUFBLGFBQUEsQ0FBQSxJQUFBLEVBQUEsSUFBQSxFQUF3RDtBQUFBLE1BQW5CLElBQW1CLEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFBbkIsSUFBQSxJQUFtQixHQUF4RCxFQUFxQztBQUFtQjs7QUFDdEQsTUFBSSxRQUFRLEdBQUcsaUJBQWlCLENBQWhDLElBQWdDLENBQWhDOztBQUVBLE1BQUkscUJBQUosSUFBSSxDQUFKLEVBQXFCO0FBQ25CLFdBQU87QUFDTCxNQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxNQUFBLElBQUksRUFBRTtBQUNKLFFBQUEsSUFBSSxFQURBLFFBQUE7QUFFSixRQUFBLElBQUEsRUFBQTtBQUZJO0FBRkQsS0FBUDtBQURGLEdBQUEsTUFRTztBQUNMLFdBQU87QUFDTCxNQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxNQUFBLFFBQVEsRUFBRTtBQUZMLEtBQVA7QUFJRDtBQUNGOztBQUVELFNBQUEsbUJBQUEsQ0FBQSxLQUFBLEVBQTBDO0FBQUEsTUFBQSxrQkFBQSxHQUNiLGlCQUFpQixDQURKLEtBQ0ksQ0FESjtBQUFBLE1BQ3BDLElBRG9DLEdBQUEsa0JBQUEsQ0FBQSxJQUFBO0FBQUEsTUFDdEIsSUFEc0IsR0FBQSxrQkFBQSxDQUFBLElBQUE7O0FBQUEsTUFBQSxXQUFBLEdBR2xCLElBQUksQ0FBSixLQUFBLENBSGtCLEdBR2xCLENBSGtCO0FBQUEsTUFHcEMsSUFIb0MsR0FBQSxXQUFBLENBQUEsQ0FBQSxDQUFBO0FBQUEsTUFHcEMsSUFIb0MsR0FBQSxXQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7QUFLeEMsTUFBSSxRQUFRLEdBQWE7QUFBRSxJQUFBLElBQUYsRUFBQSxJQUFBO0FBQVEsSUFBQSxJQUFSLEVBQUEsSUFBQTtBQUFjLElBQUEsSUFBSSxFQUFFO0FBQXBCLEdBQXpCOztBQUVBLE1BQUkscUJBQUosSUFBSSxDQUFKLEVBQXFCO0FBQ25CLFdBQU87QUFBRSxNQUFBLElBQUksRUFBQTtBQUFBO0FBQU47QUFBZ0MsTUFBQSxJQUFJLEVBQUU7QUFBRSxRQUFBLElBQUksRUFBTixRQUFBO0FBQWtCLFFBQUEsSUFBQSxFQUFBO0FBQWxCO0FBQXRDLEtBQVA7QUFERixHQUFBLE1BRU87QUFDTCxXQUFPO0FBQUUsTUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQStCLE1BQUEsUUFBQSxFQUFBO0FBQS9CLEtBQVA7QUFDRDtBQUNGOztBQUVLLFNBQUEsaUJBQUEsQ0FBQSxLQUFBLEVBQXlDO0FBQzdDLE1BQUEsSUFBQTtBQUNBLE1BQUEsSUFBQTs7QUFFQSxNQUFJLGNBQUEsSUFBQSxDQUFKLEtBQUksQ0FBSixFQUErQjtBQUM3QixXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUUsWUFBWSxDQURiLElBQUE7QUFFTCxNQUFBLElBQUksRUFGQyxLQUFBO0FBR0wsTUFBQSxJQUFJLEVBQUU7QUFIRCxLQUFQO0FBS0Q7O0FBRUQsVUFBUSxLQUFLLENBQWIsQ0FBYSxDQUFiO0FBQ0UsU0FBQSxHQUFBO0FBQ0UsTUFBQSxJQUFJLEdBQUcsWUFBWSxDQUFuQixJQUFBO0FBQ0EsTUFBQSxJQUFJLEdBQUcsS0FBSyxDQUFMLEtBQUEsQ0FBUCxDQUFPLENBQVA7QUFDQTs7QUFFRixTQUFBLEdBQUE7QUFDRSxNQUFBLElBQUksR0FBRyxZQUFZLENBQW5CLEdBQUE7QUFDQSxNQUFBLElBQUksR0FBRyxLQUFLLENBQUwsS0FBQSxDQUFQLENBQU8sQ0FBUDtBQUNBOztBQUVGLFNBQUEsR0FBQTtBQUNFLE1BQUEsSUFBSSxHQUFHLFlBQVksQ0FBbkIsS0FBQTtBQUNBLE1BQUEsSUFBSSxHQUFHLEtBQUssQ0FBTCxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBQ0E7O0FBRUY7QUFDRSxNQUFBLElBQUksR0FBRyxZQUFZLENBQW5CLEtBQUE7QUFDQSxNQUFBLElBQUksR0FBSixLQUFBO0FBbEJKOztBQXFCQSxTQUFPO0FBQUUsSUFBQSxJQUFGLEVBQUEsSUFBQTtBQUFRLElBQUEsSUFBUixFQUFBLElBQUE7QUFBYyxJQUFBLElBQUksRUFBRTtBQUFwQixHQUFQO0FBQ0Q7O0FBZUssU0FBQSw4QkFBQSxDQUFBLFNBQUEsRUFDNEI7QUFFaEMsTUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFwQixDQUFvQixDQUFwQjtBQUNBLE1BQUksTUFBTSxHQUFWLGlCQUFBO0FBQ0EsTUFBSSxNQUFNLEdBQVYsSUFBQTtBQUNBLE1BQUksSUFBSSxHQUFSLElBQUE7QUFDQSxNQUFJLFdBQVcsR0FBZixJQUFBOztBQUVBLE1BQUksU0FBUyxDQUFULE1BQUEsS0FBSixDQUFBLEVBQTRCO0FBQzFCLElBQUEsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQWxDLENBQWtDLENBQVYsQ0FBeEI7QUFERixHQUFBLE1BRU8sSUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDakMsUUFBSSxLQUFLLENBQUwsT0FBQSxDQUFjLFNBQVMsQ0FBM0IsQ0FBMkIsQ0FBdkIsQ0FBSixFQUFpQztBQUMvQixNQUFBLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFsQyxDQUFrQyxDQUFWLENBQXhCO0FBREYsS0FBQSxNQUVPO0FBQUEsVUFBQSxtQkFBQSxHQUNvQixrQkFBa0IsQ0FBQyxTQUFTLENBRGhELENBQ2dELENBQVYsQ0FEdEM7O0FBQ0osTUFBQSxJQURJLEdBQUEsbUJBQUEsQ0FBQSxJQUNKO0FBQVEsTUFBQSxXQURKLEdBQUEsbUJBQUEsQ0FBQSxXQUNJO0FBQ1Y7O0FBRUQsSUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBbEMsQ0FBa0MsQ0FBVixDQUF4QjtBQVBLLEdBQUEsTUFRQSxJQUFJLFNBQVMsQ0FBVCxNQUFBLEtBQUosQ0FBQSxFQUE0QjtBQUNqQyxJQUFBLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFsQyxDQUFrQyxDQUFWLENBQXhCOztBQURpQyxRQUFBLG9CQUFBLEdBRVIsa0JBQWtCLENBQUMsU0FBUyxDQUZwQixDQUVvQixDQUFWLENBRlY7O0FBRWhDLElBQUEsSUFGZ0MsR0FBQSxvQkFBQSxDQUFBLElBRWhDO0FBQVEsSUFBQSxXQUZ3QixHQUFBLG9CQUFBLENBQUEsV0FFeEI7QUFDVCxJQUFBLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFsQyxDQUFrQyxDQUFWLENBQXhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQUFFLGdCQUFnQixDQURqQixJQUNpQixDQURqQjtBQUVMLElBQUEsTUFGSyxFQUFBLE1BQUE7QUFHTCxJQUFBLElBSEssRUFBQSxJQUFBO0FBSUwsSUFBQSxXQUpLLEVBQUEsV0FBQTtBQUtMLElBQUEsTUFBQSxFQUFBO0FBTEssR0FBUDtBQU9EOztBQUVELFNBQUEsa0JBQUEsQ0FBQSxJQUFBLEVBQ3dCO0FBRXRCLE1BQUksSUFBSSxLQUFSLElBQUEsRUFBbUI7QUFDakIsV0FBTztBQUFFLE1BQUEsSUFBSSxFQUFOLElBQUE7QUFBYyxNQUFBLFdBQVcsRUFBRTtBQUEzQixLQUFQO0FBQ0Q7O0FBRUQsTUFBSSxHQUFHLEdBQVAsSUFBQTtBQUNBLE1BQUksV0FBVyxHQUFmLElBQUE7QUFFQSxFQUFBLE9BQU8sQ0FBQSxJQUFBLEVBQU8sVUFBQSxHQUFBLEVBQUEsS0FBQSxFQUFlO0FBQzNCLFFBQUksR0FBRyxLQUFQLElBQUEsRUFBa0I7QUFDaEIsTUFBQSxXQUFXLEdBQUcsS0FBSyxDQUFMLE9BQUEsQ0FBQSxLQUFBLElBQUEsS0FBQSxHQUErQixDQUE3QyxLQUE2QyxDQUE3QztBQURGLEtBQUEsTUFFTztBQUNMLE1BQUEsR0FBRyxHQUFHLEdBQUcsSUFBVCxpQkFBQTtBQUNBLE1BQUEsR0FBRyxDQUFILEdBQUcsQ0FBSCxHQUFXLG1CQUFtQixDQUE5QixLQUE4QixDQUE5QjtBQUNEO0FBTkgsR0FBTyxDQUFQO0FBU0EsU0FBTztBQUFFLElBQUEsSUFBSSxFQUFOLEdBQUE7QUFBYSxJQUFBLFdBQUEsRUFBQTtBQUFiLEdBQVA7QUFDRDs7QUFFSyxTQUFBLE9BQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQSxFQUVzRDtBQUUxRCxFQUFBLE1BQU0sQ0FBTixJQUFBLENBQUEsSUFBQSxFQUFBLE9BQUEsQ0FBMkIsVUFBRCxHQUFDLEVBQU87QUFDaEMsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFoQixHQUFnQixDQUFoQjtBQUNBLElBQUEsUUFBUSxDQUFBLEdBQUEsRUFBUixLQUFRLENBQVI7QUFGRixHQUFBO0FBSUQ7O0FBRUQsU0FBQSxlQUFBLENBQUEsS0FBQSxFQUE0RDtBQUMxRCxNQUFJLEtBQUssQ0FBTCxPQUFBLENBQUosS0FBSSxDQUFKLEVBQTBCO0FBQ3hCLFdBQU87QUFBRSxpQkFBUyxjQUFjLENBQUEsS0FBQTtBQUF6QixLQUFQO0FBREYsR0FBQSxNQUVPO0FBQ0wsV0FBTyxTQUFTLENBQUEsS0FBQSxFQUFoQixjQUFnQixDQUFoQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBQSxjQUFBLENBQUEsS0FBQSxFQUEyQztBQUN6QyxTQUFPLEtBQUssQ0FBTCxHQUFBLENBQVcsVUFBRCxDQUFDLEVBQUQ7QUFBQSxXQUFPLGtCQUFrQixDQUExQyxDQUEwQyxDQUF6QjtBQUFqQixHQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLGNBQUEsQ0FBQSxLQUFBLEVBQTJDO0FBQ3pDLFNBQU8sU0FBUyxDQUFBLEtBQUEsRUFBUyxVQUFELENBQUMsRUFBRDtBQUFBLFdBQU8sYUFBYSxDQUFiLENBQWEsQ0FBYixDQUEvQixJQUF3QjtBQUF4QixHQUFnQixDQUFoQjtBQUNEOztBQUVELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBd0M7QUFDdEMsTUFBSSxJQUFJLEtBQVIsT0FBQSxFQUFzQjtBQUNwQixXQUFPO0FBQUUsTUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQXdCLE1BQUEsT0FBTyxFQUFFO0FBQWpDLEtBQVA7QUFERixHQUFBLE1BRU87QUFDTCxRQUFJLElBQUksR0FBRyxtQkFBbUIsQ0FBOUIsSUFBOEIsQ0FBOUI7QUFDQSxXQUFPO0FBQUUsTUFBQSxJQUFGLEVBQUEsSUFBQTtBQUFRLE1BQUEsT0FBTyxFQUFFO0FBQWpCLEtBQVA7QUFDRDtBQUNGOztBQUVELFNBQUEsU0FBQSxDQUFBLE1BQUEsRUFBQSxRQUFBLEVBRXNEO0FBRXBELE1BQUksR0FBRyxHQUFQLGlCQUFBO0FBRUEsRUFBQSxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxPQUFBLENBQWdELFVBQXBCLENBQW9CLEVBQVE7QUFDdEQsSUFBQSxHQUFHLENBQUgsQ0FBRyxDQUFILEdBQVMsUUFBUSxDQUFDLE1BQU0sQ0FBUCxDQUFPLENBQVAsRUFBakIsQ0FBaUIsQ0FBakI7QUFERixHQUFBO0FBSUEsU0FBQSxHQUFBO0FBQ0Q7O0FBZ0JLLFNBQUEsU0FBQSxDQUFBLEtBQUEsRUFBaUQ7QUFDckQsTUFBSSxLQUFLLEdBQUcsaUNBQUEsSUFBQSxDQUFzQyxLQUFLLENBQXZELENBQXVELENBQTNDLENBQVo7QUFFQSxTQUFPLENBQUMsQ0FBRCxLQUFBLElBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBekIsQ0FBeUIsQ0FBekI7QUFDRDs7QUFFSyxTQUFBLGNBQUEsQ0FBQSxLQUFBLEVBQXNDO0FBQzFDLE1BQUksS0FBSyxHQUFHLGlDQUFBLElBQUEsQ0FBWixLQUFZLENBQVo7QUFFQSxTQUFPLEtBQUssR0FBRyxLQUFLLENBQVIsQ0FBUSxDQUFSLEdBQVosSUFBQTtBQUNEOztBQUVLLFNBQUEsc0JBQUEsQ0FBQSxLQUFBLEVBQThDO0FBQ2xELE1BQUksS0FBSyxHQUFHLDBDQUFBLElBQUEsQ0FBK0MsS0FBSyxDQUFoRSxDQUFnRSxDQUFwRCxDQUFaO0FBRUEsU0FBTyxLQUFLLEdBQUcsS0FBSyxDQUFSLENBQVEsQ0FBUixHQUFaLElBQUE7QUFDRDs7QUFFSyxTQUFBLGlCQUFBLENBQUEsS0FBQSxFQUF5RDtBQUM3RDtBQUNBLE1BQUksS0FBSyxHQUFHLDBDQUFBLElBQUEsQ0FBK0MsS0FBSyxDQUFoRSxDQUFnRSxDQUFwRCxDQUFaO0FBRUEsU0FBTyxDQUFDLENBQUQsS0FBQSxJQUFXLENBQUMsQ0FBQyxLQUFLLENBQXpCLENBQXlCLENBQXpCO0FBQ0Q7O0FBRUssU0FBQSxPQUFBLENBQUEsS0FBQSxFQUErQztBQUNuRDtBQUNBLE1BQUksS0FBSyxHQUFHLDRDQUFBLElBQUEsQ0FBaUQsS0FBSyxDQUFsRSxDQUFrRSxDQUF0RCxDQUFaO0FBRUEsU0FBTyxDQUFDLENBQUQsS0FBQSxJQUFXLENBQUMsQ0FBQyxLQUFLLENBQXpCLENBQXlCLENBQXpCO0FBQ0Q7O0FBOEZLLFNBQUEseUJBQUEsQ0FBQSxVQUFBLEVBQUEsWUFBQSxFQUVnQjtBQUFBLE1BQXBCLFlBQW9CLEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFBcEIsSUFBQSxZQUFvQixHQUZoQixLQUVKO0FBQW9COztBQUVwQixNQUFJLFVBQVUsS0FBVixJQUFBLElBQXVCLFVBQVUsS0FBckMsU0FBQSxFQUFxRDtBQUNuRCxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUU7QUFDSixRQUFBLElBQUksRUFBQTtBQUFBO0FBREE7QUFFSixRQUFBLEtBQUssRUFBRTtBQUZILE9BREQ7QUFLTCxNQUFBLElBQUksRUFBQTtBQUFBO0FBTEM7QUFNTCxNQUFBLE9BQU8sRUFBRTtBQU5KLEtBQVA7QUFERixHQUFBLE1BU08sSUFBSSxLQUFLLENBQUwsT0FBQSxDQUFKLFVBQUksQ0FBSixFQUErQjtBQUNwQyxZQUFRLFVBQVUsQ0FBbEIsQ0FBa0IsQ0FBbEI7QUFDRSxXQUFBO0FBQUE7QUFBQTtBQUNFLGVBQU87QUFDTCxVQUFBLElBQUksRUFBRTtBQUFFLFlBQUEsSUFBSSxFQUFBO0FBQUE7QUFBTjtBQUFnQyxZQUFBLEtBQUssRUFBRSxVQUFVLENBQUEsQ0FBQTtBQUFqRCxXQUREO0FBRUwsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQUZDO0FBR0wsVUFBQSxPQUFPLEVBQUU7QUFISixTQUFQOztBQU1GLFdBQUE7QUFBQTtBQUFBO0FBQWtCO0FBQ2hCLGlCQUFPLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQVgsQ0FBVyxDQUFYLEVBQWdCLFVBQVUsQ0FBeEMsQ0FBd0MsQ0FBMUIsQ0FBZCxFQUExQixZQUEwQixDQUExQjtBQUNEOztBQUNELFdBQUE7QUFBQTtBQUFBO0FBQXFCO0FBQ25CLGNBQUksSUFBSSxHQUFxQjtBQUMzQixZQUFBLElBQUksRUFBQTtBQUFBO0FBRHVCO0FBRTNCLFlBQUEsTUFBTSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQVYsS0FBQSxDQUFELENBQUMsQ0FBRDtBQUZJLFdBQTdCO0FBUUEsaUJBQU87QUFDTCxZQUFBLElBREssRUFBQSxJQUFBO0FBRUwsWUFBQSxJQUFJLEVBQUE7QUFBQTtBQUZDO0FBR0wsWUFBQSxPQUFPLEVBQUU7QUFISixXQUFQO0FBS0Q7O0FBRUQsV0FBQTtBQUFBO0FBQUE7QUFDRSxlQUFPO0FBQ0wsVUFBQSxJQUFJLEVBQUU7QUFDSixZQUFBLElBQUksRUFBQTtBQUFBO0FBREE7QUFFSixZQUFBLElBQUksRUFBRSxVQUFVLENBQUEsQ0FBQTtBQUZaLFdBREQ7QUFLTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBTEM7QUFNTCxVQUFBLE9BQU8sRUFBRTtBQU5KLFNBQVA7O0FBU0YsV0FBQTtBQUFBO0FBQUE7QUFDRSxlQUFPO0FBQ0wsVUFBQSxJQUFJLEVBQUU7QUFDSixZQUFBLElBQUksRUFBQTtBQUFBO0FBREE7QUFFSixZQUFBLElBQUksRUFBRSxVQUFVLENBQUEsQ0FBQTtBQUZaLFdBREQ7QUFLTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBTEM7QUFNTCxVQUFBLE9BQU8sRUFBRTtBQU5KLFNBQVA7O0FBU0Y7QUFBUztBQUNQLGNBQUksdUJBQXVCLENBQTNCLFVBQTJCLENBQTNCLEVBQXlDO0FBQ3ZDLG1CQUFPO0FBQ0wsY0FBQSxJQUFJLEVBQUUsdUJBQXVCLENBRHhCLFVBQ3dCLENBRHhCO0FBRUwsY0FBQSxJQUFJLEVBQUE7QUFBQTtBQUZDO0FBR0wsY0FBQSxPQUFPLEVBQUU7QUFISixhQUFQO0FBREYsV0FBQSxNQU1PO0FBQ0wsa0JBQU0sSUFBQSxLQUFBLENBQUEsNEVBRUYsVUFBVSxDQUZSLENBRVEsQ0FGUixHQUFBLGlEQUFBLEdBRzhDLElBQUksQ0FBSixTQUFBLENBSHBELFVBR29ELENBSDlDLENBQU47QUFLRDtBQUNGO0FBQ0Q7QUE5REY7QUFESyxHQUFBLE1BaUVBLElBQUksT0FBQSxVQUFBLEtBQUosUUFBQSxFQUFvQztBQUN6QyxZQUFRLE9BQVIsVUFBQTtBQUNFLFdBQUEsUUFBQTtBQUFlO0FBQ2IsaUJBQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQXBCLFVBQW9CLENBQXBCLEVBQTFCLFlBQTBCLENBQTFCO0FBQ0Q7O0FBQ0QsV0FBQSxTQUFBO0FBQ0EsV0FBQSxRQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFFO0FBQUUsWUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQWdDLFlBQUEsS0FBSyxFQUFFO0FBQXZDLFdBREQ7QUFFTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBRkM7QUFHTCxVQUFBLE9BQU8sRUFBRTtBQUhKLFNBQVA7O0FBTUY7QUFDRSxjQUFNLHVCQUFOLFVBQU0sQ0FBTjtBQWJKO0FBREssR0FBQSxNQWdCQTtBQUNMLFVBQU0sdUJBQU4sVUFBTSxDQUFOO0FBQ0Q7QUFDRjs7QUFFSyxTQUFBLG1CQUFBLENBQUEsVUFBQSxFQUEyRDtBQUMvRCxNQUFJLFVBQVUsS0FBVixJQUFBLElBQXVCLFVBQVUsS0FBckMsU0FBQSxFQUFxRDtBQUNuRCxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsTUFBQSxLQUFLLEVBQUU7QUFGRixLQUFQO0FBREYsR0FBQSxNQUtPLElBQUksS0FBSyxDQUFMLE9BQUEsQ0FBSixVQUFJLENBQUosRUFBK0I7QUFDcEMsWUFBUSxVQUFVLENBQWxCLENBQWtCLENBQWxCO0FBQ0UsV0FBQTtBQUFBO0FBQUE7QUFDRSxlQUFPO0FBQUUsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQWdDLFVBQUEsS0FBSyxFQUFFLFVBQVUsQ0FBQSxDQUFBO0FBQWpELFNBQVA7O0FBRUYsV0FBQTtBQUFBO0FBQUE7QUFBa0I7QUFDaEIsaUJBQU8sYUFBYSxDQUFDLFVBQVUsQ0FBWCxDQUFXLENBQVgsRUFBZ0IsVUFBVSxDQUE5QyxDQUE4QyxDQUExQixDQUFwQjtBQUNEOztBQUNELFdBQUE7QUFBQTtBQUFBO0FBQXFCO0FBQ25CLGNBQUksSUFBSSxHQUFxQjtBQUMzQixZQUFBLElBQUksRUFBQTtBQUFBO0FBRHVCO0FBRTNCLFlBQUEsTUFBTSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQVYsS0FBQSxDQUFELENBQUMsQ0FBRDtBQUZJLFdBQTdCO0FBUUEsaUJBQUEsSUFBQTtBQUNEOztBQUVELFdBQUE7QUFBQTtBQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsSUFBSSxFQUFFLFVBQVUsQ0FBQSxDQUFBO0FBRlgsU0FBUDs7QUFLRixXQUFBO0FBQUE7QUFBQTtBQUNFLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLElBQUksRUFBRSxVQUFVLENBQUEsQ0FBQTtBQUZYLFNBQVA7O0FBS0Y7QUFBUztBQUNQLGNBQUksdUJBQXVCLENBQTNCLFVBQTJCLENBQTNCLEVBQXlDO0FBQ3ZDLG1CQUFPLHVCQUF1QixDQUE5QixVQUE4QixDQUE5QjtBQURGLFdBQUEsTUFFTztBQUNMLGtCQUFNLElBQUEsS0FBQSxDQUFBLDRFQUVGLFVBQVUsQ0FGUixDQUVRLENBRlIsR0FBQSxpREFBQSxHQUc4QyxJQUFJLENBQUosU0FBQSxDQUhwRCxVQUdvRCxDQUg5QyxDQUFOO0FBS0Q7QUFDRjtBQUNEO0FBMUNGO0FBREssR0FBQSxNQTZDQSxJQUFJLE9BQUEsVUFBQSxLQUFKLFFBQUEsRUFBb0M7QUFDekMsWUFBUSxPQUFSLFVBQUE7QUFDRSxXQUFBLFFBQUE7QUFBZTtBQUNiLGlCQUFPLG1CQUFtQixDQUExQixVQUEwQixDQUExQjtBQUNEOztBQUNELFdBQUEsU0FBQTtBQUNBLFdBQUEsUUFBQTtBQUNFLGVBQU87QUFBRSxVQUFBLElBQUksRUFBQTtBQUFBO0FBQU47QUFBZ0MsVUFBQSxLQUFLLEVBQUU7QUFBdkMsU0FBUDs7QUFFRjtBQUNFLGNBQU0sdUJBQU4sVUFBTSxDQUFOO0FBVEo7QUFESyxHQUFBLE1BWUE7QUFDTCxVQUFNLHVCQUFOLFVBQU0sQ0FBTjtBQUNEO0FBQ0Y7O0FBaUJLLFNBQUEsbUJBQUEsQ0FBQSxJQUFBLEVBQzJDO0FBRS9DLFNBQU8sS0FBSyxDQUFMLE9BQUEsQ0FBUCxJQUFPLENBQVA7QUFDRDs7QUFFSyxTQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQzJDO0FBRS9DLFNBQU8sS0FBSyxDQUFMLE9BQUEsQ0FBQSxJQUFBLEtBQXVCLElBQUksQ0FBSixDQUFJLENBQUosS0FBOUIsU0FBQTtBQUNEOztBQUVLLFNBQUEscUJBQUEsQ0FBQSxTQUFBLEVBQ3VCO0FBRTNCLE1BQUksQ0FBQyxLQUFLLENBQUwsT0FBQSxDQUFMLFNBQUssQ0FBTCxFQUErQjtBQUM3QixXQUFBLEtBQUE7QUFDRDs7QUFFRCxNQUFJLElBQUksR0FBRyxTQUFTLENBQXBCLENBQW9CLENBQXBCOztBQUVBLE1BQUksT0FBQSxJQUFBLEtBQUosUUFBQSxFQUE4QjtBQUM1QixZQUFBLElBQUE7QUFDRSxXQUFBO0FBQUE7QUFBQTtBQUNBLFdBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBQTtBQUFBO0FBQUE7QUFDQSxXQUFBO0FBQUE7QUFBQTtBQUNBLFdBQUE7QUFBQTtBQUFBO0FBQ0UsZUFBQSxJQUFBOztBQUNGO0FBQ0UsZUFBQSxLQUFBO0FBUko7QUFVRDs7QUFFRCxNQUFJLElBQUksQ0FBSixDQUFJLENBQUosS0FBSixHQUFBLEVBQXFCO0FBQ25CLFdBQUEsSUFBQTtBQUNEOztBQUVELFNBQUEsS0FBQTtBQUNEOztBQUVLLFNBQUEsdUJBQUEsQ0FBQSxLQUFBLEVBQ2lEO0FBRXJELFNBQU8sT0FBTyxLQUFLLENBQVosQ0FBWSxDQUFaLEtBQUEsUUFBQSxJQUFnQyxLQUFLLENBQUwsQ0FBSyxDQUFMLENBQUEsQ0FBQSxNQUF2QyxHQUFBO0FBQ0Q7O0FBUUssU0FBQSxlQUFBLENBQUEsS0FBQSxFQUF1QztBQUMzQyxTQUFPLEtBQUssQ0FBTCxHQUFBLENBQVAsbUJBQU8sQ0FBUDtBQUNEOztBQUVLLFNBQUEsYUFBQSxDQUFBLEtBQUEsRUFBMkM7QUFDL0MsTUFBSSxLQUFLLEtBQVQsSUFBQSxFQUFvQixPQUFBLElBQUE7QUFDcEIsU0FBTyxTQUFTLENBQUEsS0FBQSxFQUFoQixtQkFBZ0IsQ0FBaEI7QUFDRDs7QUFFSyxTQUFBLHVCQUFBLENBQUEsSUFBQSxFQUE2RDtBQUNqRSxVQUFRLElBQUksQ0FBWixNQUFBO0FBQ0UsU0FBQSxDQUFBO0FBQ0UsYUFBTztBQUNMLFFBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFFBQUEsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FGdkIsQ0FFdUIsQ0FBTCxDQUZsQjtBQUdMLFFBQUEsTUFBTSxFQUhELElBQUE7QUFJTCxRQUFBLElBQUksRUFBRTtBQUpELE9BQVA7O0FBTUYsU0FBQSxDQUFBO0FBQVE7QUFDTixZQUFJLEtBQUssQ0FBTCxPQUFBLENBQWMsSUFBSSxDQUF0QixDQUFzQixDQUFsQixDQUFKLEVBQTRCO0FBQzFCLGlCQUFPO0FBQ0wsWUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsWUFBQSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUZ2QixDQUV1QixDQUFMLENBRmxCO0FBR0wsWUFBQSxNQUFNLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FIdkIsQ0FHdUIsQ0FBTCxDQUhsQjtBQUlMLFlBQUEsSUFBSSxFQUFFO0FBSkQsV0FBUDtBQURGLFNBQUEsTUFPTztBQUNMLGlCQUFPO0FBQ0wsWUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsWUFBQSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUZ2QixDQUV1QixDQUFMLENBRmxCO0FBR0wsWUFBQSxNQUFNLEVBSEQsSUFBQTtBQUlMLFlBQUEsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUwsQ0FBSyxDQUFMO0FBSmQsV0FBUDtBQU1EO0FBQ0Y7O0FBRUQsU0FBQSxDQUFBO0FBQ0UsYUFBTztBQUNMLFFBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFFBQUEsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FGdkIsQ0FFdUIsQ0FBTCxDQUZsQjtBQUdMLFFBQUEsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBSHZCLENBR3VCLENBQUwsQ0FIbEI7QUFJTCxRQUFBLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFMLENBQUssQ0FBTDtBQUpkLE9BQVA7QUEzQko7QUFrQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWN0LCBEaWN0VmFsdWUsIE9wdGlvbiwgUHJlc2VudEFycmF5IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciwgZGljdCwgZXhwZWN0LCBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuZXhwb3J0IHR5cGUgQnVpbGRlclBhcmFtcyA9IEJ1aWxkZXJFeHByZXNzaW9uW107XG5leHBvcnQgdHlwZSBCdWlsZGVySGFzaCA9IE9wdGlvbjxEaWN0PEJ1aWxkZXJFeHByZXNzaW9uPj47XG5leHBvcnQgdHlwZSBCdWlsZGVyQmxvY2tIYXNoID0gQnVpbGRlckhhc2ggfCB7IGFzOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xuZXhwb3J0IHR5cGUgQnVpbGRlckJsb2NrcyA9IERpY3Q8QnVpbGRlckJsb2NrPjtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJBdHRycyA9IERpY3Q8QnVpbGRlckF0dHI+O1xuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkUGFyYW1zID0gTm9ybWFsaXplZEV4cHJlc3Npb25bXTtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRIYXNoID0gRGljdDxOb3JtYWxpemVkRXhwcmVzc2lvbj47XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQmxvY2sgPSBOb3JtYWxpemVkU3RhdGVtZW50W107XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQmxvY2tzID0gRGljdDxOb3JtYWxpemVkQmxvY2s+O1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEF0dHJzID0gRGljdDxOb3JtYWxpemVkQXR0cj47XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQXR0ciA9IEhlYWRLaW5kLlNwbGF0IHwgTm9ybWFsaXplZEV4cHJlc3Npb247XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEVsZW1lbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIGF0dHJzOiBPcHRpb248Tm9ybWFsaXplZEF0dHJzPjtcbiAgYmxvY2s6IE9wdGlvbjxOb3JtYWxpemVkQmxvY2s+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRBbmdsZUludm9jYXRpb24ge1xuICBoZWFkOiBOb3JtYWxpemVkRXhwcmVzc2lvbjtcbiAgYXR0cnM6IE9wdGlvbjxOb3JtYWxpemVkQXR0cnM+O1xuICBibG9jazogT3B0aW9uPE5vcm1hbGl6ZWRCbG9jaz47XG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEhlYWRLaW5kIHtcbiAgQmxvY2sgPSAnQmxvY2snLFxuICBDYWxsID0gJ0NhbGwnLFxuICBFbGVtZW50ID0gJ0VsZW1lbnQnLFxuICBBcHBlbmRQYXRoID0gJ0FwcGVuZFBhdGgnLFxuICBBcHBlbmRFeHByID0gJ0FwcGVuZEV4cHInLFxuICBMaXRlcmFsID0gJ0xpdGVyYWwnLFxuICBNb2RpZmllciA9ICdNb2RpZmllcicsXG4gIER5bmFtaWNDb21wb25lbnQgPSAnRHluYW1pY0NvbXBvbmVudCcsXG4gIENvbW1lbnQgPSAnQ29tbWVudCcsXG4gIFNwbGF0ID0gJ1NwbGF0JyxcbiAgS2V5d29yZCA9ICdLZXl3b3JkJyxcbn1cblxuZXhwb3J0IGVudW0gVmFyaWFibGVLaW5kIHtcbiAgTG9jYWwgPSAnTG9jYWwnLFxuICBGcmVlID0gJ0ZyZWUnLFxuICBBcmcgPSAnQXJnJyxcbiAgQmxvY2sgPSAnQmxvY2snLFxuICBUaGlzID0gJ1RoaXMnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlIHtcbiAga2luZDogVmFyaWFibGVLaW5kO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaWZmZXJlbmNlczpcbiAgICpcbiAgICogLSBzdHJpY3QgbW9kZSB2YXJpYWJsZXMgYWx3YXlzIHJlZmVyIHRvIGluLXNjb3BlIHZhcmlhYmxlc1xuICAgKiAtIGxvb3NlIG1vZGUgdmFyaWFibGVzIHVzZSB0aGlzIGFsZ29yaXRobTpcbiAgICogICAxLiBvdGhlcndpc2UsIGZhbGwgYmFjayB0byBgdGhpcy48bmFtZT5gXG4gICAqL1xuICBtb2RlOiAnbG9vc2UnIHwgJ3N0cmljdCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aCB7XG4gIGhlYWQ6IFZhcmlhYmxlO1xuICB0YWlsOiBQcmVzZW50QXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBlbmRFeHByIHtcbiAga2luZDogSGVhZEtpbmQuQXBwZW5kRXhwcjtcbiAgZXhwcjogTm9ybWFsaXplZEV4cHJlc3Npb247XG4gIHRydXN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwZW5kUGF0aCB7XG4gIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZFBhdGg7XG4gIHBhdGg6IE5vcm1hbGl6ZWRQYXRoO1xuICB0cnVzdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRLZXl3b3JkU3RhdGVtZW50IHtcbiAga2luZDogSGVhZEtpbmQuS2V5d29yZDtcbiAgbmFtZTogc3RyaW5nO1xuICBwYXJhbXM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPjtcbiAgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPjtcbiAgYmxvY2tQYXJhbXM6IE9wdGlvbjxzdHJpbmdbXT47XG4gIGJsb2NrczogTm9ybWFsaXplZEJsb2Nrcztcbn1cblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplZFN0YXRlbWVudCA9XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuQ2FsbDtcbiAgICAgIGhlYWQ6IE5vcm1hbGl6ZWRIZWFkO1xuICAgICAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgdHJ1c3RlZDogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuQmxvY2s7XG4gICAgICBoZWFkOiBOb3JtYWxpemVkSGVhZDtcbiAgICAgIHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+O1xuICAgICAgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPjtcbiAgICAgIGJsb2NrUGFyYW1zOiBPcHRpb248c3RyaW5nW10+O1xuICAgICAgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzO1xuICAgIH1cbiAgfCBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudFxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyczogTm9ybWFsaXplZEF0dHJzO1xuICAgICAgYmxvY2s6IE5vcm1hbGl6ZWRCbG9jaztcbiAgICB9XG4gIHwgeyBraW5kOiBIZWFkS2luZC5Db21tZW50OyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6IEhlYWRLaW5kLkxpdGVyYWw7IHZhbHVlOiBzdHJpbmcgfVxuICB8IEFwcGVuZFBhdGhcbiAgfCBBcHBlbmRFeHByXG4gIHwgeyBraW5kOiBIZWFkS2luZC5Nb2RpZmllcjsgcGFyYW1zOiBOb3JtYWxpemVkUGFyYW1zOyBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+IH1cbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5EeW5hbWljQ29tcG9uZW50O1xuICAgICAgZXhwcjogTm9ybWFsaXplZEV4cHJlc3Npb247XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgYmxvY2s6IE5vcm1hbGl6ZWRCbG9jaztcbiAgICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3RhdGVtZW50KHN0YXRlbWVudDogQnVpbGRlclN0YXRlbWVudCk6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnQpKSB7XG4gICAgaWYgKHN0YXRlbWVudElzRXhwcmVzc2lvbihzdGF0ZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQXBwZW5kRXhwcmVzc2lvbihzdGF0ZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoaXNTdWdhcnlBcnJheVN0YXRlbWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVZlcmJvc2VTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0YXRlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplQXBwZW5kSGVhZChub3JtYWxpemVEb3R0ZWRQYXRoKHN0YXRlbWVudCksIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBhc3NlcnROZXZlcihzdGF0ZW1lbnQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcHBlbmRIZWFkKFxuICBoZWFkOiBOb3JtYWxpemVkSGVhZCxcbiAgdHJ1c3RlZDogYm9vbGVhblxuKTogQXBwZW5kRXhwciB8IEFwcGVuZFBhdGgge1xuICBpZiAoaGVhZC50eXBlID09PSBFeHByZXNzaW9uS2luZC5HZXRQYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZFBhdGgsXG4gICAgICBwYXRoOiBoZWFkLFxuICAgICAgdHJ1c3RlZCxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBIZWFkS2luZC5BcHBlbmRFeHByLFxuICAgICAgZXhwcjogaGVhZCxcbiAgICAgIHRydXN0ZWQsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N1Z2FyeUFycmF5U3RhdGVtZW50KHN0YXRlbWVudDogQnVpbGRlclN0YXRlbWVudCk6IHN0YXRlbWVudCBpcyBTdWdhcnlBcnJheVN0YXRlbWVudCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlbWVudCkgJiYgdHlwZW9mIHN0YXRlbWVudFswXSA9PT0gJ3N0cmluZycpIHtcbiAgICBzd2l0Y2ggKHN0YXRlbWVudFswXVswXSkge1xuICAgICAgY2FzZSAnKCc6XG4gICAgICBjYXNlICcjJzpcbiAgICAgIGNhc2UgJzwnOlxuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgU3VnYXJ5QXJyYXlTdGF0ZW1lbnQgPSBCdWlsZGVyQ2FsbEV4cHJlc3Npb24gfCBCdWlsZGVyRWxlbWVudCB8IEJ1aWxkZXJCbG9ja1N0YXRlbWVudDtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN1Z2FyeUFycmF5U3RhdGVtZW50KFxuICBzdGF0ZW1lbnQ6IFN1Z2FyeUFycmF5U3RhdGVtZW50XG4pOiBOb3JtYWxpemVkU3RhdGVtZW50IHtcbiAgbGV0IG5hbWUgPSBzdGF0ZW1lbnRbMF07XG5cbiAgc3dpdGNoIChuYW1lWzBdKSB7XG4gICAgY2FzZSAnKCc6IHtcbiAgICAgIGxldCBwYXJhbXM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPiA9IG51bGw7XG4gICAgICBsZXQgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPiA9IG51bGw7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHBhcmFtcyA9IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0gYXMgUGFyYW1zKTtcbiAgICAgICAgaGFzaCA9IG5vcm1hbGl6ZUhhc2goc3RhdGVtZW50WzJdIGFzIEhhc2gpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0YXRlbWVudFsxXSkpIHtcbiAgICAgICAgICBwYXJhbXMgPSBub3JtYWxpemVQYXJhbXMoc3RhdGVtZW50WzFdIGFzIFBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzaCA9IG5vcm1hbGl6ZUhhc2goc3RhdGVtZW50WzFdIGFzIEhhc2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkNhbGwsXG4gICAgICAgIGhlYWQ6IG5vcm1hbGl6ZUNhbGxIZWFkKG5hbWUpLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIHRydXN0ZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICcjJzoge1xuICAgICAgbGV0IHsgaGVhZDogcGF0aCwgcGFyYW1zLCBoYXNoLCBibG9ja3MsIGJsb2NrUGFyYW1zIH0gPSBub3JtYWxpemVCdWlsZGVyQmxvY2tTdGF0ZW1lbnQoXG4gICAgICAgIHN0YXRlbWVudCBhcyBCdWlsZGVyQmxvY2tTdGF0ZW1lbnRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkJsb2NrLFxuICAgICAgICBoZWFkOiBwYXRoLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIGJsb2NrcyxcbiAgICAgICAgYmxvY2tQYXJhbXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJyEnOiB7XG4gICAgICBsZXQgbmFtZSA9IHN0YXRlbWVudFswXS5zbGljZSgxKTtcbiAgICAgIGxldCB7IHBhcmFtcywgaGFzaCwgYmxvY2tzLCBibG9ja1BhcmFtcyB9ID0gbm9ybWFsaXplQnVpbGRlckJsb2NrU3RhdGVtZW50KFxuICAgICAgICBzdGF0ZW1lbnQgYXMgQnVpbGRlckJsb2NrU3RhdGVtZW50XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5LZXl3b3JkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIGJsb2NrcyxcbiAgICAgICAgYmxvY2tQYXJhbXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJzwnOiB7XG4gICAgICBsZXQgYXR0cnM6IE5vcm1hbGl6ZWRBdHRycyA9IGRpY3QoKTtcbiAgICAgIGxldCBibG9jazogTm9ybWFsaXplZEJsb2NrID0gW107XG5cbiAgICAgIGlmIChzdGF0ZW1lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGF0dHJzID0gbm9ybWFsaXplQXR0cnMoc3RhdGVtZW50WzFdIGFzIEJ1aWxkZXJBdHRycyk7XG4gICAgICAgIGJsb2NrID0gbm9ybWFsaXplQmxvY2soc3RhdGVtZW50WzJdIGFzIEJ1aWxkZXJCbG9jayk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50WzFdKSkge1xuICAgICAgICAgIGJsb2NrID0gbm9ybWFsaXplQmxvY2soc3RhdGVtZW50WzFdIGFzIEJ1aWxkZXJCbG9jayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0cnMgPSBub3JtYWxpemVBdHRycyhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5FbGVtZW50LFxuICAgICAgICBuYW1lOiBleHBlY3QoZXh0cmFjdEVsZW1lbnQobmFtZSksIGBCVUc6IGV4cGVjdGVkICR7bmFtZX0gdG8gbG9vayBsaWtlIGEgdGFnIG5hbWVgKSxcbiAgICAgICAgYXR0cnMsXG4gICAgICAgIGJsb2NrLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlYWNoYWJsZSAke0pTT04uc3RyaW5naWZ5KHN0YXRlbWVudCl9IGluIG5vcm1hbGl6ZVN1Z2FyeUFycmF5U3RhdGVtZW50YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmVyYm9zZVN0YXRlbWVudChzdGF0ZW1lbnQ6IFZlcmJvc2VTdGF0ZW1lbnQpOiBOb3JtYWxpemVkU3RhdGVtZW50IHtcbiAgc3dpdGNoIChzdGF0ZW1lbnRbMF0pIHtcbiAgICBjYXNlIEJ1aWxkZXIuTGl0ZXJhbDoge1xuICAg