UNPKG

ember-legacy-class-transform

Version:
312 lines (307 loc) 35.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdatableBlockTracker = exports.SimpleBlockTracker = exports.ElementStack = exports.Fragment = undefined; var _bounds2 = require('./bounds'); var _util = require('@glimmer/util'); var _dom = require('./compiled/opcodes/dom'); class First { constructor(node) { this.node = node; } firstNode() { return this.node; } } class Last { constructor(node) { this.node = node; } lastNode() { return this.node; } } class Fragment { constructor(bounds) { this.bounds = bounds; } parentElement() { return this.bounds.parentElement(); } firstNode() { return this.bounds.firstNode(); } lastNode() { return this.bounds.lastNode(); } update(bounds) { this.bounds = bounds; } } exports.Fragment = Fragment; class ElementStack { constructor(env, parentNode, nextSibling) { this.constructing = null; this.operations = null; this.elementStack = new _util.Stack(); this.nextSiblingStack = new _util.Stack(); this.blockStack = new _util.Stack(); this.env = env; this.dom = env.getAppendOperations(); this.updateOperations = env.getDOM(); this.element = parentNode; this.nextSibling = nextSibling; this.defaultOperations = new _dom.SimpleElementOperations(env); this.pushSimpleBlock(); this.elementStack.push(this.element); this.nextSiblingStack.push(this.nextSibling); } static forInitialRender(env, parentNode, nextSibling) { return new ElementStack(env, parentNode, nextSibling); } static resume(env, tracker, nextSibling) { let parentNode = tracker.parentElement(); let stack = new ElementStack(env, parentNode, nextSibling); stack.pushBlockTracker(tracker); return stack; } expectConstructing(method) { return (0, _util.expect)(this.constructing, `${method} should only be called while constructing an element`); } expectOperations(method) { return (0, _util.expect)(this.operations, `${method} should only be called while constructing an element`); } block() { return (0, _util.expect)(this.blockStack.current, "Expected a current block tracker"); } popElement() { let { elementStack, nextSiblingStack } = this; let topElement = elementStack.pop(); nextSiblingStack.pop(); // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`); this.element = (0, _util.expect)(elementStack.current, "can't pop past the last element"); this.nextSibling = nextSiblingStack.current; return topElement; } pushSimpleBlock() { let tracker = new SimpleBlockTracker(this.element); this.pushBlockTracker(tracker); return tracker; } pushUpdatableBlock() { let tracker = new UpdatableBlockTracker(this.element); this.pushBlockTracker(tracker); return tracker; } pushBlockTracker(tracker, isRemote = false) { let current = this.blockStack.current; if (current !== null) { current.newDestroyable(tracker); if (!isRemote) { current.newBounds(tracker); } } this.blockStack.push(tracker); return tracker; } pushBlockList(list) { let tracker = new BlockListTracker(this.element, list); let current = this.blockStack.current; if (current !== null) { current.newDestroyable(tracker); current.newBounds(tracker); } this.blockStack.push(tracker); return tracker; } popBlock() { this.block().finalize(this); return (0, _util.expect)(this.blockStack.pop(), "Expected popBlock to return a block"); } openElement(tag, _operations) { // workaround argument.length transpile of arg initializer let operations = _operations === undefined ? this.defaultOperations : _operations; let element = this.dom.createElement(tag, this.element); this.constructing = element; this.operations = operations; return element; } flushElement() { let parent = this.element; let element = (0, _util.expect)(this.constructing, `flushElement should only be called when constructing an element`); this.dom.insertBefore(parent, element, this.nextSibling); this.constructing = null; this.operations = null; this.pushElement(element, null); this.block().openElement(element); } pushRemoteElement(element, nextSibling = null) { this.pushElement(element, nextSibling); let tracker = new RemoteBlockTracker(element); this.pushBlockTracker(tracker, true); } popRemoteElement() { this.popBlock(); this.popElement(); } pushElement(element, nextSibling) { this.element = element; this.elementStack.push(element); // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`); this.nextSibling = nextSibling; this.nextSiblingStack.push(nextSibling); } newDestroyable(d) { this.block().newDestroyable(d); } newBounds(bounds) { this.block().newBounds(bounds); } appendText(string) { let { dom } = this; let text = dom.createTextNode(string); dom.insertBefore(this.element, text, this.nextSibling); this.block().newNode(text); return text; } appendComment(string) { let { dom } = this; let comment = dom.createComment(string); dom.insertBefore(this.element, comment, this.nextSibling); this.block().newNode(comment); return comment; } setStaticAttribute(name, value) { this.expectOperations('setStaticAttribute').addStaticAttribute(this.expectConstructing('setStaticAttribute'), name, value); } setStaticAttributeNS(namespace, name, value) { this.expectOperations('setStaticAttributeNS').addStaticAttributeNS(this.expectConstructing('setStaticAttributeNS'), namespace, name, value); } setDynamicAttribute(name, reference, isTrusting) { this.expectOperations('setDynamicAttribute').addDynamicAttribute(this.expectConstructing('setDynamicAttribute'), name, reference, isTrusting); } setDynamicAttributeNS(namespace, name, reference, isTrusting) { this.expectOperations('setDynamicAttributeNS').addDynamicAttributeNS(this.expectConstructing('setDynamicAttributeNS'), namespace, name, reference, isTrusting); } closeElement() { this.block().closeElement(); this.popElement(); } } exports.ElementStack = ElementStack; class SimpleBlockTracker { constructor(parent) { this.parent = parent; this.first = null; this.last = null; this.destroyables = null; this.nesting = 0; } destroy() { let { destroyables } = this; if (destroyables && destroyables.length) { for (let i = 0; i < destroyables.length; i++) { destroyables[i].destroy(); } } } parentElement() { return this.parent; } firstNode() { return this.first && this.first.firstNode(); } lastNode() { return this.last && this.last.lastNode(); } openElement(element) { this.newNode(element); this.nesting++; } closeElement() { this.nesting--; } newNode(node) { if (this.nesting !== 0) return; if (!this.first) { this.first = new First(node); } this.last = new Last(node); } newBounds(bounds) { if (this.nesting !== 0) return; if (!this.first) { this.first = bounds; } this.last = bounds; } newDestroyable(d) { this.destroyables = this.destroyables || []; this.destroyables.push(d); } finalize(stack) { if (!this.first) { stack.appendComment(''); } } } exports.SimpleBlockTracker = SimpleBlockTracker; class RemoteBlockTracker extends SimpleBlockTracker { destroy() { super.destroy(); (0, _bounds2.clear)(this); } } class UpdatableBlockTracker extends SimpleBlockTracker { reset(env) { let { destroyables } = this; if (destroyables && destroyables.length) { for (let i = 0; i < destroyables.length; i++) { env.didDestroy(destroyables[i]); } } let nextSibling = (0, _bounds2.clear)(this); this.first = null; this.last = null; this.destroyables = null; this.nesting = 0; return nextSibling; } } exports.UpdatableBlockTracker = UpdatableBlockTracker; class BlockListTracker { constructor(parent, boundList) { this.parent = parent; this.boundList = boundList; this.parent = parent; this.boundList = boundList; } destroy() { this.boundList.forEachNode(node => node.destroy()); } parentElement() { return this.parent; } firstNode() { let head = this.boundList.head(); return head && head.firstNode(); } lastNode() { let tail = this.boundList.tail(); return tail && tail.lastNode(); } openElement(_element) { (0, _util.assert)(false, 'Cannot openElement directly inside a block list'); } closeElement() { (0, _util.assert)(false, 'Cannot closeElement directly inside a block list'); } newNode(_node) { (0, _util.assert)(false, 'Cannot create a new node directly inside a block list'); } newBounds(_bounds) {} newDestroyable(_d) {} finalize(_stack) {} } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9idWlsZGVyLmpzIl0sIm5hbWVzIjpbIkZpcnN0IiwiY29uc3RydWN0b3IiLCJub2RlIiwiZmlyc3ROb2RlIiwiTGFzdCIsImxhc3ROb2RlIiwiRnJhZ21lbnQiLCJib3VuZHMiLCJwYXJlbnRFbGVtZW50IiwidXBkYXRlIiwiRWxlbWVudFN0YWNrIiwiZW52IiwicGFyZW50Tm9kZSIsIm5leHRTaWJsaW5nIiwiY29uc3RydWN0aW5nIiwib3BlcmF0aW9ucyIsImVsZW1lbnRTdGFjayIsIm5leHRTaWJsaW5nU3RhY2siLCJibG9ja1N0YWNrIiwiZG9tIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInVwZGF0ZU9wZXJhdGlvbnMiLCJnZXRET00iLCJlbGVtZW50IiwiZGVmYXVsdE9wZXJhdGlvbnMiLCJwdXNoU2ltcGxlQmxvY2siLCJwdXNoIiwiZm9ySW5pdGlhbFJlbmRlciIsInJlc3VtZSIsInRyYWNrZXIiLCJzdGFjayIsInB1c2hCbG9ja1RyYWNrZXIiLCJleHBlY3RDb25zdHJ1Y3RpbmciLCJtZXRob2QiLCJleHBlY3RPcGVyYXRpb25zIiwiYmxvY2siLCJjdXJyZW50IiwicG9wRWxlbWVudCIsInRvcEVsZW1lbnQiLCJwb3AiLCJTaW1wbGVCbG9ja1RyYWNrZXIiLCJwdXNoVXBkYXRhYmxlQmxvY2siLCJVcGRhdGFibGVCbG9ja1RyYWNrZXIiLCJpc1JlbW90ZSIsIm5ld0Rlc3Ryb3lhYmxlIiwibmV3Qm91bmRzIiwicHVzaEJsb2NrTGlzdCIsImxpc3QiLCJCbG9ja0xpc3RUcmFja2VyIiwicG9wQmxvY2siLCJmaW5hbGl6ZSIsIm9wZW5FbGVtZW50IiwidGFnIiwiX29wZXJhdGlvbnMiLCJ1bmRlZmluZWQiLCJjcmVhdGVFbGVtZW50IiwiZmx1c2hFbGVtZW50IiwicGFyZW50IiwiaW5zZXJ0QmVmb3JlIiwicHVzaEVsZW1lbnQiLCJwdXNoUmVtb3RlRWxlbWVudCIsIlJlbW90ZUJsb2NrVHJhY2tlciIsInBvcFJlbW90ZUVsZW1lbnQiLCJkIiwiYXBwZW5kVGV4dCIsInN0cmluZyIsInRleHQiLCJjcmVhdGVUZXh0Tm9kZSIsIm5ld05vZGUiLCJhcHBlbmRDb21tZW50IiwiY29tbWVudCIsImNyZWF0ZUNvbW1lbnQiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJuYW1lIiwidmFsdWUiLCJhZGRTdGF0aWNBdHRyaWJ1dGUiLCJzZXRTdGF0aWNBdHRyaWJ1dGVOUyIsIm5hbWVzcGFjZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsInJlZmVyZW5jZSIsImlzVHJ1c3RpbmciLCJhZGREeW5hbWljQXR0cmlidXRlIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwiYWRkRHluYW1pY0F0dHJpYnV0ZU5TIiwiY2xvc2VFbGVtZW50IiwiZmlyc3QiLCJsYXN0IiwiZGVzdHJveWFibGVzIiwibmVzdGluZyIsImRlc3Ryb3kiLCJsZW5ndGgiLCJpIiwicmVzZXQiLCJkaWREZXN0cm95IiwiYm91bmRMaXN0IiwiZm9yRWFjaE5vZGUiLCJoZWFkIiwidGFpbCIsIl9lbGVtZW50IiwiX25vZGUiLCJfYm91bmRzIiwiX2QiLCJfc3RhY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQSxNQUFNQSxLQUFOLENBQVk7QUFDUkMsZ0JBQVlDLElBQVosRUFBa0I7QUFDZCxhQUFLQSxJQUFMLEdBQVlBLElBQVo7QUFDSDtBQUNEQyxnQkFBWTtBQUNSLGVBQU8sS0FBS0QsSUFBWjtBQUNIO0FBTk87QUFRWixNQUFNRSxJQUFOLENBQVc7QUFDUEgsZ0JBQVlDLElBQVosRUFBa0I7QUFDZCxhQUFLQSxJQUFMLEdBQVlBLElBQVo7QUFDSDtBQUNERyxlQUFXO0FBQ1AsZUFBTyxLQUFLSCxJQUFaO0FBQ0g7QUFOTTtBQVFKLE1BQU1JLFFBQU4sQ0FBZTtBQUNsQkwsZ0JBQVlNLE1BQVosRUFBb0I7QUFDaEIsYUFBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0g7QUFDREMsb0JBQWdCO0FBQ1osZUFBTyxLQUFLRCxN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Q0EsZUFBT0EsUUFBUUEsS0FBSzlGLFNBQUwsRUFBZjtBQUNIO0FBQ0RFLGVBQVc7QUFDUCxZQUFJNkYsT0FBTyxLQUFLSCxTQUFMLENBQWVHLElBQWYsRUFBWDtBQUNBLGVBQU9BLFFBQVFBLEtBQUs3RixRQUFMLEVBQWY7QUFDSDtBQUNEOEMsZ0JBQVlnRCxRQUFaLEVBQXNCO0FBQ2xCLDBCQUFPLEtBQVAsRUFBYyxpREFBZDtBQUNIO0FBQ0RkLG1CQUFlO0FBQ1gsMEJBQU8sS0FBUCxFQUFjLGtEQUFkO0FBQ0g7QUFDRGpCLFlBQVFnQyxLQUFSLEVBQWU7QUFDWCwwQkFBTyxLQUFQLEVBQWMsdURBQWQ7QUFDSDtBQUNEdkQsY0FBVXdELE9BQVYsRUFBbUIsQ0FBRTtBQUNyQnpELG1CQUFlMEQsRUFBZixFQUFtQixDQUFFO0FBQ3JCcEQsYUFBU3FELE1BQVQsRUFBaUIsQ0FBRTtBQWhDQSIsImZpbGUiOiJsaWIvYnVpbGRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyIH0gZnJvbSAnLi9ib3VuZHMnO1xuaW1wb3J0IHsgU3RhY2ssIGFzc2VydCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB9IGZyb20gJy4vY29tcGlsZWQvb3Bjb2Rlcy9kb20nO1xuY2xhc3MgRmlyc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgZmlyc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgIH1cbn1cbmNsYXNzIExhc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbGFzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZyYWdtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxuICAgIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgfVxuICAgIGZpcnN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmxhc3ROb2RlKCk7XG4gICAgfVxuICAgIHVwZGF0ZShib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdGFjayB7XG4gICAgY29uc3RydWN0b3IoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMubmV4dFNpYmxpbmdTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmJsb2NrU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuZG9tID0gZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gZW52LmdldERPTSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBwYXJlbnROb2RlO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmc7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdGlvbnMgPSBuZXcgU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMoZW52KTtcbiAgICAgICAgdGhpcy5wdXNoU2ltcGxlQmxvY2soKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaCh0aGlzLm5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIGZvckluaXRpYWxSZW5kZXIoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTdGFjayhlbnYsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIHJlc3VtZShlbnYsIHRyYWNrZXIsIG5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdHJhY2tlci5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGxldCBzdGFjayA9IG5ldyBFbGVtZW50U3RhY2soZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZyk7XG4gICAgICAgIHN0YWNrLnB1c2hCbG9ja1RyYWNrZXIodHJhY2tlcik7XG4gICAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG4gICAgZXhwZWN0Q29uc3RydWN0aW5nKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgJHttZXRob2R9IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZSBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudGApO1xuICAgIH1cbiAgICBleHBlY3RPcGVyYXRpb25zKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMub3BlcmF0aW9ucywgYCR7bWV0aG9kfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUgY29uc3RydWN0aW5nIGFuIGVsZW1lbnRgKTtcbiAgICB9XG4gICAgYmxvY2soKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQsIFwiRXhwZWN0ZWQgYSBjdXJyZW50IGJsb2NrIHRyYWNrZXJcIik7XG4gICAgfVxuICAgIHBvcEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCB7IGVsZW1lbnRTdGFjaywgbmV4dFNpYmxpbmdTdGFjayB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRvcEVsZW1lbnQgPSBlbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgIG5leHRTaWJsaW5nU3RhY2sucG9wKCk7XG4gICAgICAgIC8vIExPR0dFUi5kZWJ1ZyhgLT4gZWxlbWVudCBzdGFjayAke3RoaXMuZWxlbWVudFN0YWNrLnRvQXJyYXkoKS5tYXAoZSA9PiBlLnRhZ05hbWUpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGV4cGVjdChlbGVtZW50U3RhY2suY3VycmVudCwgXCJjYW4ndCBwb3AgcGFzdCB0aGUgbGFzdCBlbGVtZW50XCIpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmdTdGFjay5jdXJyZW50O1xuICAgICAgICByZXR1cm4gdG9wRWxlbWVudDtcbiAgICB9XG4gICAgcHVzaFNpbXBsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBTaW1wbGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaFVwZGF0YWJsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBVcGRhdGFibGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCBpc1JlbW90ZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQ7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0Rlc3Ryb3lhYmxlKHRyYWNrZXIpO1xuICAgICAgICAgICAgaWYgKCFpc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQubmV3Qm91bmRzKHRyYWNrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmxvY2tTdGFjay5wdXNoKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrTGlzdChsaXN0KSB7XG4gICAgICAgIGxldCB0cmFja2VyID0gbmV3IEJsb2NrTGlzdFRyYWNrZXIodGhpcy5lbGVtZW50LCBsaXN0KTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmJsb2NrU3RhY2suY3VycmVudDtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnQubmV3RGVzdHJveWFibGUodHJhY2tlcik7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0JvdW5kcyh0cmFja2VyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJsb2NrU3RhY2sucHVzaCh0cmFja2VyKTtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXI7XG4gICAgfVxuICAgIHBvcEJsb2NrKCkge1xuICAgICAgICB0aGlzLmJsb2NrKCkuZmluYWxpemUodGhpcyk7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLnBvcCgpLCBcIkV4cGVjdGVkIHBvcEJsb2NrIHRvIHJldHVybiBhIGJsb2NrXCIpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudCh0YWcsIF9vcGVyYXRpb25zKSB7XG4gICAgICAgIC8vIHdvcmthcm91bmQgYXJndW1lbnQubGVuZ3RoIHRyYW5zcGlsZSBvZiBhcmcgaW5pdGlhbGl6ZXJcbiAgICAgICAgbGV0IG9wZXJhdGlvbnMgPSBfb3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gdGhpcy5kZWZhdWx0T3BlcmF0aW9ucyA6IF9vcGVyYXRpb25zO1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQodGFnLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtZW50ID0gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgZmx1c2hFbGVtZW50IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvbnN0cnVjdGluZyBhbiBlbGVtZW50YCk7XG4gICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYXJlbnQsIGVsZW1lbnQsIHRoaXMubmV4dFNpYmxpbmcpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5vcGVuRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG4gICAgcHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpO1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBSZW1vdGVCbG9ja1RyYWNrZXIoZWxlbWVudCk7XG4gICAgICAgIHRoaXMucHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCB0cnVlKTtcbiAgICB9XG4gICAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wb3BCbG9jaygpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbGVtZW50KTtcbiAgICAgICAgLy8gTE9HR0VSLmRlYnVnKGAtPiBlbGVtZW50IHN0YWNrICR7dGhpcy5lbGVtZW50U3RhY2sudG9BcnJheSgpLm1hcChlID0+IGUudGFnTmFtZSkuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaChuZXh0U2libGluZyk7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld0Rlc3Ryb3lhYmxlKGQpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoYm91bmRzKSB7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdCb3VuZHMoYm91bmRzKTtcbiAgICB9XG4gICAgYXBwZW5kVGV4dChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdGV4dCA9IGRvbS5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpO1xuICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgdGV4dCwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdOb2RlKHRleHQpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgYXBwZW5kQ29tbWVudChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgY29tbWVudCA9IGRvbS5jcmVhdGVDb21tZW50KHN0cmluZyk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBjb21tZW50LCB0aGlzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld05vZGUoY29tbWVudCk7XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cbiAgICBzZXRTdGF0aWNBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGUnKS5hZGRTdGF0aWNBdHRyaWJ1dGUodGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldFN0YXRpY0F0dHJpYnV0ZScpLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHNldFN0YXRpY0F0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLmFkZFN0YXRpY0F0dHJpYnV0ZU5TKHRoaXMuZXhwZWN0Q29uc3RydWN0aW5nKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0RHluYW1pY0F0dHJpYnV0ZShuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlJykuYWRkRHluYW1pY0F0dHJpYnV0ZSh0aGlzLmV4cGVjdENvbnN0cnVjdGluZygnc2V0RHluYW1pY0F0dHJpYnV0ZScpLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpO1xuICAgIH1cbiAgICBzZXREeW5hbWljQXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlTlMnKS5hZGREeW5hbWljQXR0cmlidXRlTlModGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldER5bmFtaWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHJlZmVyZW5jZSwgaXNUcnVzdGluZyk7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZmlyc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmRlc3Ryb3lhYmxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmVzdGluZyA9IDA7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGxldCB7IGRlc3Ryb3lhYmxlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKGRlc3Ryb3lhYmxlcyAmJiBkZXN0cm95YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3Ryb3lhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lhYmxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0ICYmIHRoaXMuZmlyc3QuZmlyc3ROb2RlKCk7XG4gICAgfVxuICAgIGxhc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0ICYmIHRoaXMubGFzdC5sYXN0Tm9kZSgpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMubmV3Tm9kZShlbGVtZW50KTtcbiAgICAgICAgdGhpcy5uZXN0aW5nKys7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5uZXN0aW5nLS07XG4gICAgfVxuICAgIG5ld05vZGUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5ldyBGaXJzdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBuZXcgTGFzdChub2RlKTtcbiAgICB9XG4gICAgbmV3Qm91bmRzKGJvdW5kcykge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJvdW5kcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBib3VuZHM7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMgPSB0aGlzLmRlc3Ryb3lhYmxlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMucHVzaChkKTtcbiAgICB9XG4gICAgZmluYWxpemUoc3RhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICAgICAgICBzdGFjay5hcHBlbmRDb21tZW50KCcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFJlbW90ZUJsb2NrVHJhY2tlciBleHRlbmRzIFNpbXBsZUJsb2NrVHJhY2tlciB7XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBjbGVhcih0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVXBkYXRhYmxlQmxvY2tUcmFja2VyIGV4dGVuZHMgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICByZXNldChlbnYpIHtcbiAgICAgICAgbGV0IHsgZGVzdHJveWFibGVzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZGVzdHJveWFibGVzICYmIGRlc3Ryb3lhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJveWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW52LmRpZERlc3Ryb3koZGVzdHJveWFibGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcih0aGlzKTtcbiAgICAgICAgdGhpcy5maXJzdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVzdHJveWFibGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXN0aW5nID0gMDtcbiAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nO1xuICAgIH1cbn1cbmNsYXNzIEJsb2NrTGlzdFRyYWNrZXIge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgYm91bmRMaXN0KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJvdW5kTGlzdCA9IGJvdW5kTGlzdDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYm91bmRMaXN0ID0gYm91bmRMaXN0O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmJvdW5kTGlzdC5mb3JFYWNoTm9kZShub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIGxldCBoZWFkID0gdGhpcy5ib3VuZExpc3QuaGVhZCgpO1xuICAgICAgICByZXR1cm4gaGVhZCAmJiBoZWFkLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgbGV0IHRhaWwgPSB0aGlzLmJvdW5kTGlzdC50YWlsKCk7XG4gICAgICAgIHJldHVybiB0YWlsICYmIHRhaWwubGFzdE5vZGUoKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoX2VsZW1lbnQpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCAnQ2Fubm90IG9wZW5FbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY2xvc2VFbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgbmV3Tm9kZShfbm9kZSkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY3JlYXRlIGEgbmV3IG5vZGUgZGlyZWN0bHkgaW5zaWRlIGEgYmxvY2sgbGlzdCcpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoX2JvdW5kcykge31cbiAgICBuZXdEZXN0cm95YWJsZShfZCkge31cbiAgICBmaW5hbGl6ZShfc3RhY2spIHt9XG59Il19