ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
703 lines (557 loc) • 65.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BasicOpcodeBuilder = undefined;
var _util = require("@glimmer/util");
var _compiler = require("../../compiler");
var _opcodes = require("../../opcodes");
var _functions = require("../../syntax/functions");
var _rawBlock = require("../../syntax/raw-block");
var _rawBlock2 = _interopRequireDefault(_rawBlock);
var _content = require("../opcodes/content");
var _content2 = require("./content");
var content = _interopRequireWildcard(_content2);
var _vm = require("./vm");
var vm = _interopRequireWildcard(_vm);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 Labels = function () {
function Labels() {
_classCallCheck(this, Labels);
this.labels = (0, _util.dict)();
this.targets = [];
}
Labels.prototype.label = function label(name, index) {
this.labels[name] = index;
};
Labels.prototype.target = function target(at, Target, _target) {
this.targets.push({ at: at, Target: Target, target: _target });
};
Labels.prototype.patch = function patch(program) {
var targets = this.targets,
labels = this.labels;
for (var i = 0; i < targets.length; i++) {
var _targets$i = targets[i],
at = _targets$i.at,
target = _targets$i.target;
var goto = labels[target] - at;
program.heap.setbyaddr(at + 1, goto);
}
};
return Labels;
}();
var BasicOpcodeBuilder = function () {
function BasicOpcodeBuilder(env, meta, program) {
_classCallCheck(this, BasicOpcodeBuilder);
this.env = env;
this.meta = meta;
this.program = program;
this.labelsStack = new _util.Stack();
this.constants = program.constants;
this.heap = program.heap;
this.start = this.heap.malloc();
}
BasicOpcodeBuilder.prototype.upvars = function upvars(count) {
return (0, _util.fillNulls)(count);
};
BasicOpcodeBuilder.prototype.reserve = function reserve(name) {
this.push(name, 0, 0, 0);
};
BasicOpcodeBuilder.prototype.push = function push(name) {
var op1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var op2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var op3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
this.heap.push(name);
this.heap.push(op1);
this.heap.push(op2);
this.heap.push(op3);
};
BasicOpcodeBuilder.prototype.finalize = function finalize() {
this.push(22 /* Return */);
this.heap.finishMalloc(this.start);
return this.start;
};
// args
BasicOpcodeBuilder.prototype.pushArgs = function pushArgs(synthetic) {
this.push(58 /* PushArgs */, synthetic === true ? 1 : 0);
};
// helpers
BasicOpcodeBuilder.prototype.startLabels = function startLabels() {
this.labelsStack.push(new Labels());
};
BasicOpcodeBuilder.prototype.stopLabels = function stopLabels() {
var label = this.labelsStack.pop();
label.patch(this.program);
};
// components
BasicOpcodeBuilder.prototype.pushComponentManager = function pushComponentManager(definition) {
this.push(56 /* PushComponentManager */, this.other(definition));
};
BasicOpcodeBuilder.prototype.pushDynamicComponentManager = function pushDynamicComponentManager() {
this.push(57 /* PushDynamicComponentManager */);
};
BasicOpcodeBuilder.prototype.prepareArgs = function prepareArgs(state) {
this.push(59 /* PrepareArgs */, state);
};
BasicOpcodeBuilder.prototype.createComponent = function createComponent(state, hasDefault, hasInverse) {
var flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1;
this.push(60 /* CreateComponent */, flag, state);
};
BasicOpcodeBuilder.prototype.registerComponentDestructor = function registerComponentDestructor(state) {
this.push(61 /* RegisterComponentDestructor */, state);
};
BasicOpcodeBuilder.prototype.beginComponentTransaction = function beginComponentTransaction() {
this.push(65 /* BeginComponentTransaction */);
};
BasicOpcodeBuilder.prototype.commitComponentTransaction = function commitComponentTransaction() {
this.push(66 /* CommitComponentTransaction */);
};
BasicOpcodeBuilder.prototype.pushComponentOperations = function pushComponentOperations() {
this.push(62 /* PushComponentOperations */);
};
BasicOpcodeBuilder.prototype.getComponentSelf = function getComponentSelf(state) {
this.push(63 /* GetComponentSelf */, state);
};
BasicOpcodeBuilder.prototype.getComponentLayout = function getComponentLayout(state) {
this.push(64 /* GetComponentLayout */, state);
};
BasicOpcodeBuilder.prototype.didCreateElement = function didCreateElement(state) {
this.push(67 /* DidCreateElement */, state);
};
BasicOpcodeBuilder.prototype.didRenderLayout = function didRenderLayout(state) {
this.push(68 /* DidRenderLayout */, state);
};
// partial
BasicOpcodeBuilder.prototype.getPartialTemplate = function getPartialTemplate() {
this.push(69 /* GetPartialTemplate */);
};
BasicOpcodeBuilder.prototype.resolveMaybeLocal = function resolveMaybeLocal(name) {
this.push(70 /* ResolveMaybeLocal */, this.string(name));
};
// debugger
BasicOpcodeBuilder.prototype.debugger = function _debugger(symbols, evalInfo) {
this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo));
};
// content
BasicOpcodeBuilder.prototype.dynamicContent = function dynamicContent(Opcode) {
this.push(26 /* DynamicContent */, this.other(Opcode));
};
BasicOpcodeBuilder.prototype.cautiousAppend = function cautiousAppend() {
this.dynamicContent(new content.OptimizedCautiousAppendOpcode());
};
BasicOpcodeBuilder.prototype.trustingAppend = function trustingAppend() {
this.dynamicContent(new content.OptimizedTrustingAppendOpcode());
};
// dom
BasicOpcodeBuilder.prototype.text = function text(_text) {
this.push(24 /* Text */, this.constants.string(_text));
};
BasicOpcodeBuilder.prototype.openPrimitiveElement = function openPrimitiveElement(tag) {
this.push(27 /* OpenElement */, this.constants.string(tag));
};
BasicOpcodeBuilder.prototype.openElementWithOperations = function openElementWithOperations(tag) {
this.push(28 /* OpenElementWithOperations */, this.constants.string(tag));
};
BasicOpcodeBuilder.prototype.openDynamicElement = function openDynamicElement() {
this.push(29 /* OpenDynamicElement */);
};
BasicOpcodeBuilder.prototype.flushElement = function flushElement() {
this.push(33 /* FlushElement */);
};
BasicOpcodeBuilder.prototype.closeElement = function closeElement() {
this.push(34 /* CloseElement */);
};
BasicOpcodeBuilder.prototype.staticAttr = function staticAttr(_name, _namespace, _value) {
var name = this.constants.string(_name);
var namespace = _namespace ? this.constants.string(_namespace) : 0;
var value = this.constants.string(_value);
this.push(30 /* StaticAttr */, name, value, namespace);
};
BasicOpcodeBuilder.prototype.dynamicAttrNS = function dynamicAttrNS(_name, _namespace, trusting) {
var name = this.constants.string(_name);
var namespace = this.constants.string(_namespace);
this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0);
};
BasicOpcodeBuilder.prototype.dynamicAttr = function dynamicAttr(_name, trusting) {
var name = this.constants.string(_name);
this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0);
};
BasicOpcodeBuilder.prototype.comment = function comment(_comment) {
var comment = this.constants.string(_comment);
this.push(25 /* Comment */, comment);
};
BasicOpcodeBuilder.prototype.modifier = function modifier(_definition) {
this.push(35 /* Modifier */, this.other(_definition));
};
// lists
BasicOpcodeBuilder.prototype.putIterator = function putIterator() {
this.push(54 /* PutIterator */);
};
BasicOpcodeBuilder.prototype.enterList = function enterList(start) {
this.reserve(52 /* EnterList */);
this.labels.target(this.pos, 52 /* EnterList */, start);
};
BasicOpcodeBuilder.prototype.exitList = function exitList() {
this.push(53 /* ExitList */);
};
BasicOpcodeBuilder.prototype.iterate = function iterate(breaks) {
this.reserve(55 /* Iterate */);
this.labels.target(this.pos, 55 /* Iterate */, breaks);
};
// expressions
BasicOpcodeBuilder.prototype.setVariable = function setVariable(symbol) {
this.push(4 /* SetVariable */, symbol);
};
BasicOpcodeBuilder.prototype.getVariable = function getVariable(symbol) {
this.push(5 /* GetVariable */, symbol);
};
BasicOpcodeBuilder.prototype.getProperty = function getProperty(key) {
this.push(6 /* GetProperty */, this.string(key));
};
BasicOpcodeBuilder.prototype.getBlock = function getBlock(symbol) {
this.push(8 /* GetBlock */, symbol);
};
BasicOpcodeBuilder.prototype.hasBlock = function hasBlock(symbol) {
this.push(9 /* HasBlock */, symbol);
};
BasicOpcodeBuilder.prototype.hasBlockParams = function hasBlockParams(symbol) {
this.push(10 /* HasBlockParams */, symbol);
};
BasicOpcodeBuilder.prototype.concat = function concat(size) {
this.push(11 /* Concat */, size);
};
BasicOpcodeBuilder.prototype.function = function _function(f) {
this.push(2 /* Function */, this.func(f));
};
BasicOpcodeBuilder.prototype.load = function load(register) {
this.push(17 /* Load */, register);
};
BasicOpcodeBuilder.prototype.fetch = function fetch(register) {
this.push(18 /* Fetch */, register);
};
BasicOpcodeBuilder.prototype.dup = function dup() {
var register = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _opcodes.Register.sp;
var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return this.push(15 /* Dup */, register, offset);
};
BasicOpcodeBuilder.prototype.pop = function pop() {
var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
return this.push(16 /* Pop */, count);
};
// vm
BasicOpcodeBuilder.prototype.pushRemoteElement = function pushRemoteElement() {
this.push(36 /* PushRemoteElement */);
};
BasicOpcodeBuilder.prototype.popRemoteElement = function popRemoteElement() {
this.push(37 /* PopRemoteElement */);
};
BasicOpcodeBuilder.prototype.label = function label(name) {
this.labels.label(name, this.nextPos);
};
BasicOpcodeBuilder.prototype.pushRootScope = function pushRootScope(symbols, bindCallerScope) {
this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0);
};
BasicOpcodeBuilder.prototype.pushChildScope = function pushChildScope() {
this.push(20 /* ChildScope */);
};
BasicOpcodeBuilder.prototype.popScope = function popScope() {
this.push(21 /* PopScope */);
};
BasicOpcodeBuilder.prototype.returnTo = function returnTo(label) {
this.reserve(23 /* ReturnTo */);
this.labels.target(this.pos, 23 /* ReturnTo */, label);
};
BasicOpcodeBuilder.prototype.pushDynamicScope = function pushDynamicScope() {
this.push(39 /* PushDynamicScope */);
};
BasicOpcodeBuilder.prototype.popDynamicScope = function popDynamicScope() {
this.push(40 /* PopDynamicScope */);
};
BasicOpcodeBuilder.prototype.pushImmediate = function pushImmediate(value) {
this.push(13 /* Constant */, this.other(value));
};
BasicOpcodeBuilder.prototype.primitive = function primitive(_primitive) {
var flag = 0;
var primitive = void 0;
switch (typeof _primitive) {
case 'number':
if (_primitive % 1 === 0 && _primitive > 0) {
primitive = _primitive;
} else {
primitive = this.float(_primitive);
flag = 1;
}
break;
case 'string':
primitive = this.string(_primitive);
flag = 2;
break;
case 'boolean':
primitive = _primitive | 0;
flag = 3;
break;
case 'object':
// assume null
primitive = 2;
flag = 3;
break;
case 'undefined':
primitive = 3;
flag = 3;
break;
default:
throw new Error('Invalid primitive passed to pushPrimitive');
}
this.push(14 /* PrimitiveReference */, flag << 30 | primitive);
};
BasicOpcodeBuilder.prototype.helper = function helper(func) {
this.push(1 /* Helper */, this.func(func));
};
BasicOpcodeBuilder.prototype.pushBlock = function pushBlock(block) {
this.push(7 /* PushBlock */, this.block(block));
};
BasicOpcodeBuilder.prototype.bindDynamicScope = function bindDynamicScope(_names) {
this.push(38 /* BindDynamicScope */, this.names(_names));
};
BasicOpcodeBuilder.prototype.enter = function enter(args) {
this.push(49 /* Enter */, args);
};
BasicOpcodeBuilder.prototype.exit = function exit() {
this.push(50 /* Exit */);
};
BasicOpcodeBuilder.prototype.return = function _return() {
this.push(22 /* Return */);
};
BasicOpcodeBuilder.prototype.pushFrame = function pushFrame() {
this.push(47 /* PushFrame */);
};
BasicOpcodeBuilder.prototype.popFrame = function popFrame() {
this.push(48 /* PopFrame */);
};
BasicOpcodeBuilder.prototype.compileDynamicBlock = function compileDynamicBlock() {
this.push(41 /* CompileDynamicBlock */);
};
BasicOpcodeBuilder.prototype.invokeDynamic = function invokeDynamic(invoker) {
this.push(43 /* InvokeDynamic */, this.other(invoker));
};
BasicOpcodeBuilder.prototype.invokeStatic = function invokeStatic(block) {
var callerCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var parameters = block.symbolTable.parameters;
var calleeCount = parameters.length;
var count = Math.min(callerCount, calleeCount);
this.pushFrame();
if (count) {
this.pushChildScope();
for (var i = 0; i < count; i++) {
this.dup(_opcodes.Register.fp, callerCount - i);
this.setVariable(parameters[i]);
}
}
var _block = this.constants.block(block);
this.push(42 /* InvokeStatic */, _block);
if (count) {
this.popScope();
}
this.popFrame();
};
BasicOpcodeBuilder.prototype.test = function test(testFunc) {
var _func = void 0;
if (testFunc === 'const') {
_func = vm.ConstTest;
} else if (testFunc === 'simple') {
_func = vm.SimpleTest;
} else if (testFunc === 'environment') {
_func = vm.EnvironmentTest;
} else if (typeof testFunc === 'function') {
_func = testFunc;
} else {
throw new Error('unreachable');
}
var func = this.constants.function(_func);
this.push(51 /* Test */, func);
};
BasicOpcodeBuilder.prototype.jump = function jump(target) {
this.reserve(44 /* Jump */);
this.labels.target(this.pos, 44 /* Jump */, target);
};
BasicOpcodeBuilder.prototype.jumpIf = function jumpIf(target) {
this.reserve(45 /* JumpIf */);
this.labels.target(this.pos, 45 /* JumpIf */, target);
};
BasicOpcodeBuilder.prototype.jumpUnless = function jumpUnless(target) {
this.reserve(46 /* JumpUnless */);
this.labels.target(this.pos, 46 /* JumpUnless */, target);
};
BasicOpcodeBuilder.prototype.string = function string(_string) {
return this.constants.string(_string);
};
BasicOpcodeBuilder.prototype.float = function float(num) {
return this.constants.float(num);
};
BasicOpcodeBuilder.prototype.names = function names(_names) {
var names = [];
for (var i = 0; i < _names.length; i++) {
var n = _names[i];
names[i] = this.constants.string(n);
}
return this.constants.array(names);
};
BasicOpcodeBuilder.prototype.symbols = function symbols(_symbols) {
return this.constants.array(_symbols);
};
BasicOpcodeBuilder.prototype.other = function other(value) {
return this.constants.other(value);
};
BasicOpcodeBuilder.prototype.block = function block(_block2) {
return _block2 ? this.constants.block(_block2) : 0;
};
BasicOpcodeBuilder.prototype.func = function func(_func2) {
return this.constants.function(_func2);
};
_createClass(BasicOpcodeBuilder, [{
key: 'pos',
get: function () {
return (0, _util.typePos)(this.heap.size());
}
}, {
key: 'nextPos',
get: function () {
return this.heap.size();
}
}, {
key: 'labels',
get: function () {
return this.labelsStack.current;
}
}]);
return BasicOpcodeBuilder;
}();
exports.BasicOpcodeBuilder = BasicOpcodeBuilder;
function isCompilableExpression(expr) {
return typeof expr === 'object' && expr !== null && typeof expr.compile === 'function';
}
var OpcodeBuilder = function (_BasicOpcodeBuilder) {
_inherits(OpcodeBuilder, _BasicOpcodeBuilder);
function OpcodeBuilder(env, meta) {
var program = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : env.program;
_classCallCheck(this, OpcodeBuilder);
var _this = _possibleConstructorReturn(this, _BasicOpcodeBuilder.call(this, env, meta, program));
_this.component = new _compiler.ComponentBuilder(_this);
return _this;
}
OpcodeBuilder.prototype.compileArgs = function compileArgs(params, hash, synthetic) {
var positional = 0;
if (params) {
for (var i = 0; i < params.length; i++) {
(0, _functions.expr)(params[i], this);
}
positional = params.length;
}
this.pushImmediate(positional);
var names = _util.EMPTY_ARRAY;
if (hash) {
names = hash[0];
var val = hash[1];
for (var _i = 0; _i < val.length; _i++) {
(0, _functions.expr)(val[_i], this);
}
}
this.pushImmediate(names);
this.pushArgs(synthetic);
};
OpcodeBuilder.prototype.compile = function compile(expr) {
if (isCompilableExpression(expr)) {
return expr.compile(this);
} else {
return expr;
}
};
OpcodeBuilder.prototype.guardedAppend = function guardedAppend(expression, trusting) {
this.startLabels();
this.pushFrame();
this.returnTo('END');
(0, _functions.expr)(expression, this);
this.dup();
this.test(function (reference) {
return _content.IsComponentDefinitionReference.create(reference);
});
this.enter(2);
this.jumpUnless('ELSE');
this.pushDynamicComponentManager();
this.invokeComponent(null, null, null, null, null);
this.exit();
this.return();
this.label('ELSE');
if (trusting) {
this.trustingAppend();
} else {
this.cautiousAppend();
}
this.exit();
this.return();
this.label('END');
this.popFrame();
this.stopLabels();
};
OpcodeBuilder.prototype.invokeComponent = function invokeComponent(attrs, params, hash, block) {
var inverse = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
this.fetch(_opcodes.Register.s0);
this.dup(_opcodes.Register.sp, 1);
this.load(_opcodes.Register.s0);
this.pushBlock(block);
this.pushBlock(inverse);
this.compileArgs(params, hash, false);
this.prepareArgs(_opcodes.Register.s0);
this.beginComponentTransaction();
this.pushDynamicScope();
this.createComponent(_opcodes.Register.s0, block !== null, inverse !== null);
this.registerComponentDestructor(_opcodes.Register.s0);
this.getComponentSelf(_opcodes.Register.s0);
this.getComponentLayout(_opcodes.Register.s0);
this.invokeDynamic(new _functions.InvokeDynamicLayout(attrs && attrs.scan()));
this.popFrame();
this.popScope();
this.popDynamicScope();
this.commitComponentTransaction();
this.load(_opcodes.Register.s0);
};
OpcodeBuilder.prototype.template = function template(block) {
if (!block) return null;
return new _rawBlock2.default(this.meta, block.statements, block.parameters);
};
return OpcodeBuilder;
}(BasicOpcodeBuilder);
exports.default = OpcodeBuilder;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiZmlsbE51bGxzIiwiU3RhY2siLCJ0eXBlUG9zIiwiQ29tcG9uZW50QnVpbGRlciIsIlJlZ2lzdGVyIiwiZXhwciIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJSYXdJbmxpbmVCbG9jayIsIklzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSIsImNvbnRlbnQiLCJ2bSIsIkxhYmVscyIsImxhYmVscyIsInRhcmdldHMiLCJsYWJlbCIsIm5hbWUiLCJpbmRleCIsInRhcmdldCIsImF0IiwiVGFyZ2V0IiwicHVzaCIsInBhdGNoIiwicHJvZ3JhbSIsImkiLCJsZW5ndGgiLCJnb3RvIiwiaGVhcCIsInNldGJ5YWRkciIsIkJhc2ljT3Bjb2RlQnVpbGRlciIsImVudiIsIm1ldGEiLCJsYWJlbHNTdGFjayIsImNvbnN0YW50cyIsInN0YXJ0IiwibWFsbG9jIiwidXB2YXJzIiwiY291bnQiLCJyZXNlcnZlIiwib3AxIiwib3AyIiwib3AzIiwiZmluYWxpemUiLCJmaW5pc2hNYWxsb2MiLCJwdXNoQXJncyIsInN5bnRoZXRpYyIsInN0YXJ0TGFiZWxzIiwic3RvcExhYmVscyIsInBvcCIsInB1c2hDb21wb25lbnRNYW5hZ2VyIiwiZGVmaW5pdGlvbiIsIm90aGVyIiwicHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyIiwicHJlcGFyZUFyZ3MiLCJzdGF0ZSIsImNyZWF0ZUNvbXBvbmVudCIsImhhc0RlZmF1bHQiLCJoYXNJbnZlcnNlIiwiZmxhZyIsInJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvciIsImJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24iLCJjb21taXRDb21wb25lbnRUcmFuc2FjdGlvbiIsInB1c2hDb21wb25lbnRPcGVyYXRpb25zIiwiZ2V0Q29tcG9uZW50U2VsZiIsImdldENvbXBvbmVudExheW91dCIsImRpZENyZWF0ZUVsZW1lbnQiLCJkaWRSZW5kZXJMYXlvdXQiLCJnZXRQYXJ0aWFsVGVtcGxhdGUiLCJyZXNvbHZlTWF5YmVMb2NhbCIsInN0cmluZyIsImRlYnVnZ2VyIiwic3ltYm9scyIsImV2YWxJbmZvIiwiYXJyYXkiLCJkeW5hbWljQ29udGVudCIsIk9wY29kZSIsImNhdXRpb3VzQXBwZW5kIiwiT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUiLCJ0cnVzdGluZ0FwcGVuZCIsIk9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlIiwidGV4dCIsIm9wZW5QcmltaXRpdmVFbGVtZW50IiwidGFnIiwib3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyIsIm9wZW5EeW5hbWljRWxlbWVudCIsImZsdXNoRWxlbWVudCIsImNsb3NlRWxlbWVudCIsInN0YXRpY0F0dHIiLCJfbmFtZSIsIl9uYW1lc3BhY2UiLCJfdmFsdWUiLCJuYW1lc3BhY2UiLCJ2YWx1ZSIsImR5bmFtaWNBdHRyTlMiLCJ0cnVzdGluZyIsImR5bmFtaWNBdHRyIiwiY29tbWVudCIsIl9jb21tZW50IiwibW9kaWZpZXIiLCJfZGVmaW5pdGlvbiIsInB1dEl0ZXJhdG9yIiwiZW50ZXJMaXN0IiwicG9zIiwiZXhpdExpc3QiLCJpdGVyYXRlIiwiYnJlYWtzIiwic2V0VmFyaWFibGUiLCJzeW1ib2wiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5Iiwia2V5IiwiZ2V0QmxvY2siLCJoYXNCbG9jayIsImhhc0Jsb2NrUGFyYW1zIiwiY29uY2F0Iiwic2l6ZSIsImZ1bmN0aW9uIiwiZiIsImZ1bmMiLCJsb2FkIiwicmVnaXN0ZXIiLCJmZXRjaCIsImR1cCIsInNwIiwib2Zmc2V0IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwibmV4dFBvcyIsInB1c2hSb290U2NvcGUiLCJiaW5kQ2FsbGVyU2NvcGUiLCJwdXNoQ2hpbGRTY29wZSIsInBvcFNjb3BlIiwicmV0dXJuVG8iLCJwdXNoRHluYW1pY1Njb3BlIiwicG9wRHluYW1pY1Njb3BlIiwicHVzaEltbWVkaWF0ZSIsInByaW1pdGl2ZSIsIl9wcmltaXRpdmUiLCJmbG9hdCIsIkVycm9yIiwiaGVscGVyIiwicHVzaEJsb2NrIiwiYmxvY2siLCJiaW5kRHluYW1pY1Njb3BlIiwiX25hbWVzIiwibmFtZXMiLCJlbnRlciIsImFyZ3MiLCJleGl0IiwicmV0dXJuIiwicHVzaEZyYW1lIiwicG9wRnJhbWUiLCJjb21waWxlRHluYW1pY0Jsb2NrIiwiaW52b2tlRHluYW1pYyIsImludm9rZXIiLCJpbnZva2VTdGF0aWMiLCJjYWxsZXJDb3VudCIsInBhcmFtZXRlcnMiLCJzeW1ib2xUYWJsZSIsImNhbGxlZUNvdW50IiwiTWF0aCIsIm1pbiIsImZwIiwiX2Jsb2NrIiwidGVzdCIsInRlc3RGdW5jIiwiX2Z1bmMiLCJDb25zdFRlc3QiLCJTaW1wbGVUZXN0IiwiRW52aXJvbm1lbnRUZXN0IiwianVtcCIsImp1bXBJZiIsImp1bXBVbmxlc3MiLCJfc3RyaW5nIiwibnVtIiwibiIsImN1cnJlbnQiLCJpc0NvbXBpbGFibGVFeHByZXNzaW9uIiwiY29tcGlsZSIsIk9wY29kZUJ1aWxkZXIiLCJjb21wb25lbnQiLCJjb21waWxlQXJncyIsInBhcmFtcyIsImhhc2giLCJwb3NpdGlvbmFsIiwidmFsIiwiZ3VhcmRlZEFwcGVuZCIsImV4cHJlc3Npb24iLCJjcmVhdGUiLCJyZWZlcmVuY2UiLCJpbnZva2VDb21wb25lbnQiLCJhdHRycyIsImludmVyc2UiLCJzMCIsInNjYW4iLCJ0ZW1wbGF0ZSIsInN0YXRlbWVudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxBQUFTLEFBQU0sQUFBcUIsQUFBVyxBQUFPLEFBQWU7O0FBQ3JFLEFBQVMsQUFBd0I7O0FBQ2pDLEFBQVMsQUFBZ0I7O0FBQ3pCLEFBQVMsQUFBTSxBQUEyQjs7QUFDMUMsQUFBTyxBQUFvQjs7OztBQUMzQixBQUFTLEFBQXNDOztBQUMvQyxBQUFPOztJQUFQLEFBQVksQUFBYTs7QUFDekIsQUFBTzs7SUFBUCxBQUFZLEFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJLEFBQ2QscUJBQ0Y7c0JBQWM7OEJBQ1Y7O2FBQUEsQUFBSyxTQUFMLEFBQWMsQUFDZDthQUFBLEFBQUssVUFBTCxBQUFlLEFBQ2xCOzs7cUJBQ0QsQSx1QixBQUFNLE0sQUFBTSxPQUFPLEFBQ2Y7YUFBQSxBQUFLLE9BQUwsQUFBWSxRQUFaLEFBQW9CLEFBQ3ZCO0E7O3FCLEFBQ0QseUIsQUFBTyxJQUFJLEEsUSxBQUFRLFNBQVEsQUFDdkI7YUFBQSxBQUFLLFFBQUwsQUFBYSxLQUFLLEVBQUUsSUFBRixJQUFNLFFBQU4sUUFBYyxRQUFoQyxBQUFrQixBQUNyQjtBOztxQixBQUNELHVCQUFNLEEsU0FBUztZQUFBLEFBQ0wsVUFESyxBQUNlLEtBRGYsQUFDTDtZQURLLEFBQ0ksU0FESixBQUNlLEtBRGYsQUFDSSxBQUNmOzthQUFLLElBQUksSUFBVCxBQUFhLEdBQUcsSUFBSSxRQUFwQixBQUE0QixRQUE1QixBQUFvQyxLQUFLOzZCQUNoQixRQURnQixBQUNoQixBQUFRO2dCQURRLEFBQy9CLGdCQUQrQixBQUMvQjtnQkFEK0IsQUFDM0Isb0JBRDJCLEFBQzNCLEFBQ1Y7O2dCQUFJLE9BQU8sT0FBQSxBQUFPLFVBQWxCLEFBQTRCLEFBQzVCO29CQUFBLEFBQVEsS0FBUixBQUFhLFVBQVUsS0FBdkIsQUFBNEIsR0FBNUIsQUFBK0IsQUFDbEM7QUFDSjtBOzs7OztJLEFBRVEsaUNBQ1Q7Z0NBQUEsQUFBWSxLQUFaLEFBQWlCLE1BQWpCLEFBQXVCLFNBQVM7OEJBQzVCOzthQUFBLEFBQUssTUFBTCxBQUFXLEFBQ1g7YUFBQSxBQUFLLE9BQUwsQUFBWSxBQUNaO2FBQUEsQUFBSyxVQUFMLEFBQWUsQUFDZjthQUFBLEFBQUssY0FBTCxBQUFtQixBQUFJLEFBQ3ZCO2FBQUEsQUFBSyxZQUFZLFFBQWpCLEFBQXlCLEFBQ3pCO2FBQUEsQUFBSyxPQUFPLFFBQVosQUFBb0IsQUFDcEI7YUFBQSxBQUFLLFFBQVEsS0FBQSxBQUFLLEtBQWxCLEFBQWEsQUFBVSxBQUMxQjs7O2lDLEFBT0QseUJBQU8sQSxPQUFPLEFBQ1Y7ZUFBTyxxQkFBUCxBQUFPLEFBQVUsQUFDcEI7QTs7aUMsQUFDRCwyQixBQUFRLE1BQU0sQUFDVjthQUFBLEFBQUssS0FBTCxBQUFVLE1BQVYsQUFBZ0IsR0FBaEIsQUFBbUIsR0FBbkIsQUFBc0IsQUFDekI7QTs7aUMsQUFDRCxxQixBQUFLLE1BQWlDO1lBQTNCLEFBQTJCLDBFQUFyQixBQUFxQjtZQUFsQixBQUFrQiwwRUFBWixBQUFZO1lBQVQsQUFBUywwRUFBSCxBQUFHLEFBQ2xDOzthQUFBLEFBQUssS0FBTCxBQUFVLEtBQVYsQUFBZSxBQUNmO2FBQUEsQUFBSyxLQUFMLEFBQVUsS0FBVixBQUFlLEFBQ2Y7YUFBQSxBQUFLLEtBQUwsQUFBVSxLQUFWLEFBQWUsQUFDZjthQUFBLEFBQUssS0FBTCxBQUFVLEtBQVYsQUFBZSxBQUNsQjtBOztpQ0FDRCxBLCtCQUFXLEFBQ1A7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDYjthQUFBLEFBQUssS0FBTCxBQUFVLGFBQWEsS0FBdkIsQUFBNEIsQUFDNUI7ZUFBTyxLQUFQLEFBQVksQUFDZjtBLEFBQ0Q7Ozs7aUNBQ0EsQSw2QixBQUFTLFdBQVcsQUFDaEI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsZ0JBQWdCLGNBQUEsQUFBYyxPQUFkLEFBQXFCLElBQWxELEFBQXNELEFBQ3pEO0EsQUFDRDs7OztpQyxBQUlBLHFDQUFjLEFBQ1Y7YUFBQSxBQUFLLFlBQUwsQUFBaUIsS0FBSyxJQUF0QixBQUFzQixBQUFJLEFBQzdCO0E7O2lDQUNELEEsbUNBQWEsQUFDVDtZQUFJLFFBQWUsS0FBQSxBQUFLLFlBQXhCLEFBQW1CLEFBQWlCLEFBQ3BDO2NBQUEsQUFBTSxNQUFNLEtBQVosQUFBaUIsQUFDcEI7QUFDRCxBOzs7O2lDQUNBLEEscURBQXFCLEEsWUFBWSxBQUM3QjthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSw0QkFBNEIsS0FBQSxBQUFLLE1BQTlDLEFBQXlDLEFBQVcsQUFDdkQ7QTs7aUNBQ0QsQSxxRUFBOEIsQUFDMUI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUMsQUFDRCxtQ0FBWSxBLE9BQU8sQUFDZjthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxtQkFBYixBQUFnQyxBQUNuQztBOztpQ0FDRCxBLDJDLEFBQWdCLE8sQUFBTyxZLEFBQVksWUFBWSxBQUMzQztZQUFJLE9BQU8sQ0FBQyxlQUFBLEFBQWUsT0FBZixBQUFzQixJQUF2QixBQUEyQixLQUFLLENBQUMsZUFBQSxBQUFlLE9BQWYsQUFBc0IsSUFBdkIsQUFBMkIsTUFBdEUsQUFBNEUsQUFDNUU7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsdUJBQWIsQUFBb0MsTUFBcEMsQUFBMEMsQUFDN0M7QTs7aUMsQUFDRCxtRUFBNEIsQSxPQUFPLEFBQy9CO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLG1DQUFiLEFBQWdELEFBQ25EO0E7O2lDQUNELEEsaUVBQTRCLEFBQ3hCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDLEFBQ0QsbUVBQTZCLEFBQ3pCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDLEFBQ0QsNkRBQTBCLEFBQ3RCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDLEFBQ0QsNkNBQWlCLEEsT0FBTyxBQUNwQjthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSx3QkFBYixBQUFxQyxBQUN4QztBOztpQyxBQUNELGlEQUFtQixBLE9BQU8sQUFDdEI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsMEJBQWIsQUFBdUMsQUFDMUM7QTs7aUNBQ0QsQSw2Q0FBaUIsQSxPQUFPLEFBQ3BCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLHdCQUFiLEFBQXFDLEFBQ3hDO0E7O2lDLEFBQ0QsMkNBQWdCLEEsT0FBTyxBQUNuQjthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSx1QkFBYixBQUFvQyxBQUN2QztBLEFBQ0Q7Ozs7aUMsQUFDQSxtREFBcUIsQUFDakI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUMsQUFDRCwrQyxBQUFrQixNQUFNLEFBQ3BCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLHlCQUF5QixLQUFBLEFBQUssT0FBM0MsQUFBc0MsQUFBWSxBQUNyRDtBQUNELEE7Ozs7aUNBQ0EsQSw4QkFBUyxBLFMsQUFBUyxVQUFVLEFBQ3hCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGdCQUFnQixLQUFBLEFBQUssVUFBTCxBQUFlLE1BQTVDLEFBQTZCLEFBQXFCLFVBQVUsS0FBQSxBQUFLLFVBQUwsQUFBZSxNQUEzRSxBQUE0RCxBQUFxQixBQUNwRjtBLEFBQ0Q7Ozs7aUMsQUFDQSx5QyxBQUFlLFFBQVEsQUFDbkI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsc0JBQXNCLEtBQUEsQUFBSyxNQUF4QyxBQUFtQyxBQUFXLEFBQ2pEO0E7O2lDLEFBQ0QsMkNBQWlCLEFBQ2I7YUFBQSxBQUFLLGVBQWUsSUFBSSxRQUF4QixBQUFvQixBQUFZLEFBQ25DO0E7O2lDQUNELEEsMkNBQWlCLEFBQ2I7YUFBQSxBQUFLLGVBQWUsSUFBSSxRQUF4QixBQUFvQixBQUFZLEFBQ25DO0FBQ0QsQTs7OztpQyxBQUNBLHFCLEFBQUssT0FBTSxBQUNQO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLFlBQVksS0FBQSxBQUFLLFVBQUwsQUFBZSxPQUF4QyxBQUF5QixBQUFzQixBQUNsRDtBOztpQyxBQUNELHFEQUFxQixBLEtBQUssQUFDdEI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsbUJBQW1CLEtBQUEsQUFBSyxVQUFMLEFBQWUsT0FBL0MsQUFBZ0MsQUFBc0IsQUFDekQ7QTs7aUNBQ0QsQSwrREFBMEIsQSxLQUFLLEFBQzNCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGlDQUFpQyxLQUFBLEFBQUssVUFBTCxBQUFlLE9BQTdELEFBQThDLEFBQXNCLEFBQ3ZFO0E7O2lDQUNELEEsbURBQXFCLEFBQ2pCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDQUNELEEsdUNBQWUsQUFDWDthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxBQUNoQjtBOztpQ0FDRCxBLHVDQUFlLEFBQ1g7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUNBQ0QsQSxpQ0FBVyxBLE9BQU8sQSxZQUFZLEEsUUFBUSxBQUNsQztZQUFJLE9BQU8sS0FBQSxBQUFLLFVBQUwsQUFBZSxPQUExQixBQUFXLEFBQXNCLEFBQ2pDO1lBQUksWUFBWSxhQUFhLEtBQUEsQUFBSyxVQUFMLEFBQWUsT0FBNUIsQUFBYSxBQUFzQixjQUFuRCxBQUFpRSxBQUNqRTtZQUFJLFFBQVEsS0FBQSxBQUFLLFVBQUwsQUFBZSxPQUEzQixBQUFZLEFBQXNCLEFBQ2xDO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGtCQUFiLEFBQStCLE1BQS9CLEFBQXFDLE9BQXJDLEFBQTRDLEFBQy9DO0E7O2lDQUNELEEsdUNBQWMsQSxPLEFBQU8sWSxBQUFZLFVBQVUsQUFDdkM7WUFBSSxPQUFPLEtBQUEsQUFBSyxVQUFMLEFBQWUsT0FBMUIsQUFBVyxBQUFzQixBQUNqQztZQUFJLFlBQVksS0FBQSxBQUFLLFVBQUwsQUFBZSxPQUEvQixBQUFnQixBQUFzQixBQUN0QzthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxxQkFBYixBQUFrQyxNQUFsQyxBQUF3QyxXQUFXLGFBQUEsQUFBYSxPQUFiLEFBQW9CLElBQXZFLEFBQTJFLEFBQzlFO0E7O2lDQUNELEEsbUNBQVksQSxPQUFPLEEsVUFBVSxBQUN6QjtZQUFJLE9BQU8sS0FBQSxBQUFLLFVBQUwsQUFBZSxPQUExQixBQUFXLEFBQXNCLEFBQ2pDO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLG1CQUFiLEFBQWdDLE1BQU0sYUFBQSxBQUFhLE9BQWIsQUFBb0IsSUFBMUQsQUFBOEQsQUFDakU7QTs7aUNBQ0QsQSwyQkFBUSxBLFVBQVUsQUFDZDtZQUFJLFVBQVUsS0FBQSxBQUFLLFVBQUwsQUFBZSxPQUE3QixBQUFjLEFBQXNCLEFBQ3BDO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGVBQWIsQUFBNEIsQUFDL0I7QTs7aUMsQUFDRCw2QixBQUFTLGFBQWEsQUFDbEI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsZ0JBQWdCLEtBQUEsQUFBSyxNQUFsQyxBQUE2QixBQUFXLEFBQzNDO0EsQUFDRDs7OztpQyxBQUNBLHFDQUFjLEFBQ1Y7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUNBQ0QsQSwrQkFBVSxBLE9BQU8sQUFDYjthQUFBLEFBQUssUUFBTCxBQUFhLEdBQWIsQUFBZ0IsQUFDaEI7YUFBQSxBQUFLLE9BQUwsQUFBWSxPQUFPLEtBQW5CLEFBQXdCLEtBQXhCLEFBQTZCLEdBQTdCLEFBQWdDLGlCQUFoQyxBQUFpRCxBQUNwRDtBOztpQ0FDRCxBLCtCQUFXLEFBQ1A7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUMsQUFDRCwyQixBQUFRLFFBQVEsQUFDWjthQUFBLEFBQUssUUFBTCxBQUFhLEdBQWIsQUFBZ0IsQUFDaEI7YUFBQSxBQUFLLE9BQUwsQUFBWSxPQUFPLEtBQW5CLEFBQXdCLEtBQXhCLEFBQTZCLEdBQTdCLEFBQWdDLGVBQWhDLEFBQStDLEFBQ2xEO0FBQ0QsQTs7OztpQyxBQUNBLG1DQUFZLEEsUUFBUSxBQUNoQjthQUFBLEFBQUssS0FBTCxBQUFVLEVBQVYsQUFBWSxtQkFBWixBQUErQixBQUNsQztBOztpQyxBQUNELG1DLEFBQVksUUFBUSxBQUNoQjthQUFBLEFBQUssS0FBTCxBQUFVLEVBQVYsQUFBWSxtQkFBWixBQUErQixBQUNsQztBOztpQ0FDRCxBLG1DLEFBQVksS0FBSyxBQUNiO2FBQUEsQUFBSyxLQUFMLEFBQVUsRUFBVixBQUFZLG1CQUFtQixLQUFBLEFBQUssT0FBcEMsQUFBK0IsQUFBWSxBQUM5QztBOztpQyxBQUNELDZCQUFTLEEsUUFBUSxBQUNiO2FBQUEsQUFBSyxLQUFMLEFBQVUsRUFBVixBQUFZLGdCQUFaLEFBQTRCLEFBQy9CO0E7O2lDLEFBQ0QsNkIsQUFBUyxRQUFRLEFBQ2I7YUFBQSxBQUFLLEtBQUwsQUFBVSxFQUFWLEFBQVksZ0JBQVosQUFBNEIsQUFDL0I7QTs7aUNBQ0QsQSx5QyxBQUFlLFFBQVEsQUFDbkI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsc0JBQWIsQUFBbUMsQUFDdEM7QTs7aUMsQUFDRCx5QixBQUFPLE1BQU0sQUFDVDthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxjQUFiLEFBQTJCLEFBQzlCO0E7O2lDQUNELEEsOEJBQVMsQSxHQUFHLEFBQ1I7YUFBQSxBQUFLLEtBQUwsQUFBVSxFQUFWLEFBQVksZ0JBQWdCLEtBQUEsQUFBSyxLQUFqQyxBQUE0QixBQUFVLEFBQ3pDO0E7O2lDQUNELEEscUJBQUssQSxVQUFVLEFBQ1g7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsWUFBYixBQUF5QixBQUM1QjtBOztpQyxBQUNELHVCLEFBQU0sVUFBVSxBQUNaO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGFBQWIsQUFBMEIsQUFDN0I7QTs7aUMsQUFDRCxxQkFBd0M7WUFBcEMsQUFBb0MsK0VBQXpCLGtCQUFTLEFBQWdCO1lBQVosQUFBWSw2RUFBSCxBQUFHLEFBQ3BDOztlQUFPLEtBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLFdBQWIsQUFBd0IsVUFBL0IsQUFBTyxBQUFrQyxBQUM1QztBOztpQ0FDRCxBLHFCQUFlO1lBQVgsQUFBVyw0RUFBSCxBQUFHLEFBQ1g7O2VBQU8sS0FBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsV0FBcEIsQUFBTyxBQUF3QixBQUNsQztBLEFBQ0Q7Ozs7aUMsQUFDQSxpREFBb0IsQUFDaEI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUMsQUFDRCwrQ0FBbUIsQUFDZjthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxBQUNoQjtBOztpQyxBQUNELHVCQUFNLEEsTUFBTSxBQUNSO2FBQUEsQUFBSyxPQUFMLEFBQVksTUFBWixBQUFrQixNQUFNLEtBQXhCLEFBQTZCLEFBQ2hDO0E7O2lDLEFBQ0QsdUMsQUFBYyxTLEFBQVMsaUJBQWlCLEFBQ3BDO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGlCQUFiLEFBQThCLFNBQVMsa0JBQUEsQUFBa0IsSUFBekQsQUFBNkQsQUFDaEU7QTs7aUNBQ0QsQSwyQ0FBaUIsQUFDYjthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxBQUNoQjtBOztpQ0FDRCxBLCtCQUFXLEFBQ1A7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUNBQ0QsQSw2QkFBUyxBLE9BQU8sQUFDWjthQUFBLEFBQUssUUFBTCxBQUFhLEdBQWIsQUFBZ0IsQUFDaEI7YUFBQSxBQUFLLE9BQUwsQUFBWSxPQUFPLEtBQW5CLEFBQXdCLEtBQXhCLEFBQTZCLEdBQTdCLEFBQWdDLGdCQUFoQyxBQUFnRCxBQUNuRDtBOztpQyxBQUNELCtDQUFtQixBQUNmO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDLEFBQ0QsNkNBQWtCLEFBQ2Q7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUNBQ0QsQSx1QyxBQUFjLE9BQU8sQUFDakI7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsZ0JBQWdCLEtBQUEsQUFBSyxNQUFsQyxBQUE2QixBQUFXLEFBQzNDO0E7O2lDQUNELEEsK0JBQVUsQSxZQUFZLEFBQ2xCO1lBQUksT0FBSixBQUFXLEFBQ1g7WUFBSSxpQkFBSixBQUNBO2dCQUFRLE9BQVIsQUFBZSxBQUNYO2lCQUFBLEFBQUssQUFDRDtvQkFBSSxhQUFBLEFBQWEsTUFBYixBQUFtQixLQUFLLGFBQTVCLEFBQXlDLEdBQUcsQUFDeEM7Z0NBQUEsQUFBWSxBQUNmO0FBRkQsdUJBRU8sQUFDSDtnQ0FBWSxLQUFBLEFBQUssTUFBakIsQUFBWSxBQUFXLEFBQ3ZCOzJCQUFBLEFBQU8sQUFDVjtBQUNEO0FBQ0o7aUJBQUEsQUFBSyxBQUNEOzRCQUFZLEtBQUEsQUFBSyxPQUFqQixBQUFZLEFBQVksQUFDeEI7dUJBQUEsQUFBTyxBQUNQO0FBQ0o7aUJBQUEsQUFBSyxBQUNEOzRCQUFZLGFBQVosQUFBeUIsQUFDekI7dUJBQUEsQUFBTyxBQUNQO0FBQ0o7aUJBQUEsQUFBSyxBQUNEO0FBQ0E7NEJBQUEsQUFBWSxBQUNaO3VCQUFBLEFBQU8sQUFDUDtBQUNKO2lCQUFBLEFBQUssQUFDRDs0QkFBQSxBQUFZLEFBQ1o7dUJBQUEsQUFBTyxBQUNQO0FBQ0o7QUFDSTtzQkFBTSxJQUFBLEFBQUksTUEzQmxCLEFBMkJRLEFBQU0sQUFBVSxBQUV4Qjs7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsMEJBQTBCLFFBQUEsQUFBUSxLQUEvQyxBQUFvRCxBQUN2RDtBOztpQyxBQUNELHlCQUFPLEEsTUFBTSxBQUNUO2FBQUEsQUFBSyxLQUFMLEFBQVUsRUFBVixBQUFZLGNBQWMsS0FBQSxBQUFLLEtBQS9CLEFBQTBCLEFBQVUsQUFDdkM7QTs7aUMsQUFDRCwrQixBQUFVLE9BQU8sQUFDYjthQUFBLEFBQUssS0FBTCxBQUFVLEVBQVYsQUFBWSxpQkFBaUIsS0FBQSxBQUFLLE1BQWxDLEFBQTZCLEFBQVcsQUFDM0M7QTs7aUMsQUFDRCw2QyxBQUFpQixRQUFRLEFBQ3JCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLHdCQUF3QixLQUFBLEFBQUssTUFBMUMsQUFBcUMsQUFBVyxBQUNuRDtBOztpQ0FDRCxBLHVCLEFBQU0sTUFBTSxBQUNSO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLGFBQWIsQUFBMEIsQUFDN0I7QTs7aUNBQ0QsQSx1QkFBTyxBQUNIO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDQUNELEEsNEJBQVMsQUFDTDthQUFBLEFBQUssS0FBTCxBQUFVLEdBQVYsQUFBYSxBQUNoQjtBOztpQ0FDRCxBLGlDQUFZLEFBQ1I7YUFBQSxBQUFLLEtBQUwsQUFBVSxHQUFWLEFBQWEsQUFDaEI7QTs7aUNBQ0QsQSwrQkFBVyxBQUNQO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDLEFBQ0QscURBQXNCLEFBQ2xCO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLEFBQ2hCO0E7O2lDQUNELEEsdUNBQWMsQSxTQUFTLEFBQ25CO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLHFCQUFxQixLQUFBLEFBQUssTUFBdkMsQUFBa0MsQUFBVyxBQUNoRDtBOztpQyxBQUNELHFDQUFhLEEsT0FBd0I7WUFBakIsQUFBaUIsa0ZBQUgsQUFBRztZQUFBLEFBQzNCLGFBQWUsTUFEWSxBQUNOLFlBRE0sQUFDM0IsQUFDTjs7WUFBSSxjQUFjLFdBQWxCLEFBQTZCLEFBQzdCO1lBQUksUUFBUSxLQUFBLEFBQUssSUFBTCxBQUFTLGFBQXJCLEFBQVksQUFBc0IsQUFDbEM7YUFBQSxBQUFLLEFBQ0w7WUFBQSxBQUFJLE9BQU8sQUFDUDtpQkFBQSxBQUFLLEFBQ0w7aUJBQUssSUFBSSxJQUFULEFBQWEsR0FBRyxJQUFoQixBQUFvQixPQUFwQixBQUEyQixLQUFLLEFBQzVCO3FCQUFBLEFBQUssSUFBSSxrQkFBVCxBQUFrQixJQUFJLGNBQXRCLEFBQW9DLEFBQ3BDO3FCQUFBLEFBQUssWUFBWSxXQUFqQixBQUFpQixBQUFXLEFBQy9CO0FBQ0o7QUFDRDtZQUFJLFNBQVMsS0FBQSxBQUFLLFVBQUwsQUFBZSxNQUE1QixBQUFhLEFBQXFCLEFBQ2xDO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLG9CQUFiLEFBQWlDLEFBQ2pDO1lBQUEsQUFBSSxPQUFPLEFBQ1A7aUJBQUEsQUFBSyxBQUNSO0FBQ0Q7YUFBQSxBQUFLLEFBQ1I7QTs7aUNBQ0QsQSxxQkFBSyxBLFVBQVUsQUFDWDtZQUFJLGFBQUosQUFDQTtZQUFJLGFBQUosQUFBaUIsU0FBUyxBQUN0QjtvQkFBUSxHQUFSLEFBQVcsQUFDZDtBQUZELG1CQUVXLGFBQUosQUFBaUIsVUFBVSxBQUM5QjtvQkFBUSxHQUFSLEFBQVcsQUFDZDtBQUZNLFNBQUEsVUFFSSxhQUFKLEFBQWlCLGVBQWUsQUFDbkM7b0JBQVEsR0FBUixBQUFXLEFBQ2Q7QUFGTSxTQUFBLFVBRUksT0FBQSxBQUFPLGFBQVgsQUFBd0IsWUFBWSxBQUN2QztvQkFBQSxBQUFRLEFBQ1g7QUFGTSxTQUFBLE1BRUEsQUFDSDtrQkFBTSxJQUFBLEFBQUksTUFBVixBQUFNLEFBQVUsQUFDbkI7QUFDRDtZQUFJLE9BQU8sS0FBQSxBQUFLLFVBQUwsQUFBZSxTQUExQixBQUFXLEFBQXdCLEFBQ25DO2FBQUEsQUFBSyxLQUFMLEFBQVUsR0FBVixBQUFhLFlBQWIsQUFBeUIsQUFDNUI7QTs7aUMsQUFDRCxxQkFBSyxBLFFBQVEsQUFDVDthQUFBLEFBQUssUUFBTCxBQUFhLEdBQWIsQUFBZ0IsQUFDaEI7YUFBQSxBQUFLLE9BQUwsQUFBWSxPQUFPLEtBQW5CLEFBQXdCLEtBQXhCLEFBQTZCLEdBQTdCLEFBQWdDLFlBQWhDLEFBQTRDLEFBQy9DO0E7O2lDQUNELEEseUJBQU8sQSxRQUFRLEFBQ1g7YUFBQSxBQUFLLFFBQUwsQUFBYSxHQUFiLEFBQWdCLEFBQ2hCO2FBQUEsQUFBSyxPQUFMLEFBQVksT0FBTyxLQUFuQixBQUF3QixLQUF4QixBQUE2QixHQUE3QixBQUFnQyxjQUFoQyxBQUE4QyxBQUNqRDtBOztpQ0FDRCxBLGlDLEFBQVcsUUFBUSxBQUNmO2FBQUEsQUFBSyxRQUFMLEFBQWEsR0FBYixBQUFnQixBQUNoQjthQUFBLEFBQUssT0FBTCxBQUFZLE9BQU8sS0FBbkIsQUFBd0IsS0FBeEIsQUFBNkIsR0FBN0IsQUFBZ0Msa0JBQWhDLEFBQWtELEFBQ3JEO0E7O2lDQUNELEEseUIsQUFBTyxTQUFTLEFBQ1o7ZUFBTyxLQUFBLEFBQUssVUFBTCxBQUFlLE9BQXRCLEFBQU8sQUFBc0IsQUFDaEM7QTs7aUMsQUFDRCx1QkFBTSxBLEtBQUssQUFDUDtlQUFPLEtBQUEsQUFBSyxVQUFMLEFBQWUsTUFBdEIsQUFBTyxBQUFxQixBQUMvQjtBOztpQyxBQUNELHVCQUFNLEEsUUFBUSxBQUNWO1lBQUksUUFBSixBQUFZLEFBQ1o7YUFBSyxJQUFJLElBQVQsQUFBYSxHQUFHLElBQUksT0FBcEIsQUFBMkIsUUFBM0IsQUFBbUMsS0FBSyxBQUNwQztnQkFBSSxJQUFJLE9BQVIsQUFBUSxBQUFPLEFBQ2Y7a0JBQUEsQUFBTSxLQUFLLEtBQUEsQUFBSyxVQUFMLEFBQWUsT0FBMUIsQUFBVyxBQUFzQixBQUNwQztBQUNEO2VBQU8sS0FBQSxBQUFLLFVBQUwsQUFBZSxNQUF0QixBQUFPLEFBQXFCLEFBQy9CO0E7O2lDQUNELEEsMkIsQUFBUSxVQUFTLEFBQ2I7ZUFBTyxLQUFBLEFBQUssVUFBTCxBQUFlLE1BQXRCLEFBQU8sQUFBcUIsQUFDL0I7QTs7aUNBQ0QsQSx1QixBQUFNLE9BQU8sQUFDVDtlQUFPLEtBQUEsQUFBSyxVQUFMLEFBQWUsTUFBdEIsQUFBTyxBQUFxQixBQUMvQjtBOztpQ0FDRCxBLHVCLEFBQU0sU0FBTyxBQUNUO2VBQU8sVUFBUSxLQUFBLEFBQUssVUFBTCxBQUFlLE1BQXZCLEFBQVEsQUFBcUIsV0FBcEMsQUFBNkMsQUFDaEQ7QTs7aUMsQUFDRCxxQixBQUFLLFFBQU0sQUFDUDtlQUFPLEtBQUEsQUFBSyxVQUFMLEFBQWUsU0FBdEIsQUFBTyxBQUF3QixBQUNsQztBOzs7O3lCQXRXUyxBQUNOO21CQUFPLG1CQUFRLEtBQUEsQUFBSyxLQUFwQixBQUFPLEFBQVEsQUFBVSxBQUM1Qjs7Ozt5QkFDYSxBQUNWO21CQUFPLEtBQUEsQUFBSyxLQUFaLEFBQU8sQUFBVSxBQUNwQjs7Ozt5QkF1QlksQUFDVDttQkFBYyxLQUFBLEFBQUssWUFBbkIsQUFBK0IsQUFDbEM7Ozs7Ozs7Ozs7QUEwVUwsU0FBQSxBQUFTLHVCQUFULEFBQWdDLE1BQU0sQUFDbEM7V0FBTyxPQUFBLEFBQU8sU0FBUCxBQUFnQixZQUFZLFNBQTVCLEFBQXFDLFFBQVEsT0FBTyxLQUFQLEFBQVksWUFBaEUsQUFBNEUsQUFDL0U7OztJQUNvQixBOzZCQUNqQjs7MkJBQUEsQUFBWSxLQUFaLEFBQWlCLE1BQTZCO1lBQXZCLEFBQXVCLDhFQUFiLElBQUksQUFBUzs7OEJBQUE7O3FEQUMxQywrQkFBQSxBQUFNLEtBQU4sQUFBVyxNQUQrQixBQUMxQyxBQUFpQixBQUNqQjs7Y0FBQSxBQUFLLFlBQVksQUFBSSwrQkFGcUIsQUFFMUM7ZUFDSDs7OzRCQUNELEEsbUNBQVksQSxRQUFRLEEsTSxBQUFNLFdBQVcsQUFDakM7WUFBSSxhQUFKLEFBQWlCLEFBQ2pCO1lBQUEsQUFBSSxRQUFRLEFBQ1I7aUJBQUssSUFBSSxJQUFULEFBQWEsR0FBRyxJQUFJLE9BQXBCLEFBQTJCLFFBQTNCLEFBQW1DLEtBQUssQUFDcEM7cUNBQUssT0FBTCxBQUFLLEFBQU8sSUFBWixBQUFnQixBQUNuQjtBQUNEO3lCQUFhLE9BQWIsQUFBb0IsQUFDdkI7QUFDRDthQUFBLEFBQUssY0FBTCxBQUFtQixBQUNuQjtZQUFBLEFBQUksQUFBUSxBQUNaO1lBQUEsQUFBSSxNQUFNLEFBQ047b0JBQVEsS0FBUixBQUFRLEFBQUssQUFDYjtnQkFBSSxNQUFNLEtBQVYsQUFBVSxBQUFLLEFBQ2Y7aUJBQUssSUFBSSxLQUFULEFBQWEsR0FBRyxLQUFJLElBQXBCLEFBQXdCLFFBQXhCLEFBQWdDLE1BQUssQUFDakM7cUNBQUssSUFBTCxBQUFLLEFBQUksS0FBVCxBQUFhLEFBQ2hCO0FBQ0o7QUFDRDthQUFBLEFBQUssY0FBTCxBQUFtQixBQUNuQjthQUFBLEFBQUssU0FBTCxBQUFjLEFBQ2pCO0E7OzRCQUNELEEsMkJBQVEsQSxNQUFNLEFBQ1Y7WUFBSSx1QkFBSixBQUFJLEFBQXVCLE9BQU8sQUFDOUI7bUJBQU8sS0FBQSxBQUFLLFFBQVosQUFBTyxBQUFhLEFBQ3ZCO0FBRkQsZUFFTyxBQUNIO21CQUFBLEFBQU8sQUFDVjtBQUNKO0E7OzRCQUNELEEsdUNBQWMsQSxZQUFZLEEsVUFBVSxBQUNoQzthQUFBLEFBQUssQUFDTDthQUFBLEFBQUssQUFDTDthQUFBLEFBQUssU0FBTCxBQUFjLEFBQ2Q7NkJBQUEsQUFBSyxZQUFMLEFBQWlCLEFBQ2pCO2FBQUEsQUFBSyxBQUNMO2FBQUEsQUFBSyxLQUFLLHFCQUFhLEFBQ25CO21CQUFPLHdDQUFBLEFBQStCLE9BQXRDLEFBQU8sQUFBc0MsQUFDaEQ7QUFGRCxBQUdBO2FBQUEsQUFBSyxNQUFMLEFBQVcsQUFDWDthQUFBLEFBQUssV0FBTCxBQUFnQixBQUNoQjthQUFBLEFBQUssQUFDTDthQUFBLEFBQUssZ0JBQUwsQUFBcUIsTUFBckIsQUFBMkIsTUFBM0IsQUFBaUMsTUFBakMsQUFBdUMsTUFBdkMsQUFBNkMsQUFDN0M7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLE1BQUwsQUFBVyxBQUNYO1lBQUEsQUFBSSxVQUFVLEFBQ1Y7aUJBQUEsQUFBSyxBQUNSO0FBRkQsZUFFTyxBQUNIO2lCQUFBLEFBQUssQUFDUjtBQUNEO2FBQUEsQUFBSyxBQUNMO2FBQUEsQUFBSyxBQUNMO2FBQUEsQUFBSyxNQUFMLEFBQVcsQUFDWDthQUFBLEFBQUssQUFDTDthQUFBLEFBQUssQUFDUjtBOzs0QixBQUNELDJDQUFnQixBLE9BQU8sQSxRQUFRLEEsTUFBTSxBLE9BQXVCO1lBQWhCLEFBQWdCLDhFQUFOLEFBQU0sQUFDeEQ7O2FBQUEsQUFBSyxNQUFNLGtCQUFYLEFBQW9CLEFBQ3BCO2FBQUEsQUFBSyxJQUFJLGtCQUFULEFBQWtCLElBQWxCLEFBQXNCLEFBQ3RCO2FBQUEsQUFBSyxLQUFLLGtCQUFWLEFBQW1CLEFBQ25CO2FBQUEsQUFBSyxVQUFMLEFBQWUsQUFDZjthQUFBLEFBQUssVUFBTCxBQUFlLEFBQ2Y7YUFBQSxBQUFLLFlBQUwsQUFBaUIsUUFBakIsQUFBeUIsTUFBekIsQUFBK0IsQUFDL0I7YUFBQSxBQUFLLFlBQVksa0JBQWpCLEFBQTBCLEFBQzFCO2FBQUEsQUFBSyxBQUNMO2FBQUEsQUFBSyxBQUNMO2FBQUEsQUFBSyxnQkFBZ0Isa0JBQXJCLEFBQThCLElBQUksVUFBbEMsQUFBNEMsTUFBTSxZQUFsRCxBQUE4RCxBQUM5RDthQUFBLEFBQUssNEJBQTRCLGtCQUFqQyxBQUEwQyxBQUMxQzthQUFBLEFBQUssaUJBQWlCLGtCQUF0QixBQUErQixBQUMvQjthQUFBLEFBQUssbUJBQW1CLGtCQUF4QixBQUFpQyxBQUNqQzthQUFBLEFBQUssY0FBYyxBQUFJLG1DQUFvQixTQUFTLE1BQXBELEFBQW1CLEFBQWlDLEFBQU0sQUFDMUQ7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEFBQ0w7YUFBQSxBQUFLLEtBQUssa0JBQVYsQUFBbUIsQUFDdEI7QTs7NEIsQUFDRCw2QkFBUyxBLE9BQU8sQUFDWjtZQUFJLENBQUosQUFBSyxPQUFPLE9BQUEsQUFBTyxBQUNuQjtlQUFPLEFBQUksdUJBQWUsS0FBbkIsQUFBd0IsTUFBTSxNQUE5QixBQUFvQyxZQUFZLE1BQXZELEFBQU8sQUFBc0QsQUFDaEU7QTs7O0VBbkZzQyxBOztrQkFBdEIsQSIsImZpbGUiOiJsaWIvY29tcGlsZWQvb3Bjb2Rlcy9idWlsZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGljdCwgRU1QVFlfQVJSQVksIGV4cGVjdCwgZmlsbE51bGxzLCBTdGFjaywgdHlwZVBvcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50QnVpbGRlciB9IGZyb20gJy4uLy4uL2NvbXBpbGVyJztcbmltcG9ydCB7IFJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBleHByLCBJbnZva2VEeW5hbWljTGF5b3V0IH0gZnJvbSAnLi4vLi4vc3ludGF4L2Z1bmN0aW9ucyc7XG5pbXBvcnQgUmF3SW5saW5lQmxvY2sgZnJvbSAnLi4vLi4vc3ludGF4L3Jhdy1ibG9jayc7XG5pbXBvcnQgeyBJc0NvbXBvbmVudERlZmluaXRpb25SZWZlcmVuY2UgfSBmcm9tICcuLi9vcGNvZGVzL2NvbnRlbnQnO1xuaW1wb3J0ICogYXMgY29udGVudCBmcm9tICcuL2NvbnRlbnQnO1xuaW1wb3J0ICogYXMgdm0gZnJvbSAnLi92bSc7XG5jbGFzcyBMYWJlbHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxhYmVscyA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy50YXJnZXRzID0gW107XG4gICAgfVxuICAgIGxhYmVsKG5hbWUsIGluZGV4KSB7XG4gICAgICAgIHRoaXMubGFiZWxzW25hbWVdID0gaW5kZXg7XG4gICAgfVxuICAgIHRhcmdldChhdCwgVGFyZ2V0LCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy50YXJnZXRzLnB1c2goeyBhdCwgVGFyZ2V0LCB0YXJnZXQgfSk7XG4gICAgfVxuICAgIHBhdGNoKHByb2dyYW0pIHtcbiAgICAgICAgbGV0IHsgdGFyZ2V0cywgbGFiZWxzIH0gPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IGF0LCB0YXJnZXQgfSA9IHRhcmdldHNbaV07XG4gICAgICAgICAgICBsZXQgZ290byA9IGxhYmVsc1t0YXJnZXRdIC0gYXQ7XG4gICAgICAgICAgICBwcm9ncmFtLmhlYXAuc2V0YnlhZGRyKGF0ICsgMSwgZ290byk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQmFzaWNPcGNvZGVCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYsIG1ldGEsIHByb2dyYW0pIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIHRoaXMubGFiZWxzU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMgPSBwcm9ncmFtLmNvbnN0YW50cztcbiAgICAgICAgdGhpcy5oZWFwID0gcHJvZ3JhbS5oZWFwO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5oZWFwLm1hbGxvYygpO1xuICAgIH1cbiAgICBnZXQgcG9zKCkge1xuICAgICAgICByZXR1cm4gdHlwZVBvcyh0aGlzLmhlYXAuc2l6ZSgpKTtcbiAgICB9XG4gICAgZ2V0IG5leHRQb3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuc2l6ZSgpO1xuICAgIH1cbiAgICB1cHZhcnMoY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGZpbGxOdWxscyhjb3VudCk7XG4gICAgfVxuICAgIHJlc2VydmUobmFtZSkge1xuICAgICAgICB0aGlzLnB1c2gobmFtZSwgMCwgMCwgMCk7XG4gICAgfVxuICAgIHB1c2gobmFtZSwgb3AxID0gMCwgb3AyID0gMCwgb3AzID0gMCkge1xuICAgICAgICB0aGlzLmhlYXAucHVzaChuYW1lKTtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gob3AxKTtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gob3AyKTtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gob3AzKTtcbiAgICB9XG4gICAgZmluYWxpemUoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyMiAvKiBSZXR1cm4gKi8pO1xuICAgICAgICB0aGlzLmhlYXAuZmluaXNoTWFsbG9jKHRoaXMuc3RhcnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydDtcbiAgICB9XG4gICAgLy8gYXJnc1xuICAgIHB1c2hBcmdzKHN5bnRoZXRpYykge1xuICAgICAgICB0aGlzLnB1c2goNTggLyogUHVzaEFyZ3MgKi8sIHN5bnRoZXRpYyA9PT0gdHJ1ZSA/IDEgOiAwKTtcbiAgICB9XG4gICAgLy8gaGVscGVyc1xuICAgIGdldCBsYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5sYWJlbHNTdGFjay5jdXJyZW50LCAnYnVnOiBub3QgaW4gYSBsYWJlbCBzdGFjaycpO1xuICAgIH1cbiAgICBzdGFydExhYmVscygpIHtcbiAgICAgICAgdGhpcy5sYWJlbHNTdGFjay5wdXNoKG5ldyBMYWJlbHMoKSk7XG4gICAgfVxuICAgIHN0b3BMYWJlbHMoKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IGV4cGVjdCh0aGlzLmxhYmVsc1N0YWNrLnBvcCgpLCAndW5iYWxhbmNlZCBwdXNoIGFuZCBwb3AgbGFiZWxzJyk7XG4gICAgICAgIGxhYmVsLnBhdGNoKHRoaXMucHJvZ3JhbSk7XG4gICAgfVxuICAgIC8vIGNvbXBvbmVudHNcbiAgICBwdXNoQ29tcG9uZW50TWFuYWdlcihkZWZpbml0aW9uKSB7XG4gICAgICAgIHRoaXMucHVzaCg1NiAvKiBQdXNoQ29tcG9uZW50TWFuYWdlciAqLywgdGhpcy5vdGhlcihkZWZpbml0aW9uKSk7XG4gICAgfVxuICAgIHB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlcigpIHtcbiAgICAgICAgdGhpcy5wdXNoKDU3IC8qIFB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlciAqLyk7XG4gICAgfVxuICAgIHByZXBhcmVBcmdzKHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg1OSAvKiBQcmVwYXJlQXJncyAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBjcmVhdGVDb21wb25lbnQoc3RhdGUsIGhhc0RlZmF1bHQsIGhhc0ludmVyc2UpIHtcbiAgICAgICAgbGV0IGZsYWcgPSAoaGFzRGVmYXVsdCA9PT0gdHJ1ZSA/IDEgOiAwKSB8IChoYXNJbnZlcnNlID09PSB0cnVlID8gMSA6IDApIDw8IDE7XG4gICAgICAgIHRoaXMucHVzaCg2MCAvKiBDcmVhdGVDb21wb25lbnQgKi8sIGZsYWcsIHN0YXRlKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg2MSAvKiBSZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3IgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgYmVnaW5Db21wb25lbnRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wdXNoKDY1IC8qIEJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24gKi8pO1xuICAgIH1cbiAgICBjb21taXRDb21wb25lbnRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wdXNoKDY2IC8qIENvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uICovKTtcbiAgICB9XG4gICAgcHVzaENvbXBvbmVudE9wZXJhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMucHVzaCg2MiAvKiBQdXNoQ29tcG9uZW50T3BlcmF0aW9ucyAqLyk7XG4gICAgfVxuICAgIGdldENvbXBvbmVudFNlbGYoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDYzIC8qIEdldENvbXBvbmVudFNlbGYgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgZ2V0Q29tcG9uZW50TGF5b3V0KHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg2NCAvKiBHZXRDb21wb25lbnRMYXlvdXQgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgZGlkQ3JlYXRlRWxlbWVudChzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjcgLyogRGlkQ3JlYXRlRWxlbWVudCAqLywgc3RhdGUpO1xu