UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

403 lines (323 loc) 31.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EndTrackFrameOpcode = exports.BeginTrackFrameOpcode = exports.JumpIfNotModifiedOpcode = exports.AssertFilter = exports.Assert = void 0; var _globalContext = require("@glimmer/global-context"); var _reference = require("@glimmer/reference"); var _validator = require("@glimmer/validator"); var _util = require("@glimmer/util"); var _assert = require("./assert"); var _opcodes = require("../../opcodes"); var _symbols = require("../../symbols"); _opcodes.APPEND_OPCODES.add(39 /* ChildScope */ , function (vm) { return vm.pushChildScope(); }); _opcodes.APPEND_OPCODES.add(40 /* PopScope */ , function (vm) { return vm.popScope(); }); _opcodes.APPEND_OPCODES.add(59 /* PushDynamicScope */ , function (vm) { return vm.pushDynamicScope(); }); _opcodes.APPEND_OPCODES.add(60 /* PopDynamicScope */ , function (vm) { return vm.popDynamicScope(); }); _opcodes.APPEND_OPCODES.add(28 /* Constant */ , function (vm, _ref) { var other = _ref.op1; vm.stack.push(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other))); }); _opcodes.APPEND_OPCODES.add(29 /* ConstantReference */ , function (vm, _ref2) { var other = _ref2.op1; vm.stack.push((0, _reference.createConstRef)(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other)), false)); }); _opcodes.APPEND_OPCODES.add(30 /* Primitive */ , function (vm, _ref3) { var primitive = _ref3.op1; var stack = vm.stack; if ((0, _util.isHandle)(primitive)) { // it is a handle which does not already exist on the stack var value = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(primitive)); stack.push(value); } else { // is already an encoded immediate or primitive handle stack.push((0, _util.decodeImmediate)(primitive)); } }); _opcodes.APPEND_OPCODES.add(31 /* PrimitiveReference */ , function (vm) { var stack = vm.stack; var value = stack.pop(); var ref; if (value === undefined) { ref = _reference.UNDEFINED_REFERENCE; } else if (value === null) { ref = _reference.NULL_REFERENCE; } else if (value === true) { ref = _reference.TRUE_REFERENCE; } else if (value === false) { ref = _reference.FALSE_REFERENCE; } else { ref = (0, _reference.createPrimitiveRef)(value); } stack.push(ref); }); _opcodes.APPEND_OPCODES.add(33 /* Dup */ , function (vm, _ref4) { var register = _ref4.op1, offset = _ref4.op2; var position = vm.fetchValue(register) - offset; vm.stack.dup(position); }); _opcodes.APPEND_OPCODES.add(34 /* Pop */ , function (vm, _ref5) { var count = _ref5.op1; vm.stack.pop(count); }); _opcodes.APPEND_OPCODES.add(35 /* Load */ , function (vm, _ref6) { var register = _ref6.op1; vm.load(register); }); _opcodes.APPEND_OPCODES.add(36 /* Fetch */ , function (vm, _ref7) { var register = _ref7.op1; vm.fetch(register); }); _opcodes.APPEND_OPCODES.add(58 /* BindDynamicScope */ , function (vm, _ref8) { var _names = _ref8.op1; var names = vm[_symbols.CONSTANTS].getArray(_names); vm.bindDynamicScope(names); }); _opcodes.APPEND_OPCODES.add(69 /* Enter */ , function (vm, _ref9) { var args = _ref9.op1; vm.enter(args); }); _opcodes.APPEND_OPCODES.add(70 /* Exit */ , function (vm) { vm.exit(); }); _opcodes.APPEND_OPCODES.add(63 /* PushSymbolTable */ , function (vm, _ref10) { var _table = _ref10.op1; var stack = vm.stack; stack.push(vm[_symbols.CONSTANTS].getValue(_table)); }); _opcodes.APPEND_OPCODES.add(62 /* PushBlockScope */ , function (vm) { var stack = vm.stack; stack.push(vm.scope()); }); _opcodes.APPEND_OPCODES.add(61 /* CompileBlock */ , function (vm) { var stack = vm.stack; var block = stack.pop(); if (block) { stack.push(vm.compile(block)); } else { stack.push(null); } }); _opcodes.APPEND_OPCODES.add(64 /* InvokeYield */ , function (vm) { var stack = vm.stack; var handle = stack.pop(); var scope = stack.pop(); var table = stack.pop(); false && (0, _util.assert)(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), (0, _assert.stackAssert)('Option<BlockSymbolTable>', table)); var args = stack.pop(); if (table === null) { // To balance the pop{Frame,Scope} vm.pushFrame(); vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope()); return; } var invokingScope = scope; // If necessary, create a child scope { var locals = table.parameters; var localsCount = locals.length; if (localsCount > 0) { invokingScope = invokingScope.child(); for (var i = 0; i < localsCount; i++) { invokingScope.bindSymbol(locals[i], args.at(i)); } } } vm.pushFrame(); vm.pushScope(invokingScope); vm.call(handle); }); _opcodes.APPEND_OPCODES.add(65 /* JumpIf */ , function (vm, _ref11) { var target = _ref11.op1; var reference = vm.stack.pop(); var value = Boolean((0, _reference.valueForRef)(reference)); if ((0, _reference.isConstRef)(reference)) { if (value === true) { vm["goto"](target); } } else { if (value === true) { vm["goto"](target); } vm.updateWith(new Assert(reference)); } }); _opcodes.APPEND_OPCODES.add(66 /* JumpUnless */ , function (vm, _ref12) { var target = _ref12.op1; var reference = vm.stack.pop(); var value = Boolean((0, _reference.valueForRef)(reference)); if ((0, _reference.isConstRef)(reference)) { if (value === false) { vm["goto"](target); } } else { if (value === false) { vm["goto"](target); } vm.updateWith(new Assert(reference)); } }); _opcodes.APPEND_OPCODES.add(67 /* JumpEq */ , function (vm, _ref13) { var target = _ref13.op1, comparison = _ref13.op2; var other = vm.stack.peek(); if (other === comparison) { vm["goto"](target); } }); _opcodes.APPEND_OPCODES.add(68 /* AssertSame */ , function (vm) { var reference = vm.stack.peek(); if ((0, _reference.isConstRef)(reference) === false) { vm.updateWith(new Assert(reference)); } }); _opcodes.APPEND_OPCODES.add(71 /* ToBoolean */ , function (vm) { var stack = vm.stack; var valueRef = stack.pop(); stack.push((0, _reference.createComputeRef)(function () { return (0, _globalContext.toBool)((0, _reference.valueForRef)(valueRef)); })); }); var Assert = /*#__PURE__*/function () { function Assert(ref) { this.ref = ref; this.last = (0, _reference.valueForRef)(ref); } var _proto = Assert.prototype; _proto.evaluate = function evaluate(vm) { var last = this.last, ref = this.ref; var current = (0, _reference.valueForRef)(ref); if (last !== current) { vm["throw"](); } }; return Assert; }(); exports.Assert = Assert; var AssertFilter = /*#__PURE__*/function () { function AssertFilter(ref, filter) { this.ref = ref; this.filter = filter; this.last = filter((0, _reference.valueForRef)(ref)); } var _proto2 = AssertFilter.prototype; _proto2.evaluate = function evaluate(vm) { var last = this.last, ref = this.ref, filter = this.filter; var current = filter((0, _reference.valueForRef)(ref)); if (last !== current) { vm["throw"](); } }; return AssertFilter; }(); exports.AssertFilter = AssertFilter; var JumpIfNotModifiedOpcode = /*#__PURE__*/function () { function JumpIfNotModifiedOpcode() { this.tag = _validator.CONSTANT_TAG; this.lastRevision = _validator.INITIAL; } var _proto3 = JumpIfNotModifiedOpcode.prototype; _proto3.finalize = function finalize(tag, target) { this.target = target; this.didModify(tag); }; _proto3.evaluate = function evaluate(vm) { var tag = this.tag, target = this.target, lastRevision = this.lastRevision; if (!vm.alwaysRevalidate && (0, _validator.validateTag)(tag, lastRevision)) { (0, _validator.consumeTag)(tag); vm["goto"](target); } }; _proto3.didModify = function didModify(tag) { this.tag = tag; this.lastRevision = (0, _validator.valueForTag)(this.tag); (0, _validator.consumeTag)(tag); }; return JumpIfNotModifiedOpcode; }(); exports.JumpIfNotModifiedOpcode = JumpIfNotModifiedOpcode; var BeginTrackFrameOpcode = /*#__PURE__*/function () { function BeginTrackFrameOpcode(debugLabel) { this.debugLabel = debugLabel; } var _proto4 = BeginTrackFrameOpcode.prototype; _proto4.evaluate = function evaluate() { (0, _validator.beginTrackFrame)(this.debugLabel); }; return BeginTrackFrameOpcode; }(); exports.BeginTrackFrameOpcode = BeginTrackFrameOpcode; var EndTrackFrameOpcode = /*#__PURE__*/function () { function EndTrackFrameOpcode(target) { this.target = target; } var _proto5 = EndTrackFrameOpcode.prototype; _proto5.evaluate = function evaluate() { var tag = (0, _validator.endTrackFrame)(); this.target.didModify(tag); }; return EndTrackFrameOpcode; }(); exports.EndTrackFrameOpcode = EndTrackFrameOpcode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBOztBQVlBOztBQVdBOztBQVVBOztBQUNBOztBQUlBOztBQUdBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFtQyxVQUFELEVBQUMsRUFBRDtBQUFBLFNBQVEsRUFBRSxDQUE1QyxjQUEwQyxFQUFSO0FBQWxDLENBQUE7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQWlDLFVBQUQsRUFBQyxFQUFEO0FBQUEsU0FBUSxFQUFFLENBQTFDLFFBQXdDLEVBQVI7QUFBaEMsQ0FBQTs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBeUMsVUFBRCxFQUFDLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBbEQsZ0JBQWdELEVBQVI7QUFBeEMsQ0FBQTs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBd0MsVUFBRCxFQUFDLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBakQsZUFBK0MsRUFBUjtBQUF2QyxDQUFBOztBQUVBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFnQyxVQUFBLEVBQUEsRUFBQSxJQUFBLEVBQXVCO0FBQUEsTUFBWCxLQUFXLEdBQUEsSUFBQSxDQUFoQixHQUFnQjtBQUNyRCxFQUFBLEVBQUUsQ0FBRixLQUFBLENBQUEsSUFBQSxDQUFjLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUF1Qix3QkFBckMsS0FBcUMsQ0FBdkIsQ0FBZDtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXlDLFVBQUEsRUFBQSxFQUFBLEtBQUEsRUFBdUI7QUFBQSxNQUFYLEtBQVcsR0FBQSxLQUFBLENBQWhCLEdBQWdCO0FBQzlELEVBQUEsRUFBRSxDQUFG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QSxPQUFBLENBQUEsU0FBQSxHQW1CRSxTQUFBLFNBQUEsQ0FBQSxHQUFBLEVBQWtCO0FBQ2hCLFNBQUEsR0FBQSxHQUFBLEdBQUE7QUFDQSxTQUFBLFlBQUEsR0FBb0IsNEJBQVksS0FBaEMsR0FBb0IsQ0FBcEI7QUFDQSwrQkFBQSxHQUFBO0FBdEJKLEdBQUE7O0FBQUEsU0FBQSx1QkFBQTtBQUFBLENBQUEsRUFBQTs7OztBQTBCQSxJQUFNLHFCQUFOLEdBQUEsYUFBQSxZQUFBO0FBQ0UsV0FBQSxxQkFBQSxDQUFBLFVBQUEsRUFBdUM7QUFBbkIsU0FBQSxVQUFBLEdBQUEsVUFBQTtBQUF1Qjs7QUFEN0MsTUFBQSxPQUFBLEdBQUEscUJBQUEsQ0FBQSxTQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLFFBQUEsR0FHRSxTQUFBLFFBQUEsR0FBUTtBQUNOLG9DQUFnQixLQUFoQixVQUFBO0FBSkosR0FBQTs7QUFBQSxTQUFBLHFCQUFBO0FBQUEsQ0FBQSxFQUFBOzs7O0FBUUEsSUFBTSxtQkFBTixHQUFBLGFBQUEsWUFBQTtBQUNFLFdBQUEsbUJBQUEsQ0FBQSxNQUFBLEVBQW1EO0FBQS9CLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFBbUM7O0FBRHpELE1BQUEsT0FBQSxHQUFBLG1CQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxRQUFBLEdBR0UsU0FBQSxRQUFBLEdBQVE7QUFDTixRQUFJLEdBQUcsR0FBUCwrQkFBQTtBQUNBLFNBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBO0FBTEosR0FBQTs7QUFBQSxTQUFBLG1CQUFBO0FBQUEsQ0FBQSxFQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9Cb29sIH0gZnJvbSAnQGdsaW1tZXIvZ2xvYmFsLWNvbnRleHQnO1xuaW1wb3J0IHsgQ29tcGlsYWJsZVRlbXBsYXRlLCBPcHRpb24sIE9wLCBVcGRhdGluZ09wY29kZSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgUmVmZXJlbmNlLFxuICB2YWx1ZUZvclJlZixcbiAgaXNDb25zdFJlZixcbiAgY3JlYXRlUHJpbWl0aXZlUmVmLFxuICBVTkRFRklORURfUkVGRVJFTkNFLFxuICBOVUxMX1JFRkVSRU5DRSxcbiAgVFJVRV9SRUZFUkVOQ0UsXG4gIEZBTFNFX1JFRkVSRU5DRSxcbiAgY3JlYXRlQ29tcHV0ZVJlZixcbiAgY3JlYXRlQ29uc3RSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQge1xuICBDT05TVEFOVF9UQUcsXG4gIFJldmlzaW9uLFxuICBUYWcsXG4gIHZhbHVlRm9yVGFnLFxuICB2YWxpZGF0ZVRhZyxcbiAgSU5JVElBTCxcbiAgYmVnaW5UcmFja0ZyYW1lLFxuICBlbmRUcmFja0ZyYW1lLFxuICBjb25zdW1lVGFnLFxufSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHsgYXNzZXJ0LCBkZWNvZGVIYW5kbGUsIGRlY29kZUltbWVkaWF0ZSwgZXhwZWN0LCBpc0hhbmRsZSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgQ2hlY2tOdW1iZXIsXG4gIGNoZWNrLFxuICBDaGVja0luc3RhbmNlb2YsXG4gIENoZWNrT3B0aW9uLFxuICBDaGVja0Jsb2NrU3ltYm9sVGFibGUsXG4gIENoZWNrSGFuZGxlLFxuICBDaGVja1ByaW1pdGl2ZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHsgc3RhY2tBc3NlcnQgfSBmcm9tICcuL2Fzc2VydCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgVXBkYXRpbmdWTSB9IGZyb20gJy4uLy4uL3ZtJztcbmltcG9ydCB7IFZNQXJndW1lbnRzSW1wbCB9IGZyb20gJy4uLy4uL3ZtL2FyZ3VtZW50cyc7XG5pbXBvcnQgeyBDaGVja1JlZmVyZW5jZSwgQ2hlY2tTY29wZSB9IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxWTSB9IGZyb20gJy4uLy4uL3ZtL2FwcGVuZCc7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5DaGlsZFNjb3BlLCAodm0pID0+IHZtLnB1c2hDaGlsZFNjb3BlKCkpO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUG9wU2NvcGUsICh2bSkgPT4gdm0ucG9wU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoRHluYW1pY1Njb3BlLCAodm0pID0+IHZtLnB1c2hEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucG9wRHluYW1pY1Njb3BlKCkpO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uc3RhbnQsICh2bSwgeyBvcDE6IG90aGVyIH0pID0+IHtcbiAgdm0uc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKGRlY29kZUhhbmRsZShvdGhlcikpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uc3RhbnRSZWZlcmVuY2UsICh2bSwgeyBvcDE6IG90aGVyIH0pID0+IHtcbiAgdm0uc3RhY2sucHVzaChjcmVhdGVDb25zdFJlZih2bVtDT05TVEFOVFNdLmdldFZhbHVlKGRlY29kZUhhbmRsZShvdGhlcikpLCBmYWxzZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmUsICh2bSwgeyBvcDE6IHByaW1pdGl2ZSB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuXG4gIGlmIChpc0hhbmRsZShwcmltaXRpdmUpKSB7XG4gICAgLy8gaXQgaXMgYSBoYW5kbGUgd2hpY2ggZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgc3RhY2tcbiAgICBsZXQgdmFsdWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlKGRlY29kZUhhbmRsZShwcmltaXRpdmUpKTtcbiAgICBzdGFjay5wdXNoKHZhbHVlIGFzIG9iamVjdCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaXMgYWxyZWFkeSBhbiBlbmNvZGVkIGltbWVkaWF0ZSBvciBwcmltaXRpdmUgaGFuZGxlXG4gICAgc3RhY2sucHVzaChkZWNvZGVJbW1lZGlhdGUocHJpbWl0aXZlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHJpbWl0aXZlUmVmZXJlbmNlLCAodm0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gIGxldCB2YWx1ZSA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1ByaW1pdGl2ZSk7XG4gIGxldCByZWY7XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZWYgPSBVTkRFRklORURfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmVmID0gTlVMTF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZWYgPSBUUlVFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICByZWYgPSBGQUxTRV9SRUZFUkVOQ0U7XG4gIH0gZWxzZSB7XG4gICAgcmVmID0gY3JlYXRlUHJpbWl0aXZlUmVmKHZhbHVlKTtcbiAgfVxuXG4gIHN0YWNrLnB1c2gocmVmKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHVwLCAodm0sIHsgb3AxOiByZWdpc3Rlciwgb3AyOiBvZmZzZXQgfSkgPT4ge1xuICBsZXQgcG9zaXRpb24gPSBjaGVjayh2bS5mZXRjaFZhbHVlKHJlZ2lzdGVyKSwgQ2hlY2tOdW1iZXIpIC0gb2Zmc2V0O1xuICB2bS5zdGFjay5kdXAocG9zaXRpb24pO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3AsICh2bSwgeyBvcDE6IGNvdW50IH0pID0+IHtcbiAgdm0uc3RhY2sucG9wKGNvdW50KTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuTG9hZCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5sb2FkKHJlZ2lzdGVyKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRmV0Y2gsICh2bSwgeyBvcDE6IHJlZ2lzdGVyIH0pID0+IHtcbiAgdm0uZmV0Y2gocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5CaW5kRHluYW1pY1Njb3BlLCAodm0sIHsgb3AxOiBfbmFtZXMgfSkgPT4ge1xuICBsZXQgbmFtZXMgPSB2bVtDT05TVEFOVFNdLmdldEFycmF5PHN0cmluZz4oX25hbWVzKTtcbiAgdm0uYmluZER5bmFtaWNTY29wZShuYW1lcyk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkVudGVyLCAodm0sIHsgb3AxOiBhcmdzIH0pID0+IHtcbiAgdm0uZW50ZXIoYXJncyk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkV4aXQsICh2bSkgPT4ge1xuICB2bS5leGl0KCk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hTeW1ib2xUYWJsZSwgKHZtLCB7IG9wMTogX3RhYmxlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gIHN0YWNrLnB1c2godm1bQ09OU1RBTlRTXS5nZXRWYWx1ZShfdGFibGUpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaEJsb2NrU2NvcGUsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bS5zY29wZSgpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29tcGlsZUJsb2NrLCAodm06IEludGVybmFsVk0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gIGxldCBibG9jayA9IHN0YWNrLnBvcDxPcHRpb248Q29tcGlsYWJsZVRlbXBsYXRlPiB8IDA+KCk7XG5cbiAgaWYgKGJsb2NrKSB7XG4gICAgc3RhY2sucHVzaCh2bS5jb21waWxlKGJsb2NrKSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5JbnZva2VZaWVsZCwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcblxuICBsZXQgaGFuZGxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrSGFuZGxlKSk7XG4gIGxldCBzY29wZSA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja1Njb3BlKSk7XG4gIGxldCB0YWJsZSA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcblxuICBhc3NlcnQoXG4gICAgdGFibGUgPT09IG51bGwgfHwgKHRhYmxlICYmIHR5cGVvZiB0YWJsZSA9PT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheSh0YWJsZS5wYXJhbWV0ZXJzKSksXG4gICAgc3RhY2tBc3NlcnQoJ09wdGlvbjxCbG9ja1N5bWJvbFRhYmxlPicsIHRhYmxlKVxuICApO1xuXG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrSW5zdGFuY2VvZihWTUFyZ3VtZW50c0ltcGwpKTtcblxuICBpZiAodGFibGUgPT09IG51bGwpIHtcbiAgICAvLyBUbyBiYWxhbmNlIHRoZSBwb3B7RnJhbWUsU2NvcGV9XG4gICAgdm0ucHVzaEZyYW1lKCk7XG4gICAgdm0ucHVzaFNjb3BlKHNjb3BlID8/IHZtLnNjb3BlKCkpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGludm9raW5nU2NvcGUgPSBleHBlY3Qoc2NvcGUsICdCVUc6IGV4cGVjdGVkIHNjb3BlJyk7XG5cbiAgLy8gSWYgbmVjZXNzYXJ5LCBjcmVhdGUgYSBjaGlsZCBzY29wZVxuICB7XG4gICAgbGV0IGxvY2FscyA9IHRhYmxlLnBhcmFtZXRlcnM7XG4gICAgbGV0IGxvY2Fsc0NvdW50ID0gbG9jYWxzLmxlbmd0aDtcblxuICAgIGlmIChsb2NhbHNDb3VudCA+IDApIHtcbiAgICAgIGludm9raW5nU2NvcGUgPSBpbnZva2luZ1Njb3BlLmNoaWxkKCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxzQ291bnQ7IGkrKykge1xuICAgICAgICBpbnZva2luZ1Njb3BlLmJpbmRTeW1ib2wobG9jYWxzIVtpXSwgYXJncy5hdChpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdm0ucHVzaEZyYW1lKCk7XG4gIHZtLnB1c2hTY29wZShpbnZva2luZ1Njb3BlKTtcbiAgdm0uY2FsbChoYW5kbGUhKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcElmLCAodm0sIHsgb3AxOiB0YXJnZXQgfSkgPT4ge1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHZhbHVlID0gQm9vbGVhbih2YWx1ZUZvclJlZihyZWZlcmVuY2UpKTtcblxuICBpZiAoaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdm0uZ290byh0YXJnZXQpO1xuICAgIH1cblxuICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChyZWZlcmVuY2UpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wVW5sZXNzLCAodm0sIHsgb3AxOiB0YXJnZXQgfSkgPT4ge1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHZhbHVlID0gQm9vbGVhbih2YWx1ZUZvclJlZihyZWZlcmVuY2UpKTtcblxuICBpZiAoaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgdm0uZ290byh0YXJnZXQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBFcSwgKHZtLCB7IG9wMTogdGFyZ2V0LCBvcDI6IGNvbXBhcmlzb24gfSkgPT4ge1xuICBsZXQgb3RoZXIgPSBjaGVjayh2bS5zdGFjay5wZWVrKCksIENoZWNrTnVtYmVyKTtcblxuICBpZiAob3RoZXIgPT09IGNvbXBhcmlzb24pIHtcbiAgICB2bS5nb3RvKHRhcmdldCk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQXNzZXJ0U2FtZSwgKHZtKSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wZWVrKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBpZiAoaXNDb25zdFJlZihyZWZlcmVuY2UpID09PSBmYWxzZSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChyZWZlcmVuY2UpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Ub0Jvb2xlYW4sICh2bSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCB2YWx1ZVJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgc3RhY2sucHVzaChjcmVhdGVDb21wdXRlUmVmKCgpID0+IHRvQm9vbCh2YWx1ZUZvclJlZih2YWx1ZVJlZikpKSk7XG59KTtcblxuZXhwb3J0IGNsYXNzIEFzc2VydCBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2UpIHtcbiAgICB0aGlzLmxhc3QgPSB2YWx1ZUZvclJlZihyZWYpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyBsYXN0LCByZWYgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSB2YWx1ZUZvclJlZihyZWYpO1xuXG4gICAgaWYgKGxhc3QgIT09IGN1cnJlbnQpIHtcbiAgICAgIHZtLnRocm93KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRGaWx0ZXI8VCwgVT4gaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgbGFzdDogVTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogUmVmZXJlbmNlPFQ+LCBwcml2YXRlIGZpbHRlcjogKGZyb206IFQpID0+IFUpIHtcbiAgICB0aGlzLmxhc3QgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiwgZmlsdGVyIH0gPSB0aGlzO1xuICAgIGxldCBjdXJyZW50ID0gZmlsdGVyKHZhbHVlRm9yUmVmKHJlZikpO1xuXG4gICAgaWYgKGxhc3QgIT09IGN1cnJlbnQpIHtcbiAgICAgIHZtLnRocm93KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKdW1wSWZOb3RNb2RpZmllZE9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSB0YWc6IFRhZyA9IENPTlNUQU5UX1RBRztcbiAgcHJpdmF0ZSBsYXN0UmV2aXNpb246IFJldmlzaW9uID0gSU5JVElBTDtcbiAgcHJpdmF0ZSB0YXJnZXQ/OiBudW1iZXI7XG5cbiAgZmluYWxpemUodGFnOiBUYWcsIHRhcmdldDogbnVtYmVyKSB7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5kaWRNb2RpZnkodGFnKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgdGFnLCB0YXJnZXQsIGxhc3RSZXZpc2lvbiB9ID0gdGhpcztcblxuICAgIGlmICghdm0uYWx3YXlzUmV2YWxpZGF0ZSAmJiB2YWxpZGF0ZVRhZyh0YWcsIGxhc3RSZXZpc2lvbikpIHtcbiAgICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICAgIHZtLmdvdG8oZXhwZWN0KHRhcmdldCwgJ1ZNIEJVRzogVGFyZ2V0IG11c3QgYmUgc2V0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIGp1bXAnKSk7XG4gICAgfVxuICB9XG5cbiAgZGlkTW9kaWZ5KHRhZzogVGFnKSB7XG4gICAgdGhpcy50YWcgPSB0YWc7XG4gICAgdGhpcy5sYXN0UmV2aXNpb24gPSB2YWx1ZUZvclRhZyh0aGlzLnRhZyk7XG4gICAgY29uc3VtZVRhZyh0YWcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCZWdpblRyYWNrRnJhbWVPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVidWdMYWJlbD86IHN0cmluZykge31cblxuICBldmFsdWF0ZSgpIHtcbiAgICBiZWdpblRyYWNrRnJhbWUodGhpcy5kZWJ1Z0xhYmVsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0YXJnZXQ6IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGxldCB0YWcgPSBlbmRUcmFja0ZyYW1lKCk7XG4gICAgdGhpcy50YXJnZXQuZGlkTW9kaWZ5KHRhZyk7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=