UNPKG

ember-legacy-class-transform

Version:
652 lines (521 loc) 66.5 kB
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"); } } import { dict, EMPTY_ARRAY, fillNulls, Stack, typePos } from '@glimmer/util'; import { ComponentBuilder } from '../../compiler'; import { Register } from '../../opcodes'; import { expr, InvokeDynamicLayout } from '../../syntax/functions'; import RawInlineBlock from '../../syntax/raw-block'; import { IsComponentDefinitionReference } from '../opcodes/content'; import * as content from './content'; import * as vm from './vm'; var Labels = function () { function Labels() { _classCallCheck(this, Labels); this.labels = 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 Stack(); this.constants = program.constants; this.heap = program.heap; this.start = this.heap.malloc(); } BasicOpcodeBuilder.prototype.upvars = function upvars(count) { return 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] : 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(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 typePos(this.heap.size()); } }, { key: 'nextPos', get: function () { return this.heap.size(); } }, { key: 'labels', get: function () { return this.labelsStack.current; } }]); return BasicOpcodeBuilder; }(); export { 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 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++) { expr(params[i], this); } positional = params.length; } this.pushImmediate(positional); var names = EMPTY_ARRAY; if (hash) { names = hash[0]; var val = hash[1]; for (var _i = 0; _i < val.length; _i++) { 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'); expr(expression, this); this.dup(); this.test(function (reference) { return 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(Register.s0); this.dup(Register.sp, 1); this.load(Register.s0); this.pushBlock(block); this.pushBlock(inverse); this.compileArgs(params, hash, false); this.prepareArgs(Register.s0); this.beginComponentTransaction(); this.pushDynamicScope(); this.createComponent(Register.s0, block !== null, inverse !== null); this.registerComponentDestructor(Register.s0); this.getComponentSelf(Register.s0); this.getComponentLayout(Register.s0); this.invokeDynamic(new InvokeDynamicLayout(attrs && attrs.scan())); this.popFrame(); this.popScope(); this.popDynamicScope(); this.commitComponentTransaction(); this.load(Register.s0); }; OpcodeBuilder.prototype.template = function template(block) { if (!block) return null; return new RawInlineBlock(this.meta, block.statements, block.parameters); }; return OpcodeBuilder; }(BasicOpcodeBuilder); export default OpcodeBuilder; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiZmlsbE51bGxzIiwiU3RhY2siLCJ0eXBlUG9zIiwiQ29tcG9uZW50QnVpbGRlciIsIlJlZ2lzdGVyIiwiZXhwciIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJSYXdJbmxpbmVCbG9jayIsIklzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSIsImNvbnRlbnQiLCJ2bSIsIkxhYmVscyIsImxhYmVscyIsInRhcmdldHMiLCJsYWJlbCIsIm5hbWUiLCJpbmRleCIsInRhcmdldCIsImF0IiwiVGFyZ2V0IiwicHVzaCIsInBhdGNoIiwicHJvZ3JhbSIsImkiLCJsZW5ndGgiLCJnb3RvIiwiaGVhcCIsInNldGJ5YWRkciIsIkJhc2ljT3Bjb2RlQnVpbGRlciIsImVudiIsIm1ldGEiLCJsYWJlbHNTdGFjayIsImNvbnN0YW50cyIsInN0YXJ0IiwibWFsbG9jIiwidXB2YXJzIiwiY291bnQiLCJyZXNlcnZlIiwib3AxIiwib3AyIiwib3AzIiwiZmluYWxpemUiLCJmaW5pc2hNYWxsb2MiLCJwdXNoQXJncyIsInN5bnRoZXRpYyIsInN0YXJ0TGFiZWxzIiwic3RvcExhYmVscyIsInBvcCIsInB1c2hDb21wb25lbnRNYW5hZ2VyIiwiZGVmaW5pdGlvbiIsIm90aGVyIiwicHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyIiwicHJlcGFyZUFyZ3MiLCJzdGF0ZSIsImNyZWF0ZUNvbXBvbmVudCIsImhhc0RlZmF1bHQiLCJoYXNJbnZlcnNlIiwiZmxhZyIsInJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvciIsImJlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24iLCJjb21taXRDb21wb25lbnRUcmFuc2FjdGlvbiIsInB1c2hDb21wb25lbnRPcGVyYXRpb25zIiwiZ2V0Q29tcG9uZW50U2VsZiIsImdldENvbXBvbmVudExheW91dCIsImRpZENyZWF0ZUVsZW1lbnQiLCJkaWRSZW5kZXJMYXlvdXQiLCJnZXRQYXJ0aWFsVGVtcGxhdGUiLCJyZXNvbHZlTWF5YmVMb2NhbCIsInN0cmluZyIsImRlYnVnZ2VyIiwic3ltYm9scyIsImV2YWxJbmZvIiwiYXJyYXkiLCJkeW5hbWljQ29udGVudCIsIk9wY29kZSIsImNhdXRpb3VzQXBwZW5kIiwiT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUiLCJ0cnVzdGluZ0FwcGVuZCIsIk9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlIiwidGV4dCIsIm9wZW5QcmltaXRpdmVFbGVtZW50IiwidGFnIiwib3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyIsIm9wZW5EeW5hbWljRWxlbWVudCIsImZsdXNoRWxlbWVudCIsImNsb3NlRWxlbWVudCIsInN0YXRpY0F0dHIiLCJfbmFtZSIsIl9uYW1lc3BhY2UiLCJfdmFsdWUiLCJuYW1lc3BhY2UiLCJ2YWx1ZSIsImR5bmFtaWNBdHRyTlMiLCJ0cnVzdGluZyIsImR5bmFtaWNBdHRyIiwiY29tbWVudCIsIl9jb21tZW50IiwibW9kaWZpZXIiLCJfZGVmaW5pdGlvbiIsInB1dEl0ZXJhdG9yIiwiZW50ZXJMaXN0IiwicG9zIiwiZXhpdExpc3QiLCJpdGVyYXRlIiwiYnJlYWtzIiwic2V0VmFyaWFibGUiLCJzeW1ib2wiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5Iiwia2V5IiwiZ2V0QmxvY2siLCJoYXNCbG9jayIsImhhc0Jsb2NrUGFyYW1zIiwiY29uY2F0Iiwic2l6ZSIsImZ1bmN0aW9uIiwiZiIsImZ1bmMiLCJsb2FkIiwicmVnaXN0ZXIiLCJmZXRjaCIsImR1cCIsInNwIiwib2Zmc2V0IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwibmV4dFBvcyIsInB1c2hSb290U2NvcGUiLCJiaW5kQ2FsbGVyU2NvcGUiLCJwdXNoQ2hpbGRTY29wZSIsInBvcFNjb3BlIiwicmV0dXJuVG8iLCJwdXNoRHluYW1pY1Njb3BlIiwicG9wRHluYW1pY1Njb3BlIiwicHVzaEltbWVkaWF0ZSIsInByaW1pdGl2ZSIsIl9wcmltaXRpdmUiLCJmbG9hdCIsIkVycm9yIiwiaGVscGVyIiwicHVzaEJsb2NrIiwiYmxvY2siLCJiaW5kRHluYW1pY1Njb3BlIiwiX25hbWVzIiwibmFtZXMiLCJlbnRlciIsImFyZ3MiLCJleGl0IiwicmV0dXJuIiwicHVzaEZyYW1lIiwicG9wRnJhbWUiLCJjb21waWxlRHluYW1pY0Jsb2NrIiwiaW52b2tlRHluYW1pYyIsImludm9rZXIiLCJpbnZva2VTdGF0aWMiLCJjYWxsZXJDb3VudCIsInBhcmFtZXRlcnMiLCJzeW1ib2xUYWJsZSIsImNhbGxlZUNvdW50IiwiTWF0aCIsIm1pbiIsImZwIiwiX2Jsb2NrIiwidGVzdCIsInRlc3RGdW5jIiwiX2Z1bmMiLCJDb25zdFRlc3QiLCJTaW1wbGVUZXN0IiwiRW52aXJvbm1lbnRUZXN0IiwianVtcCIsImp1bXBJZiIsImp1bXBVbmxlc3MiLCJfc3RyaW5nIiwibnVtIiwibiIsImN1cnJlbnQiLCJpc0NvbXBpbGFibGVFeHByZXNzaW9uIiwiY29tcGlsZSIsIk9wY29kZUJ1aWxkZXIiLCJjb21wb25lbnQiLCJjb21waWxlQXJncyIsInBhcmFtcyIsImhhc2giLCJwb3NpdGlvbmFsIiwidmFsIiwiZ3VhcmRlZEFwcGVuZCIsImV4cHJlc3Npb24iLCJjcmVhdGUiLCJyZWZlcmVuY2UiLCJpbnZva2VDb21wb25lbnQiLCJhdHRycyIsImludmVyc2UiLCJzMCIsInNjYW4iLCJ0ZW1wbGF0ZSIsInN0YXRlbWVudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxJQUFULEVBQWVDLFdBQWYsRUFBb0NDLFNBQXBDLEVBQStDQyxLQUEvQyxFQUFzREMsT0FBdEQsUUFBcUUsZUFBckU7QUFDQSxTQUFTQyxnQkFBVCxRQUFpQyxnQkFBakM7QUFDQSxTQUFTQyxRQUFULFFBQXlCLGVBQXpCO0FBQ0EsU0FBU0MsSUFBVCxFQUFlQyxtQkFBZixRQUEwQyx3QkFBMUM7QUFDQSxPQUFPQyxjQUFQ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ci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpY3QsIEVNUFRZX0FSUkFZLCBleHBlY3QsIGZpbGxOdWxscywgU3RhY2ssIHR5cGVQb3MgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9jb21waWxlcic7XG5pbXBvcnQgeyBSZWdpc3RlciB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgZXhwciwgSW52b2tlRHluYW1pY0xheW91dCB9IGZyb20gJy4uLy4uL3N5bnRheC9mdW5jdGlvbnMnO1xuaW1wb3J0IFJhd0lubGluZUJsb2NrIGZyb20gJy4uLy4uL3N5bnRheC9yYXctYmxvY2snO1xuaW1wb3J0IHsgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlIH0gZnJvbSAnLi4vb3Bjb2Rlcy9jb250ZW50JztcbmltcG9ydCAqIGFzIGNvbnRlbnQgZnJvbSAnLi9jb250ZW50JztcbmltcG9ydCAqIGFzIHZtIGZyb20gJy4vdm0nO1xuY2xhc3MgTGFiZWxzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sYWJlbHMgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMudGFyZ2V0cyA9IFtdO1xuICAgIH1cbiAgICBsYWJlbChuYW1lLCBpbmRleCkge1xuICAgICAgICB0aGlzLmxhYmVsc1tuYW1lXSA9IGluZGV4O1xuICAgIH1cbiAgICB0YXJnZXQoYXQsIFRhcmdldCwgdGFyZ2V0KSB7XG4gICAgICAgIHRoaXMudGFyZ2V0cy5wdXNoKHsgYXQsIFRhcmdldCwgdGFyZ2V0IH0pO1xuICAgIH1cbiAgICBwYXRjaChwcm9ncmFtKSB7XG4gICAgICAgIGxldCB7IHRhcmdldHMsIGxhYmVscyB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBhdCwgdGFyZ2V0IH0gPSB0YXJnZXRzW2ldO1xuICAgICAgICAgICAgbGV0IGdvdG8gPSBsYWJlbHNbdGFyZ2V0XSAtIGF0O1xuICAgICAgICAgICAgcHJvZ3JhbS5oZWFwLnNldGJ5YWRkcihhdCArIDEsIGdvdG8pO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEJhc2ljT3Bjb2RlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZW52LCBtZXRhLCBwcm9ncmFtKSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB0aGlzLmxhYmVsc1N0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzID0gcHJvZ3JhbS5jb25zdGFudHM7XG4gICAgICAgIHRoaXMuaGVhcCA9IHByb2dyYW0uaGVhcDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMuaGVhcC5tYWxsb2MoKTtcbiAgICB9XG4gICAgZ2V0IHBvcygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVQb3ModGhpcy5oZWFwLnNpemUoKSk7XG4gICAgfVxuICAgIGdldCBuZXh0UG9zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFwLnNpemUoKTtcbiAgICB9XG4gICAgdXB2YXJzKGNvdW50KSB7XG4gICAgICAgIHJldHVybiBmaWxsTnVsbHMoY291bnQpO1xuICAgIH1cbiAgICByZXNlcnZlKG5hbWUpIHtcbiAgICAgICAgdGhpcy5wdXNoKG5hbWUsIDAsIDAsIDApO1xuICAgIH1cbiAgICBwdXNoKG5hbWUsIG9wMSA9IDAsIG9wMiA9IDAsIG9wMyA9IDApIHtcbiAgICAgICAgdGhpcy5oZWFwLnB1c2gobmFtZSk7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG9wMSk7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG9wMik7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG9wMyk7XG4gICAgfVxuICAgIGZpbmFsaXplKCkge1xuICAgICAgICB0aGlzLnB1c2goMjIgLyogUmV0dXJuICovKTtcbiAgICAgICAgdGhpcy5oZWFwLmZpbmlzaE1hbGxvYyh0aGlzLnN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQ7XG4gICAgfVxuICAgIC8vIGFyZ3NcbiAgICBwdXNoQXJncyhzeW50aGV0aWMpIHtcbiAgICAgICAgdGhpcy5wdXNoKDU4IC8qIFB1c2hBcmdzICovLCBzeW50aGV0aWMgPT09IHRydWUgPyAxIDogMCk7XG4gICAgfVxuICAgIC8vIGhlbHBlcnNcbiAgICBnZXQgbGFiZWxzKCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMubGFiZWxzU3RhY2suY3VycmVudCwgJ2J1Zzogbm90IGluIGEgbGFiZWwgc3RhY2snKTtcbiAgICB9XG4gICAgc3RhcnRMYWJlbHMoKSB7XG4gICAgICAgIHRoaXMubGFiZWxzU3RhY2sucHVzaChuZXcgTGFiZWxzKCkpO1xuICAgIH1cbiAgICBzdG9wTGFiZWxzKCkge1xuICAgICAgICBsZXQgbGFiZWwgPSBleHBlY3QodGhpcy5sYWJlbHNTdGFjay5wb3AoKSwgJ3VuYmFsYW5jZWQgcHVzaCBhbmQgcG9wIGxhYmVscycpO1xuICAgICAgICBsYWJlbC5wYXRjaCh0aGlzLnByb2dyYW0pO1xuICAgIH1cbiAgICAvLyBjb21wb25lbnRzXG4gICAgcHVzaENvbXBvbmVudE1hbmFnZXIoZGVmaW5pdGlvbikge1xuICAgICAgICB0aGlzLnB1c2goNTYgLyogUHVzaENvbXBvbmVudE1hbmFnZXIgKi8sIHRoaXMub3RoZXIoZGVmaW5pdGlvbikpO1xuICAgIH1cbiAgICBwdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIoKSB7XG4gICAgICAgIHRoaXMucHVzaCg1NyAvKiBQdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIgKi8pO1xuICAgIH1cbiAgICBwcmVwYXJlQXJncyhzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNTkgLyogUHJlcGFyZUFyZ3MgKi8sIHN0YXRlKTtcbiAgICB9XG4gICAgY3JlYXRlQ29tcG9uZW50KHN0YXRlLCBoYXNEZWZhdWx0LCBoYXNJbnZlcnNlKSB7XG4gICAgICAgIGxldCBmbGFnID0gKGhhc0RlZmF1bHQgPT09IHRydWUgPyAxIDogMCkgfCAoaGFzSW52ZXJzZSA9PT0gdHJ1ZSA/IDEgOiAwKSA8PCAxO1xuICAgICAgICB0aGlzLnB1c2goNjAgLyogQ3JlYXRlQ29tcG9uZW50ICovLCBmbGFnLCBzdGF0ZSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjEgLyogUmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIGJlZ