@glimmer/application-test-helpers
Version:
Test helpers for developing @glimmer/component and @glimmer/application
387 lines (318 loc) • 33.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.buildApp = exports.AppBuilder = exports.TestApplication = undefined;
var _resolver = require("@glimmer/resolver");
var _resolver2 = _interopRequireDefault(_resolver);
var _defaultResolverConfiguration = require("./default-resolver-configuration");
var _defaultResolverConfiguration2 = _interopRequireDefault(_defaultResolverConfiguration);
var _compiler = require("./compiler");
var _application = require("@glimmer/application");
var _application2 = _interopRequireDefault(_application);
var _util = require("@glimmer/util");
var _bundleCompiler = require("@glimmer/bundle-compiler");
var _opcodeCompiler = require("@glimmer/opcode-compiler");
var _ssr = require("@glimmer/ssr");
var _didRender = require("./did-render");
var _didRender2 = _interopRequireDefault(_didRender);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_defaults(subClass, superClass);
}
var TestApplication =
/*#__PURE__*/
exports.TestApplication = function (_Application) {
_inheritsLoose(TestApplication, _Application);
function TestApplication() {
return _Application.apply(this, arguments) || this;
}
return TestApplication;
}(_application2.default);
function locatorFor(module, name) {
return {
kind: 'template',
module: module,
name: name,
meta: {
module: module,
name: name
}
};
}
var AppBuilder =
/*#__PURE__*/
exports.AppBuilder = function () {
function AppBuilder(name, options) {
this.modules = {};
this.templates = {};
this.rootName = name;
this.options = options;
this.template('Main', '<div />');
this.helper('action', _application.buildAction, true);
}
var _proto = AppBuilder.prototype;
_proto.template = function template(name, _template) {
(0, _util.assert)(name.charAt(0) === name.charAt(0).toUpperCase(), 'template names must start with a capital letter');
var specifier = "template:/" + this.rootName + "/components/" + name;
this.modules[specifier] = (0, _compiler.precompile)(_template, {
meta: {
specifier: specifier
}
});
this.templates[specifier] = _template;
return this;
};
_proto.component = function component(name, componentFactory) {
var specifier = "component:/" + this.rootName + "/components/" + name;
this.modules[specifier] = componentFactory;
return this;
};
_proto.helper = function helper(name, helperFunc, isFactory) {
if (isFactory === void 0) {
isFactory = false;
}
var specifier = "helper:/" + this.rootName + "/components/" + name;
helperFunc.isFactory = isFactory;
this.modules[specifier] = helperFunc;
return this;
};
_proto.buildResolver = function buildResolver() {
var resolverConfiguration = this.options.resolverConfiguration || _defaultResolverConfiguration2.default;
resolverConfiguration.app = resolverConfiguration.app || {
name: this.rootName,
rootName: this.rootName
};
var registry = new _resolver.BasicModuleRegistry(this.modules);
return new _resolver2.default(resolverConfiguration, registry);
};
_proto.buildRuntimeCompilerLoader = function buildRuntimeCompilerLoader() {
return new _application.RuntimeCompilerLoader();
};
_proto.buildBytecodeLoader = function buildBytecodeLoader(resolver) {
var _this = this;
var delegate = new CompilerDelegate(resolver);
var compiler = new _bundleCompiler.BundleCompiler(delegate);
var mainLocator = locatorFor('template:mainTemplate', 'default');
mainLocator.meta.module = 'template:mainTemplate';
var block = JSON.parse(_application.mainTemplate.block);
var compilableTemplate = (0, _opcodeCompiler.compilable)({
block: block,
referrer: mainLocator.meta
});
compiler.addCompilableTemplate(mainLocator, compilableTemplate);
for (var module in this.templates) {
compiler.addTemplateSource(locatorFor(module, 'default'), this.templates[module]);
}
var _compiler$compile = compiler.compile(),
heap = _compiler$compile.heap,
pool = _compiler$compile.pool,
table = _compiler$compile.table;
var resolverTable = [];
var meta = {};
table.vmHandleByModuleLocator.forEach(function (vmHandle, locator) {
var handle = table.byModuleLocator.get(locator);
var template = compiler.getTemplate(locator);
meta[locator.module] = {
v: vmHandle,
h: handle,
sT: template.symbolTable
};
});
table.byHandle.forEach(function (locator, handle) {
var module = locator.module.replace('template:/', 'component:/');
if (_this.modules[module]) {
if (module.indexOf('helper:') === 0) {
var moduleType = _this.modules[module].isFactory ? 0
/* HELPER_FACTORY */
: 1
/* HELPER */
;
resolverTable[handle] = [moduleType, _this.modules[module]];
} else {
resolverTable[handle] = _this.modules[module];
}
}
});
var bytecode = heap.buffer;
var data = {
prefix: '',
mainEntry: table.vmHandleByModuleLocator.get(mainLocator),
pool: pool,
table: resolverTable,
meta: meta,
heap: {
table: heap.table,
handle: heap.handle
}
};
return new _application.BytecodeLoader({
bytecode: bytecode,
data: data
});
};
_proto.buildLoader = function buildLoader(resolver) {
switch (this.options.loader) {
case 'runtime-compiler':
return this.buildRuntimeCompilerLoader();
case 'bytecode':
return this.buildBytecodeLoader(resolver);
default:
throw new Error("Unrecognized loader " + this.options.loader);
}
};
_proto.renderToString = function renderToString(componentName, data, options) {
var resolver = this.buildResolver();
var loader = this.buildLoader(resolver);
return _ssr.SSRApplication.renderToString(componentName, data, Object.assign({
rootName: this.rootName,
resolver: resolver,
loader: loader,
renderer: new _application.SyncRenderer()
}, options));
};
_proto.boot =
/*#__PURE__*/
function () {
var _boot = _asyncToGenerator(function* () {
var resolver = this.buildResolver();
var loader = this.buildLoader(resolver);
var doc = this.options.document || document;
var element = doc.body;
var builder = new _application.DOMBuilder({
element: element
});
var renderer = new _application.SyncRenderer();
var app = new this.options.ApplicationClass({
resolver: resolver,
builder: builder,
loader: loader,
renderer: renderer,
rootName: this.rootName,
document: this.options.document
});
var rootElement = doc.createElement('div');
app.rootElement = rootElement;
app.renderComponent('Main', rootElement);
app.boot();
yield (0, _didRender2.default)(app);
return app;
});
function boot() {
return _boot.apply(this, arguments);
}
return boot;
}();
return AppBuilder;
}();
var CAPABILITIES = {
createInstance: true,
dynamicLayout: false,
dynamicTag: false,
wrapped: false,
prepareArgs: false,
createArgs: true,
attributeHook: false,
elementHook: false,
updateHook: true,
createCaller: false,
dynamicScope: true
};
var CompilerDelegate =
/*#__PURE__*/
function () {
function CompilerDelegate(resolver) {
this.resolver = resolver;
}
var _proto2 = CompilerDelegate.prototype;
_proto2.hasComponentInScope = function hasComponentInScope(name, referrer) {
return !!this.resolver.identify("template:" + name, referrer.module);
};
_proto2.resolveComponent = function resolveComponent(name, referrer) {
var resolved = this.resolver.identify("template:" + name, referrer.module);
return {
module: resolved,
name: 'default'
};
};
_proto2.getComponentCapabilities = function getComponentCapabilities() {
return CAPABILITIES;
};
_proto2.hasHelperInScope = function hasHelperInScope(helperName, referrer) {
return !!this.resolver.identify("helper:" + helperName, referrer.module);
};
_proto2.resolveHelper = function resolveHelper(helperName, referrer) {
var resolved = this.resolver.identify("helper:" + helperName, referrer.module);
return {
module: resolved,
name: 'default'
};
};
_proto2.hasPartialInScope = function hasPartialInScope(partialName, referrer) {
throw new Error('Method not implemented.');
};
_proto2.resolvePartial = function resolvePartial(partialName, referrer) {
throw new Error('Method not implemented.');
};
_proto2.hasModifierInScope = function hasModifierInScope(modifierName, referrer) {
throw new Error('Method not implemented.');
};
_proto2.resolveModifier = function resolveModifier(modifierName, referrer) {
throw new Error('Method not implemented.');
};
return CompilerDelegate;
}();
function buildApp(options) {
if (options === void 0) {
options = {};
}
options.appName = options.appName || 'test-app';
options.loader = options.loader || 'runtime-compiler';
options.ApplicationClass = options.ApplicationClass || TestApplication;
return new AppBuilder(options.appName, options);
}
exports.buildApp = buildApp;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2FwcGxpY2F0aW9uLXRlc3QtaGVscGVycy9zcmMvYXBwLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBRUE7Ozs7QUFDQTs7QUFDQTs7OztBQVVBOztBQUNBOztBQUVBOztBQUdBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYUEsSUFBYSxlQUFiO0FBQUE7QUFBQSxRQUFhLGVBQWIsR0FBQSxVQUFBLFlBQUEsRUFBQTtBQUFBLEVBQUEsY0FBQSxDQUFBLGVBQUEsRUFBQSxZQUFBLENBQUE7O0FBQUEsV0FBQSxlQUFBLEdBQUE7QUFBQSxXQUFBLFlBQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsS0FBQSxJQUFBO0FBQUE7O0FBQUEsU0FBQSxlQUFBO0FBQUEsQ0FBQSxDQUFBLHFCQUFBLENBQUE7O0FBcUJBLFNBQUEsVUFBQSxDQUFBLE1BQUEsRUFBQSxJQUFBLEVBQWdEO0FBQzlDLFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxVQUFBO0FBRUwsSUFBQSxNQUFNLEVBRkQsTUFBQTtBQUdMLElBQUEsSUFBSSxFQUhDLElBQUE7QUFJTCxJQUFBLElBQUksRUFBRTtBQUNKLE1BQUEsTUFBTSxFQURGLE1BQUE7QUFFSixNQUFBLElBQUksRUFBSjtBQUZJO0FBSkQsR0FBUDtBQVNEOztBQUVELElBQWEsVUFBYjtBQUFBO0FBQUEsUUFBYSxVQUFiLEdBQUEsWUFBQTtBQU1FLFdBQUEsVUFBQSxDQUFBLElBQUEsRUFBQSxPQUFBLEVBQXVEO0FBSnZELFNBQUEsT0FBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLFNBQUEsR0FBQSxFQUFBO0FBSUUsU0FBQSxRQUFBLEdBQUEsSUFBQTtBQUNBLFNBQUEsT0FBQSxHQUFBLE9BQUE7QUFDQSxTQUFBLFFBQUEsQ0FBQSxNQUFBLEVBQUEsU0FBQTtBQUNBLFNBQUEsTUFBQSxDQUFBLFFBQUEsRUFBQSx3QkFBQSxFQUFBLElBQUE7QUFDRDs7QUFYSCxNQUFBLE1BQUEsR0FBQSxVQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxRQUFBLEdBYUUsU0FBQSxRQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsRUFBdUM7QUFDckMsc0JBQ0UsSUFBSSxDQUFKLE1BQUEsQ0FBQSxDQUFBLE1BQW1CLElBQUksQ0FBSixNQUFBLENBQUEsQ0FBQSxFQURmLFdBQ2UsRUFEckIsRUFBQSxpREFBQTtBQUtBLFFBQUksU0FBUyxHQUFBLGVBQWdCLEtBQWhCLFFBQUEsR0FBQSxjQUFBLEdBQWIsSUFBQTtBQUNBLFNBQUEsT0FBQSxDQUFBLFNBQUEsSUFBMEIsMEJBQVUsU0FBVixFQUFxQjtBQUFFLE1BQUEsSUFBSSxFQUFFO0FBQUUsUUFBQSxTQUFTLEVBQVQ7QUFBRjtBQUFSLEtBQXJCLENBQTFCO0FBQ0EsU0FBQSxTQUFBLENBQUEsU0FBQSxJQUFBLFNBQUE7QUFDQSxXQUFBLElBQUE7QUF0QkosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxTQUFBLEdBeUJFLFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBQSxnQkFBQSxFQUEwRDtBQUN4RCxRQUFJLFNBQVMsR0FBQSxnQkFBaUIsS0FBakIsUUFBQSxHQUFBLGNBQUEsR0FBYixJQUFBO0FBQ0EsU0FBQSxPQUFBLENBQUEsU0FBQSxJQUFBLGdCQUFBO0FBQ0EsV0FBQSxJQUFBO0FBNUJKLEdBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsTUFBQSxHQStCRSxTQUFBLE1BQUEsQ0FBQSxJQUFBLEVBQUEsVUFBQSxFQUFBLFNBQUEsRUFBa0U7QUFBQSxRQUFqQixTQUFpQixLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQWpCLE1BQUEsU0FBaUIsR0FBTCxLQUFaO0FBQWlCOztBQUNoRSxRQUFJLFNBQVMsR0FBQSxhQUFjLEtBQWQsUUFBQSxHQUFBLGNBQUEsR0FBYixJQUFBO0FBQ0EsSUFBQSxVQUFVLENBQVYsU0FBQSxHQUFBLFNBQUE7QUFDQSxTQUFBLE9BQUEsQ0FBQSxTQUFBLElBQUEsVUFBQTtBQUNBLFdBQUEsSUFBQTtBQW5DSixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLGFBQUEsR0FzQ1ksU0FBQSxhQUFBLEdBQWE7QUFDckIsUUFBSSxxQkFBcUIsR0FBRyxLQUFBLE9BQUEsQ0FBQSxxQkFBQSxJQUE1QixzQ0FBQTtBQUNBLElBQUEscUJBQXFCLENBQXJCLEdBQUEsR0FBNEIscUJBQXFCLENBQXJCLEdBQUEsSUFBNkI7QUFDdkQsTUFBQSxJQUFJLEVBQUUsS0FEaUQsUUFBQTtBQUV2RCxNQUFBLFFBQVEsRUFBRSxLQUFLO0FBRndDLEtBQXpEO0FBS0EsUUFBSSxRQUFRLEdBQUcsSUFBQSw2QkFBQSxDQUF3QixLQUF2QyxPQUFlLENBQWY7QUFDQSxXQUFPLElBQUEsa0JBQUEsQ0FBQSxxQkFBQSxFQUFQLFFBQU8sQ0FBUDtBQTlDSixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLDBCQUFBLEdBaURZLFNBQUEsMEJBQUEsR0FBMEI7QUFDbEMsV0FBTyxJQUFQLGtDQUFPLEVBQVA7QUFsREosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxtQkFBQSxHQXFEWSxTQUFBLG1CQUFBLENBQUEsUUFBQSxFQUFzQztBQUFBLFFBQUEsS0FBQSxHQUFBLElBQUE7O0FBQzlDLFFBQUksUUFBUSxHQUFHLElBQUEsZ0JBQUEsQ0FBZixRQUFlLENBQWY7QUFDQSxRQUFJLFFBQVEsR0FBRyxJQUFBLDhCQUFBLENBQWYsUUFBZSxDQUFmO0FBRUEsUUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFBLHVCQUFBLEVBQTVCLFNBQTRCLENBQTVCO0FBQ0EsSUFBQSxXQUFXLENBQVgsSUFBQSxDQUFBLE1BQUEsR0FBQSx1QkFBQTtBQUVBLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBSixLQUFBLENBQVcsMEJBQXZCLEtBQVksQ0FBWjtBQUNBLFFBQUksa0JBQWtCLEdBQUcsZ0NBQVc7QUFDbEMsTUFBQSxLQUFLLEVBRDZCLEtBQUE7QUFFbEMsTUFBQSxRQUFRLEVBQUUsV0FBVyxDQUFDO0FBRlksS0FBWCxDQUF6QjtBQUtBLElBQUEsUUFBUSxDQUFSLHFCQUFBLENBQUEsV0FBQSxFQUFBLGtCQUFBOztBQUVBLFNBQUssSUFBTCxNQUFBLElBQW1CLEtBQW5CLFNBQUEsRUFBbUM7QUFDakMsTUFBQSxRQUFRLENBQVIsaUJBQUEsQ0FBMkIsVUFBVSxDQUFBLE1BQUEsRUFBckMsU0FBcUMsQ0FBckMsRUFBMEQsS0FBQSxTQUFBLENBQTFELE1BQTBELENBQTFEO0FBQ0Q7O0FBakI2QyxRQUFBLGlCQUFBLEdBbUJsQixRQUFRLENBbkJVLE9BbUJsQixFQW5Ca0I7QUFBQSxRQW1CeEMsSUFuQndDLEdBQUEsaUJBQUEsQ0FBQSxJQUFBO0FBQUEsUUFtQmxDLElBbkJrQyxHQUFBLGlCQUFBLENBQUEsSUFBQTtBQUFBLFFBbUI1QixLQW5CNEIsR0FBQSxpQkFBQSxDQUFBLEtBQUE7O0FBcUI5QyxRQUFJLGFBQWEsR0FBakIsRUFBQTtBQUVBLFFBQUksSUFBSSxHQUFSLEVBQUE7QUFFQSxJQUFBLEtBQUssQ0FBTCx1QkFBQSxDQUFBLE9BQUEsQ0FBc0MsVUFBQSxRQUFBLEVBQUEsT0FBQSxFQUFzQjtBQUMxRCxVQUFJLE1BQU0sR0FBRyxLQUFLLENBQUwsZUFBQSxDQUFBLEdBQUEsQ0FBYixPQUFhLENBQWI7QUFDQSxVQUFJLFFBQVEsR0FBRyxRQUFRLENBQVIsV0FBQSxDQUFmLE9BQWUsQ0FBZjtBQUVBLE1BQUEsSUFBSSxDQUFDLE9BQU8sQ0FBWixNQUFJLENBQUosR0FBdUI7QUFDckIsUUFBQSxDQUFDLEVBRG9CLFFBQUE7QUFFckIsUUFBQSxDQUFDLEVBRm9CLE1BQUE7QUFHckIsUUFBQSxFQUFFLEVBQUUsUUFBUSxDQUFDO0FBSFEsT0FBdkI7QUFKRixLQUFBO0FBV0EsSUFBQSxLQUFLLENBQUwsUUFBQSxDQUFBLE9BQUEsQ0FBdUIsVUFBQSxPQUFBLEVBQUEsTUFBQSxFQUFvQjtBQUN6QyxVQUFJLE1BQU0sR0FBRyxPQUFPLENBQVAsTUFBQSxDQUFBLE9BQUEsQ0FBQSxZQUFBLEVBQWIsYUFBYSxDQUFiOztBQUNBLFVBQUksS0FBSSxDQUFKLE9BQUEsQ0FBSixNQUFJLENBQUosRUFBMEI7QUFDeEIsWUFBSSxNQUFNLENBQU4sT0FBQSxDQUFBLFNBQUEsTUFBSixDQUFBLEVBQXFDO0FBQ25DLGNBQU0sVUFBVSxHQUFJLEtBQUksQ0FBSixPQUFBLENBQUEsTUFBQSxFQUFBLFNBQUEsR0FBbUQ7QUFBQTtBQUFuRCxZQUFnRjtBQUFBO0FBQXBHO0FBQ0EsVUFBQSxhQUFhLENBQWIsTUFBYSxDQUFiLEdBQXdCLENBQUEsVUFBQSxFQUFhLEtBQUksQ0FBSixPQUFBLENBQXJDLE1BQXFDLENBQWIsQ0FBeEI7QUFGRixTQUFBLE1BR087QUFDTCxVQUFBLGFBQWEsQ0FBYixNQUFhLENBQWIsR0FBd0IsS0FBSSxDQUFKLE9BQUEsQ0FBeEIsTUFBd0IsQ0FBeEI7QUFDRDtBQUNGO0FBVEgsS0FBQTtBQVlBLFFBQUksUUFBUSxHQUFHLElBQUksQ0FBbkIsTUFBQTtBQUNBLFFBQUksSUFBSSxHQUFHO0FBQ1QsTUFBQSxNQUFNLEVBREcsRUFBQTtBQUVULE1BQUEsU0FBUyxFQUFFLEtBQUssQ0FBTCx1QkFBQSxDQUFBLEdBQUEsQ0FGRixXQUVFLENBRkY7QUFHVCxNQUFBLElBQUksRUFISyxJQUFBO0FBSVQsTUFBQSxLQUFLLEVBSkksYUFBQTtBQUtULE1BQUEsSUFBSSxFQUxLLElBQUE7QUFNVCxNQUFBLElBQUksRUFBRTtBQUNKLFFBQUEsS0FBSyxFQUFFLElBQUksQ0FEUCxLQUFBO0FBRUosUUFBQSxNQUFNLEVBQUUsSUFBSSxDQUFDO0FBRlQ7QUFORyxLQUFYO0FBWUEsV0FBTyxJQUFBLDJCQUFBLENBQW1CO0FBQUUsTUFBQSxRQUFRLEVBQVYsUUFBQTtBQUFZLE1BQUEsSUFBSSxFQUFKO0FBQVosS0FBbkIsQ0FBUDtBQWxISixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLFdBQUEsR0FxSFksU0FBQSxXQUFBLENBQUEsUUFBQSxFQUFvQjtBQUM1QixZQUFRLEtBQUEsT0FBQSxDQUFSLE1BQUE7QUFDRSxXQUFBLGtCQUFBO0FBQ0UsZUFBTyxLQUFQLDBCQUFPLEVBQVA7O0FBQ0YsV0FBQSxVQUFBO0FBQ0UsZUFBTyxLQUFBLG1CQUFBLENBQVAsUUFBTyxDQUFQOztBQUNGO0FBQ0UsY0FBTSxJQUFBLEtBQUEsQ0FBQSx5QkFBaUMsS0FBQSxPQUFBLENBQXZDLE1BQU0sQ0FBTjtBQU5KO0FBdEhKLEdBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsY0FBQSxHQWdJRSxTQUFBLGNBQUEsQ0FBQSxhQUFBLEVBQUEsSUFBQSxFQUFBLE9BQUEsRUFBOEY7QUFDNUYsUUFBTSxRQUFRLEdBQUcsS0FBakIsYUFBaUIsRUFBakI7QUFDQSxRQUFJLE1BQU0sR0FBRyxLQUFBLFdBQUEsQ0FBYixRQUFhLENBQWI7QUFFQSxXQUFPLG9CQUFBLGNBQUEsQ0FBQSxhQUFBLEVBQUEsSUFBQSxFQUFpRCxNQUFBLENBQUEsTUFBQSxDQUFBO0FBQ3RELE1BQUEsUUFBUSxFQUFFLEtBRDRDLFFBQUE7QUFFdEQsTUFBQSxRQUFRLEVBRjhDLFFBQUE7QUFHdEQsTUFBQSxNQUFNLEVBSGdELE1BQUE7QUFJdEQsTUFBQSxRQUFRLEVBQUUsSUFBQSx5QkFBQTtBQUo0QyxLQUFBLEVBQXhELE9BQXdELENBQWpELENBQVA7QUFwSUosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxJQUFBO0FBQUE7QUFBQSxjQUFBO0FBQUEsUUFBQSxLQUFBLEdBQUEsaUJBQUEsQ0E2SUUsYUFBVTtBQUNSLFVBQUksUUFBUSxHQUFHLEtBQWYsYUFBZSxFQUFmO0FBQ0EsVUFBSSxNQUFNLEdBQVcsS0FBQSxXQUFBLENBQXJCLFFBQXFCLENBQXJCO0FBRUEsVUFBSSxHQUFHLEdBQWMsS0FBQSxPQUFBLENBQUEsUUFBQSxJQUFyQixRQUFBO0FBQ0EsVUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFqQixJQUFBO0FBQ0EsVUFBSSxPQUFPLEdBQUcsSUFBQSx1QkFBQSxDQUFlO0FBQUUsUUFBQSxPQUFPLEVBQVA7QUFBRixPQUFmLENBQWQ7QUFDQSxVQUFJLFFBQVEsR0FBRyxJQUFmLHlCQUFlLEVBQWY7QUFFQSxVQUFJLEdBQUcsR0FBRyxJQUFJLEtBQUEsT0FBQSxDQUFKLGdCQUFBLENBQWtDO0FBQzFDLFFBQUEsUUFBUSxFQURrQyxRQUFBO0FBRTFDLFFBQUEsT0FBTyxFQUZtQyxPQUFBO0FBRzFDLFFBQUEsTUFBTSxFQUhvQyxNQUFBO0FBSTFDLFFBQUEsUUFBUSxFQUprQyxRQUFBO0FBSzFDLFFBQUEsUUFBUSxFQUFFLEtBTGdDLFFBQUE7QUFNMUMsUUFBQSxRQUFRLEVBQUUsS0FBQSxPQUFBLENBQWE7QUFObUIsT0FBbEMsQ0FBVjtBQVNBLFVBQUksV0FBVyxHQUFHLEdBQUcsQ0FBSCxhQUFBLENBQWxCLEtBQWtCLENBQWxCO0FBQ0EsTUFBQSxHQUFHLENBQUgsV0FBQSxHQUFBLFdBQUE7QUFDQSxNQUFBLEdBQUcsQ0FBSCxlQUFBLENBQUEsTUFBQSxFQUFBLFdBQUE7QUFDQSxNQUFBLEdBQUcsQ0FBSCxJQUFBO0FBRUEsWUFBTSx5QkFBTixHQUFNLENBQU47QUFFQSxhQUFBLEdBQUE7QUF0S0osS0FBQSxDQUFBOztBQUFBLGFBQUEsSUFBQSxHQUFBO0FBQUEsYUFBQSxLQUFBLENBQUEsS0FBQSxDQUFBLElBQUEsRUFBQSxTQUFBLENBQUE7QUFBQTs7QUFBQSxXQUFBLElBQUE7QUFBQSxHQUFBLEVBQUE7O0FBQUEsU0FBQSxVQUFBO0FBQUEsQ0FBQSxFQUFBOztBQTBLQSxJQUFNLFlBQVksR0FBMEI7QUFDMUMsRUFBQSxjQUFjLEVBRDRCLElBQUE7QUFFMUMsRUFBQSxhQUFhLEVBRjZCLEtBQUE7QUFHMUMsRUFBQSxVQUFVLEVBSGdDLEtBQUE7QUFJMUMsRUFBQSxPQUFPLEVBSm1DLEtBQUE7QUFLMUMsRUFBQSxXQUFXLEVBTCtCLEtBQUE7QUFNMUMsRUFBQSxVQUFVLEVBTmdDLElBQUE7QUFPMUMsRUFBQSxhQUFhLEVBUDZCLEtBQUE7QUFRMUMsRUFBQSxXQUFXLEVBUitCLEtBQUE7QUFTMUMsRUFBQSxVQUFVLEVBVGdDLElBQUE7QUFVMUMsRUFBQSxZQUFZLEVBVjhCLEtBQUE7QUFXMUMsRUFBQSxZQUFZLEVBQUU7QUFYNEIsQ0FBNUM7O0lBY00sZ0I7OztBQUNKLFdBQUEsZ0JBQUEsQ0FBQSxRQUFBLEVBQXdDO0FBQWxCLFNBQUEsUUFBQSxHQUFBLFFBQUE7QUFBc0I7Ozs7VUFFNUMsbUIsR0FBQSxTQUFBLG1CQUFBLENBQUEsSUFBQSxFQUFBLFFBQUEsRUFBeUQ7QUFDdkQsV0FBTyxDQUFDLENBQUMsS0FBQSxRQUFBLENBQUEsUUFBQSxDQUFBLGNBQUEsSUFBQSxFQUEyQyxRQUFRLENBQTVELE1BQVMsQ0FBVDs7O1VBR0YsZ0IsR0FBQSxTQUFBLGdCQUFBLENBQUEsSUFBQSxFQUFBLFFBQUEsRUFBc0Q7QUFDcEQsUUFBSSxRQUFRLEdBQUcsS0FBQSxRQUFBLENBQUEsUUFBQSxDQUFBLGNBQUEsSUFBQSxFQUEyQyxRQUFRLENBQWxFLE1BQWUsQ0FBZjtBQUNBLFdBQU87QUFBRSxNQUFBLE1BQU0sRUFBUixRQUFBO0FBQW9CLE1BQUEsSUFBSSxFQUFFO0FBQTFCLEtBQVA7OztVQUdGLHdCLEdBQUEsU0FBQSx3QkFBQSxHQUF3QjtBQUN0QixXQUFBLFlBQUE7OztVQUdGLGdCLEdBQUEsU0FBQSxnQkFBQSxDQUFBLFVBQUEsRUFBQSxRQUFBLEVBQTREO0FBQzFELFdBQU8sQ0FBQyxDQUFDLEtBQUEsUUFBQSxDQUFBLFFBQUEsQ0FBQSxZQUFBLFVBQUEsRUFBK0MsUUFBUSxDQUFoRSxNQUFTLENBQVQ7OztVQUdGLGEsR0FBQSxTQUFBLGFBQUEsQ0FBQSxVQUFBLEVBQUEsUUFBQSxFQUF5RDtBQUN2RCxRQUFJLFFBQVEsR0FBRyxLQUFBLFFBQUEsQ0FBQSxRQUFBLENBQUEsWUFBQSxVQUFBLEVBQStDLFFBQVEsQ0FBdEUsTUFBZSxDQUFmO0FBQ0EsV0FBTztBQUFFLE1BQUEsTUFBTSxFQUFSLFFBQUE7QUFBb0IsTUFBQSxJQUFJLEVBQUU7QUFBMUIsS0FBUDs7O1VBR0YsaUIsR0FBQSxTQUFBLGlCQUFBLENBQUEsV0FBQSxFQUFBLFFBQUEsRUFBOEQ7QUFDNUQsVUFBTSxJQUFBLEtBQUEsQ0FBTix5QkFBTSxDQUFOOzs7VUFHRixjLEdBQUEsU0FBQSxjQUFBLENBQUEsV0FBQSxFQUFBLFFBQUEsRUFBMkQ7QUFDekQsVUFBTSxJQUFBLEtBQUEsQ0FBTix5QkFBTSxDQUFOOzs7VUFHRixrQixHQUFBLFNBQUEsa0JBQUEsQ0FBQSxZQUFBLEVBQUEsUUFBQSxFQUFnRTtBQUM5RCxVQUFNLElBQUEsS0FBQSxDQUFOLHlCQUFNLENBQU47OztVQUdGLGUsR0FBQSxTQUFBLGVBQUEsQ0FBQSxZQUFBLEVBQUEsUUFBQSxFQUE2RDtBQUMzRCxVQUFNLElBQUEsS0FBQSxDQUFOLHlCQUFNLENBQU47Ozs7OztBQUlKLFNBQUEsUUFBQSxDQUFBLE9BQUEsRUFBK0U7QUFBQSxNQUFsQyxPQUFrQyxLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQWxDLElBQUEsT0FBa0MsR0FBRixFQUFoQztBQUFrQzs7QUFDN0UsRUFBQSxPQUFPLENBQVAsT0FBQSxHQUFrQixPQUFPLENBQVAsT0FBQSxJQUFsQixVQUFBO0FBQ0EsRUFBQSxPQUFPLENBQVAsTUFBQSxHQUFpQixPQUFPLENBQVAsTUFBQSxJQUFqQixrQkFBQTtBQUNBLEVBQUEsT0FBTyxDQUFQLGdCQUFBLEdBQ0UsT0FBTyxDQUFQLGdCQUFBLElBREYsZUFBQTtBQUdBLFNBQU8sSUFBQSxVQUFBLENBQWUsT0FBTyxDQUF0QixPQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0Q7O1FBRUQsUSxHQUFBLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb2x2ZXIsIHsgQmFzaWNNb2R1bGVSZWdpc3RyeSwgUmVzb2x2ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnQGdsaW1tZXIvcmVzb2x2ZXInO1xuaW1wb3J0IHsgRGljdCwgTW9kdWxlTG9jYXRvciwgVGVtcGxhdGVMb2NhdG9yLCBDb21wb25lbnRDYXBhYmlsaXRpZXMgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCBkZWZhdWx0UmVzb2x2ZXJDb25maWd1cmF0aW9uIGZyb20gJy4vZGVmYXVsdC1yZXNvbHZlci1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IHByZWNvbXBpbGUgfSBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCBBcHBsaWNhdGlvbiwge1xuICBBcHBsaWNhdGlvbkNvbnN0cnVjdG9yLFxuICBCeXRlY29kZUxvYWRlcixcbiAgRE9NQnVpbGRlcixcbiAgTG9hZGVyLFxuICBSdW50aW1lQ29tcGlsZXJMb2FkZXIsXG4gIFN5bmNSZW5kZXJlcixcbiAgTW9kdWxlVHlwZXMsXG4gIElOVEVSTkFMX0RZTkFNSUNfU0NPUEVcbn0gZnJvbSAnQGdsaW1tZXIvYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBCdW5kbGVDb21waWxlciwgQ29tcGlsZXJEZWxlZ2F0ZSBhcyBJQ29tcGlsZXJEZWxlZ2F0ZSB9IGZyb20gJ0BnbGltbWVyL2J1bmRsZS1jb21waWxlcic7XG5pbXBvcnQgeyBidWlsZEFjdGlvbiwgbWFpblRlbXBsYXRlLCBSZW5kZXJlciwgQnl0ZWNvZGVNZXRhZGF0YSB9IGZyb20gJ0BnbGltbWVyL2FwcGxpY2F0aW9uJztcbmltcG9ydCB7IGNvbXBpbGFibGUgfSBmcm9tICdAZ2xpbW1lci9vcGNvZGUtY29tcGlsZXInO1xuaW1wb3J0IHsgU2ltcGxlRG9jdW1lbnQgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuaW1wb3J0IEhUTUxTZXJpYWxpemVyIGZyb20gJ0BzaW1wbGUtZG9tL3NlcmlhbGl6ZXInO1xuaW1wb3J0IHsgU1NSQXBwbGljYXRpb24gfSBmcm9tICdAZ2xpbW1lci9zc3InO1xuXG5pbXBvcnQgZGlkUmVuZGVyIGZyb20gJy4vZGlkLXJlbmRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQnVpbGRlck9wdGlvbnM8VD4ge1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsb2FkZXI/OiBzdHJpbmc7XG4gIEFwcGxpY2F0aW9uQ2xhc3M/OiBBcHBsaWNhdGlvbkNvbnN0cnVjdG9yPFQ+O1xuICBDb21wb25lbnRNYW5hZ2VyPzogYW55OyAvLyBUT0RPIC0gdHlwaW5nXG4gIHJlc29sdmVyQ29uZmlndXJhdGlvbj86IFJlc29sdmVyQ29uZmlndXJhdGlvbjtcbiAgZG9jdW1lbnQ/OiBTaW1wbGVEb2N1bWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRGYWN0b3J5IHt9XG5cbmV4cG9ydCBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7XG4gIHJvb3RFbGVtZW50OiBFbGVtZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEJ1aWxkZXJUZW1wbGF0ZU1ldGEge1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEhlbHBlckZ1bmN0aW9uIGV4dGVuZHMgRnVuY3Rpb24ge1xuICBpc0ZhY3Rvcnk/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGVzdFNTUkFwcGxpY2F0aW9uT3B0aW9ucyB7XG4gIHJvb3ROYW1lPzogc3RyaW5nO1xuICByZXNvbHZlcj86IFJlc29sdmVyO1xuICBsb2FkZXI/OiBMb2FkZXI7XG4gIHJlbmRlcmVyPzogUmVuZGVyZXI7XG4gIHNlcmlhbGl6ZXI/OiBIVE1MU2VyaWFsaXplcjtcbiAgW0lOVEVSTkFMX0RZTkFNSUNfU0NPUEVdPzogRGljdDx1bmtub3duPjtcbn1cblxuZnVuY3Rpb24gbG9jYXRvckZvcihtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogVGVtcGxhdGVMb2NhdG9yPE1vZHVsZUxvY2F0b3I+IHtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiAndGVtcGxhdGUnLFxuICAgIG1vZHVsZSxcbiAgICBuYW1lLFxuICAgIG1ldGE6IHtcbiAgICAgIG1vZHVsZSxcbiAgICAgIG5hbWUsXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcEJ1aWxkZXI8VCBleHRlbmRzIFRlc3RBcHBsaWNhdGlvbj4ge1xuICByb290TmFtZTogc3RyaW5nO1xuICBtb2R1bGVzOiBEaWN0PHVua25vd24+ID0ge307XG4gIHRlbXBsYXRlczogRGljdDxzdHJpbmc+ID0ge307XG4gIG9wdGlvbnM6IEFwcEJ1aWxkZXJPcHRpb25zPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgb3B0aW9uczogQXBwQnVpbGRlck9wdGlvbnM8VD4pIHtcbiAgICB0aGlzLnJvb3ROYW1lID0gbmFtZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVtcGxhdGUoJ01haW4nLCAnPGRpdiAvPicpO1xuICAgIHRoaXMuaGVscGVyKCdhY3Rpb24nLCBidWlsZEFjdGlvbiwgdHJ1ZSk7XG4gIH1cblxuICB0ZW1wbGF0ZShuYW1lOiBzdHJpbmcsIHRlbXBsYXRlOiBzdHJpbmcpIHtcbiAgICBhc3NlcnQoXG4gICAgICBuYW1lLmNoYXJBdCgwKSA9PT0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSxcbiAgICAgICd0ZW1wbGF0ZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlcidcbiAgICApO1xuXG4gICAgbGV0IHNwZWNpZmllciA9IGB0ZW1wbGF0ZTovJHt0aGlzLnJvb3ROYW1lfS9jb21wb25lbnRzLyR7bmFtZX1gO1xuICAgIHRoaXMubW9kdWxlc1tzcGVjaWZpZXJdID0gcHJlY29tcGlsZSh0ZW1wbGF0ZSwgeyBtZXRhOiB7IHNwZWNpZmllciB9IH0pO1xuICAgIHRoaXMudGVtcGxhdGVzW3NwZWNpZmllcl0gPSB0ZW1wbGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbXBvbmVudChuYW1lOiBzdHJpbmcsIGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3RvcnkpIHtcbiAgICBsZXQgc3BlY2lmaWVyID0gYGNvbXBvbmVudDovJHt0aGlzLnJvb3ROYW1lfS9jb21wb25lbnRzLyR7bmFtZX1gO1xuICAgIHRoaXMubW9kdWxlc1tzcGVjaWZpZXJdID0gY29tcG9uZW50RmFjdG9yeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGhlbHBlcihuYW1lOiBzdHJpbmcsIGhlbHBlckZ1bmM6IEhlbHBlckZ1bmN0aW9uLCBpc0ZhY3RvcnkgPSBmYWxzZSkge1xuICAgIGxldCBzcGVjaWZpZXIgPSBgaGVscGVyOi8ke3RoaXMucm9vdE5hbWV9L2NvbXBvbmVudHMvJHtuYW1lfWA7XG4gICAgaGVscGVyRnVuYy5pc0ZhY3RvcnkgPSBpc0ZhY3Rvcnk7XG4gICAgdGhpcy5tb2R1bGVzW3NwZWNpZmllcl0gPSBoZWxwZXJGdW5jO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVzb2x2ZXIoKTogUmVzb2x2ZXIge1xuICAgIGxldCByZXNvbHZlckNvbmZpZ3VyYXRpb24gPSB0aGlzLm9wdGlvbnMucmVzb2x2ZXJDb25maWd1cmF0aW9uIHx8IGRlZmF1bHRSZXNvbHZlckNvbmZpZ3VyYXRpb247XG4gICAgcmVzb2x2ZXJDb25maWd1cmF0aW9uLmFwcCA9IHJlc29sdmVyQ29uZmlndXJhdGlvbi5hcHAgfHwge1xuICAgICAgbmFtZTogdGhpcy5yb290TmFtZSxcbiAgICAgIHJvb3ROYW1lOiB0aGlzLnJvb3ROYW1lLFxuICAgIH07XG5cbiAgICBsZXQgcmVnaXN0cnkgPSBuZXcgQmFzaWNNb2R1bGVSZWdpc3RyeSh0aGlzLm1vZHVsZXMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZXIocmVzb2x2ZXJDb25maWd1cmF0aW9uLCByZWdpc3RyeSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSdW50aW1lQ29tcGlsZXJMb2FkZXIoKTogTG9hZGVyIHtcbiAgICByZXR1cm4gbmV3IFJ1bnRpbWVDb21waWxlckxvYWRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQnl0ZWNvZGVMb2FkZXIocmVzb2x2ZXI6IFJlc29sdmVyKSB7XG4gICAgbGV0IGRlbGVnYXRlID0gbmV3IENvbXBpbGVyRGVsZWdhdGUocmVzb2x2ZXIpO1xuICAgIGxldCBjb21waWxlciA9IG5ldyBCdW5kbGVDb21waWxlcihkZWxlZ2F0ZSk7XG5cbiAgICBsZXQgbWFpbkxvY2F0b3IgPSBsb2NhdG9yRm9yKCd0ZW1wbGF0ZTptYWluVGVtcGxhdGUnLCAnZGVmYXVsdCcpO1xuICAgIG1haW5Mb2NhdG9yLm1ldGEubW9kdWxlID0gJ3RlbXBsYXRlOm1haW5UZW1wbGF0ZSc7XG5cbiAgICBsZXQgYmxvY2sgPSBKU09OLnBhcnNlKG1haW5UZW1wbGF0ZS5ibG9jayk7XG4gICAgbGV0IGNvbXBpbGFibGVUZW1wbGF0ZSA9IGNvbXBpbGFibGUoe1xuICAgICAgYmxvY2ssXG4gICAgICByZWZlcnJlcjogbWFpbkxvY2F0b3IubWV0YSxcbiAgICB9KTtcblxuICAgIGNvbXBpbGVyLmFkZENvbXBpbGFibGVUZW1wbGF0ZShtYWluTG9jYXRvciwgY29tcGlsYWJsZVRlbXBsYXRlKTtcblxuICAgIGZvciAobGV0IG1vZHVsZSBpbiB0aGlzLnRlbXBsYXRlcykge1xuICAgICAgY29tcGlsZXIuYWRkVGVtcGxhdGVTb3VyY2UobG9jYXRvckZvcihtb2R1bGUsICdkZWZhdWx0JyksIHRoaXMudGVtcGxhdGVzW21vZHVsZV0pO1xuICAgIH1cblxuICAgIGxldCB7IGhlYXAsIHBvb2wsIHRhYmxlIH0gPSBjb21waWxlci5jb21waWxlKCk7XG5cbiAgICBsZXQgcmVzb2x2ZXJUYWJsZTogdW5rbm93bltdID0gW107XG5cbiAgICBsZXQgbWV0YTogRGljdDxCeXRlY29kZU1ldGFkYXRhPiA9IHt9O1xuXG4gICAgdGFibGUudm1IYW5kbGVCeU1vZHVsZUxvY2F0b3IuZm9yRWFjaCgodm1IYW5kbGUsIGxvY2F0b3IpID0+IHtcbiAgICAgIGxldCBoYW5kbGUgPSB0YWJsZS5ieU1vZHVsZUxvY2F0b3IuZ2V0KGxvY2F0b3IpO1xuICAgICAgbGV0IHRlbXBsYXRlID0gY29tcGlsZXIuZ2V0VGVtcGxhdGUobG9jYXRvcik7XG5cbiAgICAgIG1ldGFbbG9jYXRvci5tb2R1bGVdID0ge1xuICAgICAgICB2OiB2bUhhbmRsZSxcbiAgICAgICAgaDogaGFuZGxlLFxuICAgICAgICBzVDogdGVtcGxhdGUuc3ltYm9sVGFibGUsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGFibGUuYnlIYW5kbGUuZm9yRWFjaCgobG9jYXRvciwgaGFuZGxlKSA9PiB7XG4gICAgICBsZXQgbW9kdWxlID0gbG9jYXRvci5tb2R1bGUucmVwbGFjZSgndGVtcGxhdGU6LycsICdjb21wb25lbnQ6LycpO1xuICAgICAgaWYgKHRoaXMubW9kdWxlc1ttb2R1bGVdKSB7XG4gICAgICAgIGlmIChtb2R1bGUuaW5kZXhPZignaGVscGVyOicpID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlVHlwZSA9ICh0aGlzLm1vZHVsZXNbbW9kdWxlXSBhcyBIZWxwZXJGdW5jdGlvbikuaXNGYWN0b3J5ID8gTW9kdWxlVHlwZXMuSEVMUEVSX0ZBQ1RPUlkgOiBNb2R1bGVUeXBlcy5IRUxQRVI7XG4gICAgICAgICAgcmVzb2x2ZXJUYWJsZVtoYW5kbGVdID0gW21vZHVsZVR5cGUsIHRoaXMubW9kdWxlc1ttb2R1bGVdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlclRhYmxlW2hhbmRsZV0gPSB0aGlzLm1vZHVsZXNbbW9kdWxlXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGJ5dGVjb2RlID0gaGVhcC5idWZmZXI7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBwcmVmaXg6ICcnLFxuICAgICAgbWFpbkVudHJ5OiB0YWJsZS52bUhhbmRsZUJ5TW9kdWxlTG9jYXRvci5nZXQobWFpbkxvY2F0b3IpLFxuICAgICAgcG9vbCxcbiAgICAgIHRhYmxlOiByZXNvbHZlclRhYmxlLFxuICAgICAgbWV0YSxcbiAgICAgIGhlYXA6IHtcbiAgICAgICAgdGFibGU6IGhlYXAudGFibGUsXG4gICAgICAgIGhhbmRsZTogaGVhcC5oYW5kbGUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IEJ5dGVjb2RlTG9hZGVyKHsgYnl0ZWNvZGUsIGRhdGEgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRMb2FkZXIocmVzb2x2ZXIpOiBMb2FkZXIge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxvYWRlcikge1xuICAgICAgY2FzZSAncnVudGltZS1jb21waWxlcic6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUnVudGltZUNvbXBpbGVyTG9hZGVyKCk7XG4gICAgICBjYXNlICdieXRlY29kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQnl0ZWNvZGVMb2FkZXIocmVzb2x2ZXIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgbG9hZGVyICR7dGhpcy5vcHRpb25zLmxvYWRlcn1gKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJUb1N0cmluZyhjb21wb25lbnROYW1lOiBzdHJpbmcsIGRhdGE6IERpY3Q8dW5rbm93bj4sIG9wdGlvbnM/OiBUZXN0U1NSQXBwbGljYXRpb25PcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuYnVpbGRSZXNvbHZlcigpO1xuICAgIGxldCBsb2FkZXIgPSB0aGlzLmJ1aWxkTG9hZGVyKHJlc29sdmVyKTtcblxuICAgIHJldHVybiBTU1JBcHBsaWNhdGlvbi5yZW5kZXJUb1N0cmluZyhjb21wb25lbnROYW1lLCBkYXRhLCB7XG4gICAgICByb290TmFtZTogdGhpcy5yb290TmFtZSxcbiAgICAgIHJlc29sdmVyLFxuICAgICAgbG9hZGVyLFxuICAgICAgcmVuZGVyZXI6IG5ldyBTeW5jUmVuZGVyZXIoKSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGJvb3QoKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHJlc29sdmVyID0gdGhpcy5idWlsZFJlc29sdmVyKCk7XG4gICAgbGV0IGxvYWRlcjogTG9hZGVyID0gdGhpcy5idWlsZExvYWRlcihyZXNvbHZlcik7XG5cbiAgICBsZXQgZG9jOiBEb2N1bWVudCA9ICh0aGlzLm9wdGlvbnMuZG9jdW1lbnQgYXMgRG9jdW1lbnQpIHx8IGRvY3VtZW50O1xuICAgIGxldCBlbGVtZW50ID0gZG9jLmJvZHk7XG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgRE9NQnVpbGRlcih7IGVsZW1lbnQgfSk7XG4gICAgbGV0IHJlbmRlcmVyID0gbmV3IFN5bmNSZW5kZXJlcigpO1xuXG4gICAgbGV0IGFwcCA9IG5ldyB0aGlzLm9wdGlvbnMuQXBwbGljYXRpb25DbGFzcyh7XG4gICAgICByZXNvbHZlcixcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBsb2FkZXIsXG4gICAgICByZW5kZXJlcixcbiAgICAgIHJvb3ROYW1lOiB0aGlzLnJvb3ROYW1lLFxuICAgICAgZG9jdW1lbnQ6IHRoaXMub3B0aW9ucy5kb2N1bWVudCxcbiAgICB9KTtcblxuICAgIGxldCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBhcHAucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDtcbiAgICBhcHAucmVuZGVyQ29tcG9uZW50KCdNYWluJywgcm9vdEVsZW1lbnQpO1xuICAgIGFwcC5ib290KCk7XG5cbiAgICBhd2FpdCBkaWRSZW5kZXIoYXBwKTtcblxuICAgIHJldHVybiBhcHA7XG4gIH1cbn1cblxuY29uc3QgQ0FQQUJJTElUSUVTOiBDb21wb25lbnRDYXBhYmlsaXRpZXMgPSB7XG4gIGNyZWF0ZUluc3RhbmNlOiB0cnVlLFxuICBkeW5hbWljTGF5b3V0OiBmYWxzZSxcbiAgZHluYW1pY1RhZzogZmFsc2UsXG4gIHdyYXBwZWQ6IGZhbHNlLFxuICBwcmVwYXJlQXJnczogZmFsc2UsXG4gIGNyZWF0ZUFyZ3M6IHRydWUsXG4gIGF0dHJpYnV0ZUhvb2s6IGZhbHNlLFxuICBlbGVtZW50SG9vazogZmFsc2UsXG4gIHVwZGF0ZUhvb2s6IHRydWUsXG4gIGNyZWF0ZUNhbGxlcjogZmFsc2UsXG4gIGR5bmFtaWNTY29wZTogdHJ1ZSxcbn07XG5cbmNsYXNzIENvbXBpbGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQ29tcGlsZXJEZWxlZ2F0ZTxNb2R1bGVMb2NhdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZXNvbHZlcjogUmVzb2x2ZXIpIHt9XG5cbiAgaGFzQ29tcG9uZW50SW5TY29wZShuYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlci5pZGVudGlmeShgdGVtcGxhdGU6JHtuYW1lfWAsIHJlZmVycmVyLm1vZHVsZSk7XG4gIH1cblxuICByZXNvbHZlQ29tcG9uZW50KG5hbWU6IHN0cmluZywgcmVmZXJyZXI6IE1vZHVsZUxvY2F0b3IpOiBNb2R1bGVMb2NhdG9yIHtcbiAgICBsZXQgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVyLmlkZW50aWZ5KGB0ZW1wbGF0ZToke25hbWV9YCwgcmVmZXJyZXIubW9kdWxlKTtcbiAgICByZXR1cm4geyBtb2R1bGU6IHJlc29sdmVkLCBuYW1lOiAnZGVmYXVsdCcgfTtcbiAgfVxuXG4gIGdldENvbXBvbmVudENhcGFiaWxpdGllcygpIHtcbiAgICByZXR1cm4gQ0FQQUJJTElUSUVTO1xuICB9XG5cbiAgaGFzSGVscGVySW5TY29wZShoZWxwZXJOYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlci5pZGVudGlmeShgaGVscGVyOiR7aGVscGVyTmFtZX1gLCByZWZlcnJlci5tb2R1bGUpO1xuICB9XG5cbiAgcmVzb2x2ZUhlbHBlcihoZWxwZXJOYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogTW9kdWxlTG9jYXRvciB7XG4gICAgbGV0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlci5pZGVudGlmeShgaGVscGVyOiR7aGVscGVyTmFtZX1gLCByZWZlcnJlci5tb2R1bGUpO1xuICAgIHJldHVybiB7IG1vZHVsZTogcmVzb2x2ZWQsIG5hbWU6ICdkZWZhdWx0JyB9O1xuICB9XG5cbiAgaGFzUGFydGlhbEluU2NvcGUocGFydGlhbE5hbWU6IHN0cmluZywgcmVmZXJyZXI6IE1vZHVsZUxvY2F0b3IpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICByZXNvbHZlUGFydGlhbChwYXJ0aWFsTmFtZTogc3RyaW5nLCByZWZlcnJlcjogTW9kdWxlTG9jYXRvcik6IE1vZHVsZUxvY2F0b3Ige1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGhhc01vZGlmaWVySW5TY29wZShtb2RpZmllck5hbWU6IHN0cmluZywgcmVmZXJyZXI6IE1vZHVsZUxvY2F0b3IpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICByZXNvbHZlTW9kaWZpZXIobW9kaWZpZXJOYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogTW9kdWxlTG9jYXRvciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXBwPFQgZXh0ZW5kcyBUZXN0QXBwbGljYXRpb24+KG9wdGlvbnM6IEFwcEJ1aWxkZXJPcHRpb25zPFQ+ID0ge30pOiBBcHBCdWlsZGVyPFQ+IHtcbiAgb3B0aW9ucy5hcHBOYW1lID0gb3B0aW9ucy5hcHBOYW1lIHx8ICd0ZXN0LWFwcCc7XG4gIG9wdGlvbnMubG9hZGVyID0gb3B0aW9ucy5sb2FkZXIgfHwgJ3J1bnRpbWUtY29tcGlsZXInO1xuICBvcHRpb25zLkFwcGxpY2F0aW9uQ2xhc3MgPVxuICAgIG9wdGlvbnMuQXBwbGljYXRpb25DbGFzcyB8fCAoVGVzdEFwcGxpY2F0aW9uIGFzIEFwcGxpY2F0aW9uQ29uc3RydWN0b3I8VD4pO1xuXG4gIHJldHVybiBuZXcgQXBwQnVpbGRlcihvcHRpb25zLmFwcE5hbWUsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgeyBidWlsZEFwcCB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==