UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

517 lines (430 loc) 52.6 kB
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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _a, _b; import { DEBUG } from '@glimmer/env'; import { assertGlobalContextWasSet } from '@glimmer/global-context'; import { createIteratorItemRef, UNDEFINED_REFERENCE } from '@glimmer/reference'; import { assert, LOCAL_LOGGER, Stack, unwrapHandle } from '@glimmer/util'; import { beginTrackFrame, endTrackFrame, resetTracking } from '@glimmer/validator'; import { $fp, $pc, $s0, $s1, $sp, $t0, $t1, $v0, isLowLevelRegister } from '@glimmer/vm'; import { associateDestroyableChild } from '@glimmer/destroyable'; import { BeginTrackFrameOpcode, EndTrackFrameOpcode, JumpIfNotModifiedOpcode } from '../compiled/opcodes/vm'; import { APPEND_OPCODES } from '../opcodes'; import { PartialScopeImpl } from '../scope'; import { ARGS, CONSTANTS, DESTROYABLE_STACK, HEAP, INNER_VM, REGISTERS, STACKS } from '../symbols'; import { VMArgumentsImpl } from './arguments'; import LowLevelVM from './low-level'; import RenderResultImpl from './render-result'; import EvaluationStackImpl from './stack'; import { ListBlockOpcode, ListItemOpcode, ResumableVMStateImpl, TryOpcode } from './update'; var Stacks = function Stacks() { this.scope = new Stack(); this.dynamicScope = new Stack(); this.updating = new Stack(); this.cache = new Stack(); this.list = new Stack(); }; var VM = /*#__PURE__*/function () { /** * End of migrated. */ function VM(runtime, _ref, elementStack, context) { var _this = this; var pc = _ref.pc, scope = _ref.scope, dynamicScope = _ref.dynamicScope, stack = _ref.stack; this.runtime = runtime; this.elementStack = elementStack; this.context = context; this[_a] = new Stacks(); this[_b] = new Stack(); this.s0 = null; this.s1 = null; this.t0 = null; this.t1 = null; this.v0 = null; this.resume = initVM(this.context); if (DEBUG) { assertGlobalContextWasSet(); } var evalStack = EvaluationStackImpl.restore(stack); false && assert(typeof pc === 'number', 'pc is a number'); evalStack[REGISTERS][$pc] = pc; evalStack[REGISTERS][$sp] = stack.length - 1; evalStack[REGISTERS][$fp] = -1; this[HEAP] = this.program.heap; this[CONSTANTS] = this.program.constants; this.elementStack = elementStack; this[STACKS].scope.push(scope); this[STACKS].dynamicScope.push(dynamicScope); this[ARGS] = new VMArgumentsImpl(); this[INNER_VM] = new LowLevelVM(evalStack, this[HEAP], runtime.program, { debugBefore: function debugBefore(opcode) { return APPEND_OPCODES.debugBefore(_this, opcode); }, debugAfter: function debugAfter(state) { APPEND_OPCODES.debugAfter(_this, state); } }, evalStack[REGISTERS]); this.destructor = {}; this[DESTROYABLE_STACK].push(this.destructor); } var _proto = VM.prototype; // Fetch a value from a register onto the stack _proto.fetch = function fetch(register) { var value = this.fetchValue(register); this.stack.push(value); } // Load a value from the stack into a register ; _proto.load = function load(register) { var value = this.stack.pop(); this.loadValue(register, value); }; _proto.fetchValue = function fetchValue(register) { if (isLowLevelRegister(register)) { return this[INNER_VM].fetchRegister(register); } switch (register) { case $s0: return this.s0; case $s1: return this.s1; case $t0: return this.t0; case $t1: return this.t1; case $v0: return this.v0; } } // Load a value into a register ; _proto.loadValue = function loadValue(register, value) { if (isLowLevelRegister(register)) { this[INNER_VM].loadRegister(register, value); } switch (register) { case $s0: this.s0 = value; break; case $s1: this.s1 = value; break; case $t0: this.t0 = value; break; case $t1: this.t1 = value; break; case $v0: this.v0 = value; break; } } /** * Migrated to Inner */ // Start a new frame and save $ra and $fp on the stack ; _proto.pushFrame = function pushFrame() { this[INNER_VM].pushFrame(); } // Restore $ra, $sp and $fp ; _proto.popFrame = function popFrame() { this[INNER_VM].popFrame(); } // Jump to an address in `program` ; _proto["goto"] = function goto(offset) { this[INNER_VM]["goto"](offset); } // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS) ; _proto.call = function call(handle) { this[INNER_VM].call(handle); } // Put a specific `program` address in $ra ; _proto.returnTo = function returnTo(offset) { this[INNER_VM].returnTo(offset); } // Return to the `program` address stored in $ra ; _proto["return"] = function _return() { this[INNER_VM]["return"](); }; VM.initial = function initial(runtime, context, _ref2) { var handle = _ref2.handle, self = _ref2.self, dynamicScope = _ref2.dynamicScope, treeBuilder = _ref2.treeBuilder, numSymbols = _ref2.numSymbols, owner = _ref2.owner; var scope = PartialScopeImpl.root(self, numSymbols, owner); var state = vmState(runtime.program.heap.getaddr(handle), scope, dynamicScope); var vm = initVM(context)(runtime, state, treeBuilder); vm.pushUpdating(); return vm; }; VM.empty = function empty(runtime, _ref3, context) { var handle = _ref3.handle, treeBuilder = _ref3.treeBuilder, dynamicScope = _ref3.dynamicScope, owner = _ref3.owner; var vm = initVM(context)(runtime, vmState(runtime.program.heap.getaddr(handle), PartialScopeImpl.root(UNDEFINED_REFERENCE, 0, owner), dynamicScope), treeBuilder); vm.pushUpdating(); return vm; }; _proto.compile = function compile(block) { var handle = unwrapHandle(block.compile(this.context)); return handle; }; _proto.captureState = function captureState(args, pc) { if (pc === void 0) { pc = this[INNER_VM].fetchRegister($pc); } return { pc: pc, scope: this.scope(), dynamicScope: this.dynamicScope(), stack: this.stack.capture(args) }; }; _proto.capture = function capture(args, pc) { if (pc === void 0) { pc = this[INNER_VM].fetchRegister($pc); } return new ResumableVMStateImpl(this.captureState(args, pc), this.resume); }; _proto.beginCacheGroup = function beginCacheGroup(name) { var opcodes = this.updating(); var guard = new JumpIfNotModifiedOpcode(); opcodes.push(guard); opcodes.push(new BeginTrackFrameOpcode(name)); this[STACKS].cache.push(guard); beginTrackFrame(name); }; _proto.commitCacheGroup = function commitCacheGroup() { var opcodes = this.updating(); var guard = this[STACKS].cache.pop(); var tag = endTrackFrame(); opcodes.push(new EndTrackFrameOpcode(guard)); guard.finalize(tag, opcodes.length); }; _proto.enter = function enter(args) { var updating = []; var state = this.capture(args); var block = this.elements().pushUpdatableBlock(); var tryOpcode = new TryOpcode(state, this.runtime, block, updating); this.didEnter(tryOpcode); }; _proto.enterItem = function enterItem(_ref4) { var key = _ref4.key, value = _ref4.value, memo = _ref4.memo; var stack = this.stack; var valueRef = createIteratorItemRef(value); var memoRef = createIteratorItemRef(memo); stack.push(valueRef); stack.push(memoRef); var state = this.capture(2); var block = this.elements().pushUpdatableBlock(); var opcode = new ListItemOpcode(state, this.runtime, block, key, memoRef, valueRef); this.didEnter(opcode); return opcode; }; _proto.registerItem = function registerItem(opcode) { this.listBlock().initializeChild(opcode); }; _proto.enterList = function enterList(iterableRef, offset) { var updating = []; var addr = this[INNER_VM].target(offset); var state = this.capture(0, addr); var list = this.elements().pushBlockList(updating); var opcode = new ListBlockOpcode(state, this.runtime, list, updating, iterableRef); this[STACKS].list.push(opcode); this.didEnter(opcode); }; _proto.didEnter = function didEnter(opcode) { this.associateDestroyable(opcode); this[DESTROYABLE_STACK].push(opcode); this.updateWith(opcode); this.pushUpdating(opcode.children); }; _proto.exit = function exit() { this[DESTROYABLE_STACK].pop(); this.elements().popBlock(); this.popUpdating(); }; _proto.exitList = function exitList() { this.exit(); this[STACKS].list.pop(); }; _proto.pushUpdating = function pushUpdating(list) { if (list === void 0) { list = []; } this[STACKS].updating.push(list); }; _proto.popUpdating = function popUpdating() { return this[STACKS].updating.pop(); }; _proto.updateWith = function updateWith(opcode) { this.updating().push(opcode); }; _proto.listBlock = function listBlock() { return this[STACKS].list.current; }; _proto.associateDestroyable = function associateDestroyable(child) { var parent = this[DESTROYABLE_STACK].current; associateDestroyableChild(parent, child); }; _proto.tryUpdating = function tryUpdating() { return this[STACKS].updating.current; }; _proto.updating = function updating() { return this[STACKS].updating.current; }; _proto.elements = function elements() { return this.elementStack; }; _proto.scope = function scope() { return this[STACKS].scope.current; }; _proto.dynamicScope = function dynamicScope() { return this[STACKS].dynamicScope.current; }; _proto.pushChildScope = function pushChildScope() { this[STACKS].scope.push(this.scope().child()); }; _proto.pushDynamicScope = function pushDynamicScope() { var child = this.dynamicScope().child(); this[STACKS].dynamicScope.push(child); return child; }; _proto.pushRootScope = function pushRootScope(size, owner) { var scope = PartialScopeImpl.sized(size, owner); this[STACKS].scope.push(scope); return scope; }; _proto.pushScope = function pushScope(scope) { this[STACKS].scope.push(scope); }; _proto.popScope = function popScope() { this[STACKS].scope.pop(); }; _proto.popDynamicScope = function popDynamicScope() { this[STACKS].dynamicScope.pop(); } /// SCOPE HELPERS ; _proto.getOwner = function getOwner() { return this.scope().owner; }; _proto.getSelf = function getSelf() { return this.scope().getSelf(); }; _proto.referenceForSymbol = function referenceForSymbol(symbol) { return this.scope().getSymbol(symbol); } /// EXECUTION ; _proto.execute = function execute(initialize) { if (DEBUG) { var hasErrored = true; try { var value = this._execute(initialize); // using a boolean here to avoid breaking ergonomics of "pause on uncaught exceptions" // which would happen with a `catch` + `throw` hasErrored = false; return value; } finally { if (hasErrored) { // If any existing blocks are open, due to an error or something like // that, we need to close them all and clean things up properly. var elements = this.elements(); while (elements.hasBlocks) { elements.popBlock(); } // eslint-disable-next-line no-console console.error("\n\nError occurred:\n\n" + resetTracking() + "\n\n"); } } } else { return this._execute(initialize); } }; _proto._execute = function _execute(initialize) { if (false /* LOCAL_SHOULD_LOG */ ) { LOCAL_LOGGER.log("EXECUTING FROM " + this[INNER_VM].fetchRegister($pc)); } if (initialize) initialize(this); var result; while (true) { result = this.next(); if (result.done) break; } return result.value; }; _proto.next = function next() { var env = this.env, elementStack = this.elementStack; var opcode = this[INNER_VM].nextStatement(); var result; if (opcode !== null) { this[INNER_VM].evaluateOuter(opcode, this); result = { done: false, value: null }; } else { // Unload the stack this.stack.reset(); result = { done: true, value: new RenderResultImpl(env, this.popUpdating(), elementStack.popBlock(), this.destructor) }; } return result; }; _proto.bindDynamicScope = function bindDynamicScope(names) { var scope = this.dynamicScope(); for (var i = names.length - 1; i >= 0; i--) { var name = names[i]; scope.set(name, this.stack.pop()); } }; _createClass(VM, [{ key: "stack", get: function get() { return this[INNER_VM].stack; } /* Registers */ }, { key: "pc", get: function get() { return this[INNER_VM].fetchRegister($pc); } }, { key: "program", get: function get() { return this.runtime.program; } }, { key: "env", get: function get() { return this.runtime.env; } }]); return VM; }(); export { VM as default }; _a = STACKS, _b = DESTROYABLE_STACK; function vmState(pc, scope, dynamicScope) { return { pc: pc, scope: scope, dynamicScope: dynamicScope, stack: [] }; } function initVM(context) { return function (runtime, state, builder) { return new VM(runtime, state, builder, context); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FwcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxTQUFBLEtBQUEsUUFBQSxjQUFBO0FBQ0EsU0FBQSx5QkFBQSxRQUFBLHlCQUFBO0FBd0JBLFNBQUEscUJBQUEsRUFBQSxtQkFBQSxRQUFBLG9CQUFBO0FBT0EsU0FBQSxNQUFBLEVBQUEsWUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsZUFBQSxFQUFBLGFBQUEsRUFBQSxhQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsa0JBQUEsUUFBQSxhQUFBO0FBY0EsU0FBQSx5QkFBQSxRQUFBLHNCQUFBO0FBQ0EsU0FBQSxxQkFBQSxFQUFBLG1CQUFBLEVBQUEsdUJBQUEsUUFBQSx3QkFBQTtBQUtBLFNBQUEsY0FBQSxRQUFBLFlBQUE7QUFDQSxTQUFBLGdCQUFBLFFBQUEsVUFBQTtBQUNBLFNBQUEsSUFBQSxFQUFBLFNBQUEsRUFBQSxpQkFBQSxFQUFBLElBQUEsRUFBQSxRQUFBLEVBQUEsU0FBQSxFQUFBLE1BQUEsUUFBQSxZQUFBO0FBQ0EsU0FBQSxlQUFBLFFBQUEsYUFBQTtBQUVBLE9BQUEsVUFBQSxNQUFBLGFBQUE7QUFDQSxPQUFBLGdCQUFBLE1BQUEsaUJBQUE7QUFDQSxPQUFBLG1CQUFBLE1BQUEsU0FBQTtBQUNBLFNBQUEsZUFBQSxFQUFBLGNBQUEsRUFBQSxvQkFBQSxFQUFBLFNBQUEsUUFBQSxVQUFBOztJQWlGQSxNLEdBQUEsa0JBQUE7QUFDVyxPQUFBLEtBQUEsR0FBUSxJQUFSLEtBQVEsRUFBUjtBQUNBLE9BQUEsWUFBQSxHQUFlLElBQWYsS0FBZSxFQUFmO0FBQ0EsT0FBQSxRQUFBLEdBQVcsSUFBWCxL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QUFQLEtBQUE7QUFDRDtBQUVEOzs7O3dCQUVNO0FBQ0osYUFBTyxLQUFBLFFBQUEsRUFBQSxhQUFBLENBQVAsR0FBTyxDQUFQO0FBaEJtQjs7O3dCQStNVjtBQUNULGFBQU8sS0FBQSxPQUFBLENBQVAsT0FBQTtBQUNEOzs7d0JBRU07QUFDTCxhQUFPLEtBQUEsT0FBQSxDQUFQLEdBQUE7QUFDRDs7Ozs7O1NBck5XLEU7S0FDTSxNLEVBQU0sRUFBQSxHQUdOLGlCOztBQWtlcEIsU0FBQSxPQUFBLENBQUEsRUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLEVBQXFFO0FBQ25FLFNBQU87QUFDTCxJQUFBLEVBREssRUFDTCxFQURLO0FBRUwsSUFBQSxLQUZLLEVBRUwsS0FGSztBQUdMLElBQUEsWUFISyxFQUdMLFlBSEs7QUFJTCxJQUFBLEtBQUssRUFBRTtBQUpGLEdBQVA7QUFNRDs7QUFxQkQsU0FBQSxNQUFBLENBQUEsT0FBQSxFQUFzRDtBQUNwRCxTQUFPLFVBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxPQUFBO0FBQUEsV0FBNkIsSUFBQSxFQUFBLENBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxPQUFBLEVBQXBDLE9BQW9DLENBQTdCO0FBQUEsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHsgYXNzZXJ0R2xvYmFsQ29udGV4dFdhc1NldCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7XG4gIENvbXBpbGFibGVUZW1wbGF0ZSxcbiAgRGVzdHJveWFibGUsXG4gIER5bmFtaWNTY29wZSxcbiAgRWxlbWVudEJ1aWxkZXIsXG4gIEVudmlyb25tZW50LFxuICBPcHRpb24sXG4gIFBhcnRpYWxTY29wZSxcbiAgUmVuZGVyUmVzdWx0LFxuICBSaWNoSXRlcmF0b3JSZXN1bHQsXG4gIFJ1bnRpbWVDb25zdGFudHMsXG4gIFJ1bnRpbWVDb250ZXh0LFxuICBSdW50aW1lSGVhcCxcbiAgUnVudGltZVByb2dyYW0sXG4gIFNjb3BlLFxuICBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dCxcbiAgVk0gYXMgUHVibGljVk0sXG4gIFJlc29sdXRpb25UaW1lQ29uc3RhbnRzLFxuICBPd25lcixcbiAgVXBkYXRpbmdPcGNvZGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfU0hPVUxEX0xPRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IFJ1bnRpbWVPcEltcGwgfSBmcm9tICdAZ2xpbW1lci9wcm9ncmFtJztcbmltcG9ydCB7XG4gIGNyZWF0ZUl0ZXJhdG9ySXRlbVJlZixcbiAgT3BhcXVlSXRlcmF0aW9uSXRlbSxcbiAgT3BhcXVlSXRlcmF0b3IsXG4gIFJlZmVyZW5jZSxcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGFzc2VydCwgZXhwZWN0LCBMT0NBTF9MT0dHRVIsIFN0YWNrLCB1bndyYXBIYW5kbGUgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IGJlZ2luVHJhY2tGcmFtZSwgZW5kVHJhY2tGcmFtZSwgcmVzZXRUcmFja2luZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQge1xuICAkZnAsXG4gICRwYyxcbiAgJHMwLFxuICAkczEsXG4gICRzcCxcbiAgJHQwLFxuICAkdDEsXG4gICR2MCxcbiAgaXNMb3dMZXZlbFJlZ2lzdGVyLFxuICBNYWNoaW5lUmVnaXN0ZXIsXG4gIFJlZ2lzdGVyLFxuICBTeXNjYWxsUmVnaXN0ZXIsXG59IGZyb20gJ0BnbGltbWVyL3ZtJztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5pbXBvcnQge1xuICBCZWdpblRyYWNrRnJhbWVPcGNvZGUsXG4gIEVuZFRyYWNrRnJhbWVPcGNvZGUsXG4gIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlLFxufSBmcm9tICcuLi9jb21waWxlZC9vcGNvZGVzL3ZtJztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTLCBEZWJ1Z1N0YXRlIH0gZnJvbSAnLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBQYXJ0aWFsU2NvcGVJbXBsIH0gZnJvbSAnLi4vc2NvcGUnO1xuaW1wb3J0IHsgQVJHUywgQ09OU1RBTlRTLCBERVNUUk9ZQUJMRV9TVEFDSywgSEVBUCwgSU5ORVJfVk0sIFJFR0lTVEVSUywgU1RBQ0tTIH0gZnJvbSAnLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBWTUFyZ3VtZW50c0ltcGwgfSBmcm9tICcuL2FyZ3VtZW50cyc7XG5pbXBvcnQgeyBMaXZlQmxvY2tMaXN0IH0gZnJvbSAnLi9lbGVtZW50LWJ1aWxkZXInO1xuaW1wb3J0IExvd0xldmVsVk0gZnJvbSAnLi9sb3ctbGV2ZWwnO1xuaW1wb3J0IFJlbmRlclJlc3VsdEltcGwgZnJvbSAnLi9yZW5kZXItcmVzdWx0JztcbmltcG9ydCBFdmFsdWF0aW9uU3RhY2tJbXBsLCB7IEV2YWx1YXRpb25TdGFjayB9IGZyb20gJy4vc3RhY2snO1xuaW1wb3J0IHtcbiAgQmxvY2tPcGNvZGUsXG4gIExpc3RCbG9ja09wY29kZSxcbiAgTGlzdEl0ZW1PcGNvZGUsXG4gIFJlc3VtYWJsZVZNU3RhdGUsXG4gIFJlc3VtYWJsZVZNU3RhdGVJbXBsLFxuICBUcnlPcGNvZGUsXG4gIFZNU3RhdGUsXG59IGZyb20gJy4vdXBkYXRlJztcblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGludGVybmFsIG9wY29kZXMsIGFuZCBpcyBtb3JlIHN0YWJsZSB0aGFuXG4gKiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwcGVuZCBWTSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxWTSB7XG4gIHJlYWRvbmx5IFtDT05TVEFOVFNdOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHM7XG4gIHJlYWRvbmx5IFtBUkdTXTogVk1Bcmd1bWVudHNJbXBsO1xuXG4gIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IHN0YWNrOiBFdmFsdWF0aW9uU3RhY2s7XG4gIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0O1xuICByZWFkb25seSBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dDtcblxuICBsb2FkVmFsdWUocmVnaXN0ZXI6IE1hY2hpbmVSZWdpc3RlciwgdmFsdWU6IG51bWJlcik6IHZvaWQ7XG4gIGxvYWRWYWx1ZShyZWdpc3RlcjogUmVnaXN0ZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgbG9hZFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3RlciB8IE1hY2hpbmVSZWdpc3RlciwgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuXG4gIGZldGNoVmFsdWUocmVnaXN0ZXI6IE1hY2hpbmVSZWdpc3Rlci5yYSB8IE1hY2hpbmVSZWdpc3Rlci5wYyk6IG51bWJlcjtcbiAgLy8gVE9ETzogU29tZXRoaW5nIGJldHRlciB0aGFuIGEgdHlwZSBhc3NlcnRpb24/XG4gIGZldGNoVmFsdWU8VD4ocmVnaXN0ZXI6IFJlZ2lzdGVyKTogVDtcbiAgZmV0Y2hWYWx1ZShyZWdpc3RlcjogUmVnaXN0ZXIpOiB1bmtub3duO1xuXG4gIGxvYWQocmVnaXN0ZXI6IFJlZ2lzdGVyKTogdm9pZDtcbiAgZmV0Y2gocmVnaXN0ZXI6IFJlZ2lzdGVyKTogdm9pZDtcblxuICBjb21waWxlKGJsb2NrOiBDb21waWxhYmxlVGVtcGxhdGUpOiBudW1iZXI7XG5cbiAgc2NvcGUoKTogU2NvcGU7XG4gIGVsZW1lbnRzKCk6IEVsZW1lbnRCdWlsZGVyO1xuXG4gIGdldE93bmVyKCk6IE93bmVyO1xuICBnZXRTZWxmKCk6IFJlZmVyZW5jZTtcblxuICB1cGRhdGVXaXRoKG9wY29kZTogVXBkYXRpbmdPcGNvZGUpOiB2b2lkO1xuXG4gIGFzc29jaWF0ZURlc3Ryb3lhYmxlKGQ6IERlc3Ryb3lhYmxlKTogdm9pZDtcblxuICBiZWdpbkNhY2hlR3JvdXAobmFtZT86IHN0cmluZyk6IHZvaWQ7XG4gIGNvbW1pdENhY2hlR3JvdXAoKTogdm9pZDtcblxuICAvLy8gSXRlcmF0aW9uIC8vL1xuXG4gIGVudGVyTGlzdChpdGVyYWJsZVJlZjogUmVmZXJlbmNlPE9wYXF1ZUl0ZXJhdG9yPiwgb2Zmc2V0OiBudW1iZXIpOiB2b2lkO1xuICBleGl0TGlzdCgpOiB2b2lkO1xuICBlbnRlckl0ZW0oaXRlbTogT3BhcXVlSXRlcmF0aW9uSXRlbSk6IExpc3RJdGVtT3Bjb2RlO1xuICByZWdpc3Rlckl0ZW0oaXRlbTogTGlzdEl0ZW1PcGNvZGUpOiB2b2lkO1xuXG4gIHB1c2hSb290U2NvcGUoc2l6ZTogbnVtYmVyLCBvd25lcjogT3duZXIpOiBQYXJ0aWFsU2NvcGU7XG4gIHB1c2hDaGlsZFNjb3BlKCk6IHZvaWQ7XG4gIHBvcFNjb3BlKCk6IHZvaWQ7XG4gIHB1c2hTY29wZShzY29wZTogU2NvcGUpOiB2b2lkO1xuXG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGU7XG4gIGJpbmREeW5hbWljU2NvcGUobmFtZXM6IHN0cmluZ1tdKTogdm9pZDtcbiAgcHVzaER5bmFtaWNTY29wZSgpOiB2b2lkO1xuICBwb3BEeW5hbWljU2NvcGUoKTogdm9pZDtcblxuICBlbnRlcihhcmdzOiBudW1iZXIpOiB2b2lkO1xuICBleGl0KCk6IHZvaWQ7XG5cbiAgZ290byhwYzogbnVtYmVyKTogdm9pZDtcbiAgY2FsbChoYW5kbGU6IG51bWJlcik6IHZvaWQ7XG4gIHB1c2hGcmFtZSgpOiB2b2lkO1xuXG4gIHJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2w6IG51bWJlcik6IFJlZmVyZW5jZTtcblxuICBleGVjdXRlKGluaXRpYWxpemU/OiAodm06IHRoaXMpID0+IHZvaWQpOiBSZW5kZXJSZXN1bHQ7XG4gIHB1c2hVcGRhdGluZyhsaXN0PzogVXBkYXRpbmdPcGNvZGVbXSk6IHZvaWQ7XG4gIG5leHQoKTogUmljaEl0ZXJhdG9yUmVzdWx0PG51bGwsIFJlbmRlclJlc3VsdD47XG59XG5cbmNsYXNzIFN0YWNrcyB7XG4gIHJlYWRvbmx5IHNjb3BlID0gbmV3IFN0YWNrPFNjb3BlPigpO1xuICByZWFkb25seSBkeW5hbWljU2NvcGUgPSBuZXcgU3RhY2s8RHluYW1pY1Njb3BlPigpO1xuICByZWFkb25seSB1cGRhdGluZyA9IG5ldyBTdGFjazxVcGRhdGluZ09wY29kZVtdPigpO1xuICByZWFkb25seSBjYWNoZSA9IG5ldyBTdGFjazxKdW1wSWZOb3RNb2RpZmllZE9wY29kZT4oKTtcbiAgcmVhZG9ubHkgbGlzdCA9IG5ldyBTdGFjazxMaXN0QmxvY2tPcGNvZGU+KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZNIGltcGxlbWVudHMgUHVibGljVk0sIEludGVybmFsVk0ge1xuICBwcml2YXRlIHJlYWRvbmx5IFtTVEFDS1NdID0gbmV3IFN0YWNrcygpO1xuICBwcml2YXRlIHJlYWRvbmx5IFtIRUFQXTogUnVudGltZUhlYXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJ1Y3Rvcjogb2JqZWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IFtERVNUUk9ZQUJMRV9TVEFDS10gPSBuZXcgU3RhY2s8b2JqZWN0PigpO1xuICByZWFkb25seSBbQ09OU1RBTlRTXTogUnVudGltZUNvbnN0YW50cyAmIFJlc29sdXRpb25UaW1lQ29uc3RhbnRzO1xuICByZWFkb25seSBbQVJHU106IFZNQXJndW1lbnRzSW1wbDtcbiAgcmVhZG9ubHkgW0lOTkVSX1ZNXTogTG93TGV2ZWxWTTtcblxuICBnZXQgc3RhY2soKTogRXZhbHVhdGlvblN0YWNrIHtcbiAgICByZXR1cm4gdGhpc1tJTk5FUl9WTV0uc3RhY2sgYXMgRXZhbHVhdGlvblN0YWNrO1xuICB9XG5cbiAgLyogUmVnaXN0ZXJzICovXG5cbiAgZ2V0IHBjKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXNbSU5ORVJfVk1dLmZldGNoUmVnaXN0ZXIoJHBjKTtcbiAgfVxuXG4gIHB1YmxpYyBzMDogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyBzMTogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyB0MDogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyB0MTogdW5rbm93biA9IG51bGw7XG4gIHB1YmxpYyB2MDogdW5rbm93biA9IG51bGw7XG5cbiAgLy8gRmV0Y2ggYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXIgb250byB0aGUgc3RhY2tcbiAgZmV0Y2gocmVnaXN0ZXI6IFN5c2NhbGxSZWdpc3Rlcik6IHZvaWQge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZmV0Y2hWYWx1ZShyZWdpc3Rlcik7XG5cbiAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpO1xuICB9XG5cbiAgLy8gTG9hZCBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGludG8gYSByZWdpc3RlclxuICBsb2FkKHJlZ2lzdGVyOiBTeXNjYWxsUmVnaXN0ZXIpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrLnBvcCgpO1xuXG4gICAgdGhpcy5sb2FkVmFsdWUocmVnaXN0ZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIEZldGNoIGEgdmFsdWUgZnJvbSBhIHJlZ2lzdGVyXG4gIGZldGNoVmFsdWUocmVnaXN0ZXI6IE1hY2hpbmVSZWdpc3Rlcik6IG51bWJlcjtcbiAgZmV0Y2hWYWx1ZTxUPihyZWdpc3RlcjogUmVnaXN0ZXIpOiBUO1xuICBmZXRjaFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3RlciB8IE1hY2hpbmVSZWdpc3Rlcik6IHVua25vd24ge1xuICAgIGlmIChpc0xvd0xldmVsUmVnaXN0ZXIocmVnaXN0ZXIpKSB7XG4gICAgICByZXR1cm4gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcihyZWdpc3Rlcik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWdpc3Rlcikge1xuICAgICAgY2FzZSAkczA6XG4gICAgICAgIHJldHVybiB0aGlzLnMwO1xuICAgICAgY2FzZSAkczE6XG4gICAgICAgIHJldHVybiB0aGlzLnMxO1xuICAgICAgY2FzZSAkdDA6XG4gICAgICAgIHJldHVybiB0aGlzLnQwO1xuICAgICAgY2FzZSAkdDE6XG4gICAgICAgIHJldHVybiB0aGlzLnQxO1xuICAgICAgY2FzZSAkdjA6XG4gICAgICAgIHJldHVybiB0aGlzLnYwO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXJcblxuICBsb2FkVmFsdWU8VD4ocmVnaXN0ZXI6IFJlZ2lzdGVyIHwgTWFjaGluZVJlZ2lzdGVyLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIGlmIChpc0xvd0xldmVsUmVnaXN0ZXIocmVnaXN0ZXIpKSB7XG4gICAgICB0aGlzW0lOTkVSX1ZNXS5sb2FkUmVnaXN0ZXIocmVnaXN0ZXIsICh2YWx1ZSBhcyBhbnkpIGFzIG51bWJlcik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWdpc3Rlcikge1xuICAgICAgY2FzZSAkczA6XG4gICAgICAgIHRoaXMuczAgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICRzMTpcbiAgICAgICAgdGhpcy5zMSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJHQwOlxuICAgICAgICB0aGlzLnQwID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAkdDE6XG4gICAgICAgIHRoaXMudDEgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICR2MDpcbiAgICAgICAgdGhpcy52MCA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZWQgdG8gSW5uZXJcbiAgICovXG5cbiAgLy8gU3RhcnQgYSBuZXcgZnJhbWUgYW5kIHNhdmUgJHJhIGFuZCAkZnAgb24gdGhlIHN0YWNrXG4gIHB1c2hGcmFtZSgpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5wdXNoRnJhbWUoKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgJHJhLCAkc3AgYW5kICRmcFxuICBwb3BGcmFtZSgpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5wb3BGcmFtZSgpO1xuICB9XG5cbiAgLy8gSnVtcCB0byBhbiBhZGRyZXNzIGluIGBwcm9ncmFtYFxuICBnb3RvKG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpc1tJTk5FUl9WTV0uZ290byhvZmZzZXQpO1xuICB9XG5cbiAgLy8gU2F2ZSAkcGMgaW50byAkcmEsIHRoZW4ganVtcCB0byBhIG5ldyBhZGRyZXNzIGluIGBwcm9ncmFtYCAoamFsIGluIE1JUFMpXG4gIGNhbGwoaGFuZGxlOiBudW1iZXIpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5jYWxsKGhhbmRsZSk7XG4gIH1cblxuICAvLyBQdXQgYSBzcGVjaWZpYyBgcHJvZ3JhbWAgYWRkcmVzcyBpbiAkcmFcbiAgcmV0dXJuVG8ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5yZXR1cm5UbyhvZmZzZXQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIHRvIHRoZSBgcHJvZ3JhbWAgYWRkcmVzcyBzdG9yZWQgaW4gJHJhXG4gIHJldHVybigpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5yZXR1cm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgb2YgbWlncmF0ZWQuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0LFxuICAgIHsgcGMsIHNjb3BlLCBkeW5hbWljU2NvcGUsIHN0YWNrIH06IFZNU3RhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50U3RhY2s6IEVsZW1lbnRCdWlsZGVyLFxuICAgIHJlYWRvbmx5IGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0XG4gICkge1xuICAgIGlmIChERUJVRykge1xuICAgICAgYXNzZXJ0R2xvYmFsQ29udGV4dFdhc1NldCEoKTtcbiAgICB9XG5cbiAgICBsZXQgZXZhbFN0YWNrID0gRXZhbHVhdGlvblN0YWNrSW1wbC5yZXN0b3JlKHN0YWNrKTtcblxuICAgIGFzc2VydCh0eXBlb2YgcGMgPT09ICdudW1iZXInLCAncGMgaXMgYSBudW1iZXInKTtcblxuICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdWyRwY10gPSBwYztcbiAgICBldmFsU3RhY2tbUkVHSVNURVJTXVskc3BdID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBldmFsU3RhY2tbUkVHSVNURVJTXVskZnBdID0gLTE7XG5cbiAgICB0aGlzW0hFQVBdID0gdGhpcy5wcm9ncmFtLmhlYXA7XG4gICAgdGhpc1tDT05TVEFOVFNdID0gdGhpcy5wcm9ncmFtLmNvbnN0YW50cztcbiAgICB0aGlzLmVsZW1lbnRTdGFjayA9IGVsZW1lbnRTdGFjaztcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucHVzaChzY29wZSk7XG4gICAgdGhpc1tTVEFDS1NdLmR5bmFtaWNTY29wZS5wdXNoKGR5bmFtaWNTY29wZSk7XG4gICAgdGhpc1tBUkdTXSA9IG5ldyBWTUFyZ3VtZW50c0ltcGwoKTtcbiAgICB0aGlzW0lOTkVSX1ZNXSA9IG5ldyBMb3dMZXZlbFZNKFxuICAgICAgZXZhbFN0YWNrLFxuICAgICAgdGhpc1tIRUFQXSxcbiAgICAgIHJ1bnRpbWUucHJvZ3JhbSxcbiAgICAgIHtcbiAgICAgICAgZGVidWdCZWZvcmU6IChvcGNvZGU6IFJ1bnRpbWVPcEltcGwpOiBEZWJ1Z1N0YXRlID0+IHtcbiAgICAgICAgICByZXR1cm4gQVBQRU5EX09QQ09ERVMuZGVidWdCZWZvcmUodGhpcywgb3Bjb2RlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWJ1Z0FmdGVyOiAoc3RhdGU6IERlYnVnU3RhdGUpOiB2b2lkID0+IHtcbiAgICAgICAgICBBUFBFTkRfT1BDT0RFUy5kZWJ1Z0FmdGVyKHRoaXMsIHN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBldmFsU3RhY2tbUkVHSVNURVJTXVxuICAgICk7XG5cbiAgICB0aGlzLmRlc3RydWN0b3IgPSB7fTtcbiAgICB0aGlzW0RFU1RST1lBQkxFX1NUQUNLXS5wdXNoKHRoaXMuZGVzdHJ1Y3Rvcik7XG4gIH1cblxuICBzdGF0aWMgaW5pdGlhbChcbiAgICBydW50aW1lOiBSdW50aW1lQ29udGV4dCxcbiAgICBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dCxcbiAgICB7IGhhbmRsZSwgc2VsZiwgZHluYW1pY1Njb3BlLCB0cmVlQnVpbGRlciwgbnVtU3ltYm9scywgb3duZXIgfTogSW5pdE9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IHNjb3BlID0gUGFydGlhbFNjb3BlSW1wbC5yb290KHNlbGYsIG51bVN5bWJvbHMsIG93bmVyKTtcbiAgICBsZXQgc3RhdGUgPSB2bVN0YXRlKHJ1bnRpbWUucHJvZ3JhbS5oZWFwLmdldGFkZHIoaGFuZGxlKSwgc2NvcGUsIGR5bmFtaWNTY29wZSk7XG4gICAgbGV0IHZtID0gaW5pdFZNKGNvbnRleHQpKHJ1bnRpbWUsIHN0YXRlLCB0cmVlQnVpbGRlcik7XG4gICAgdm0ucHVzaFVwZGF0aW5nKCk7XG4gICAgcmV0dXJuIHZtO1xuICB9XG5cbiAgc3RhdGljIGVtcHR5KFxuICAgIHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0LFxuICAgIHsgaGFuZGxlLCB0cmVlQnVpbGRlciwgZHluYW1pY1Njb3BlLCBvd25lciB9OiBNaW5pbWFsSW5pdE9wdGlvbnMsXG4gICAgY29udGV4dDogQ29tcGlsZVRpbWVDb21waWxhdGlvbkNvbnRleHRcbiAgKSB7XG4gICAgbGV0IHZtID0gaW5pdFZNKGNvbnRleHQpKFxuICAgICAgcnVudGltZSxcbiAgICAgIHZtU3RhdGUoXG4gICAgICAgIHJ1bnRpbWUucHJvZ3JhbS5oZWFwLmdldGFkZHIoaGFuZGxlKSxcbiAgICAgICAgUGFydGlhbFNjb3BlSW1wbC5yb290KFVOREVGSU5FRF9SRUZFUkVOQ0UsIDAsIG93bmVyKSxcbiAgICAgICAgZHluYW1pY1Njb3BlXG4gICAgICApLFxuICAgICAgdHJlZUJ1aWxkZXJcbiAgICApO1xuICAgIHZtLnB1c2hVcGRhdGluZygpO1xuICAgIHJldHVybiB2bTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdW1lOiBWbUluaXRDYWxsYmFjayA9IGluaXRWTSh0aGlzLmNvbnRleHQpO1xuXG4gIGNvbXBpbGUoYmxvY2s6IENvbXBpbGFibGVUZW1wbGF0ZSk6IG51bWJlciB7XG4gICAgbGV0IGhhbmRsZSA9IHVud3JhcEhhbmRsZShibG9jay5jb21waWxlKHRoaXMuY29udGV4dCkpO1xuXG4gICAgcmV0dXJuIGhhbmRsZTtcbiAgfVxuXG4gIGdldCBwcm9ncmFtKCk6IFJ1bnRpbWVQcm9ncmFtIHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lLnByb2dyYW07XG4gIH1cblxuICBnZXQgZW52KCk6IEVudmlyb25tZW50IHtcbiAgICByZXR1cm4gdGhpcy5ydW50aW1lLmVudjtcbiAgfVxuXG4gIGNhcHR1cmVTdGF0ZShhcmdzOiBudW1iZXIsIHBjID0gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcigkcGMpKTogVk1TdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBjLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUoKSxcbiAgICAgIGR5bmFtaWNTY29wZTogdGhpcy5keW5hbWljU2NvcGUoKSxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLmNhcHR1cmUoYXJncyksXG4gICAgfTtcbiAgfVxuXG4gIGNhcHR1cmUoYXJnczogbnVtYmVyLCBwYyA9IHRoaXNbSU5ORVJfVk1dLmZldGNoUmVnaXN0ZXIoJHBjKSk6IFJlc3VtYWJsZVZNU3RhdGUge1xuICAgIHJldHVybiBuZXcgUmVzdW1hYmxlVk1TdGF0ZUltcGwodGhpcy5jYXB0dXJlU3RhdGUoYXJncywgcGMpLCB0aGlzLnJlc3VtZSk7XG4gIH1cblxuICBiZWdpbkNhY2hlR3JvdXAobmFtZT86IHN0cmluZykge1xuICAgIGxldCBvcGNvZGVzID0gdGhpcy51cGRhdGluZygpO1xuICAgIGxldCBndWFyZCA9IG5ldyBKdW1wSWZOb3RNb2RpZmllZE9wY29kZSgpO1xuXG4gICAgb3Bjb2Rlcy5wdXNoKGd1YXJkKTtcbiAgICBvcGNvZGVzLnB1c2gobmV3IEJlZ2luVHJhY2tGcmFtZU9wY29kZShuYW1lKSk7XG4gICAgdGhpc1tTVEFDS1NdLmNhY2hlLnB1c2goZ3VhcmQpO1xuXG4gICAgYmVnaW5UcmFja0ZyYW1lKG5hbWUpO1xuICB9XG5cbiAgY29tbWl0Q2FjaGVHcm91cCgpIHtcbiAgICBsZXQgb3Bjb2RlcyA9IHRoaXMudXBkYXRpbmcoKTtcbiAgICBsZXQgZ3VhcmQgPSBleHBlY3QodGhpc1tTVEFDS1NdLmNhY2hlLnBvcCgpLCAnVk0gQlVHOiBFeHBlY3RlZCBhIGNhY2hlIGdyb3VwJyk7XG5cbiAgICBsZXQgdGFnID0gZW5kVHJhY2tGcmFtZSgpO1xuICAgIG9wY29kZXMucHVzaChuZXcgRW5kVHJhY2tGcmFtZU9wY29kZShndWFyZCkpO1xuXG4gICAgZ3VhcmQuZmluYWxpemUodGFnLCBvcGNvZGVzLmxlbmd0aCk7XG4gIH1cblxuICBlbnRlcihhcmdzOiBudW1iZXIpIHtcbiAgICBsZXQgdXBkYXRpbmc6IFVwZGF0aW5nT3Bjb2RlW10gPSBbXTtcblxuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZShhcmdzKTtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmVsZW1lbnRzKCkucHVzaFVwZGF0YWJsZUJsb2NrKCk7XG5cbiAgICBsZXQgdHJ5T3Bjb2RlID0gbmV3IFRyeU9wY29kZShzdGF0ZSwgdGhpcy5ydW50aW1lLCBibG9jaywgdXBkYXRpbmcpO1xuXG4gICAgdGhpcy5kaWRFbnRlcih0cnlPcGNvZGUpO1xuICB9XG5cbiAgZW50ZXJJdGVtKHsga2V5LCB2YWx1ZSwgbWVtbyB9OiBPcGFxdWVJdGVyYXRpb25JdGVtKTogTGlzdEl0ZW1PcGNvZGUge1xuICAgIGxldCB7IHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgbGV0IHZhbHVlUmVmID0gY3JlYXRlSXRlcmF0b3JJdGVtUmVmKHZhbHVlKTtcbiAgICBsZXQgbWVtb1JlZiA9IGNyZWF0ZUl0ZXJhdG9ySXRlbVJlZihtZW1vKTtcblxuICAgIHN0YWNrLnB1c2godmFsdWVSZWYpO1xuICAgIHN0YWNrLnB1c2gobWVtb1JlZik7XG5cbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNhcHR1cmUoMik7XG4gICAgbGV0IGJsb2NrID0gdGhpcy5lbGVtZW50cygpLnB1c2hVcGRhdGFibGVCbG9jaygpO1xuXG4gICAgbGV0IG9wY29kZSA9IG5ldyBMaXN0SXRlbU9wY29kZShzdGF0ZSwgdGhpcy5ydW50aW1lLCBibG9jaywga2V5LCBtZW1vUmVmLCB2YWx1ZVJlZik7XG4gICAgdGhpcy5kaWRFbnRlcihvcGNvZGUpO1xuXG4gICAgcmV0dXJuIG9wY29kZTtcbiAgfVxuXG4gIHJlZ2lzdGVySXRlbShvcGNvZGU6IExpc3RJdGVtT3Bjb2RlKSB7XG4gICAgdGhpcy5saXN0QmxvY2soKS5pbml0aWFsaXplQ2hpbGQob3Bjb2RlKTtcbiAgfVxuXG4gIGVudGVyTGlzdChpdGVyYWJsZVJlZjogUmVmZXJlbmNlPE9wYXF1ZUl0ZXJhdG9yPiwgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICBsZXQgdXBkYXRpbmc6IExpc3RJdGVtT3Bjb2RlW10gPSBbXTtcblxuICAgIGxldCBhZGRyID0gdGhpc1tJTk5FUl9WTV0udGFyZ2V0KG9mZnNldCk7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKDAsIGFkZHIpO1xuICAgIGxldCBsaXN0ID0gdGhpcy5lbGVtZW50cygpLnB1c2hCbG9ja0xpc3QodXBkYXRpbmcpIGFzIExpdmVCbG9ja0xpc3Q7XG5cbiAgICBsZXQgb3Bjb2RlID0gbmV3IExpc3RCbG9ja09wY29kZShzdGF0ZSwgdGhpcy5ydW50aW1lLCBsaXN0LCB1cGRhdGluZywgaXRlcmFibGVSZWYpO1xuXG4gICAgdGhpc1tTVEFDS1NdLmxpc3QucHVzaChvcGNvZGUpO1xuXG4gICAgdGhpcy5kaWRFbnRlcihvcGNvZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaWRFbnRlcihvcGNvZGU6IEJsb2NrT3Bjb2RlKSB7XG4gICAgdGhpcy5hc3NvY2lhdGVEZXN0cm95YWJsZShvcGNvZGUpO1xuICAgIHRoaXNbREVTVFJPWUFCTEVfU1RBQ0tdLnB1c2gob3Bjb2RlKTtcbiAgICB0aGlzLnVwZGF0ZVdpdGgob3Bjb2RlKTtcbiAgICB0aGlzLnB1c2hVcGRhdGluZyhvcGNvZGUuY2hpbGRyZW4pO1xuICB9XG5cbiAgZXhpdCgpIHtcbiAgICB0aGlzW0RFU1RST1lBQkxFX1NUQUNLXS5wb3AoKTtcbiAgICB0aGlzLmVsZW1lbnRzKCkucG9wQmxvY2soKTtcbiAgICB0aGlzLnBvcFVwZGF0aW5nKCk7XG4gIH1cblxuICBleGl0TGlzdCgpIHtcbiAgICB0aGlzLmV4aXQoKTtcbiAgICB0aGlzW1NUQUNLU10ubGlzdC5wb3AoKTtcbiAgfVxuXG4gIHB1c2hVcGRhdGluZyhsaXN0OiBVcGRhdGluZ09wY29kZVtdID0gW10pOiB2b2lkIHtcbiAgICB0aGlzW1NUQUNLU10udXBkYXRpbmcucHVzaChsaXN0KTtcbiAgfVxuXG4gIHBvcFVwZGF0aW5nKCk6IFVwZGF0aW5nT3Bjb2RlW10ge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tTVEFDS1NdLnVwZGF0aW5nLnBvcCgpLCBcImNhbid0IHBvcCBhbiBlbXB0eSBzdGFja1wiKTtcbiAgfVxuXG4gIHVwZGF0ZVdpdGgob3Bjb2RlOiBVcGRhdGluZ09wY29kZSkge1xuICAgIHRoaXMudXBkYXRpbmcoKS5wdXNoKG9wY29kZSk7XG4gIH1cblxuICBsaXN0QmxvY2soKTogTGlzdEJsb2NrT3Bjb2RlIHtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXNbU1RBQ0tTXS5saXN0LmN1cnJlbnQsICdleHBlY3RlZCBhIGxpc3QgYmxvY2snKTtcbiAgfVxuXG4gIGFzc29jaWF0ZURlc3Ryb3lhYmxlKGNoaWxkOiBEZXN0cm95YWJsZSk6IHZvaWQge1xuICAgIGxldCBwYXJlbnQgPSBleHBlY3QodGhpc1tERVNUUk9ZQUJMRV9TVEFDS10uY3VycmVudCwgJ0V4cGVjdGVkIGRlc3RydWN0b3IgcGFyZW50Jyk7XG4gICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChwYXJlbnQsIGNoaWxkKTtcbiAgfVxuXG4gIHRyeVVwZGF0aW5nKCk6IE9wdGlvbjxVcGRhdGluZ09wY29kZVtdPiB7XG4gICAgcmV0dXJuIHRoaXNbU1RBQ0tTXS51cGRhdGluZy5jdXJyZW50O1xuICB9XG5cbiAgdXBkYXRpbmcoKTogVXBkYXRpbmdPcGNvZGVbXSB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXNbU1RBQ0tTXS51cGRhdGluZy5jdXJyZW50LFxuICAgICAgJ2V4cGVjdGVkIHVwZGF0aW5nIG9wY29kZSBvbiB0aGUgdXBkYXRpbmcgb3Bjb2RlIHN0YWNrJ1xuICAgICk7XG4gIH1cblxuICBlbGVtZW50cygpOiBFbGVtZW50QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrO1xuICB9XG5cbiAgc2NvcGUoKTogU2NvcGUge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tTVEFDS1NdLnNjb3BlLmN1cnJlbnQsICdleHBlY3RlZCBzY29wZSBvbiB0aGUgc2NvcGUgc3RhY2snKTtcbiAgfVxuXG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGUge1xuICAgIHJldHVybiBleHBlY3QoXG4gICAgICB0aGlzW1NUQUNLU10uZHluYW1pY1Njb3BlLmN1cnJlbnQsXG4gICAgICAnZXhwZWN0ZWQgZHluYW1pYyBzY29wZSBvbiB0aGUgZHluYW1pYyBzY29wZSBzdGFjaydcbiAgICApO1xuICB9XG5cbiAgcHVzaENoaWxkU2NvcGUoKSB7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnB1c2godGhpcy5zY29wZSgpLmNoaWxkKCkpO1xuICB9XG5cbiAgcHVzaER5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGUge1xuICAgIGxldCBjaGlsZCA9IHRoaXMuZHluYW1pY1Njb3BlKCkuY2hpbGQoKTtcbiAgICB0aGlzW1NUQUNLU10uZHluYW1pY1Njb3BlLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHB1c2hSb290U2NvcGUoc2l6ZTogbnVtYmVyLCBvd25lcjogT3duZXIpOiBQYXJ0aWFsU2NvcGUge1xuICAgIGxldCBzY29wZSA9IFBhcnRpYWxTY29wZUltcGwuc2l6ZWQoc2l6ZSwgb3duZXIpO1xuICAgIHRoaXNbU1RBQ0tTXS5zY29wZS5wdXNoKHNjb3BlKTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICBwdXNoU2NvcGUoc2NvcGU6IFNjb3BlKSB7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnB1c2goc2NvcGUpO1xuICB9XG5cbiAgcG9wU2NvcGUoKSB7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnBvcCgpO1xuICB9XG5cbiAgcG9wRHluYW1pY1Njb3BlKCkge1xuICAgIHRoaXNbU1RBQ0tTXS5keW5hbWljU2NvcGUucG9wKCk7XG4gIH1cblxuICAvLy8gU0NPUEUgSEVMUEVSU1xuXG4gIGdldE93bmVyKCk6IE93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZSgpLm93bmVyO1xuICB9XG5cbiAgZ2V0U2VsZigpOiBSZWZlcmVuY2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUoKS5nZXRTZWxmKCk7XG4gIH1cblxuICByZWZlcmVuY2VGb3JTeW1ib2woc3ltYm9sOiBudW1iZXIpOiBSZWZlcmVuY2Uge1xuICAgIHJldHVybiB0aGlzLnNjb3BlKCkuZ2V0U3ltYm9sKHN5bWJvbCk7XG4gIH1cblxuICAvLy8gRVhFQ1VUSU9OXG5cbiAgZXhlY3V0ZShpbml0aWFsaXplPzogKHZtOiB0aGlzKSA9PiB2b2lkKTogUmVuZGVyUmVzdWx0IHtcbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIGxldCBoYXNFcnJvcmVkID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2V4ZWN1dGUoaW5pdGlhbGl6ZSk7XG5cbiAgICAgICAgLy8gdXNpbmcgYSBib29sZWFuIGhlcmUgdG8gYXZvaWQgYnJlYWtpbmcgZXJnb25vbWljcyBvZiBcInBhdXNlIG9uIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcIlxuICAgICAgICAvLyB3aGljaCB3b3VsZCBoYXBwZW4gd2l0aCBhIGBjYXRjaGAgKyBgdGhyb3dgXG4gICAgICAgIGhhc0Vycm9yZWQgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoaGFzRXJyb3JlZCkge1xuICAgICAgICAgIC8vIElmIGFueSBleGlzdGluZyBibG9ja3MgYXJlIG9wZW4sIGR1ZSB0byBhbiBlcnJvciBvciBzb21ldGhpbmcgbGlrZVxuICAgICAgICAgIC8vIHRoYXQsIHdlIG5lZWQgdG8gY2xvc2UgdGhlbSBhbGwgYW5kIGNsZWFuIHRoaW5ncyB1cCBwcm9wZXJseS5cbiAgICAgICAgICBsZXQgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCk7XG5cbiAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzQmxvY2tzKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wb3BCbG9jaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgXFxuXFxuRXJyb3Igb2NjdXJyZWQ6XFxuXFxuJHtyZXNldFRyYWNraW5nKCl9XFxuXFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGUoaW5pdGlhbGl6ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZShpbml0aWFsaXplPzogKHZtOiB0aGlzKSA9PiB2b2lkKTogUmVuZGVyUmVzdWx0IHtcbiAgICBp