UNPKG

ember-legacy-class-transform

Version:
541 lines (457 loc) 57.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PatchElementOpcode = exports.DynamicAttribute = exports.StaticAttribute = exports.UpdateModifierOpcode = exports.ComponentElementOperations = exports.SimpleElementOperations = undefined; var _reference = require("@glimmer/reference"); var _opcodes = require("../../opcodes"); var _references = require("../../references"); var _vm = require("./vm"); function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) { var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } }return obj; } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } _opcodes.APPEND_OPCODES.add(24 /* Text */, function (vm, _ref) { var text = _ref.op1; vm.elements().appendText(vm.constants.getString(text)); }); _opcodes.APPEND_OPCODES.add(25 /* Comment */, function (vm, _ref2) { var text = _ref2.op1; vm.elements().appendComment(vm.constants.getString(text)); }); _opcodes.APPEND_OPCODES.add(27 /* OpenElement */, function (vm, _ref3) { var tag = _ref3.op1; vm.elements().openElement(vm.constants.getString(tag)); }); _opcodes.APPEND_OPCODES.add(28 /* OpenElementWithOperations */, function (vm, _ref4) { var tag = _ref4.op1; var tagName = vm.constants.getString(tag); var operations = vm.stack.pop(); vm.elements().openElement(tagName, operations); }); _opcodes.APPEND_OPCODES.add(29 /* OpenDynamicElement */, function (vm) { var operations = vm.stack.pop(); var tagName = vm.stack.pop().value(); vm.elements().openElement(tagName, operations); }); _opcodes.APPEND_OPCODES.add(36 /* PushRemoteElement */, function (vm) { var elementRef = vm.stack.pop(); var nextSiblingRef = vm.stack.pop(); var element = void 0; var nextSibling = void 0; if ((0, _reference.isConst)(elementRef)) { element = elementRef.value(); } else { var cache = new _reference.ReferenceCache(elementRef); element = cache.peek(); vm.updateWith(new _vm.Assert(cache)); } if ((0, _reference.isConst)(nextSiblingRef)) { nextSibling = nextSiblingRef.value(); } else { var _cache = new _reference.ReferenceCache(nextSiblingRef); nextSibling = _cache.peek(); vm.updateWith(new _vm.Assert(_cache)); } vm.elements().pushRemoteElement(element, nextSibling); }); _opcodes.APPEND_OPCODES.add(37 /* PopRemoteElement */, function (vm) { return vm.elements().popRemoteElement(); }); var ClassList = function () { function ClassList() { _classCallCheck(this, ClassList); this.list = null; this.isConst = true; } ClassList.prototype.append = function append(reference) { var list = this.list, isConst = this.isConst; if (list === null) list = this.list = []; list.push(reference); this.isConst = isConst && (0, _reference.isConst)(reference); }; ClassList.prototype.toReference = function toReference() { var list = this.list, isConst = this.isConst; if (!list) return _references.NULL_REFERENCE; if (isConst) return _references.PrimitiveReference.create(toClassName(list)); return new ClassListReference(list); }; return ClassList; }(); var ClassListReference = function (_CachedReference) { _inherits(ClassListReference, _CachedReference); function ClassListReference(list) { _classCallCheck(this, ClassListReference); var _this = _possibleConstructorReturn(this, _CachedReference.call(this)); _this.list = []; _this.tag = (0, _reference.combineTagged)(list); _this.list = list; return _this; } ClassListReference.prototype.compute = function compute() { return toClassName(this.list); }; return ClassListReference; }(_reference.CachedReference); function toClassName(list) { var ret = []; for (var i = 0; i < list.length; i++) { var value = list[i].value(); if (value !== false && value !== null && value !== undefined) ret.push(value); } return ret.length === 0 ? null : ret.join(' '); } var SimpleElementOperations = exports.SimpleElementOperations = function () { function SimpleElementOperations(env) { _classCallCheck(this, SimpleElementOperations); this.env = env; this.opcodes = null; this.classList = null; } SimpleElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) { if (name === 'class') { this.addClass(_references.PrimitiveReference.create(value)); } else { this.env.getAppendOperations().setAttribute(element, name, value); } }; SimpleElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) { this.env.getAppendOperations().setAttribute(element, name, value, namespace); }; SimpleElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference, isTrusting) { if (name === 'class') { this.addClass(reference); } else { var attributeManager = this.env.attributeFor(element, name, isTrusting); var attribute = new DynamicAttribute(element, attributeManager, name, reference); this.addAttribute(attribute); } }; SimpleElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference, isTrusting) { var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace); var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace); this.addAttribute(nsAttribute); }; SimpleElementOperations.prototype.flush = function flush(element, vm) { var env = vm.env; var opcodes = this.opcodes, classList = this.classList; for (var i = 0; opcodes && i < opcodes.length; i++) { vm.updateWith(opcodes[i]); } if (classList) { var attributeManager = env.attributeFor(element, 'class', false); var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference()); var opcode = attribute.flush(env); if (opcode) { vm.updateWith(opcode); } } this.opcodes = null; this.classList = null; }; SimpleElementOperations.prototype.addClass = function addClass(reference) { var classList = this.classList; if (!classList) { classList = this.classList = new ClassList(); } classList.append(reference); }; SimpleElementOperations.prototype.addAttribute = function addAttribute(attribute) { var opcode = attribute.flush(this.env); if (opcode) { var opcodes = this.opcodes; if (!opcodes) { opcodes = this.opcodes = []; } opcodes.push(opcode); } }; return SimpleElementOperations; }(); var ComponentElementOperations = exports.ComponentElementOperations = function () { function ComponentElementOperations(env) { _classCallCheck(this, ComponentElementOperations); this.env = env; this.attributeNames = null; this.attributes = null; this.classList = null; } ComponentElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) { if (name === 'class') { this.addClass(_references.PrimitiveReference.create(value)); } else if (this.shouldAddAttribute(name)) { this.addAttribute(name, new StaticAttribute(element, name, value)); } }; ComponentElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) { if (this.shouldAddAttribute(name)) { this.addAttribute(name, new StaticAttribute(element, name, value, namespace)); } }; ComponentElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference, isTrusting) { if (name === 'class') { this.addClass(reference); } else if (this.shouldAddAttribute(name)) { var attributeManager = this.env.attributeFor(element, name, isTrusting); var attribute = new DynamicAttribute(element, attributeManager, name, reference); this.addAttribute(name, attribute); } }; ComponentElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference, isTrusting) { if (this.shouldAddAttribute(name)) { var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace); var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace); this.addAttribute(name, nsAttribute); } }; ComponentElementOperations.prototype.flush = function flush(element, vm) { var env = this.env; var attributes = this.attributes, classList = this.classList; for (var i = 0; attributes && i < attributes.length; i++) { var opcode = attributes[i].flush(env); if (opcode) { vm.updateWith(opcode); } } if (classList) { var attributeManager = env.attributeFor(element, 'class', false); var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference()); var _opcode = attribute.flush(env); if (_opcode) { vm.updateWith(_opcode); } } }; ComponentElementOperations.prototype.shouldAddAttribute = function shouldAddAttribute(name) { return !this.attributeNames || this.attributeNames.indexOf(name) === -1; }; ComponentElementOperations.prototype.addClass = function addClass(reference) { var classList = this.classList; if (!classList) { classList = this.classList = new ClassList(); } classList.append(reference); }; ComponentElementOperations.prototype.addAttribute = function addAttribute(name, attribute) { var attributeNames = this.attributeNames, attributes = this.attributes; if (!attributeNames) { attributeNames = this.attributeNames = []; attributes = this.attributes = []; } attributeNames.push(name); attributes.push(attribute); }; return ComponentElementOperations; }(); _opcodes.APPEND_OPCODES.add(33 /* FlushElement */, function (vm) { var stack = vm.elements(); var action = 'FlushElementOpcode#evaluate'; stack.expectOperations(action).flush(stack.expectConstructing(action), vm); stack.flushElement(); }); _opcodes.APPEND_OPCODES.add(34 /* CloseElement */, function (vm) { return vm.elements().closeElement(); }); _opcodes.APPEND_OPCODES.add(30 /* StaticAttr */, function (vm, _ref5) { var _name = _ref5.op1, _value = _ref5.op2, _namespace = _ref5.op3; var name = vm.constants.getString(_name); var value = vm.constants.getString(_value); if (_namespace) { var namespace = vm.constants.getString(_namespace); vm.elements().setStaticAttributeNS(namespace, name, value); } else { vm.elements().setStaticAttribute(name, value); } }); _opcodes.APPEND_OPCODES.add(35 /* Modifier */, function (vm, _ref6) { var _manager = _ref6.op1; var manager = vm.constants.getOther(_manager); var stack = vm.stack; var args = stack.pop(); var tag = args.tag; var _vm$elements = vm.elements(), element = _vm$elements.constructing, updateOperations = _vm$elements.updateOperations; var dynamicScope = vm.dynamicScope(); var modifier = manager.create(element, args, dynamicScope, updateOperations); args.clear(); vm.env.scheduleInstallModifier(modifier, manager); var destructor = manager.getDestructor(modifier); if (destructor) { vm.newDestroyable(destructor); } vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier)); }); var UpdateModifierOpcode = exports.UpdateModifierOpcode = function (_UpdatingOpcode) { _inherits(UpdateModifierOpcode, _UpdatingOpcode); function UpdateModifierOpcode(tag, manager, modifier) { _classCallCheck(this, UpdateModifierOpcode); var _this2 = _possibleConstructorReturn(this, _UpdatingOpcode.call(this)); _this2.tag = tag; _this2.manager = manager; _this2.modifier = modifier; _this2.type = 'update-modifier'; _this2.lastUpdated = tag.value(); return _this2; } UpdateModifierOpcode.prototype.evaluate = function evaluate(vm) { var manager = this.manager, modifier = this.modifier, tag = this.tag, lastUpdated = this.lastUpdated; if (!tag.validate(lastUpdated)) { vm.env.scheduleUpdateModifier(modifier, manager); this.lastUpdated = tag.value(); } }; UpdateModifierOpcode.prototype.toJSON = function toJSON() { return { guid: this._guid, type: this.type }; }; return UpdateModifierOpcode; }(_opcodes.UpdatingOpcode); var StaticAttribute = exports.StaticAttribute = function () { function StaticAttribute(element, name, value, namespace) { _classCallCheck(this, StaticAttribute); this.element = element; this.name = name; this.value = value; this.namespace = namespace; } StaticAttribute.prototype.flush = function flush(env) { env.getAppendOperations().setAttribute(this.element, this.name, this.value, this.namespace); return null; }; return StaticAttribute; }(); var DynamicAttribute = exports.DynamicAttribute = function () { function DynamicAttribute(element, attributeManager, name, reference, namespace) { _classCallCheck(this, DynamicAttribute); this.element = element; this.attributeManager = attributeManager; this.name = name; this.reference = reference; this.namespace = namespace; this.cache = null; this.tag = reference.tag; } DynamicAttribute.prototype.patch = function patch(env) { var element = this.element, cache = this.cache; var value = cache.revalidate(); if ((0, _reference.isModified)(value)) { this.attributeManager.updateAttribute(env, element, value, this.namespace); } }; DynamicAttribute.prototype.flush = function flush(env) { var reference = this.reference, element = this.element; if ((0, _reference.isConst)(reference)) { var value = reference.value(); this.attributeManager.setAttribute(env, element, value, this.namespace); return null; } else { var cache = this.cache = new _reference.ReferenceCache(reference); var _value2 = cache.peek(); this.attributeManager.setAttribute(env, element, _value2, this.namespace); return new PatchElementOpcode(this); } }; DynamicAttribute.prototype.toJSON = function toJSON() { var element = this.element, namespace = this.namespace, name = this.name, cache = this.cache; var formattedElement = formatElement(element); var lastValue = cache.peek(); if (namespace) { return { element: formattedElement, lastValue: lastValue, name: name, namespace: namespace, type: 'attribute' }; } return { element: formattedElement, lastValue: lastValue, name: name, namespace: namespace === undefined ? null : namespace, type: 'attribute' }; }; return DynamicAttribute; }(); function formatElement(element) { return JSON.stringify('<' + element.tagName.toLowerCase() + ' />'); } _opcodes.APPEND_OPCODES.add(32 /* DynamicAttrNS */, function (vm, _ref7) { var _name = _ref7.op1, _namespace = _ref7.op2, trusting = _ref7.op3; var name = vm.constants.getString(_name); var namespace = vm.constants.getString(_namespace); var reference = vm.stack.pop(); vm.elements().setDynamicAttributeNS(namespace, name, reference, !!trusting); }); _opcodes.APPEND_OPCODES.add(31 /* DynamicAttr */, function (vm, _ref8) { var _name = _ref8.op1, trusting = _ref8.op2; var name = vm.constants.getString(_name); var reference = vm.stack.pop(); vm.elements().setDynamicAttribute(name, reference, !!trusting); }); var PatchElementOpcode = exports.PatchElementOpcode = function (_UpdatingOpcode2) { _inherits(PatchElementOpcode, _UpdatingOpcode2); function PatchElementOpcode(operation) { _classCallCheck(this, PatchElementOpcode); var _this3 = _possibleConstructorReturn(this, _UpdatingOpcode2.call(this)); _this3.type = 'patch-element'; _this3.tag = operation.tag; _this3.operation = operation; return _this3; } PatchElementOpcode.prototype.evaluate = function evaluate(vm) { this.operation.patch(vm.env); }; PatchElementOpcode.prototype.toJSON = function toJSON() { var _guid = this._guid, type = this.type, operation = this.operation; return { details: operation.toJSON(), guid: _guid, type: type }; }; return PatchElementOpcode; }(_opcodes.UpdatingOpcode); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2RvbS5qcyJdLCJuYW1lcyI6WyJDYWNoZWRSZWZlcmVuY2UiLCJjb21iaW5lVGFnZ2VkIiwiaXNDb25zdCIsImlzQ29uc3RSZWZlcmVuY2UiLCJpc01vZGlmaWVkIiwiUmVmZXJlbmNlQ2FjaGUiLCJBUFBFTkRfT1BDT0RFUyIsIlVwZGF0aW5nT3Bjb2RlIiwiTlVMTF9SRUZFUkVOQ0UiLCJQcmltaXRpdmVSZWZlcmVuY2UiLCJBc3NlcnQiLCJhZGQiLCJ2bSIsInRleHQiLCJvcDEiLCJlbGVtZW50cyIsImFwcGVuZFRleHQiLCJjb25zdGFudHMiLCJnZXRTdHJpbmciLCJhcHBlbmRDb21tZW50IiwidGFnIiwib3BlbkVsZW1lbnQiLCJ0YWdOYW1lIiwib3BlcmF0aW9ucyIsInN0YWNrIiwicG9wIiwidmFsdWUiLCJlbGVtZW50UmVmIiwibmV4dFNpYmxpbmdSZWYiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJjYWNoZSIsInBlZWsiLCJ1cGRhdGVXaXRoIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiQ2xhc3NMaXN0IiwibGlzdCIsImFwcGVuZCIsInJlZmVyZW5jZSIsInB1c2giLCJ0b1JlZmVyZW5jZSIsImNyZWF0ZSIsInRvQ2xhc3NOYW1lIiwiQ2xhc3NMaXN0UmVmZXJlbmNlIiwiY29tcHV0ZSIsInJldCIsImkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwiU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMiLCJlbnYiLCJvcGNvZGVzIiwiY2xhc3NMaXN0IiwiYWRkU3RhdGljQXR0cmlidXRlIiwibmFtZSIsImFkZENsYXNzIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInNldEF0dHJpYnV0ZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwibmFtZXNwYWNlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsImlzVHJ1c3RpbmciLCJhdHRyaWJ1dGVNYW5hZ2VyIiwiYXR0cmlidXRlRm9yIiwiYXR0cmlidXRlIiwiRHluYW1pY0F0dHJpYnV0ZSIsImFkZEF0dHJpYnV0ZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsIm5zQXR0cmlidXRlIiwiZmx1c2giLCJvcGNvZGUiLCJDb21wb25lbnRFbGVtZW50T3BlcmF0aW9ucyIsImF0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlcyIsInNob3VsZEFkZEF0dHJpYnV0ZSIsIlN0YXRpY0F0dHJpYnV0ZSIsImluZGV4T2YiLCJhY3Rpb24iLCJleHBlY3RPcGVyYXRpb25zIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwiZmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiX25hbWUiLCJfdmFsdWUiLCJvcDIiLCJfbmFtZXNwYWNlIiwib3AzIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJfbWFuYWdlciIsIm1hbmFnZXIiLCJnZXRPdGhlciIsImFyZ3MiLCJjb25zdHJ1Y3RpbmciLCJ1cGRhdGVPcGVyYXRpb25zIiwiZHluYW1pY1Njb3BlIiwibW9kaWZpZXIiLCJjbGVhciIsInNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyIiwiZGVzdHJ1Y3RvciIsImdldERlc3RydWN0b3IiLCJuZXdEZXN0cm95YWJsZSIsIlVwZGF0ZU1vZGlmaWVyT3Bjb2RlIiwidHlwZSIsImxhc3RVcGRhdGVkIiwiZXZhbHVhdGUiLCJ2YWxpZGF0ZSIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJ0b0pTT04iLCJndWlkIiwiX2d1aWQiLCJwYXRjaCIsInJldmFsaWRhdGUiLCJ1cGRhdGVBdHRyaWJ1dGUiLCJQYXRjaEVsZW1lbnRPcGNvZGUiLCJmb3JtYXR0ZWRFbGVtZW50IiwiZm9ybWF0RWxlbWVudCIsImxhc3RWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b0xvd2VyQ2FzZSIsInRydXN0aW5nIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsIm9wZXJhdGlvbiIsImRldGFpbHMiXSwibWFwcGluZ3MiOiI7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QUFBZSxNQUFNLEdBQXJCLEFBQXdCLEFBQzNCO0FBVEw7O2lDQUFBLEFBVUksMkJBQVM7WUFBQSxBQUNDLFFBREQsQUFDNEIsS0FENUIsQUFDQztZQURELEFBQ1EsT0FEUixBQUM0QixLQUQ1QixBQUNRO1lBRFIsQUFDYyxZQURkLEFBQzRCLEtBRDVCLEFBQ2MsQUFDbkI7OztxQkFDYSxVQUROLEFBQ00sQUFBVSxBQUNuQjtrQkFGRyxBQUVHLEFBQ047a0JBSEosQUFBTyxBQUtWO0FBTFUsQUFDSDtBQWJaOztXQUFBO0FBQUEsQUFBd0MiLCJmaWxlIjoibGliL2NvbXBpbGVkL29wY29kZXMvZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVkUmVmZXJlbmNlLCBjb21iaW5lVGFnZ2VkLCBpc0NvbnN0IGFzIGlzQ29uc3RSZWZlcmVuY2UsIGlzTW9kaWZpZWQsIFJlZmVyZW5jZUNhY2hlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUywgVXBkYXRpbmdPcGNvZGUgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IE5VTExfUkVGRVJFTkNFLCBQcmltaXRpdmVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI0IC8qIFRleHQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kVGV4dCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI1IC8qIENvbW1lbnQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kQ29tbWVudCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI3IC8qIE9wZW5FbGVtZW50ICovLCAodm0sIHsgb3AxOiB0YWcgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodm0uY29uc3RhbnRzLmdldFN0cmluZyh0YWcpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi8sICh2bSwgeyBvcDE6IHRhZyB9KSA9PiB7XG4gICAgbGV0IHRhZ05hbWUgPSB2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRhZyk7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHRhZ05hbWUsIG9wZXJhdGlvbnMpO1xufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjkgLyogT3BlbkR5bmFtaWNFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgdGFnTmFtZSA9IHZtLnN0YWNrLnBvcCgpLnZhbHVlKCk7XG4gICAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh0YWdOYW1lLCBvcGVyYXRpb25zKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IGVsZW1lbnRSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgbmV4dFNpYmxpbmdSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgZWxlbWVudDtcbiAgICBsZXQgbmV4dFNpYmxpbmc7XG4gICAgaWYgKGlzQ29uc3RSZWZlcmVuY2UoZWxlbWVudFJlZikpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRSZWYudmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUoZWxlbWVudFJlZik7XG4gICAgICAgIGVsZW1lbnQgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChjYWNoZSkpO1xuICAgIH1cbiAgICBpZiAoaXNDb25zdFJlZmVyZW5jZShuZXh0U2libGluZ1JlZikpIHtcbiAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZ1JlZi52YWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjYWNoZSA9IG5ldyBSZWZlcmVuY2VDYWNoZShuZXh0U2libGluZ1JlZik7XG4gICAgICAgIG5leHRTaWJsaW5nID0gY2FjaGUucGVlaygpO1xuICAgICAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoY2FjaGUpKTtcbiAgICB9XG4gICAgdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBuZXh0U2libGluZyk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgzNyAvKiBQb3BSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB2bS5lbGVtZW50cygpLnBvcFJlbW90ZUVsZW1lbnQoKSk7XG5jbGFzcyBDbGFzc0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSB0cnVlO1xuICAgIH1cbiAgICBhcHBlbmQocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmIChsaXN0ID09PSBudWxsKSBsaXN0ID0gdGhpcy5saXN0ID0gW107XG4gICAgICAgIGxpc3QucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0ICYmIGlzQ29uc3RSZWZlcmVuY2UocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgdG9SZWZlcmVuY2UoKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGlzdCkgcmV0dXJuIE5VTExfUkVGRVJFTkNFO1xuICAgICAgICBpZiAoaXNDb25zdCkgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUodG9DbGFzc05hbWUobGlzdCkpO1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdFJlZmVyZW5jZShsaXN0KTtcbiAgICB9XG59XG5jbGFzcyBDbGFzc0xpc3RSZWZlcmVuY2UgZXh0ZW5kcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIHRoaXMudGFnID0gY29tYmluZVRhZ2dlZChsaXN0KTtcbiAgICAgICAgdGhpcy5saXN0ID0gbGlzdDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvQ2xhc3NOYW1lKHRoaXMubGlzdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9DbGFzc05hbWUobGlzdCkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbGlzdFtpXS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHJldC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0LmpvaW4oJyAnKTtcbn1cbmV4cG9ydCBjbGFzcyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoZW52KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm9wY29kZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCkuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGFkZER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENsYXNzKHJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlTWFuYWdlciA9IHRoaXMuZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCBuYW1lLCBpc1RydXN0aW5nKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCBuYW1lLCByZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGREeW5hbWljQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgbGV0IG5zQXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlLCBuYW1lc3BhY2UpO1xuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZShuc0F0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGZsdXNoKGVsZW1lbnQsIHZtKSB7XG4gICAgICAgIGxldCB7IGVudiB9ID0gdm07XG4gICAgICAgIGxldCB7IG9wY29kZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IG9wY29kZXMgJiYgaSA8IG9wY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSBlbnYuYXR0cmlidXRlRm9yKGVsZW1lbnQsICdjbGFzcycsIGZhbHNlKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCAnY2xhc3MnLCBjbGFzc0xpc3QudG9SZWZlcmVuY2UoKSk7XG4gICAgICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0ID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKHRoaXMuZW52KTtcbiAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgbGV0IHsgb3Bjb2RlcyB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghb3Bjb2Rlcykge1xuICAgICAgICAgICAgICAgIG9wY29kZXMgPSB0aGlzLm9wY29kZXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wY29kZXMucHVzaChvcGNvZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEVsZW1lbnRPcGVyYXRpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5ldyBTdGF0aWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUobmFtZSwgbmV3IFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MocmVmZXJlbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZyk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZU5TKGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIGxldCBuc0F0dHJpYnV0ZSA9IG5ldyBEeW5hbWljQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU1hbmFnZXIsIG5hbWUsIHJlZmVyZW5jZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5zQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaChlbGVtZW50LCB2bSkge1xuICAgICAgICBsZXQgeyBlbnYgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGF0dHJpYnV0ZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGF0dHJpYnV0ZXMgJiYgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvcGNvZGUgPSBhdHRyaWJ1dGVzW2ldLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVNYW5hZ2VyID0gZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCAnY2xhc3MnLCBmYWxzZSk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgJ2NsYXNzJywgY2xhc3NMaXN0LnRvUmVmZXJlbmNlKCkpO1xuICAgICAgICAgICAgbGV0IG9wY29kZSA9IGF0dHJpYnV0ZS5mbHVzaChlbnYpO1xuICAgICAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYXR0cmlidXRlTmFtZXMgfHwgdGhpcy5hdHRyaWJ1dGVOYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMTtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgeyBhdHRyaWJ1dGVOYW1lcywgYXR0cmlidXRlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lcykge1xuICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMgPSB0aGlzLmF0dHJpYnV0ZU5hbWVzID0gW107XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgdW53cmFwKGF0dHJpYnV0ZXMpLnB1c2goYXR0cmlidXRlKTtcbiAgICB9XG59XG5BUFBFTkRfT1BDT0RFUy5hZGQoMzMgLyogRmx1c2hFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IHN0YWNrID0gdm0uZWxlbWV