@glimmer/compiler
Version:
554 lines (443 loc) • 51.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Template = exports.ComponentBlock = exports.TemplateBlock = exports.NamedBlock = exports.InlineBlock = exports.Block = undefined;
var _util = require("@glimmer/util");
var _wireFormat = require("@glimmer/wire-format");
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
}return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
}();
function _defaults(obj, defaults) {
var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
Object.defineProperty(obj, key, value);
}
}return obj;
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && (typeof call === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Block = exports.Block = function () {
function Block() {
_classCallCheck(this, Block);
this.statements = [];
}
Block.prototype.push = function push(statement) {
this.statements.push(statement);
};
return Block;
}();
var InlineBlock = exports.InlineBlock = function (_Block) {
_inherits(InlineBlock, _Block);
function InlineBlock(table) {
_classCallCheck(this, InlineBlock);
var _this = _possibleConstructorReturn(this, _Block.call(this));
_this.table = table;
return _this;
}
InlineBlock.prototype.toJSON = function toJSON() {
return {
statements: this.statements,
parameters: this.table.slots
};
};
return InlineBlock;
}(Block);
var NamedBlock = exports.NamedBlock = function (_InlineBlock) {
_inherits(NamedBlock, _InlineBlock);
function NamedBlock(name, table) {
_classCallCheck(this, NamedBlock);
var _this2 = _possibleConstructorReturn(this, _InlineBlock.call(this, table));
_this2.name = name;
return _this2;
}
return NamedBlock;
}(InlineBlock);
var TemplateBlock = exports.TemplateBlock = function (_Block2) {
_inherits(TemplateBlock, _Block2);
function TemplateBlock(symbolTable) {
_classCallCheck(this, TemplateBlock);
var _this3 = _possibleConstructorReturn(this, _Block2.call(this));
_this3.symbolTable = symbolTable;
_this3.type = 'template';
_this3.yields = new _util.DictSet();
_this3.named = new _util.DictSet();
_this3.blocks = [];
_this3.hasEval = false;
return _this3;
}
TemplateBlock.prototype.push = function push(statement) {
this.statements.push(statement);
};
TemplateBlock.prototype.toJSON = function toJSON() {
return {
symbols: this.symbolTable.symbols,
statements: this.statements,
hasEval: this.hasEval
};
};
return TemplateBlock;
}(Block);
var ComponentBlock = exports.ComponentBlock = function (_Block3) {
_inherits(ComponentBlock, _Block3);
function ComponentBlock(tag, table, selfClosing) {
_classCallCheck(this, ComponentBlock);
var _this4 = _possibleConstructorReturn(this, _Block3.call(this));
_this4.tag = tag;
_this4.table = table;
_this4.selfClosing = selfClosing;
_this4.attributes = [];
_this4.arguments = [];
_this4.inParams = true;
_this4.positionals = [];
_this4.blocks = [];
return _this4;
}
ComponentBlock.prototype.push = function push(statement) {
if (this.inParams) {
if ((0, _wireFormat.isFlushElement)(statement)) {
this.inParams = false;
} else if ((0, _wireFormat.isArgument)(statement)) {
this.arguments.push(statement);
} else if ((0, _wireFormat.isAttribute)(statement)) {
this.attributes.push(statement);
} else {
throw new Error('Compile Error: only parameters allowed before flush-element');
}
} else {
this.statements.push(statement);
}
};
ComponentBlock.prototype.pushBlock = function pushBlock(name, block) {
this.blocks.push([name, block]);
};
ComponentBlock.prototype.toJSON = function toJSON() {
var blocks = void 0;
var args = this.arguments;
var keys = args.map(function (arg) {
return arg[1];
});
var values = args.map(function (arg) {
return arg[2];
});
if (this.selfClosing) {
blocks = null;
} else if (this.blocks.length > 0) {
var _keys = [];
var _values = [];
for (var i = 0; i < this.blocks.length; i++) {
var _blocks$i = this.blocks[i],
key = _blocks$i[0],
value = _blocks$i[1];
_keys.push(key.slice(1));
_values.push(value);
}
blocks = [_keys, _values];
} else {
blocks = [['default'], [{
statements: this.statements,
parameters: this.table.slots
}]];
}
return [this.tag, this.attributes, [keys, values], blocks];
};
return ComponentBlock;
}(Block);
var Template = exports.Template = function () {
function Template(symbols) {
_classCallCheck(this, Template);
this.block = new TemplateBlock(symbols);
}
Template.prototype.toJSON = function toJSON() {
return this.block.toJSON();
};
return Template;
}();
var JavaScriptCompiler = function () {
function JavaScriptCompiler(opcodes, symbols, options) {
_classCallCheck(this, JavaScriptCompiler);
this.blocks = new _util.Stack();
this.values = [];
this.opcodes = opcodes;
this.template = new Template(symbols);
this.options = options;
}
JavaScriptCompiler.process = function process(opcodes, symbols, options) {
var compiler = new JavaScriptCompiler(opcodes, symbols, options);
return compiler.process();
};
JavaScriptCompiler.prototype.process = function process() {
var _this5 = this;
this.opcodes.forEach(function (op) {
var opcode = op[0];
var arg = op[1];
if (!_this5[opcode]) {
throw new Error('unimplemented ' + opcode + ' on JavaScriptCompiler');
}
_this5[opcode](arg);
});
return this.template;
};
/// Nesting
JavaScriptCompiler.prototype.startBlock = function startBlock(program) {
this.startInlineBlock(program.symbols);
};
JavaScriptCompiler.prototype.endBlock = function endBlock() {
var block = this.endInlineBlock();
this.template.block.blocks.push(block);
};
JavaScriptCompiler.prototype.startProgram = function startProgram() {
this.blocks.push(this.template.block);
};
JavaScriptCompiler.prototype.endProgram = function endProgram() {};
/// Statements
JavaScriptCompiler.prototype.text = function text(content) {
this.push([0 /* Text */, content]);
};
JavaScriptCompiler.prototype.append = function append(trusted) {
this.push([1 /* Append */, this.popValue(), trusted]);
};
JavaScriptCompiler.prototype.comment = function comment(value) {
this.push([2 /* Comment */, value]);
};
JavaScriptCompiler.prototype.modifier = function modifier(name) {
var params = this.popValue();
var hash = this.popValue();
this.push([3 /* Modifier */, name, params, hash]);
};
JavaScriptCompiler.prototype.block = function block(_ref) {
var name = _ref[0],
template = _ref[1],
inverse = _ref[2];
var params = this.popValue();
var hash = this.popValue();
var blocks = this.template.block.blocks;
false && (0, _util.assert)(typeof template !== 'number' || blocks[template] !== null, 'missing block in the compiler');
false && (0, _util.assert)(typeof inverse !== 'number' || blocks[inverse] !== null, 'missing block in the compiler');
var namedBlocks = void 0;
if (template === null && inverse === null) {
namedBlocks = null;
} else if (inverse === null) {
namedBlocks = [['default'], [blocks[template]]];
} else {
namedBlocks = [['default', 'else'], [blocks[template], blocks[inverse]]];
}
this.push([4 /* Block */, name, params, hash, namedBlocks]);
};
JavaScriptCompiler.prototype.openComponent = function openComponent(element) {
var tag = this.options && this.options.customizeComponentName ? this.options.customizeComponentName(element.tag) : element.tag;
var component = new ComponentBlock(tag, element.symbols, element.selfClosing);
this.blocks.push(component);
};
JavaScriptCompiler.prototype.openNamedBlock = function openNamedBlock(element) {
var block = new NamedBlock(element.tag, element.symbols);
this.blocks.push(block);
};
JavaScriptCompiler.prototype.openElement = function openElement(_ref2) {
var element = _ref2[0],
simple = _ref2[1];
var tag = element.tag;
if (element.blockParams.length > 0) {
throw new Error('Compile Error: <' + element.tag + '> is not a component and doesn\'t support block parameters');
} else {
this.push([7 /* OpenElement */, tag, simple]);
}
};
JavaScriptCompiler.prototype.flushElement = function flushElement() {
this.push([9 /* FlushElement */]);
};
JavaScriptCompiler.prototype.closeComponent = function closeComponent(_element) {
var _endComponent = this.endComponent(),
tag = _endComponent[0],
attrs = _endComponent[1],
args = _endComponent[2],
blocks = _endComponent[3];
this.push([5 /* Component */, tag, attrs, args, blocks]);
};
JavaScriptCompiler.prototype.closeNamedBlock = function closeNamedBlock(_element) {
var blocks = this.blocks;
var block = blocks.pop();
this.currentComponent.pushBlock(block.name, block.toJSON());
};
JavaScriptCompiler.prototype.closeDynamicComponent = function closeDynamicComponent(_element) {
var _endComponent2 = this.endComponent(),
attrs = _endComponent2[1],
args = _endComponent2[2],
block = _endComponent2[3];
this.push([6 /* DynamicComponent */, this.popValue(), attrs, args, block]);
};
JavaScriptCompiler.prototype.closeElement = function closeElement(_element) {
this.push([10 /* CloseElement */]);
};
JavaScriptCompiler.prototype.staticAttr = function staticAttr(_ref3) {
var name = _ref3[0],
namespace = _ref3[1];
var value = this.popValue();
this.push([11 /* StaticAttr */, name, value, namespace]);
};
JavaScriptCompiler.prototype.dynamicAttr = function dynamicAttr(_ref4) {
var name = _ref4[0],
namespace = _ref4[1];
var value = this.popValue();
this.push([12 /* DynamicAttr */, name, value, namespace]);
};
JavaScriptCompiler.prototype.componentAttr = function componentAttr(_ref5) {
var name = _ref5[0],
namespace = _ref5[1];
var value = this.popValue();
this.push([13 /* ComponentAttr */, name, value, namespace]);
};
JavaScriptCompiler.prototype.trustingAttr = function trustingAttr(_ref6) {
var name = _ref6[0],
namespace = _ref6[1];
var value = this.popValue();
this.push([19 /* TrustingDynamicAttr */, name, value, namespace]);
};
JavaScriptCompiler.prototype.trustingComponentAttr = function trustingComponentAttr(_ref7) {
var name = _ref7[0],
namespace = _ref7[1];
var value = this.popValue();
this.push([20 /* TrustingComponentAttr */, name, value, namespace]);
};
JavaScriptCompiler.prototype.staticArg = function staticArg(name) {
var value = this.popValue();
this.push([18 /* StaticArg */, name, value]);
};
JavaScriptCompiler.prototype.dynamicArg = function dynamicArg(name) {
var value = this.popValue();
this.push([17 /* DynamicArg */, name, value]);
};
JavaScriptCompiler.prototype.yield = function _yield(to) {
var params = this.popValue();
this.push([15 /* Yield */, to, params]);
};
JavaScriptCompiler.prototype.attrSplat = function attrSplat(to) {
// consume (and disregard) the value pushed for the
// ...attributes attribute
this.popValue();
this.push([14 /* AttrSplat */, to]);
};
JavaScriptCompiler.prototype.debugger = function _debugger(evalInfo) {
this.push([21 /* Debugger */, evalInfo]);
this.template.block.hasEval = true;
};
JavaScriptCompiler.prototype.hasBlock = function hasBlock(name) {
this.pushValue([26 /* HasBlock */, name]);
};
JavaScriptCompiler.prototype.hasBlockParams = function hasBlockParams(name) {
this.pushValue([27 /* HasBlockParams */, name]);
};
JavaScriptCompiler.prototype.partial = function partial(evalInfo) {
var params = this.popValue();
this.push([16 /* Partial */, params[0], evalInfo]);
this.template.block.hasEval = true;
};
/// Expressions
JavaScriptCompiler.prototype.literal = function literal(value) {
if (value === undefined) {
this.pushValue([28 /* Undefined */]);
} else {
this.pushValue(value);
}
};
JavaScriptCompiler.prototype.unknown = function unknown(name) {
this.pushValue([23 /* Unknown */, name]);
};
JavaScriptCompiler.prototype.get = function get(_ref8) {
var head = _ref8[0],
path = _ref8[1];
this.pushValue([24 /* Get */, head, path]);
};
JavaScriptCompiler.prototype.maybeLocal = function maybeLocal(path) {
this.pushValue([25 /* MaybeLocal */, path]);
};
JavaScriptCompiler.prototype.concat = function concat() {
this.pushValue([30 /* Concat */, this.popValue()]);
};
JavaScriptCompiler.prototype.helper = function helper(name) {
var params = this.popValue();
var hash = this.popValue();
this.pushValue([29 /* Helper */, name, params, hash]);
};
/// Stack Management Opcodes
JavaScriptCompiler.prototype.prepareArray = function prepareArray(size) {
var values = [];
for (var i = 0; i < size; i++) {
values.push(this.popValue());
}
this.pushValue(values);
};
JavaScriptCompiler.prototype.prepareObject = function prepareObject(size) {
false && (0, _util.assert)(this.values.length >= size, 'Expected ' + size + ' values on the stack, found ' + this.values.length);
var keys = new Array(size);
var values = new Array(size);
for (var i = 0; i < size; i++) {
keys[i] = this.popValue();
values[i] = this.popValue();
}
this.pushValue([keys, values]);
};
/// Utilities
JavaScriptCompiler.prototype.endComponent = function endComponent() {
var component = this.blocks.pop();
false && (0, _util.assert)(component instanceof ComponentBlock, 'Compiler bug: endComponent() should end a component');
return component.toJSON();
};
JavaScriptCompiler.prototype.startInlineBlock = function startInlineBlock(symbols) {
var block = new InlineBlock(symbols);
this.blocks.push(block);
};
JavaScriptCompiler.prototype.endInlineBlock = function endInlineBlock() {
var blocks = this.blocks;
var block = blocks.pop();
return block.toJSON();
};
JavaScriptCompiler.prototype.push = function push(args) {
this.currentBlock.push(args);
};
JavaScriptCompiler.prototype.pushValue = function pushValue(val) {
this.values.push(val);
};
JavaScriptCompiler.prototype.popValue = function popValue() {
false && (0, _util.assert)(this.values.length, 'No expression found on stack');
return this.values.pop();
};
_createClass(JavaScriptCompiler, [{
key: 'currentBlock',
get: function get() {
return this.blocks.current;
}
}, {
key: 'currentComponent',
get: function get() {
var block = this.currentBlock;
if (block instanceof ComponentBlock) {
return block;
} else {
throw new Error('Expected ComponentBlock on stack, found ' + block.constructor.name);
}
}
}]);
return JavaScriptCompiler;
}();
exports.default = JavaScriptCompiler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9qYXZhc2NyaXB0LWNvbXBpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsSUFBQSx3QkFBQSxZQUFBO0FBQUEsYUFBQSxLQUFBLEdBQUE7QUFBQSx3QkFBQSxJQUFBLEVBQUEsS0FBQTs7QUFDUyxhQUFBLFVBQUEsR0FBQSxFQUFBO0FBT1I7O0FBUkQsVUFBQSxTQUFBLENBQUEsSUFBQSxHQUFBLFNBQUEsSUFBQSxDQUFBLFNBQUEsRUFLc0M7QUFDbEMsYUFBQSxVQUFBLENBQUEsSUFBQSxDQUFBLFNBQUE7QUFOSixLQUFBOztBQUFBLFdBQUEsS0FBQTtBQUFBLENBQUEsRUFBQTtBQVVBLElBQUEsb0NBQUEsVUFBQSxNQUFBLEVBQUE7QUFBQSxjQUFBLFdBQUEsRUFBQSxNQUFBOztBQUNFLGFBQUEsV0FBQSxDQUFBLEtBQUEsRUFBMEM7QUFBQSx3QkFBQSxJQUFBLEVBQUEsV0FBQTs7QUFBQSxZQUFBLFFBQUEsMkJBQUEsSUFBQSxFQUN4QyxPQUFBLElBQUEsQ0FEd0MsSUFDeEMsQ0FEd0MsQ0FBQTs7QUFBdkIsY0FBQSxLQUFBLEdBQUEsS0FBQTtBQUF1QixlQUFBLEtBQUE7QUFFekM7O0FBSEgsZ0JBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxTQUFBLE1BQUEsR0FLUTtBQUNKLGVBQU87QUFDTCx3QkFBWSxLQURQLFVBQUE7QUFFTCx3QkFBWSxLQUFBLEtBQUEsQ0FBVztBQUZsQixTQUFQO0FBTkosS0FBQTs7QUFBQSxXQUFBLFdBQUE7QUFBQSxDQUFBLENBQUEsS0FBQSxDQUFBO0FBYUEsSUFBQSxrQ0FBQSxVQUFBLFlBQUEsRUFBQTtBQUFBLGNBQUEsVUFBQSxFQUFBLFlBQUE7O0FBQ0UsYUFBQSxVQUFBLENBQUEsSUFBQSxFQUFBLEtBQUEsRUFBd0Q7QUFB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OztBQUdGOzs7aUNBRUEsWSwyQkFBWTtBQUNWLFlBQUksWUFBWSxLQUFBLE1BQUEsQ0FBaEIsR0FBZ0IsRUFBaEI7QUFEVSxpQkFFVixrQkFDRSxxQkFERixjQUFBLEVBRlUscURBRVYsQ0FGVTs7QUFPVixlQUFRLFVBQVIsTUFBUSxFQUFSOzs7aUNBR0YsZ0IsNkJBQUEsTyxFQUEwQztBQUN4QyxZQUFJLFFBQWUsSUFBQSxXQUFBLENBQW5CLE9BQW1CLENBQW5CO0FBQ0EsYUFBQSxNQUFBLENBQUEsSUFBQSxDQUFBLEtBQUE7OztpQ0FHRixjLDZCQUFjO0FBQUEsWUFBQSxTQUFBLEtBQUEsTUFBQTs7QUFFWixZQUFJLFFBQVEsT0FBWixHQUFZLEVBQVo7QUFDQSxlQUFPLE1BQVAsTUFBTyxFQUFQOzs7aUNBR0YsSSxpQkFBQSxJLEVBQW9CO0FBQ2xCLGFBQUEsWUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBOzs7aUNBR0YsUyxzQkFBQSxHLEVBQXNEO0FBQ3BELGFBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxHQUFBOzs7aUNBR0YsUSx1QkFBUTtBQUFBLGlCQUNOLGtCQUFPLEtBQUEsTUFBQSxDQUFQLE1BQUEsRUFETSw4QkFDTixDQURNOztBQUVOLGVBQU8sS0FBQSxNQUFBLENBQVAsR0FBTyxFQUFQOzs7Ozs0QkFqVGM7QUFDZCxtQkFBYyxLQUFBLE1BQUEsQ0FBZCxPQUFBO0FBQ0Q7Ozs0QkFFbUI7QUFDbEIsZ0JBQUksUUFBUSxLQUFaLFlBQUE7QUFFQSxnQkFBSSxpQkFBSixjQUFBLEVBQXFDO0FBQ25DLHVCQUFBLEtBQUE7QUFERixhQUFBLE1BRU87QUFDTCxzQkFBTSxJQUFBLEtBQUEsQ0FBQSw2Q0FBcUQsTUFBQSxXQUFBLENBQTNELElBQU0sQ0FBTjtBQUNEO0FBQ0Y7Ozs7OztrQkEvQlcsa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IFN0YWNrLCBEaWN0U2V0LCBPcHRpb24sIGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQVNUIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IENvbXBpbGVPcHRpb25zIH0gZnJvbSAnLi90ZW1wbGF0ZS1jb21waWxlcic7XG5pbXBvcnQgeyBpc0FyZ3VtZW50LCBpc0F0dHJpYnV0ZSwgaXNGbHVzaEVsZW1lbnQgfSBmcm9tICdAZ2xpbW1lci93aXJlLWZvcm1hdCc7XG5pbXBvcnQgeyBQcm9jZXNzb3IsIENvbXBpbGVyT3BzLCBPcE5hbWUsIE9wIH0gZnJvbSAnLi9jb21waWxlci1vcHMnO1xuaW1wb3J0IHtcbiAgV2lyZUZvcm1hdCxcbiAgU2VyaWFsaXplZElubGluZUJsb2NrLFxuICBTdGF0ZW1lbnQsXG4gIFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrLFxuICBTdGF0ZW1lbnRzLFxuICBTZXhwT3Bjb2RlcyxcbiAgRXhwcmVzc2lvbixcbiAgRXhwcmVzc2lvbnMsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgdHlwZSBzdHIgPSBzdHJpbmc7XG5pbXBvcnQgQ29yZSA9IFdpcmVGb3JtYXQuQ29yZTtcbmV4cG9ydCB0eXBlIFBhcmFtcyA9IFdpcmVGb3JtYXQuQ29yZS5QYXJhbXM7XG5leHBvcnQgdHlwZSBIYXNoID0gV2lyZUZvcm1hdC5Db3JlLkhhc2g7XG5leHBvcnQgdHlwZSBQYXRoID0gV2lyZUZvcm1hdC5Db3JlLlBhdGg7XG5leHBvcnQgdHlwZSBTdGFja1ZhbHVlID0gV2lyZUZvcm1hdC5FeHByZXNzaW9uIHwgUGFyYW1zIHwgSGFzaCB8IHN0cjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJsb2NrIHtcbiAgcHVibGljIHN0YXRlbWVudHM6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10gPSBbXTtcblxuICBhYnN0cmFjdCB0b0pTT04oKTogT2JqZWN0O1xuXG4gIHB1c2goc3RhdGVtZW50OiBXaXJlRm9ybWF0LlN0YXRlbWVudCkge1xuICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElubGluZUJsb2NrIGV4dGVuZHMgQmxvY2sge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGFibGU6IEFTVC5CbG9ja1N5bWJvbHMpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgdG9KU09OKCk6IFNlcmlhbGl6ZWRJbmxpbmVCbG9jayB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlbWVudHM6IHRoaXMuc3RhdGVtZW50cyxcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMudGFibGUuc2xvdHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmFtZWRCbG9jayBleHRlbmRzIElubGluZUJsb2NrIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgdGFibGU6IEFTVC5CbG9ja1N5bWJvbHMpIHtcbiAgICBzdXBlcih0YWJsZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gIHB1YmxpYyB0eXBlID0gJ3RlbXBsYXRlJztcbiAgcHVibGljIHlpZWxkcyA9IG5ldyBEaWN0U2V0PHN0cmluZz4oKTtcbiAgcHVibGljIG5hbWVkID0gbmV3IERpY3RTZXQ8c3RyaW5nPigpO1xuICBwdWJsaWMgYmxvY2tzOiBTZXJpYWxpemVkSW5saW5lQmxvY2tbXSA9IFtdO1xuICBwdWJsaWMgaGFzRXZhbCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3ltYm9sVGFibGU6IEFTVC5TeW1ib2xzKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1c2goc3RhdGVtZW50OiBTdGF0ZW1lbnQpIHtcbiAgICB0aGlzLnN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICB9XG5cbiAgdG9KU09OKCk6IFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3ltYm9sczogdGhpcy5zeW1ib2xUYWJsZS5zeW1ib2xzLFxuICAgICAgc3RhdGVtZW50czogdGhpcy5zdGF0ZW1lbnRzLFxuICAgICAgaGFzRXZhbDogdGhpcy5oYXNFdmFsLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEJsb2NrIGV4dGVuZHMgQmxvY2sge1xuICBwdWJsaWMgYXR0cmlidXRlczogU3RhdGVtZW50cy5BdHRyaWJ1dGVbXSA9IFtdO1xuICBwdWJsaWMgYXJndW1lbnRzOiBTdGF0ZW1lbnRzLkFyZ3VtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBpblBhcmFtcyA9IHRydWU7XG4gIHB1YmxpYyBwb3NpdGlvbmFsczogbnVtYmVyW10gPSBbXTtcbiAgcHVibGljIGJsb2NrczogQXJyYXk8W3N0cmluZywgU2VyaWFsaXplZElubGluZUJsb2NrXT4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhZzogc3RyaW5nLCBwcml2YXRlIHRhYmxlOiBBU1QuQmxvY2tTeW1ib2xzLCBwcml2YXRlIHNlbGZDbG9zaW5nOiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1c2goc3RhdGVtZW50OiBTdGF0ZW1lbnQpIHtcbiAgICBpZiAodGhpcy5pblBhcmFtcykge1xuICAgICAgaWYgKGlzRmx1c2hFbGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgdGhpcy5pblBhcmFtcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChpc0FyZ3VtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgdGhpcy5hcmd1bWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmIChpc0F0dHJpYnV0ZShzdGF0ZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wdXNoKHN0YXRlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBpbGUgRXJyb3I6IG9ubHkgcGFyYW1ldGVycyBhbGxvd2VkIGJlZm9yZSBmbHVzaC1lbGVtZW50Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHVzaEJsb2NrKG5hbWU6IHN0cmluZywgYmxvY2s6IFNlcmlhbGl6ZWRJbmxpbmVCbG9jaykge1xuICAgIHRoaXMuYmxvY2tzLnB1c2goW25hbWUsIGJsb2NrXSk7XG4gIH1cblxuICB0b0pTT04oKTogW3N0cmluZywgU3RhdGVtZW50cy5BdHRyaWJ1dGVbXSwgQ29yZS5IYXNoLCBDb3JlLkJsb2Nrc10ge1xuICAgIGxldCBibG9ja3M6IENvcmUuQmxvY2tzO1xuICAgIGxldCBhcmdzID0gdGhpcy5hcmd1bWVudHM7XG4gICAgbGV0IGtleXMgPSBhcmdzLm1hcChhcmcgPT4gYXJnWzFdKTtcbiAgICBsZXQgdmFsdWVzID0gYXJncy5tYXAoYXJnID0+IGFyZ1syXSk7XG5cbiAgICBpZiAodGhpcy5zZWxmQ2xvc2luZykge1xuICAgICAgYmxvY2tzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYmxvY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHZhbHVlczogU2VyaWFsaXplZElubGluZUJsb2NrW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgW2tleSwgdmFsdWVdID0gdGhpcy5ibG9ja3NbaV07XG4gICAgICAgIGtleXMucHVzaChrZXkuc2xpY2UoMSkpO1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBibG9ja3MgPSBba2V5cywgdmFsdWVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmxvY2tzID0gW1xuICAgICAgICBbJ2RlZmF1bHQnXSxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IHRoaXMuc3RhdGVtZW50cyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMudGFibGUuc2xvdHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFt0aGlzLnRhZywgdGhpcy5hdHRyaWJ1dGVzLCBba2V5cywgdmFsdWVzXSwgYmxvY2tzXTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGUge1xuICBwdWJsaWMgYmxvY2s6IFRlbXBsYXRlQmxvY2s7XG5cbiAgY29uc3RydWN0b3Ioc3ltYm9sczogQVNULlN5bWJvbHMpIHtcbiAgICB0aGlzLmJsb2NrID0gbmV3IFRlbXBsYXRlQmxvY2soc3ltYm9scyk7XG4gIH1cblxuICB0b0pTT04oKTogU2VyaWFsaXplZFRlbXBsYXRlQmxvY2sge1xuICAgIHJldHVybiB0aGlzLmJsb2NrLnRvSlNPTigpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEluVmFyaWFibGUgPSBudW1iZXI7XG5leHBvcnQgdHlwZSBJbk9wPEsgZXh0ZW5kcyBrZXlvZiBDb21waWxlck9wczxJblZhcmlhYmxlPiA9IE9wTmFtZT4gPSBPcDxcbiAgSW5WYXJpYWJsZSxcbiAgQ29tcGlsZXJPcHM8SW5WYXJpYWJsZT4sXG4gIEtcbj47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmFTY3JpcHRDb21waWxlclxuICBpbXBsZW1lbnRzIFByb2Nlc3NvcjxDb21waWxlck9wczxudW1iZXI+LCB2b2lkLCBDb21waWxlck9wczx2b2lkPj4ge1xuICBzdGF0aWMgcHJvY2VzcyhvcGNvZGVzOiBJbk9wW10sIHN5bWJvbHM6IEFTVC5TeW1ib2xzLCBvcHRpb25zPzogQ29tcGlsZU9wdGlvbnMpOiBUZW1wbGF0ZSB7XG4gICAgbGV0IGNvbXBpbGVyID0gbmV3IEphdmFTY3JpcHRDb21waWxlcihvcGNvZGVzLCBzeW1ib2xzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gY29tcGlsZXIucHJvY2VzcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHByaXZhdGUgYmxvY2tzID0gbmV3IFN0YWNrPEJsb2NrPigpO1xuICBwcml2YXRlIG9wY29kZXM6IEluT3BbXTtcbiAgcHJpdmF0ZSB2YWx1ZXM6IFN0YWNrVmFsdWVbXSA9IFtdO1xuICBwcml2YXRlIG9wdGlvbnM6IENvbXBpbGVPcHRpb25zIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wY29kZXM6IEluT3BbXSwgc3ltYm9sczogQVNULlN5bWJvbHMsIG9wdGlvbnM/OiBDb21waWxlT3B0aW9ucykge1xuICAgIHRoaXMub3Bjb2RlcyA9IG9wY29kZXM7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShzeW1ib2xzKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRCbG9jaygpOiBCbG9jayB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzLmJsb2Nrcy5jdXJyZW50LCAnRXhwZWN0ZWQgYSBibG9jayBvbiB0aGUgc3RhY2snKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50Q29tcG9uZW50KCk6IENvbXBvbmVudEJsb2NrIHtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmN1cnJlbnRCbG9jaztcblxuICAgIGlmIChibG9jayBpbnN0YW5jZW9mIENvbXBvbmVudEJsb2NrKSB7XG4gICAgICByZXR1cm4gYmxvY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgQ29tcG9uZW50QmxvY2sgb24gc3RhY2ssIGZvdW5kICR7YmxvY2suY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzKCk6IFRlbXBsYXRlIHtcbiAgICB0aGlzLm9wY29kZXMuZm9yRWFjaChvcCA9PiB7XG4gICAgICBsZXQgb3Bjb2RlID0gb3BbMF07XG4gICAgICBsZXQgYXJnID0gb3BbMV07XG5cbiAgICAgIGlmICghdGhpc1tvcGNvZGVdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke29wY29kZX0gb24gSmF2YVNjcmlwdENvbXBpbGVyYCk7XG4gICAgICB9XG4gICAgICAodGhpc1tvcGNvZGVdIGFzIGFueSkoYXJnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcbiAgfVxuXG4gIC8vLyBOZXN0aW5nXG5cbiAgc3RhcnRCbG9jayhwcm9ncmFtOiBBU1QuQmxvY2spIHtcbiAgICB0aGlzLnN0YXJ0SW5saW5lQmxvY2socHJvZ3JhbS5zeW1ib2xzISk7XG4gIH1cblxuICBlbmRCbG9jaygpIHtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmVuZElubGluZUJsb2NrKCk7XG4gICAgdGhpcy50ZW1wbGF0ZS5ibG9jay5ibG9ja3MucHVzaChibG9jayk7XG4gIH1cblxuICBzdGFydFByb2dyYW0oKSB7XG4gICAgdGhpcy5ibG9ja3MucHVzaCh0aGlzLnRlbXBsYXRlLmJsb2NrKTtcbiAgfVxuXG4gIGVuZFByb2dyYW0oKSB7fVxuXG4gIC8vLyBTdGF0ZW1lbnRzXG5cbiAgdGV4dChjb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLnB1c2goW1NleHBPcGNvZGVzLlRleHQsIGNvbnRlbnRdKTtcbiAgfVxuXG4gIGFwcGVuZCh0cnVzdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5BcHBlbmQsIHRoaXMucG9wVmFsdWU8RXhwcmVzc2lvbj4oKSwgdHJ1c3RlZF0pO1xuICB9XG5cbiAgY29tbWVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5Db21tZW50LCB2YWx1ZV0pO1xuICB9XG5cbiAgbW9kaWZpZXIobmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWU8UGFyYW1zPigpO1xuICAgIGxldCBoYXNoID0gdGhpcy5wb3BWYWx1ZTxIYXNoPigpO1xuICAgIHRoaXMucHVzaChbU2V4cE9wY29kZXMuTW9kaWZpZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICB9XG5cbiAgYmxvY2soW25hbWUsIHRlbXBsYXRlLCBpbnZlcnNlXTogW3N0cmluZywgbnVtYmVyLCBPcHRpb248bnVtYmVyPl0pIHtcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZTxQYXJhbXM+KCk7XG4gICAgbGV0IGhhc2ggPSB0aGlzLnBvcFZhbHVlPEhhc2g+KCk7XG5cbiAgICBsZXQgYmxvY2tzID0gdGhpcy50ZW1wbGF0ZS5ibG9jay5ibG9ja3M7XG4gICAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIHRlbXBsYXRlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbdGVtcGxhdGVdICE9PSBudWxsLFxuICAgICAgJ21pc3NpbmcgYmxvY2sgaW4gdGhlIGNvbXBpbGVyJ1xuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIGludmVyc2UgIT09ICdudW1iZXInIHx8IGJsb2Nrc1tpbnZlcnNlXSAhPT0gbnVsbCxcbiAgICAgICdtaXNzaW5nIGJsb2NrIGluIHRoZSBjb21waWxlcidcbiAgICApO1xuXG4gICAgbGV0IG5hbWVkQmxvY2tzOiBPcHRpb248Q29yZS5CbG9ja3M+O1xuXG4gICAgaWYgKHRlbXBsYXRlID09PSBudWxsICYmIGludmVyc2UgPT09IG51bGwpIHtcbiAgICAgIG5hbWVkQmxvY2tzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGludmVyc2UgPT09IG51bGwpIHtcbiAgICAgIG5hbWVkQmxvY2tzID0gW1snZGVmYXVsdCddLCBbYmxvY2tzW3RlbXBsYXRlXV1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lZEJsb2NrcyA9IFtbJ2RlZmF1bHQnLCAnZWxzZSddLCBbYmxvY2tzW3RlbXBsYXRlXSwgYmxvY2tzW2ludmVyc2VdXV07XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5CbG9jaywgbmFtZSwgcGFyYW1zLCBoYXNoLCBuYW1lZEJsb2Nrc10pO1xuICB9XG5cbiAgb3BlbkNvbXBvbmVudChlbGVtZW50OiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICBsZXQgdGFnID1cbiAgICAgIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuY3VzdG9taXplQ29tcG9uZW50TmFtZVxuICAgICAgICA/IHRoaXMub3B0aW9ucy5jdXN0b21pemVDb21wb25lbnROYW1lKGVsZW1lbnQudGFnKVxuICAgICAgICA6IGVsZW1lbnQudGFnO1xuICAgIGxldCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50QmxvY2sodGFnLCBlbGVtZW50LnN5bWJvbHMhLCBlbGVtZW50LnNlbGZDbG9zaW5nKTtcbiAgICB0aGlzLmJsb2Nrcy5wdXNoKGNvbXBvbmVudCk7XG4gIH1cblxuICBvcGVuTmFtZWRCbG9jayhlbGVtZW50OiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICBsZXQgYmxvY2s6IEJsb2NrID0gbmV3IE5hbWVkQmxvY2soZWxlbWVudC50YWcsIGVsZW1lbnQuc3ltYm9scyEpO1xuICAgIHRoaXMuYmxvY2tzLnB1c2goYmxvY2spO1xuICB9XG5cbiAgb3BlbkVsZW1lbnQoW2VsZW1lbnQsIHNpbXBsZV06IFtBU1QuRWxlbWVudE5vZGUsIGJvb2xlYW5dKSB7XG4gICAgbGV0IHRhZyA9IGVsZW1lbnQudGFnO1xuXG4gICAgaWYgKGVsZW1lbnQuYmxvY2tQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29tcGlsZSBFcnJvcjogPCR7ZWxlbWVudC50YWd9PiBpcyBub3QgYSBjb21wb25lbnQgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBibG9jayBwYXJhbWV0ZXJzYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5PcGVuRWxlbWVudCwgdGFnLCBzaW1wbGVdKTtcbiAgICB9XG4gIH1cblxuICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5GbHVzaEVsZW1lbnRdKTtcbiAgfVxuXG4gIGNsb3NlQ29tcG9uZW50KF9lbGVtZW50OiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICBsZXQgW3RhZywgYXR0cnMsIGFyZ3MsIGJsb2Nrc10gPSB0aGlzLmVuZENvbXBvbmVudCgpO1xuXG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5Db21wb25lbnQsIHRhZywgYXR0cnMsIGFyZ3MsIGJsb2Nrc10pO1xuICB9XG5cbiAgY2xvc2VOYW1lZEJsb2NrKF9lbGVtZW50OiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICBsZXQgeyBibG9ja3MgfSA9IHRoaXM7XG4gICAgbGV0IGJsb2NrID0gZXhwZWN0KGJsb2Nrcy5wb3AoKSwgYEV4cGVjdGVkIGEgbmFtZWQgYmxvY2sgb24gdGhlIHN0YWNrYCkgYXMgTmFtZWRCbG9jaztcblxuICAgIHRoaXMuY3VycmVudENvbXBvbmVudC5wdXNoQmxvY2soYmxvY2submFtZSwgYmxvY2sudG9KU09OKCkpO1xuICB9XG5cbiAgY2xvc2VEeW5hbWljQ29tcG9uZW50KF9lbGVtZW50OiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICBsZXQgWywgYXR0cnMsIGFyZ3MsIGJsb2NrXSA9IHRoaXMuZW5kQ29tcG9uZW50KCk7XG5cbiAgICB0aGlzLnB1c2goW1NleHBPcGNvZGVzLkR5bmFtaWNDb21wb25lbnQsIHRoaXMucG9wVmFsdWU8RXhwcmVzc2lvbj4oKSwgYXR0cnMsIGFyZ3MsIGJsb2NrXSk7XG4gIH1cblxuICBjbG9zZUVsZW1lbnQoX2VsZW1lbnQ6IEFTVC5FbGVtZW50Tm9kZSkge1xuICAgIHRoaXMucHVzaChbU2V4cE9wY29kZXMuQ2xvc2VFbGVtZW50XSk7XG4gIH1cblxuICBzdGF0aWNBdHRyKFtuYW1lLCBuYW1lc3BhY2VdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlPHN0cmluZz4oKTtcbiAgICB0aGlzLnB1c2goW1NleHBPcGNvZGVzLlN0YXRpY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgfVxuXG4gIGR5bmFtaWNBdHRyKFtuYW1lLCBuYW1lc3BhY2VdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlPEV4cHJlc3Npb24+KCk7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5EeW5hbWljQXR0ciwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZV0pO1xuICB9XG5cbiAgY29tcG9uZW50QXR0cihbbmFtZSwgbmFtZXNwYWNlXTogW3N0cmluZywgT3B0aW9uPHN0cmluZz5dKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5wb3BWYWx1ZTxFeHByZXNzaW9uPigpO1xuICAgIHRoaXMucHVzaChbU2V4cE9wY29kZXMuQ29tcG9uZW50QXR0ciwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZV0pO1xuICB9XG5cbiAgdHJ1c3RpbmdBdHRyKFtuYW1lLCBuYW1lc3BhY2VdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlPEV4cHJlc3Npb24+KCk7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5UcnVzdGluZ0R5bmFtaWNBdHRyLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlIV0pO1xuICB9XG5cbiAgdHJ1c3RpbmdDb21wb25lbnRBdHRyKFtuYW1lLCBuYW1lc3BhY2VdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlPEV4cHJlc3Npb24+KCk7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5UcnVzdGluZ0NvbXBvbmVudEF0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UhXSk7XG4gIH1cblxuICBzdGF0aWNBcmcobmFtZTogc3RyKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5wb3BWYWx1ZTxFeHByZXNzaW9uPigpO1xuICAgIHRoaXMucHVzaChbU2V4cE9wY29kZXMuU3RhdGljQXJnLCBuYW1lLCB2YWx1ZV0pO1xuICB9XG5cbiAgZHluYW1pY0FyZyhuYW1lOiBzdHIpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlPEV4cHJlc3Npb24+KCk7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5EeW5hbWljQXJnLCBuYW1lLCB2YWx1ZV0pO1xuICB9XG5cbiAgeWllbGQodG86IG51bWJlcikge1xuICAgIGxldCBwYXJhbXMgPSB0aGlzLnBvcFZhbHVlPFBhcmFtcz4oKTtcbiAgICB0aGlzLnB1c2goW1NleHBPcGNvZGVzLllpZWxkLCB0bywgcGFyYW1zXSk7XG4gIH1cblxuICBhdHRyU3BsYXQodG86IE9wdGlvbjxudW1iZXI+KSB7XG4gICAgLy8gY29uc3VtZSAoYW5kIGRpc3JlZ2FyZCkgdGhlIHZhbHVlIHB1c2hlZCBmb3IgdGhlXG4gICAgLy8gLi4uYXR0cmlidXRlcyBhdHRyaWJ1dGVcbiAgICB0aGlzLnBvcFZhbHVlKCk7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5BdHRyU3BsYXQsIHRvIV0pO1xuICB9XG5cbiAgZGVidWdnZXIoZXZhbEluZm86IE9wdGlvbjxDb3JlLkV2YWxJbmZvPikge1xuICAgIHRoaXMucHVzaChbU2V4cE9wY29kZXMuRGVidWdnZXIsIGV2YWxJbmZvIV0pO1xuICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gIH1cblxuICBoYXNCbG9jayhuYW1lOiBudW1iZXIpIHtcbiAgICB0aGlzLnB1c2hWYWx1ZTxFeHByZXNzaW9ucy5IYXNCbG9jaz4oW1NleHBPcGNvZGVzLkhhc0Jsb2NrLCBuYW1lXSk7XG4gIH1cblxuICBoYXNCbG9ja1BhcmFtcyhuYW1lOiBudW1iZXIpIHtcbiAgICB0aGlzLnB1c2hWYWx1ZTxFeHByZXNzaW9ucy5IYXNCbG9ja1BhcmFtcz4oW1NleHBPcGNvZGVzLkhhc0Jsb2NrUGFyYW1zLCBuYW1lXSk7XG4gIH1cblxuICBwYXJ0aWFsKGV2YWxJbmZvOiBPcHRpb248Q29yZS5FdmFsSW5mbz4pIHtcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZTxQYXJhbXM+KCk7XG4gICAgdGhpcy5wdXNoKFtTZXhwT3Bjb2Rlcy5QYXJ0aWFsLCBwYXJhbXNbMF0sIGV2YWxJbmZvIV0pO1xuICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gIH1cblxuICAvLy8gRXhwcmVzc2lvbnNcblxuICBsaXRlcmFsKHZhbHVlOiBFeHByZXNzaW9ucy5WYWx1ZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnB1c2hWYWx1ZTxFeHByZXNzaW9ucy5VbmRlZmluZWQ+KFtTZXhwT3Bjb2Rlcy5VbmRlZmluZWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoVmFsdWU8RXhwcmVzc2lvbnMuVmFsdWU+KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1bmtub3duKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucHVzaFZhbHVlPEV4cHJlc3Npb25zLlVua25vd24+KFtTZXhwT3Bjb2Rlcy5Vbmtub3duLCBuYW1lXSk7XG4gIH1cblxuICBnZXQoW2hlYWQsIHBhdGhdOiBbbnVtYmVyLCBzdHJpbmdbXV0pIHtcbiAgICB0aGlzLnB1c2hWYWx1ZTxFeHByZXNzaW9ucy5HZXQ+KFtTZXhwT3Bjb2Rlcy5HZXQsIGhlYWQsIHBhdGhdKTtcbiAgfVxuXG4gIG1heWJlTG9jYWwocGF0aDogc3RyaW5nW10pIHtcbiAgICB0aGlzLnB1c2hWYWx1ZTxFeHByZXNzaW9ucy5NYXliZUxvY2FsPihbU2V4cE9wY29kZXMuTWF5YmVMb2NhbCwgcGF0aF0pO1xuICB9XG5cbiAgY29uY2F0KCkge1xuICAgIHRoaXMucHVzaFZhbHVlPEV4cHJlc3Npb25zLkNvbmNhdD4oW1NleHBPcGNvZGVzLkNvbmNhdCwgdGhpcy5wb3BWYWx1ZTxQYXJhbXM+KCldKTtcbiAgfVxuXG4gIGhlbHBlcihuYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZTxQYXJhbXM+KCk7XG4gICAgbGV0IGhhc2ggPSB0aGlzLnBvcFZhbHVlPEhhc2g+KCk7XG5cbiAgICB0aGlzLnB1c2hWYWx1ZTxFeHByZXNzaW9ucy5IZWxwZXI+KFtTZXhwT3Bjb2Rlcy5IZWxwZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICB9XG5cbiAgLy8vIFN0YWNrIE1hbmFnZW1lbnQgT3Bjb2Rlc1xuXG4gIHByZXBhcmVBcnJheShzaXplOiBudW1iZXIpIHtcbiAgICBsZXQgdmFsdWVzOiBFeHByZXNzaW9uW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaCh0aGlzLnBvcFZhbHVlKCkgYXMgRXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoVmFsdWU8UGFyY