UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

587 lines (455 loc) 52.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.clientBuilder = clientBuilder; exports.LiveBlockList = exports.UpdatableBlockImpl = exports.RemoteLiveBlock = exports.SimpleLiveBlock = exports.NewElementBuilder = exports.CURSOR_STACK = exports.Fragment = void 0; var _util = require("@glimmer/util"); var _bounds2 = require("../bounds"); var _destroyable = require("@glimmer/destroyable"); var _dynamic = require("./attributes/dynamic"); function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } 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; var First = /*#__PURE__*/function () { function First(node) { this.node = node; } var _proto = First.prototype; _proto.firstNode = function firstNode() { return this.node; }; return First; }(); var Last = /*#__PURE__*/function () { function Last(node) { this.node = node; } var _proto2 = Last.prototype; _proto2.lastNode = function lastNode() { return this.node; }; return Last; }(); var Fragment = /*#__PURE__*/function () { function Fragment(bounds) { this.bounds = bounds; } var _proto3 = Fragment.prototype; _proto3.parentElement = function parentElement() { return this.bounds.parentElement(); }; _proto3.firstNode = function firstNode() { return this.bounds.firstNode(); }; _proto3.lastNode = function lastNode() { return this.bounds.lastNode(); }; return Fragment; }(); exports.Fragment = Fragment; var CURSOR_STACK = (0, _util.symbol)('CURSOR_STACK'); exports.CURSOR_STACK = CURSOR_STACK; var NewElementBuilder = /*#__PURE__*/function () { function NewElementBuilder(env, parentNode, nextSibling) { this.constructing = null; this.operations = null; this[_a] = new _util.Stack(); this.modifierStack = new _util.Stack(); this.blockStack = new _util.Stack(); this.pushElement(parentNode, nextSibling); this.env = env; this.dom = env.getAppendOperations(); this.updateOperations = env.getDOM(); } NewElementBuilder.forInitialRender = function forInitialRender(env, cursor) { return new this(env, cursor.element, cursor.nextSibling).initialize(); }; NewElementBuilder.resume = function resume(env, block) { var parentNode = block.parentElement(); var nextSibling = block.reset(env); var stack = new this(env, parentNode, nextSibling).initialize(); stack.pushLiveBlock(block); return stack; }; var _proto4 = NewElementBuilder.prototype; _proto4.initialize = function initialize() { this.pushSimpleBlock(); return this; }; _proto4.debugBlocks = function debugBlocks() { return this.blockStack.toArray(); }; _proto4.block = function block() { return this.blockStack.current; }; _proto4.popElement = function popElement() { this[CURSOR_STACK].pop(); this[CURSOR_STACK].current; }; _proto4.pushSimpleBlock = function pushSimpleBlock() { return this.pushLiveBlock(new SimpleLiveBlock(this.element)); }; _proto4.pushUpdatableBlock = function pushUpdatableBlock() { return this.pushLiveBlock(new UpdatableBlockImpl(this.element)); }; _proto4.pushBlockList = function pushBlockList(list) { return this.pushLiveBlock(new LiveBlockList(this.element, list)); }; _proto4.pushLiveBlock = function pushLiveBlock(block, isRemote) { if (isRemote === void 0) { isRemote = false; } var current = this.blockStack.current; if (current !== null) { if (!isRemote) { current.didAppendBounds(block); } } this.__openBlock(); this.blockStack.push(block); return block; }; _proto4.popBlock = function popBlock() { this.block().finalize(this); this.__closeBlock(); return this.blockStack.pop(); }; _proto4.__openBlock = function __openBlock() {}; _proto4.__closeBlock = function __closeBlock() {} // todo return seems unused ; _proto4.openElement = function openElement(tag) { var element = this.__openElement(tag); this.constructing = element; return element; }; _proto4.__openElement = function __openElement(tag) { return this.dom.createElement(tag, this.element); }; _proto4.flushElement = function flushElement(modifiers) { var parent = this.element; var element = this.constructing; this.__flushElement(parent, element); this.constructing = null; this.operations = null; this.pushModifiers(modifiers); this.pushElement(element, null); this.didOpenElement(element); }; _proto4.__flushElement = function __flushElement(parent, constructing) { this.dom.insertBefore(parent, constructing, this.nextSibling); }; _proto4.closeElement = function closeElement() { this.willCloseElement(); this.popElement(); return this.popModifiers(); }; _proto4.pushRemoteElement = function pushRemoteElement(element, guid, insertBefore) { return this.__pushRemoteElement(element, guid, insertBefore); }; _proto4.__pushRemoteElement = function __pushRemoteElement(element, _guid, insertBefore) { this.pushElement(element, insertBefore); if (insertBefore === undefined) { while (element.lastChild) { element.removeChild(element.lastChild); } } var block = new RemoteLiveBlock(element); return this.pushLiveBlock(block, true); }; _proto4.popRemoteElement = function popRemoteElement() { this.popBlock(); this.popElement(); }; _proto4.pushElement = function pushElement(element, nextSibling) { if (nextSibling === void 0) { nextSibling = null; } this[CURSOR_STACK].push(new _bounds2.CursorImpl(element, nextSibling)); }; _proto4.pushModifiers = function pushModifiers(modifiers) { this.modifierStack.push(modifiers); }; _proto4.popModifiers = function popModifiers() { return this.modifierStack.pop(); }; _proto4.didAppendBounds = function didAppendBounds(bounds) { this.block().didAppendBounds(bounds); return bounds; }; _proto4.didAppendNode = function didAppendNode(node) { this.block().didAppendNode(node); return node; }; _proto4.didOpenElement = function didOpenElement(element) { this.block().openElement(element); return element; }; _proto4.willCloseElement = function willCloseElement() { this.block().closeElement(); }; _proto4.appendText = function appendText(string) { return this.didAppendNode(this.__appendText(string)); }; _proto4.__appendText = function __appendText(text) { var dom = this.dom, element = this.element, nextSibling = this.nextSibling; var node = dom.createTextNode(text); dom.insertBefore(element, node, nextSibling); return node; }; _proto4.__appendNode = function __appendNode(node) { this.dom.insertBefore(this.element, node, this.nextSibling); return node; }; _proto4.__appendFragment = function __appendFragment(fragment) { var first = fragment.firstChild; if (first) { var ret = new _bounds2.ConcreteBounds(this.element, first, fragment.lastChild); this.dom.insertBefore(this.element, fragment, this.nextSibling); return ret; } else { return new _bounds2.SingleNodeBounds(this.element, this.__appendComment('')); } }; _proto4.__appendHTML = function __appendHTML(html) { return this.dom.insertHTMLBefore(this.element, this.nextSibling, html); }; _proto4.appendDynamicHTML = function appendDynamicHTML(value) { var bounds = this.trustedContent(value); this.didAppendBounds(bounds); }; _proto4.appendDynamicText = function appendDynamicText(value) { var node = this.untrustedContent(value); this.didAppendNode(node); return node; }; _proto4.appendDynamicFragment = function appendDynamicFragment(value) { var bounds = this.__appendFragment(value); this.didAppendBounds(bounds); }; _proto4.appendDynamicNode = function appendDynamicNode(value) { var node = this.__appendNode(value); var bounds = new _bounds2.SingleNodeBounds(this.element, node); this.didAppendBounds(bounds); }; _proto4.trustedContent = function trustedContent(value) { return this.__appendHTML(value); }; _proto4.untrustedContent = function untrustedContent(value) { return this.__appendText(value); }; _proto4.appendComment = function appendComment(string) { return this.didAppendNode(this.__appendComment(string)); }; _proto4.__appendComment = function __appendComment(string) { var dom = this.dom, element = this.element, nextSibling = this.nextSibling; var node = dom.createComment(string); dom.insertBefore(element, node, nextSibling); return node; }; _proto4.__setAttribute = function __setAttribute(name, value, namespace) { this.dom.setAttribute(this.constructing, name, value, namespace); }; _proto4.__setProperty = function __setProperty(name, value) { this.constructing[name] = value; }; _proto4.setStaticAttribute = function setStaticAttribute(name, value, namespace) { this.__setAttribute(name, value, namespace); }; _proto4.setDynamicAttribute = function setDynamicAttribute(name, value, trusting, namespace) { var element = this.constructing; var attribute = (0, _dynamic.dynamicAttribute)(element, name, namespace, trusting); attribute.set(this, value, this.env); return attribute; }; _createClass(NewElementBuilder, [{ key: "element", get: function get() { return this[CURSOR_STACK].current.element; } }, { key: "nextSibling", get: function get() { return this[CURSOR_STACK].current.nextSibling; } }, { key: "hasBlocks", get: function get() { return this.blockStack.size > 0; } }]); return NewElementBuilder; }(); exports.NewElementBuilder = NewElementBuilder; _a = CURSOR_STACK; var SimpleLiveBlock = /*#__PURE__*/function () { function SimpleLiveBlock(parent) { this.parent = parent; this.first = null; this.last = null; this.nesting = 0; } var _proto5 = SimpleLiveBlock.prototype; _proto5.parentElement = function parentElement() { return this.parent; }; _proto5.firstNode = function firstNode() { var first = this.first; return first.firstNode(); }; _proto5.lastNode = function lastNode() { var last = this.last; return last.lastNode(); }; _proto5.openElement = function openElement(element) { this.didAppendNode(element); this.nesting++; }; _proto5.closeElement = function closeElement() { this.nesting--; }; _proto5.didAppendNode = function didAppendNode(node) { if (this.nesting !== 0) return; if (!this.first) { this.first = new First(node); } this.last = new Last(node); }; _proto5.didAppendBounds = function didAppendBounds(bounds) { if (this.nesting !== 0) return; if (!this.first) { this.first = bounds; } this.last = bounds; }; _proto5.finalize = function finalize(stack) { if (this.first === null) { stack.appendComment(''); } }; return SimpleLiveBlock; }(); exports.SimpleLiveBlock = SimpleLiveBlock; var RemoteLiveBlock = /*#__PURE__*/function (_SimpleLiveBlock) { _inheritsLoose(RemoteLiveBlock, _SimpleLiveBlock); function RemoteLiveBlock(parent) { var _this; _this = _SimpleLiveBlock.call(this, parent) || this; (0, _destroyable.registerDestructor)(_assertThisInitialized(_this), function () { // In general, you only need to clear the root of a hierarchy, and should never // need to clear any child nodes. This is an important constraint that gives us // a strong guarantee that clearing a subtree is a single DOM operation. // // Because remote blocks are not normally physically nested inside of the tree // that they are logically nested inside, we manually clear remote blocks when // a logical parent is cleared. // // HOWEVER, it is currently possible for a remote block to be physically nested // inside of the block it is logically contained inside of. This happens when // the remote block is appended to the end of the application's entire element. // // The problem with that scenario is that Glimmer believes that it owns more of // the DOM than it actually does. The code is attempting to write past the end // of the Glimmer-managed root, but Glimmer isn't aware of that. // // The correct solution to that problem is for Glimmer to be aware of the end // of the bounds that it owns, and once we make that change, this check could // be removed. // // For now, a more targeted fix is to check whether the node was already removed // and avoid clearing the node if it was. In most cases this shouldn't happen, // so this might hide bugs where the code clears nested nodes unnecessarily, // so we should eventually try to do the correct fix. if (_this.parentElement() === _this.firstNode().parentNode) { (0, _bounds2.clear)(_assertThisInitialized(_this)); } }); return _this; } return RemoteLiveBlock; }(SimpleLiveBlock); exports.RemoteLiveBlock = RemoteLiveBlock; var UpdatableBlockImpl = /*#__PURE__*/function (_SimpleLiveBlock2) { _inheritsLoose(UpdatableBlockImpl, _SimpleLiveBlock2); function UpdatableBlockImpl() { return _SimpleLiveBlock2.apply(this, arguments) || this; } var _proto6 = UpdatableBlockImpl.prototype; _proto6.reset = function reset() { (0, _destroyable.destroy)(this); var nextSibling = (0, _bounds2.clear)(this); this.first = null; this.last = null; this.nesting = 0; return nextSibling; }; return UpdatableBlockImpl; }(SimpleLiveBlock); // FIXME: All the noops in here indicate a modelling problem exports.UpdatableBlockImpl = UpdatableBlockImpl; var LiveBlockList = /*#__PURE__*/function () { function LiveBlockList(parent, boundList) { this.parent = parent; this.boundList = boundList; this.parent = parent; this.boundList = boundList; } var _proto7 = LiveBlockList.prototype; _proto7.parentElement = function parentElement() { return this.parent; }; _proto7.firstNode = function firstNode() { var head = this.boundList[0]; return head.firstNode(); }; _proto7.lastNode = function lastNode() { var boundList = this.boundList; var tail = boundList[boundList.length - 1]; return tail.lastNode(); }; _proto7.openElement = function openElement(_element) { false && (0, _util.assert)(false, 'Cannot openElement directly inside a block list'); }; _proto7.closeElement = function closeElement() { false && (0, _util.assert)(false, 'Cannot closeElement directly inside a block list'); }; _proto7.didAppendNode = function didAppendNode(_node) { false && (0, _util.assert)(false, 'Cannot create a new node directly inside a block list'); }; _proto7.didAppendBounds = function didAppendBounds(_bounds) {}; _proto7.finalize = function finalize(_stack) { false && (0, _util.assert)(this.boundList.length > 0, 'boundsList cannot be empty'); }; return LiveBlockList; }(); exports.LiveBlockList = LiveBlockList; function clientBuilder(env, cursor) { return NewElementBuilder.forInitialRender(env, cursor); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2VsZW1lbnQtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWVBOztBQVNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBVUEsSztBQUNFLFdBQUEsS0FBQSxDQUFBLElBQUEsRUFBb0M7QUFBaEIsU0FBQSxJQUFBLEdBQUEsSUFBQTtBQUFvQjs7OztTQUV4QyxTLEdBQUEsU0FBQSxTQUFBLEdBQVM7QUFDUCxXQUFPLEtBQVAsSUFBQTs7Ozs7O0lBSUosSTtBQUNFLFdBQUEsSUFBQSxDQUFBLElBQUEsRUFBb0M7QUFBaEIsU0FBQSxJQUFBLEdBQUEsSUFBQTtBQUFvQjs7OztVQUV4QyxRLEdBQUEsU0FBQSxRQUFBLEdBQVE7QUFDTixXQUFPLEtBQVAsSUFBQTs7Ozs7O0FBSUosSUFBTSxRQUFOLEdBQUEsYUFBQSxZQUFBO0FBR0UsV0FBQSxRQUFBLENBQUEsTUFBQSxFQUEwQjtBQUN4QixTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQ0Q7O0FBTEgsTUFBQSxPQUFBLEdBQUEsUUFBQSxDQUFBLFNBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsYUFBQSxHQU9FLFNBQUEsYUFBQSxHQUFhO0FBQ1gsV0FBTyxLQUFBLE1BQUEsQ0FBUCxhQUFPLEVBQVA7QUFSSixHQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLFNBQUEsR0FXRSxTQUFBLFNBQUEsR0FBUztBQUNQLFdBQU8sS0FBQSxNQUFBLENBQVAsU0FBTyxFQUFQO0FBWkosR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxRQUFBLEdBZUUsU0FBQSxRQUFBLEdBQVE7QUFDTixXQUFPLEtBQUEsTUFBQSxDQUFQLFFBQU8sRUFBUDtBQWhCSixHQUFBOztBQUFBLFNBQUEsUUFBQTtBQUFBLENBQUEsRUFBQTs7O0FBb0JPLElBQU0sWUFBWSxHQUFzQixrQkFBeEMsY0FB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QixnQkFBQSxDQUFBLEdBQUEsRUFBUCxNQUFPLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJvdW5kcyxcbiAgQ3Vyc29yLFxuICBDdXJzb3JTdGFja1N5bWJvbCxcbiAgRWxlbWVudEJ1aWxkZXIsXG4gIEVsZW1lbnRPcGVyYXRpb25zLFxuICBFbnZpcm9ubWVudCxcbiAgR2xpbW1lclRyZWVDaGFuZ2VzLFxuICBHbGltbWVyVHJlZUNvbnN0cnVjdGlvbixcbiAgTGl2ZUJsb2NrLFxuICBNYXliZSxcbiAgT3B0aW9uLFxuICBVcGRhdGFibGVCbG9jayxcbiAgTW9kaWZpZXJJbnN0YW5jZSxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnQsIGV4cGVjdCwgU3RhY2ssIHN5bWJvbCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgQXR0ck5hbWVzcGFjZSxcbiAgU2ltcGxlQ29tbWVudCxcbiAgU2ltcGxlRG9jdW1lbnRGcmFnbWVudCxcbiAgU2ltcGxlRWxlbWVudCxcbiAgU2ltcGxlTm9kZSxcbiAgU2ltcGxlVGV4dCxcbn0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcbmltcG9ydCB7IGNsZWFyLCBDb25jcmV0ZUJvdW5kcywgQ3Vyc29ySW1wbCwgU2luZ2xlTm9kZUJvdW5kcyB9IGZyb20gJy4uL2JvdW5kcyc7XG5pbXBvcnQgeyBkZXN0cm95LCByZWdpc3RlckRlc3RydWN0b3IgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5pbXBvcnQgeyBEeW5hbWljQXR0cmlidXRlLCBkeW5hbWljQXR0cmlidXRlIH0gZnJvbSAnLi9hdHRyaWJ1dGVzL2R5bmFtaWMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0Tm9kZSB7XG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhc3ROb2RlIHtcbiAgbGFzdE5vZGUoKTogU2ltcGxlTm9kZTtcbn1cblxuY2xhc3MgRmlyc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGU6IFNpbXBsZU5vZGUpIHt9XG5cbiAgZmlyc3ROb2RlKCk6IFNpbXBsZU5vZGUge1xuICAgIHJldHVybiB0aGlzLm5vZGU7XG4gIH1cbn1cblxuY2xhc3MgTGFzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbm9kZTogU2ltcGxlTm9kZSkge31cblxuICBsYXN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIEJvdW5kcyB7XG4gIHByaXZhdGUgYm91bmRzOiBCb3VuZHM7XG5cbiAgY29uc3RydWN0b3IoYm91bmRzOiBCb3VuZHMpIHtcbiAgICB0aGlzLmJvdW5kcyA9IGJvdW5kcztcbiAgfVxuXG4gIHBhcmVudEVsZW1lbnQoKTogU2ltcGxlRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRzLnBhcmVudEVsZW1lbnQoKTtcbiAgfVxuXG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ib3VuZHMuZmlyc3ROb2RlKCk7XG4gIH1cblxuICBsYXN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ib3VuZHMubGFzdE5vZGUoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQ1VSU09SX1NUQUNLOiBDdXJzb3JTdGFja1N5bWJvbCA9IHN5bWJvbCgnQ1VSU09SX1NUQUNLJyk7XG5cbmV4cG9ydCBjbGFzcyBOZXdFbGVtZW50QnVpbGRlciBpbXBsZW1lbnRzIEVsZW1lbnRCdWlsZGVyIHtcbiAgcHVibGljIGRvbTogR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb247XG4gIHB1YmxpYyB1cGRhdGVPcGVyYXRpb25zOiBHbGltbWVyVHJlZUNoYW5nZXM7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rpbmc6IE9wdGlvbjxTaW1wbGVFbGVtZW50PiA9IG51bGw7XG4gIHB1YmxpYyBvcGVyYXRpb25zOiBPcHRpb248RWxlbWVudE9wZXJhdGlvbnM+ID0gbnVsbDtcbiAgcHJpdmF0ZSBlbnY6IEVudmlyb25tZW50O1xuXG4gIFtDVVJTT1JfU1RBQ0tdID0gbmV3IFN0YWNrPEN1cnNvcj4oKTtcbiAgcHJpdmF0ZSBtb2RpZmllclN0YWNrID0gbmV3IFN0YWNrPE9wdGlvbjxNb2RpZmllckluc3RhbmNlW10+PigpO1xuICBwcml2YXRlIGJsb2NrU3RhY2sgPSBuZXcgU3RhY2s8TGl2ZUJsb2NrPigpO1xuXG4gIHN0YXRpYyBmb3JJbml0aWFsUmVuZGVyKGVudjogRW52aXJvbm1lbnQsIGN1cnNvcjogQ3Vyc29ySW1wbCkge1xuICAgIHJldHVybiBuZXcgdGhpcyhlbnYsIGN1cnNvci5lbGVtZW50LCBjdXJzb3IubmV4dFNpYmxpbmcpLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHN0YXRpYyByZXN1bWUoZW52OiBFbnZpcm9ubWVudCwgYmxvY2s6IFVwZGF0YWJsZUJsb2NrKTogTmV3RWxlbWVudEJ1aWxkZXIge1xuICAgIGxldCBwYXJlbnROb2RlID0gYmxvY2sucGFyZW50RWxlbWVudCgpO1xuICAgIGxldCBuZXh0U2libGluZyA9IGJsb2NrLnJlc2V0KGVudik7XG5cbiAgICBsZXQgc3RhY2sgPSBuZXcgdGhpcyhlbnYsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nKS5pbml0aWFsaXplKCk7XG4gICAgc3RhY2sucHVzaExpdmVCbG9jayhibG9jayk7XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihlbnY6IEVudmlyb25tZW50LCBwYXJlbnROb2RlOiBTaW1wbGVFbGVtZW50LCBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+KSB7XG4gICAgdGhpcy5wdXNoRWxlbWVudChwYXJlbnROb2RlLCBuZXh0U2libGluZyk7XG5cbiAgICB0aGlzLmVudiA9IGVudjtcbiAgICB0aGlzLmRvbSA9IGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gZW52LmdldERPTSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemUoKTogdGhpcyB7XG4gICAgdGhpcy5wdXNoU2ltcGxlQmxvY2soKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRlYnVnQmxvY2tzKCk6IExpdmVCbG9ja1tdIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja1N0YWNrLnRvQXJyYXkoKTtcbiAgfVxuXG4gIGdldCBlbGVtZW50KCk6IFNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzW0NVUlNPUl9TVEFDS10uY3VycmVudCEuZWxlbWVudDtcbiAgfVxuXG4gIGdldCBuZXh0U2libGluZygpOiBPcHRpb248U2ltcGxlTm9kZT4ge1xuICAgIHJldHVybiB0aGlzW0NVUlNPUl9TVEFDS10uY3VycmVudCEubmV4dFNpYmxpbmc7XG4gIH1cblxuICBnZXQgaGFzQmxvY2tzKCkge1xuICAgIHJldHVybiB0aGlzLmJsb2NrU3RhY2suc2l6ZSA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYmxvY2soKTogTGl2ZUJsb2NrIHtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXMuYmxvY2tTdGFjay5jdXJyZW50LCAnRXhwZWN0ZWQgYSBjdXJyZW50IGxpdmUgYmxvY2snKTtcbiAgfVxuXG4gIHBvcEVsZW1lbnQoKSB7XG4gICAgdGhpc1tDVVJTT1JfU1RBQ0tdLnBvcCgpO1xuICAgIGV4cGVjdCh0aGlzW0NVUlNPUl9TVEFDS10uY3VycmVudCwgXCJjYW4ndCBwb3AgcGFzdCB0aGUgbGFzdCBlbGVtZW50XCIpO1xuICB9XG5cbiAgcHVzaFNpbXBsZUJsb2NrKCk6IExpdmVCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMucHVzaExpdmVCbG9jayhuZXcgU2ltcGxlTGl2ZUJsb2NrKHRoaXMuZWxlbWVudCkpO1xuICB9XG5cbiAgcHVzaFVwZGF0YWJsZUJsb2NrKCk6IFVwZGF0YWJsZUJsb2NrSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMucHVzaExpdmVCbG9jayhuZXcgVXBkYXRhYmxlQmxvY2tJbXBsKHRoaXMuZWxlbWVudCkpO1xuICB9XG5cbiAgcHVzaEJsb2NrTGlzdChsaXN0OiBMaXZlQmxvY2tbXSk6IExpdmVCbG9ja0xpc3Qge1xuICAgIHJldHVybiB0aGlzLnB1c2hMaXZlQmxvY2sobmV3IExpdmVCbG9ja0xpc3QodGhpcy5lbGVtZW50LCBsaXN0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHVzaExpdmVCbG9jazxUIGV4dGVuZHMgTGl2ZUJsb2NrPihibG9jazogVCwgaXNSZW1vdGUgPSBmYWxzZSk6IFQge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQ7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKCFpc1JlbW90ZSkge1xuICAgICAgICBjdXJyZW50LmRpZEFwcGVuZEJvdW5kcyhibG9jayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fX29wZW5CbG9jaygpO1xuICAgIHRoaXMuYmxvY2tTdGFjay5wdXNoKGJsb2NrKTtcbiAgICByZXR1cm4gYmxvY2s7XG4gIH1cblxuICBwb3BCbG9jaygpOiBMaXZlQmxvY2sge1xuICAgIHRoaXMuYmxvY2soKS5maW5hbGl6ZSh0aGlzKTtcbiAgICB0aGlzLl9fY2xvc2VCbG9jaygpO1xuICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLnBvcCgpLCAnRXhwZWN0ZWQgcG9wQmxvY2sgdG8gcmV0dXJuIGEgYmxvY2snKTtcbiAgfVxuXG4gIF9fb3BlbkJsb2NrKCk6IHZvaWQge31cbiAgX19jbG9zZUJsb2NrKCk6IHZvaWQge31cblxuICAvLyB0b2RvIHJldHVybiBzZWVtcyB1bnVzZWRcbiAgb3BlbkVsZW1lbnQodGFnOiBzdHJpbmcpOiBTaW1wbGVFbGVtZW50IHtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuX19vcGVuRWxlbWVudCh0YWcpO1xuICAgIHRoaXMuY29uc3RydWN0aW5nID0gZWxlbWVudDtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgX19vcGVuRWxlbWVudCh0YWc6IHN0cmluZyk6IFNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmRvbS5jcmVhdGVFbGVtZW50KHRhZywgdGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIGZsdXNoRWxlbWVudChtb2RpZmllcnM6IE9wdGlvbjxNb2RpZmllckluc3RhbmNlW10+KSB7XG4gICAgbGV0IHBhcmVudCA9IHRoaXMuZWxlbWVudDtcbiAgICBsZXQgZWxlbWVudCA9IGV4cGVjdChcbiAgICAgIHRoaXMuY29uc3RydWN0aW5nLFxuICAgICAgYGZsdXNoRWxlbWVudCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudGBcbiAgICApO1xuXG4gICAgdGhpcy5fX2ZsdXNoRWxlbWVudChwYXJlbnQsIGVsZW1lbnQpO1xuXG4gICAgdGhpcy5jb25zdHJ1Y3RpbmcgPSBudWxsO1xuICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG5cbiAgICB0aGlzLnB1c2hNb2RpZmllcnMobW9kaWZpZXJzKTtcbiAgICB0aGlzLnB1c2hFbGVtZW50KGVsZW1lbnQsIG51bGwpO1xuICAgIHRoaXMuZGlkT3BlbkVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICBfX2ZsdXNoRWxlbWVudChwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIGNvbnN0cnVjdGluZzogU2ltcGxlRWxlbWVudCkge1xuICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYXJlbnQsIGNvbnN0cnVjdGluZywgdGhpcy5uZXh0U2libGluZyk7XG4gIH1cblxuICBjbG9zZUVsZW1lbnQoKTogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4ge1xuICAgIHRoaXMud2lsbENsb3NlRWxlbWVudCgpO1xuICAgIHRoaXMucG9wRWxlbWVudCgpO1xuICAgIHJldHVybiB0aGlzLnBvcE1vZGlmaWVycygpO1xuICB9XG5cbiAgcHVzaFJlbW90ZUVsZW1lbnQoXG4gICAgZWxlbWVudDogU2ltcGxlRWxlbWVudCxcbiAgICBndWlkOiBzdHJpbmcsXG4gICAgaW5zZXJ0QmVmb3JlOiBNYXliZTxTaW1wbGVOb2RlPlxuICApOiBPcHRpb248UmVtb3RlTGl2ZUJsb2NrPiB7XG4gICAgcmV0dXJuIHRoaXMuX19wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBndWlkLCBpbnNlcnRCZWZvcmUpO1xuICB9XG5cbiAgX19wdXNoUmVtb3RlRWxlbWVudChcbiAgICBlbGVtZW50OiBTaW1wbGVFbGVtZW50LFxuICAgIF9ndWlkOiBzdHJpbmcsXG4gICAgaW5zZXJ0QmVmb3JlOiBNYXliZTxTaW1wbGVOb2RlPlxuICApOiBPcHRpb248UmVtb3RlTGl2ZUJsb2NrPiB7XG4gICAgdGhpcy5wdXNoRWxlbWVudChlbGVtZW50LCBpbnNlcnRCZWZvcmUpO1xuXG4gICAgaWYgKGluc2VydEJlZm9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB3aGlsZSAoZWxlbWVudC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50Lmxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJsb2NrID0gbmV3IFJlbW90ZUxpdmVCbG9jayhlbGVtZW50KTtcblxuICAgIHJldHVybiB0aGlzLnB1c2hMaXZlQmxvY2soYmxvY2ssIHRydWUpO1xuICB9XG5cbiAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICB0aGlzLnBvcEJsb2NrKCk7XG4gICAgdGhpcy5wb3BFbGVtZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHVzaEVsZW1lbnQoZWxlbWVudDogU2ltcGxlRWxlbWVudCwgbmV4dFNpYmxpbmc6IE1heWJlPFNpbXBsZU5vZGU+ID0gbnVsbCkge1xuICAgIHRoaXNbQ1VSU09SX1NUQUNLXS5wdXNoKG5ldyBDdXJzb3JJbXBsKGVsZW1lbnQsIG5leHRTaWJsaW5nKSk7XG4gIH1cblxuICBwcml2YXRlIHB1c2hNb2RpZmllcnMobW9kaWZpZXJzOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPik6IHZvaWQge1xuICAgIHRoaXMubW9kaWZpZXJTdGFjay5wdXNoKG1vZGlmaWVycyk7XG4gIH1cblxuICBwcml2YXRlIHBvcE1vZGlmaWVycygpOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJTdGFjay5wb3AoKTtcbiAgfVxuXG4gIGRpZEFwcGVuZEJvdW5kcyhib3VuZHM6IEJvdW5kcyk6IEJvdW5kcyB7XG4gICAgdGhpcy5ibG9jaygpLmRpZEFwcGVuZEJvdW5kcyhib3VuZHMpO1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cblxuICBkaWRBcHBlbmROb2RlPFQgZXh0ZW5kcyBTaW1wbGVOb2RlPihub2RlOiBUKTogVCB7XG4gICAgdGhpcy5ibG9jaygpLmRpZEFwcGVuZE5vZGUobm9kZSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBkaWRPcGVuRWxlbWVudChlbGVtZW50OiBTaW1wbGVFbGVtZW50KTogU2ltcGxlRWxlbWVudCB7XG4gICAgdGhpcy5ibG9jaygpLm9wZW5FbGVtZW50KGVsZW1lbnQpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgd2lsbENsb3NlRWxlbWVudCgpIHtcbiAgICB0aGlzLmJsb2NrKCkuY2xvc2VFbGVtZW50KCk7XG4gIH1cblxuICBhcHBlbmRUZXh0KHN0cmluZzogc3RyaW5nKTogU2ltcGxlVGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuZGlkQXBwZW5kTm9kZSh0aGlzLl9fYXBwZW5kVGV4dChzdHJpbmcpKTtcbiAgfVxuXG4gIF9fYXBwZW5kVGV4dCh0ZXh0OiBzdHJpbmcpOiBTaW1wbGVUZXh0IHtcbiAgICBsZXQgeyBkb20sIGVsZW1lbnQsIG5leHRTaWJsaW5nIH0gPSB0aGlzO1xuICAgIGxldCBub2RlID0gZG9tLmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgIGRvbS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbm9kZSwgbmV4dFNpYmxpbmcpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgX19hcHBlbmROb2RlKG5vZGU6IFNpbXBsZU5vZGUpOiBTaW1wbGVOb2RlIHtcbiAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBub2RlLCB0aGlzLm5leHRTaWJsaW5nKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIF9fYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQ6IFNpbXBsZURvY3VtZW50RnJhZ21lbnQpOiBCb3VuZHMge1xuICAgIGxldCBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIGxldCByZXQgPSBuZXcgQ29uY3JldGVCb3VuZHModGhpcy5lbGVtZW50LCBmaXJzdCwgZnJhZ21lbnQubGFzdENoaWxkISk7XG4gICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBmcmFnbWVudCwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFNpbmdsZU5vZGVCb3VuZHModGhpcy5lbGVtZW50LCB0aGlzLl9fYXBwZW5kQ29tbWVudCgnJykpO1xuICAgIH1cbiAgfVxuXG4gIF9fYXBwZW5kSFRNTChodG1sOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgIHJldHVybiB0aGlzLmRvbS5pbnNlcnRIVE1MQmVmb3JlKHRoaXMuZWxlbWVudCwgdGhpcy5uZXh0U2libGluZywgaHRtbCk7XG4gIH1cblxuICBhcHBlbmREeW5hbWljSFRNTCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGJvdW5kcyA9IHRoaXMudHJ1c3RlZENvbnRlbnQodmFsdWUpO1xuICAgIHRoaXMuZGlkQXBwZW5kQm91bmRzKGJvdW5kcyk7XG4gIH1cblxuICBhcHBlbmREeW5hbWljVGV4dCh2YWx1ZTogc3RyaW5nKTogU2ltcGxlVGV4dCB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLnVudHJ1c3RlZENvbnRlbnQodmFsdWUpO1xuICAgIHRoaXMuZGlkQXBwZW5kTm9kZShub2RlKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGFwcGVuZER5bmFtaWNGcmFnbWVudCh2YWx1ZTogU2ltcGxlRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGxldCBib3VuZHMgPSB0aGlzLl9fYXBwZW5kRnJhZ21lbnQodmFsdWUpO1xuICAgIHRoaXMuZGlkQXBwZW5kQm91bmRzKGJvdW5kcyk7XG4gIH1cblxuICBhcHBlbmREeW5hbWljTm9kZSh2YWx1ZTogU2ltcGxlTm9kZSk6IHZvaWQge1xuICAgIGxldCBub2RlID0gdGhpcy5fX2FwcGVuZE5vZGUodmFsdWUpO1xuICAgIGxldCBib3VuZHMgPSBuZXcgU2luZ2xlTm9kZUJvdW5kcyh0aGlzLmVsZW1lbnQsIG5vZGUpO1xuICAgIHRoaXMuZGlkQXBwZW5kQm91bmRzKGJvdW5kcyk7XG4gIH1cblxuICBwcml2YXRlIHRydXN0ZWRDb250ZW50KHZhbHVlOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgIHJldHVybiB0aGlzLl9fYXBwZW5kSFRNTCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVudHJ1c3RlZENvbnRlbnQodmFsdWU6IHN0cmluZyk6IFNpbXBsZVRleHQge1xuICAgIHJldHVybiB0aGlzLl9fYXBwZW5kVGV4dCh2YWx1ZSk7XG4gIH1cblxuICBhcHBlbmRDb21tZW50KHN0cmluZzogc3RyaW5nKTogU2ltcGxlQ29tbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZGlkQXBwZW5kTm9kZSh0aGlzLl9fYXBwZW5kQ29tbWVudChzdHJpbmcpKTtcbiAgfVxuXG4gIF9fYXBwZW5kQ29tbWVudChzdHJpbmc6IHN0cmluZyk6IFNpbXBsZUNvbW1lbnQge1xuICAgIGxldCB7IGRvbSwgZWxlbWVudCwgbmV4dFNpYmxpbmcgfSA9IHRoaXM7XG4gICAgbGV0IG5vZGUgPSBkb20uY3JlYXRlQ29tbWVudChzdHJpbmcpO1xuICAgIGRvbS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbm9kZSwgbmV4dFNpYmxpbmcpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgX19zZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPik6IHZvaWQge1xuICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZSh0aGlzLmNvbnN0cnVjdGluZyEsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgX19zZXRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgKHRoaXMuY29uc3RydWN0aW5nISBhcyBhbnkpW25hbWVdID0gdmFsdWU7XG4gIH1cblxuICBzZXRTdGF0aWNBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPik6IHZvaWQge1xuICAgIHRoaXMuX19zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBzZXREeW5hbWljQXR0cmlidXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB0cnVzdGluZzogYm9vbGVhbixcbiAgICBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPlxuICApOiBEeW5hbWljQXR0cmlidXRlIHtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuY29uc3RydWN0aW5nITtcbiAgICBsZXQgYXR0cmlidXRlID0gZHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCBuYW1lc3BhY2UsIHRydXN0aW5nKTtcbiAgICBhdHRyaWJ1dGUuc2V0KHRoaXMsIHZhbHVlLCB0aGlzLmVudik7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2ltcGxlTGl2ZUJsb2NrIGltcGxlbWVudHMgTGl2ZUJsb2NrIHtcbiAgcHJvdGVjdGVkIGZpcnN0OiBPcHRpb248Rmlyc3ROb2RlPiA9IG51bGw7XG4gIHByb3RlY3RlZCBsYXN0OiBPcHRpb248TGFzdE5vZGU+ID0gbnVsbDtcbiAgcHJvdGVjdGVkIG5lc3RpbmcgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyZW50OiBTaW1wbGVFbGVtZW50KSB7fVxuXG4gIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICB9XG5cbiAgZmlyc3ROb2RlKCk6IFNpbXBsZU5vZGUge1xuICAgIGxldCBmaXJzdCA9IGV4cGVjdChcbiAgICAgIHRoaXMuZmlyc3QsXG4gICAgICAnY2Fubm90IGNhbGwgYGZpcnN0Tm9kZSgpYCB3aGlsZSBgU2ltcGxlTGl2ZUJsb2NrYCBpcyBzdGlsbCBpbml0aWFsaXppbmcnXG4gICAgKTtcblxuICAgIHJldHVybiBmaXJzdC5maXJzdE5vZGUoKTtcbiAgfVxuXG4gIGxhc3ROb2RlKCk6IFNpbXBsZU5vZGUge1xuICAgIGxldCBsYXN0ID0gZXhwZWN0KFxuICAgICAgdGhpcy5sYXN0LFxuICAgICAgJ2Nhbm5vdCBjYWxsIGBsYXN0Tm9kZSgpYCB3aGlsZSBgU2ltcGxlTGl2ZUJsb2NrYCBpcyBzdGlsbCBpbml0aWFsaXppbmcnXG4gICAgKTtcblxuICAgIHJldHVybiBsYXN0Lmxhc3ROb2RlKCk7XG4gIH1cblxuICBvcGVuRWxlbWVudChlbGVtZW50OiBTaW1wbGVFbGVtZW50KSB7XG4gICAgdGhpcy5kaWRBcHBlbmROb2RlKGVsZW1lbnQpO1xuICAgIHRoaXMubmVzdGluZysrO1xuICB9XG5cbiAgY2xvc2VFbGVtZW50KCkge1xuICAgIHRoaXMubmVzdGluZy0tO1xuICB9XG5cbiAgZGlkQXBwZW5kTm9kZShub2RlOiBTaW1wbGVOb2RlKSB7XG4gICAgaWYgKHRoaXMubmVzdGluZyAhPT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0ID0gbmV3IEZpcnN0KG5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdCA9IG5ldyBMYXN0KG5vZGUpO1xuICB9XG5cbiAgZGlkQXBwZW5kQm91bmRzKGJvdW5kczogQm91bmRzKSB7XG4gICAgaWYgKHRoaXMubmVzdGluZyAhPT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0ID0gYm91bmRzO1xuICAgIH1cblxuICAgIHRoaXMubGFzdCA9IGJvdW5kcztcbiAgfVxuXG4gIGZpbmFsaXplKHN0YWNrOiBFbGVtZW50QnVpbGRlcikge1xuICAgIGlmICh0aGlzLmZpcnN0ID09PSBudWxsKSB7XG4gICAgICBzdGFjay5hcHBlbmRDb21tZW50KCcnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbW90ZUxpdmVCbG9jayBleHRlbmRzIFNpbXBsZUxpdmVCbG9jayB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogU2ltcGxlRWxlbWVudCkge1xuICAgIHN1cGVyKHBhcmVudCk7XG5cbiAgICByZWdpc3RlckRlc3RydWN0b3IodGhpcywgKCkgPT4ge1xuICAgICAgLy8gSW4gZ2VuZXJhbCwgeW91IG9ubHkgbmVlZCB0byBjbGVhciB0aGUgcm9vdCBvZiBhIGhpZXJhcmNoeSwgYW5kIHNob3VsZCBuZXZlclxuICAgICAgLy8gbmVlZCB0byBjbGVhciBhbnkgY2hpbGQgbm9kZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNvbnN0cmFpbnQgdGhhdCBnaXZlcyB1c1xuICAgICAgLy8gYSBzdHJvbmcgZ3VhcmFudGVlIHRoYXQgY2xlYXJpbmcgYSBzdWJ0cmVlIGlzIGEgc2luZ2xlIERPTSBvcGVyYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSByZW1vdGUgYmxvY2tzIGFyZSBub3Qgbm9ybWFsbHkgcGh5c2ljYWxseSBuZXN0ZWQgaW5zaWRlIG9mIHRoZSB0cmVlXG4gICAgICAvLyB0aGF0IHRoZXkgYXJlIGxvZ2ljYWxseSBuZXN0ZWQgaW5zaWRlLCB3ZSBtYW51YWxseSBjbGVhciByZW1vdGUgYmxvY2tzIHdoZW5cbiAgICAgIC8vIGEgbG9naWNhbCBwYXJlbnQgaXMgY2xlYXJlZC5cbiAgICAgIC8vXG4gICAgICAvLyBIT1dFVkVSLCBpdCBpcyBjdXJyZW50bHkgcG9zc2libGUgZm9yIGEgcmVtb3RlIGJsb2NrIHRvIGJlIHBoeXNpY2FsbHkgbmVzdGVkXG4gICAgICAvLyBpbnNpZGUgb2YgdGhlIGJsb2NrIGl0IGlzIGxvZ2ljYWxseSBjb250YWluZWQgaW5zaWRlIG9mLiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gdGhlIHJlbW90ZSBibG9jayBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBhcHBsaWNhdGlvbidzIGVudGlyZSBlbGVtZW50LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwcm9ibGVtIHdpdGggdGhhdCBzY2VuYXJpbyBpcyB0aGF0IEdsaW1tZXIgYmVsaWV2ZXMgdGhhdCBpdCBvd25zIG1vcmUgb2ZcbiAgICAgIC8vIHRoZSBET00gdGhhbiBpdCBhY3R1YWxseSBkb2VzLiBUaGUgY29kZSBpcyBhdHRlbXB0aW5nIHRvIHdyaXRlIHBhc3QgdGhlIGVuZFxuICAgICAgLy8gb2YgdGhlIEdsaW1tZXItbWFuYWdlZCByb290LCBidXQgR2xpbW1lciBpc24ndCBhd2FyZSBvZiB0aGF0LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBjb3JyZWN0IHNvbHV0aW9uIHRvIHRoYXQgcHJvYmxlbSBpcyBmb3IgR2xpbW1lciB0byBiZSBhd2FyZSBvZiB0aGUgZW5kXG4gICAgICAvLyBvZiB0aGUgYm91bmRzIHRoYXQgaXQgb3ducywgYW5kIG9uY2Ugd2UgbWFrZSB0aGF0IGNoYW5nZSwgdGhpcyBjaGVjayBjb3VsZFxuICAgICAgLy8gYmUgcmVtb3ZlZC5cbiAgICAgIC8vXG4gICAgICAvLyBGb3Igbm93LCBhIG1vcmUgdGFyZ2V0ZWQgZml4IGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG5vZGUgd2FzIGFscmVhZHkgcmVtb3ZlZFxuICAgICAgLy8gYW5kIGF2b2lkIGNsZWFyaW5nIHRoZSBub2RlIGlmIGl0IHdhcy4gSW4gbW9zdCBjYXNlcyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sXG4gICAgICAvLyBzbyB0aGlzIG1pZ2h0IGhpZGUgYnVncyB3aGVyZSB0aGUgY29kZSB