UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

389 lines (315 loc) 34.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateDynamicAttributeOpcode = exports.UpdateDynamicModifierOpcode = exports.UpdateModifierOpcode = void 0; var _reference = require("@glimmer/reference"); var _validator = require("@glimmer/validator"); var _vm = require("@glimmer/vm"); var _opcodes = require("../../opcodes"); var _vm2 = require("./vm"); var _symbols = require("../../symbols"); var _util = require("@glimmer/util"); var _curriedValue = require("../../curried-value"); var _env = require("@glimmer/env"); var _destroyable = require("@glimmer/destroyable"); _opcodes.APPEND_OPCODES.add(41 /* Text */ , (vm, { op1: text }) => { vm.elements().appendText(vm[_symbols.CONSTANTS].getValue(text)); }); _opcodes.APPEND_OPCODES.add(42 /* Comment */ , (vm, { op1: text }) => { vm.elements().appendComment(vm[_symbols.CONSTANTS].getValue(text)); }); _opcodes.APPEND_OPCODES.add(48 /* OpenElement */ , (vm, { op1: tag }) => { vm.elements().openElement(vm[_symbols.CONSTANTS].getValue(tag)); }); _opcodes.APPEND_OPCODES.add(49 /* OpenDynamicElement */ , vm => { let tagName = (0, _reference.valueForRef)(vm.stack.pop()); vm.elements().openElement(tagName); }); _opcodes.APPEND_OPCODES.add(50 /* PushRemoteElement */ , vm => { let elementRef = vm.stack.pop(); let insertBeforeRef = vm.stack.pop(); let guidRef = vm.stack.pop(); let element = (0, _reference.valueForRef)(elementRef); let insertBefore = (0, _reference.valueForRef)(insertBeforeRef); let guid = (0, _reference.valueForRef)(guidRef); if (!(0, _reference.isConstRef)(elementRef)) { vm.updateWith(new _vm2.Assert(elementRef)); } if (insertBefore !== undefined && !(0, _reference.isConstRef)(insertBeforeRef)) { vm.updateWith(new _vm2.Assert(insertBeforeRef)); } let block = vm.elements().pushRemoteElement(element, guid, insertBefore); if (block) vm.associateDestroyable(block); }); _opcodes.APPEND_OPCODES.add(56 /* PopRemoteElement */ , vm => { vm.elements().popRemoteElement(); }); _opcodes.APPEND_OPCODES.add(54 /* FlushElement */ , vm => { let operations = vm.fetchValue(_vm.$t0); let modifiers = null; if (operations) { modifiers = operations.flush(vm); vm.loadValue(_vm.$t0, null); } vm.elements().flushElement(modifiers); }); _opcodes.APPEND_OPCODES.add(55 /* CloseElement */ , vm => { let modifiers = vm.elements().closeElement(); if (modifiers) { modifiers.forEach(modifier => { vm.env.scheduleInstallModifier(modifier); let { manager, state } = modifier; let d = manager.getDestroyable(state); if (d) { vm.associateDestroyable(d); } }); } }); _opcodes.APPEND_OPCODES.add(57 /* Modifier */ , (vm, { op1: handle }) => { if (vm.env.isInteractive === false) { return; } let owner = vm.getOwner(); let args = vm.stack.pop(); let definition = vm[_symbols.CONSTANTS].getValue(handle); let { manager } = definition; let { constructing } = vm.elements(); let state = manager.create(owner, constructing, definition.state, args.capture()); let instance = { manager, state, definition }; let operations = vm.fetchValue(_vm.$t0); operations.addModifier(instance); let tag = manager.getTag(state); if (tag !== null) { (0, _validator.consumeTag)(tag); return vm.updateWith(new UpdateModifierOpcode(tag, instance)); } }); _opcodes.APPEND_OPCODES.add(108 /* DynamicModifier */ , vm => { if (vm.env.isInteractive === false) { return; } let { stack, [_symbols.CONSTANTS]: constants } = vm; let ref = stack.pop(); let args = stack.pop().capture(); let { constructing } = vm.elements(); let initialOwner = vm.getOwner(); let instanceRef = (0, _reference.createComputeRef)(() => { let value = (0, _reference.valueForRef)(ref); let owner; if (!(0, _util.isObject)(value)) { return; } let hostDefinition; if ((0, _curriedValue.isCurriedType)(value, 2 /* Modifier */ )) { let { definition: resolvedDefinition, owner: curriedOwner, positional, named } = (0, _curriedValue.resolveCurriedValue)(value); hostDefinition = resolvedDefinition; owner = curriedOwner; if (positional !== undefined) { args.positional = positional.concat(args.positional); } if (named !== undefined) { args.named = (0, _util.assign)({}, ...named, args.named); } } else { hostDefinition = value; owner = initialOwner; } let handle = constants.modifier(hostDefinition, null, true); if (_env.DEBUG && handle === null) { throw new Error(`Expected a dynamic modifier definition, but received an object or function that did not have a modifier manager associated with it. The dynamic invocation was \`{{${ref.debugLabel}}}\`, and the incorrect definition is the value at the path \`${ref.debugLabel}\`, which was: ${(0, _util.debugToString)(hostDefinition)}`); } let definition = constants.getValue(handle); let { manager } = definition; let state = manager.create(owner, constructing, definition.state, args); return { manager, state, definition }; }); let instance = (0, _reference.valueForRef)(instanceRef); let tag = null; if (instance !== undefined) { let operations = vm.fetchValue(_vm.$t0); operations.addModifier(instance); tag = instance.manager.getTag(instance.state); if (tag !== null) { (0, _validator.consumeTag)(tag); } } if (!(0, _reference.isConstRef)(ref) || tag) { return vm.updateWith(new UpdateDynamicModifierOpcode(tag, instance, instanceRef)); } }); class UpdateModifierOpcode { constructor(tag, modifier) { this.tag = tag; this.modifier = modifier; this.lastUpdated = (0, _validator.valueForTag)(tag); } evaluate(vm) { let { modifier, tag, lastUpdated } = this; (0, _validator.consumeTag)(tag); if (!(0, _validator.validateTag)(tag, lastUpdated)) { vm.env.scheduleUpdateModifier(modifier); this.lastUpdated = (0, _validator.valueForTag)(tag); } } } exports.UpdateModifierOpcode = UpdateModifierOpcode; class UpdateDynamicModifierOpcode { constructor(tag, instance, instanceRef) { this.tag = tag; this.instance = instance; this.instanceRef = instanceRef; this.lastUpdated = (0, _validator.valueForTag)(tag !== null && tag !== void 0 ? tag : _validator.CURRENT_TAG); } evaluate(vm) { let { tag, lastUpdated, instance, instanceRef } = this; let newInstance = (0, _reference.valueForRef)(instanceRef); if (newInstance !== instance) { if (instance !== undefined) { let destroyable = instance.manager.getDestroyable(instance.state); if (destroyable !== null) { (0, _destroyable.destroy)(destroyable); } } if (newInstance !== undefined) { let { manager, state } = newInstance; let destroyable = manager.getDestroyable(state); if (destroyable !== null) { (0, _destroyable.associateDestroyableChild)(this, destroyable); } tag = manager.getTag(state); if (tag !== null) { this.lastUpdated = (0, _validator.valueForTag)(tag); } this.tag = tag; vm.env.scheduleInstallModifier(newInstance); } this.instance = newInstance; } else if (tag !== null && !(0, _validator.validateTag)(tag, lastUpdated)) { vm.env.scheduleUpdateModifier(instance); this.lastUpdated = (0, _validator.valueForTag)(tag); } if (tag !== null) { (0, _validator.consumeTag)(tag); } } } exports.UpdateDynamicModifierOpcode = UpdateDynamicModifierOpcode; _opcodes.APPEND_OPCODES.add(51 /* StaticAttr */ , (vm, { op1: _name, op2: _value, op3: _namespace }) => { let name = vm[_symbols.CONSTANTS].getValue(_name); let value = vm[_symbols.CONSTANTS].getValue(_value); let namespace = _namespace ? vm[_symbols.CONSTANTS].getValue(_namespace) : null; vm.elements().setStaticAttribute(name, value, namespace); }); _opcodes.APPEND_OPCODES.add(52 /* DynamicAttr */ , (vm, { op1: _name, op2: _trusting, op3: _namespace }) => { let name = vm[_symbols.CONSTANTS].getValue(_name); let trusting = vm[_symbols.CONSTANTS].getValue(_trusting); let reference = vm.stack.pop(); let value = (0, _reference.valueForRef)(reference); let namespace = _namespace ? vm[_symbols.CONSTANTS].getValue(_namespace) : null; let attribute = vm.elements().setDynamicAttribute(name, value, trusting, namespace); if (!(0, _reference.isConstRef)(reference)) { vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute, vm.env)); } }); class UpdateDynamicAttributeOpcode { constructor(reference, attribute, env) { let initialized = false; this.updateRef = (0, _reference.createComputeRef)(() => { let value = (0, _reference.valueForRef)(reference); if (initialized === true) { attribute.update(value, env); } else { initialized = true; } }); (0, _reference.valueForRef)(this.updateRef); } evaluate() { (0, _reference.valueForRef)(this.updateRef); } } exports.UpdateDynamicAttributeOpcode = UpdateDynamicAttributeOpcode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUE2QkE7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQTRCLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXNCO0FBQ2hELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxVQUFBLENBQXlCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUF6QixJQUF5QixDQUF6QjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQStCLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXNCO0FBQ25ELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxhQUFBLENBQTRCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUE1QixJQUE0QixDQUE1QjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQW1DLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXFCO0FBQ3RELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxXQUFBLENBQTBCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUExQixHQUEwQixDQUExQjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQTJDLEVBQUQsSUFBTztBQUMvQyxNQUFJLE9BQU8sR0FBUyw0QkFBa0IsRUFBRSxDQUFGLEtBQUEsQ0FBdEMsR0FBc0MsRUFBbEIsQ0FBcEI7QUFDQSxFQUFBLEVBQUUsQ0FB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O0FBWEgsQ0FBQTs7QUFjTSxNQUFBLDRCQUFBLENBQW1DO0FBR3ZDLEVBQUEsV0FBQSxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsR0FBQSxFQUF3RjtBQUN0RixRQUFJLFdBQVcsR0FBZixLQUFBO0FBRUEsU0FBQSxTQUFBLEdBQWlCLGlDQUFpQixNQUFLO0FBQ3JDLFVBQUksS0FBSyxHQUFHLDRCQUFaLFNBQVksQ0FBWjs7QUFFQSxVQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLFFBQUEsU0FBUyxDQUFULE1BQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQTtBQURGLE9BQUEsTUFFTztBQUNMLFFBQUEsV0FBVyxHQUFYLElBQUE7QUFDRDtBQVBILEtBQWlCLENBQWpCO0FBVUEsZ0NBQVksS0FBWixTQUFBO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLEdBQUE7QUFDTixnQ0FBWSxLQUFaLFNBQUE7QUFDRDs7QUFyQnNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVmZXJlbmNlLCB2YWx1ZUZvclJlZiwgaXNDb25zdFJlZiwgY3JlYXRlQ29tcHV0ZVJlZiB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQge1xuICBSZXZpc2lvbixcbiAgVGFnLFxuICB2YWx1ZUZvclRhZyxcbiAgdmFsaWRhdGVUYWcsXG4gIGNvbnN1bWVUYWcsXG4gIENVUlJFTlRfVEFHLFxufSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIENoZWNrU3RyaW5nLFxuICBDaGVja0VsZW1lbnQsXG4gIENoZWNrT3B0aW9uLFxuICBDaGVja05vZGUsXG4gIENoZWNrTWF5YmUsXG59IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7XG4gIE9wLFxuICBPcHRpb24sXG4gIE1vZGlmaWVyRGVmaW5pdGlvbixcbiAgTW9kaWZpZXJJbnN0YW5jZSxcbiAgT3duZXIsXG4gIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgQ3VycmllZFR5cGUsXG4gIE1vZGlmaWVyRGVmaW5pdGlvblN0YXRlLFxuICBFbnZpcm9ubWVudCxcbiAgVXBkYXRpbmdWTSxcbiAgVXBkYXRpbmdPcGNvZGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgJHQwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuaW1wb3J0IHsgRHluYW1pY0F0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL3ZtL2F0dHJpYnV0ZXMvZHluYW1pYyc7XG5pbXBvcnQgeyBDaGVja1JlZmVyZW5jZSwgQ2hlY2tBcmd1bWVudHMsIENoZWNrT3BlcmF0aW9ucyB9IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgYXNzaWduLCBkZWJ1Z1RvU3RyaW5nLCBleHBlY3QsIGlzT2JqZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDdXJyaWVkVmFsdWUsIGlzQ3VycmllZFR5cGUsIHJlc29sdmVDdXJyaWVkVmFsdWUgfSBmcm9tICcuLi8uLi9jdXJyaWVkLXZhbHVlJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3kgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5UZXh0LCAodm0sIHsgb3AxOiB0ZXh0IH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5hcHBlbmRUZXh0KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGV4dCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21tZW50LCAodm0sIHsgb3AxOiB0ZXh0IH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5hcHBlbmRDb21tZW50KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGV4dCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5PcGVuRWxlbWVudCwgKHZtLCB7IG9wMTogdGFnIH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKHRhZykpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5PcGVuRHluYW1pY0VsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgdGFnTmFtZSA9IGNoZWNrKHZhbHVlRm9yUmVmKGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSkpLCBDaGVja1N0cmluZyk7XG4gIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodGFnTmFtZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hSZW1vdGVFbGVtZW50LCAodm0pID0+IHtcbiAgbGV0IGVsZW1lbnRSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgaW5zZXJ0QmVmb3JlUmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGd1aWRSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGxldCBlbGVtZW50ID0gY2hlY2sodmFsdWVGb3JSZWYoZWxlbWVudFJlZiksIENoZWNrRWxlbWVudCk7XG4gIGxldCBpbnNlcnRCZWZvcmUgPSBjaGVjayh2YWx1ZUZvclJlZihpbnNlcnRCZWZvcmVSZWYpLCBDaGVja01heWJlKENoZWNrT3B0aW9uKENoZWNrTm9kZSkpKTtcbiAgbGV0IGd1aWQgPSB2YWx1ZUZvclJlZihndWlkUmVmKSBhcyBzdHJpbmc7XG5cbiAgaWYgKCFpc0NvbnN0UmVmKGVsZW1lbnRSZWYpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGVsZW1lbnRSZWYpKTtcbiAgfVxuXG4gIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCAmJiAhaXNDb25zdFJlZihpbnNlcnRCZWZvcmVSZWYpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGluc2VydEJlZm9yZVJlZikpO1xuICB9XG5cbiAgbGV0IGJsb2NrID0gdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBndWlkLCBpbnNlcnRCZWZvcmUpO1xuICBpZiAoYmxvY2spIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUG9wUmVtb3RlRWxlbWVudCwgKHZtKSA9PiB7XG4gIHZtLmVsZW1lbnRzKCkucG9wUmVtb3RlRWxlbWVudCgpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GbHVzaEVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgb3BlcmF0aW9ucyA9IGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKTtcbiAgbGV0IG1vZGlmaWVyczogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4gPSBudWxsO1xuXG4gIGlmIChvcGVyYXRpb25zKSB7XG4gICAgbW9kaWZpZXJzID0gb3BlcmF0aW9ucy5mbHVzaCh2bSk7XG4gICAgdm0ubG9hZFZhbHVlKCR0MCwgbnVsbCk7XG4gIH1cblxuICB2bS5lbGVtZW50cygpLmZsdXNoRWxlbWVudChtb2RpZmllcnMpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5DbG9zZUVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgbW9kaWZpZXJzID0gdm0uZWxlbWVudHMoKS5jbG9zZUVsZW1lbnQoKTtcblxuICBpZiAobW9kaWZpZXJzKSB7XG4gICAgbW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XG4gICAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgbGV0IHsgbWFuYWdlciwgc3RhdGUgfSA9IG1vZGlmaWVyO1xuICAgICAgbGV0IGQgPSBtYW5hZ2VyLmdldERlc3Ryb3lhYmxlKHN0YXRlKTtcblxuICAgICAgaWYgKGQpIHtcbiAgICAgICAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuTW9kaWZpZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGlmICh2bS5lbnYuaXNJbnRlcmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgb3duZXIgPSB2bS5nZXRPd25lcigpO1xuICBsZXQgYXJncyA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cyk7XG4gIGxldCBkZWZpbml0aW9uID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxNb2RpZmllckRlZmluaXRpb24+KGhhbmRsZSk7XG5cbiAgbGV0IHsgbWFuYWdlciB9ID0gZGVmaW5pdGlvbjtcblxuICBsZXQgeyBjb25zdHJ1Y3RpbmcgfSA9IHZtLmVsZW1lbnRzKCk7XG5cbiAgbGV0IHN0YXRlID0gbWFuYWdlci5jcmVhdGUoXG4gICAgb3duZXIsXG4gICAgZXhwZWN0KGNvbnN0cnVjdGluZywgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIHRoZSBlbGVtZW50IGl0IGFwcGxpZXMgdG8nKSxcbiAgICBkZWZpbml0aW9uLnN0YXRlLFxuICAgIGFyZ3MuY2FwdHVyZSgpXG4gICk7XG5cbiAgbGV0IGluc3RhbmNlOiBNb2RpZmllckluc3RhbmNlID0ge1xuICAgIG1hbmFnZXIsXG4gICAgc3RhdGUsXG4gICAgZGVmaW5pdGlvbixcbiAgfTtcblxuICBsZXQgb3BlcmF0aW9ucyA9IGV4cGVjdChcbiAgICBjaGVjayh2bS5mZXRjaFZhbHVlKCR0MCksIENoZWNrT3BlcmF0aW9ucyksXG4gICAgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbnMgdG8gYXBwZW5kIHRvJ1xuICApO1xuXG4gIG9wZXJhdGlvbnMuYWRkTW9kaWZpZXIoaW5zdGFuY2UpO1xuXG4gIGxldCB0YWcgPSBtYW5hZ2VyLmdldFRhZyhzdGF0ZSk7XG5cbiAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICByZXR1cm4gdm0udXBkYXRlV2l0aChuZXcgVXBkYXRlTW9kaWZpZXJPcGNvZGUodGFnLCBpbnN0YW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkR5bmFtaWNNb2RpZmllciwgKHZtKSA9PiB7XG4gIGlmICh2bS5lbnYuaXNJbnRlcmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgeyBzdGFjaywgW0NPTlNUQU5UU106IGNvbnN0YW50cyB9ID0gdm07XG4gIGxldCByZWYgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgYXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuICBsZXQgeyBjb25zdHJ1Y3RpbmcgfSA9IHZtLmVsZW1lbnRzKCk7XG4gIGxldCBpbml0aWFsT3duZXIgPSB2bS5nZXRPd25lcigpO1xuXG4gIGxldCBpbnN0YW5jZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZik7XG4gICAgbGV0IG93bmVyOiBPd25lcjtcblxuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGhvc3REZWZpbml0aW9uOiBDdXJyaWVkVmFsdWUgfCBNb2RpZmllckRlZmluaXRpb25TdGF0ZTtcblxuICAgIGlmIChpc0N1cnJpZWRUeXBlKHZhbHVlLCBDdXJyaWVkVHlwZS5Nb2RpZmllcikpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGRlZmluaXRpb246IHJlc29sdmVkRGVmaW5pdGlvbixcbiAgICAgICAgb3duZXI6IGN1cnJpZWRPd25lcixcbiAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgICAgbmFtZWQsXG4gICAgICB9ID0gcmVzb2x2ZUN1cnJpZWRWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhvc3REZWZpbml0aW9uID0gcmVzb2x2ZWREZWZpbml0aW9uO1xuICAgICAgb3duZXIgPSBjdXJyaWVkT3duZXI7XG5cbiAgICAgIGlmIChwb3NpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5wb3NpdGlvbmFsID0gcG9zaXRpb25hbC5jb25jYXQoYXJncy5wb3NpdGlvbmFsKSBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MubmFtZWQgPSBhc3NpZ24oe30sIC4uLm5hbWVkLCBhcmdzLm5hbWVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaG9zdERlZmluaXRpb24gPSB2YWx1ZTtcbiAgICAgIG93bmVyID0gaW5pdGlhbE93bmVyO1xuICAgIH1cblxuICAgIGxldCBoYW5kbGUgPSBjb25zdGFudHMubW9kaWZpZXIoaG9zdERlZmluaXRpb24sIG51bGwsIHRydWUpO1xuXG4gICAgaWYgKERFQlVHICYmIGhhbmRsZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgYSBkeW5hbWljIG1vZGlmaWVyIGRlZmluaXRpb24sIGJ1dCByZWNlaXZlZCBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkaWQgbm90IGhhdmUgYSBtb2RpZmllciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICAgIH19fVxcYCwgYW5kIHRoZSBpbmNvcnJlY3QgZGVmaW5pdGlvbiBpcyB0aGUgdmFsdWUgYXQgdGhlIHBhdGggXFxgJHtcbiAgICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoaG9zdERlZmluaXRpb24pfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSBjb25zdGFudHMuZ2V0VmFsdWU8TW9kaWZpZXJEZWZpbml0aW9uPihcbiAgICAgIGV4cGVjdChoYW5kbGUsICdCVUc6IG1vZGlmaWVyIGhhbmRsZSBleHBlY3RlZCcpXG4gICAgKTtcblxuICAgIGxldCB7IG1hbmFnZXIgfSA9IGRlZmluaXRpb247XG5cbiAgICBsZXQgc3RhdGUgPSBtYW5hZ2VyLmNyZWF0ZShcbiAgICAgIG93bmVyLFxuICAgICAgZXhwZWN0KGNvbnN0cnVjdGluZywgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIHRoZSBlbGVtZW50IGl0IGFwcGxpZXMgdG8nKSxcbiAgICAgIGRlZmluaXRpb24uc3RhdGUsXG4gICAgICBhcmdzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtYW5hZ2VyLFxuICAgICAgc3RhdGUsXG4gICAgICBkZWZpbml0aW9uLFxuICAgIH07XG4gIH0pO1xuXG4gIGxldCBpbnN0YW5jZSA9IHZhbHVlRm9yUmVmKGluc3RhbmNlUmVmKTtcbiAgbGV0IHRhZyA9IG51bGw7XG5cbiAgaWYgKGluc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb3BlcmF0aW9ucyA9IGV4cGVjdChcbiAgICAgIGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKSxcbiAgICAgICdCVUc6IEVsZW1lbnRNb2RpZmllciBjb3VsZCBub3QgZmluZCBvcGVyYXRpb25zIHRvIGFwcGVuZCB0bydcbiAgICApO1xuXG4gICAgb3BlcmF0aW9ucy5hZGRNb2RpZmllcihpbnN0YW5jZSk7XG5cbiAgICB0YWcgPSBpbnN0YW5jZS5tYW5hZ2VyLmdldFRhZyhpbnN0YW5jZS5zdGF0ZSk7XG5cbiAgICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgICBjb25zdW1lVGFnKHRhZyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc0NvbnN0UmVmKHJlZikgfHwgdGFnKSB7XG4gICAgcmV0dXJuIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZUR5bmFtaWNNb2RpZmllck9wY29kZSh0YWcsIGluc3RhbmNlLCBpbnN0YW5jZVJlZikpO1xuICB9XG59KTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZU1vZGlmaWVyT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3RVcGRhdGVkOiBSZXZpc2lvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhZzogVGFnLCBwcml2YXRlIG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IG1vZGlmaWVyLCB0YWcsIGxhc3RVcGRhdGVkIH0gPSB0aGlzO1xuXG4gICAgY29uc3VtZVRhZyh0YWcpO1xuXG4gICAgaWYgKCF2YWxpZGF0ZVRhZyh0YWcsIGxhc3RVcGRhdGVkKSkge1xuICAgICAgdm0uZW52LnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVEeW5hbWljTW9kaWZpZXJPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgbGFzdFVwZGF0ZWQ6IFJldmlzaW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFnOiBUYWcgfCBudWxsLFxuICAgIHByaXZhdGUgaW5zdGFuY2U6IE1vZGlmaWVySW5zdGFuY2UgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBpbnN0YW5jZVJlZjogUmVmZXJlbmNlPE1vZGlmaWVySW5zdGFuY2UgfCB1bmRlZmluZWQ+XG4gICkge1xuICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcgPz8gQ1VSUkVOVF9UQUcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIGxhc3RVcGRhdGVkLCBpbnN0YW5jZSwgaW5zdGFuY2VSZWYgfSA9IHRoaXM7XG5cbiAgICBsZXQgbmV3SW5zdGFuY2UgPSB2YWx1ZUZvclJlZihpbnN0YW5jZVJlZik7XG5cbiAgICBpZiAobmV3SW5zdGFuY2UgIT09IGluc3RhbmNlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgZGVzdHJveWFibGUgPSBpbnN0YW5jZS5tYW5hZ2VyLmdldERlc3Ryb3lhYmxlKGluc3RhbmNlLnN0YXRlKTtcblxuICAgICAgICBpZiAoZGVzdHJveWFibGUgIT09IG51bGwpIHtcbiAgICAgICAgICBkZXN0cm95KGRlc3Ryb3lhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3SW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gbmV3SW5zdGFuY2U7XG4gICAgICAgIGxldCBkZXN0cm95YWJsZSA9IG1hbmFnZXIuZ2V0RGVzdHJveWFibGUoc3RhdGUpO1xuXG4gICAgICAgIGlmIChkZXN0cm95YWJsZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQodGhpcywgZGVzdHJveWFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobmV3SW5zdGFuY2UhKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ld0luc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGFnICE9PSBudWxsICYmICF2YWxpZGF0ZVRhZyh0YWcsIGxhc3RVcGRhdGVkKSkge1xuICAgICAgdm0uZW52LnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIoaW5zdGFuY2UhKTtcbiAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcpO1xuICAgIH1cblxuICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICB9XG4gIH1cbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlN0YXRpY0F0dHIsICh2bSwgeyBvcDE6IF9uYW1lLCBvcDI6IF92YWx1ZSwgb3AzOiBfbmFtZXNwYWNlIH0pID0+IHtcbiAgbGV0IG5hbWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWUpO1xuICBsZXQgdmFsdWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX3ZhbHVlKTtcbiAgbGV0IG5hbWVzcGFjZSA9IF9uYW1lc3BhY2UgPyB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWVzcGFjZSkgOiBudWxsO1xuXG4gIHZtLmVsZW1lbnRzKCkuc2V0U3RhdGljQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EeW5hbWljQXR0ciwgKHZtLCB7IG9wMTogX25hbWUsIG9wMjogX3RydXN0aW5nLCBvcDM6IF9uYW1lc3BhY2UgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCB0cnVzdGluZyA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8Ym9vbGVhbj4oX3RydXN0aW5nKTtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZmVyZW5jZSk7XG4gIGxldCBuYW1lc3BhY2UgPSBfbmFtZXNwYWNlID8gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9uYW1lc3BhY2UpIDogbnVsbDtcblxuICBsZXQgYXR0cmlidXRlID0gdm0uZWxlbWVudHMoKS5zZXREeW5hbWljQXR0cmlidXRlKG5hbWUsIHZhbHVlLCB0cnVzdGluZywgbmFtZXNwYWNlKTtcblxuICBpZiAoIWlzQ29uc3RSZWYocmVmZXJlbmNlKSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZUR5bmFtaWNBdHRyaWJ1dGVPcGNvZGUocmVmZXJlbmNlLCBhdHRyaWJ1dGUsIHZtLmVudikpO1xuICB9XG59KTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUR5bmFtaWNBdHRyaWJ1dGVPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgdXBkYXRlUmVmOiBSZWZlcmVuY2U7XG5cbiAgY29uc3RydWN0b3IocmVmZXJlbmNlOiBSZWZlcmVuY2U8dW5rbm93bj4sIGF0dHJpYnV0ZTogRHluYW1pY0F0dHJpYnV0ZSwgZW52OiBFbnZpcm9ubWVudCkge1xuICAgIGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgdGhpcy51cGRhdGVSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZmVyZW5jZSk7XG5cbiAgICAgIGlmIChpbml0aWFsaXplZCA9PT0gdHJ1ZSkge1xuICAgICAgICBhdHRyaWJ1dGUudXBkYXRlKHZhbHVlLCBlbnYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFsdWVGb3JSZWYodGhpcy51cGRhdGVSZWYpO1xuICB9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgdmFsdWVGb3JSZWYodGhpcy51cGRhdGVSZWYpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9