ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
412 lines (340 loc) • 31.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.combineTagged = combineTagged;
exports.combineSlice = combineSlice;
exports.combine = combine;
exports.map = map;
exports.isModified = isModified;
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");
}
}
var CONSTANT = exports.CONSTANT = 0;
var INITIAL = exports.INITIAL = 1;
var VOLATILE = exports.VOLATILE = NaN;
var RevisionTag = exports.RevisionTag = function () {
function RevisionTag() {
_classCallCheck(this, RevisionTag);
}
RevisionTag.prototype.validate = function validate(snapshot) {
return this.value() === snapshot;
};
return RevisionTag;
}();
RevisionTag.id = 0;
var VALUE = [];
var VALIDATE = [];
var TagWrapper = exports.TagWrapper = function () {
function TagWrapper(type, inner) {
_classCallCheck(this, TagWrapper);
this.type = type;
this.inner = inner;
}
TagWrapper.prototype.value = function value() {
var func = VALUE[this.type];
return func(this.inner);
};
TagWrapper.prototype.validate = function validate(snapshot) {
var func = VALIDATE[this.type];
return func(this.inner, snapshot);
};
return TagWrapper;
}();
function register(Type) {
var type = VALUE.length;
VALUE.push(function (tag) {
return tag.value();
});
VALIDATE.push(function (tag, snapshot) {
return tag.validate(snapshot);
});
Type.id = type;
}
///
// CONSTANT: 0
VALUE.push(function () {
return CONSTANT;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === CONSTANT;
});
var CONSTANT_TAG = exports.CONSTANT_TAG = new TagWrapper(0, null);
// VOLATILE: 1
VALUE.push(function () {
return VOLATILE;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === VOLATILE;
});
var VOLATILE_TAG = exports.VOLATILE_TAG = new TagWrapper(1, null);
// CURRENT: 2
VALUE.push(function () {
return $REVISION;
});
VALIDATE.push(function (_tag, snapshot) {
return snapshot === $REVISION;
});
var CURRENT_TAG = exports.CURRENT_TAG = new TagWrapper(2, null);
///
var $REVISION = INITIAL;
var DirtyableTag = exports.DirtyableTag = function (_RevisionTag) {
_inherits(DirtyableTag, _RevisionTag);
DirtyableTag.create = function create() {
var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
return new TagWrapper(this.id, new DirtyableTag(revision));
};
function DirtyableTag() {
var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
_classCallCheck(this, DirtyableTag);
var _this = _possibleConstructorReturn(this, _RevisionTag.call(this));
_this.revision = revision;
return _this;
}
DirtyableTag.prototype.value = function value() {
return this.revision;
};
DirtyableTag.prototype.dirty = function dirty() {
this.revision = ++$REVISION;
};
return DirtyableTag;
}(RevisionTag);
register(DirtyableTag);
function combineTagged(tagged) {
var optimized = [];
for (var i = 0, l = tagged.length; i < l; i++) {
var tag = tagged[i].tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function combineSlice(slice) {
var optimized = [];
var node = slice.head();
while (node !== null) {
var tag = node.tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag !== CONSTANT_TAG) optimized.push(tag);
node = slice.nextNode(node);
}
return _combine(optimized);
}
function combine(tags) {
var optimized = [];
for (var i = 0, l = tags.length; i < l; i++) {
var tag = tags[i];
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function _combine(tags) {
switch (tags.length) {
case 0:
return CONSTANT_TAG;
case 1:
return tags[0];
case 2:
return TagsPair.create(tags[0], tags[1]);
default:
return TagsCombinator.create(tags);
}
;
}
var CachedTag = exports.CachedTag = function (_RevisionTag2) {
_inherits(CachedTag, _RevisionTag2);
function CachedTag() {
_classCallCheck(this, CachedTag);
var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments));
_this2.lastChecked = null;
_this2.lastValue = null;
return _this2;
}
CachedTag.prototype.value = function value() {
var lastChecked = this.lastChecked,
lastValue = this.lastValue;
if (lastChecked !== $REVISION) {
this.lastChecked = $REVISION;
this.lastValue = lastValue = this.compute();
}
return this.lastValue;
};
CachedTag.prototype.invalidate = function invalidate() {
this.lastChecked = null;
};
return CachedTag;
}(RevisionTag);
var TagsPair = function (_CachedTag) {
_inherits(TagsPair, _CachedTag);
TagsPair.create = function create(first, second) {
return new TagWrapper(this.id, new TagsPair(first, second));
};
function TagsPair(first, second) {
_classCallCheck(this, TagsPair);
var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this));
_this3.first = first;
_this3.second = second;
return _this3;
}
TagsPair.prototype.compute = function compute() {
return Math.max(this.first.value(), this.second.value());
};
return TagsPair;
}(CachedTag);
register(TagsPair);
var TagsCombinator = function (_CachedTag2) {
_inherits(TagsCombinator, _CachedTag2);
TagsCombinator.create = function create(tags) {
return new TagWrapper(this.id, new TagsCombinator(tags));
};
function TagsCombinator(tags) {
_classCallCheck(this, TagsCombinator);
var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this));
_this4.tags = tags;
return _this4;
}
TagsCombinator.prototype.compute = function compute() {
var tags = this.tags;
var max = -1;
for (var i = 0; i < tags.length; i++) {
var value = tags[i].value();
max = Math.max(value, max);
}
return max;
};
return TagsCombinator;
}(CachedTag);
register(TagsCombinator);
var UpdatableTag = exports.UpdatableTag = function (_CachedTag3) {
_inherits(UpdatableTag, _CachedTag3);
UpdatableTag.create = function create(tag) {
return new TagWrapper(this.id, new UpdatableTag(tag));
};
function UpdatableTag(tag) {
_classCallCheck(this, UpdatableTag);
var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this));
_this5.tag = tag;
_this5.lastUpdated = INITIAL;
return _this5;
}
UpdatableTag.prototype.compute = function compute() {
return Math.max(this.lastUpdated, this.tag.value());
};
UpdatableTag.prototype.update = function update(tag) {
if (tag !== this.tag) {
this.tag = tag;
this.lastUpdated = $REVISION;
this.invalidate();
}
};
return UpdatableTag;
}(CachedTag);
register(UpdatableTag);
var CachedReference = exports.CachedReference = function () {
function CachedReference() {
_classCallCheck(this, CachedReference);
this.lastRevision = null;
this.lastValue = null;
}
CachedReference.prototype.value = function value() {
var tag = this.tag,
lastRevision = this.lastRevision,
lastValue = this.lastValue;
if (!lastRevision || !tag.validate(lastRevision)) {
lastValue = this.lastValue = this.compute();
this.lastRevision = tag.value();
}
return lastValue;
};
CachedReference.prototype.invalidate = function invalidate() {
this.lastRevision = null;
};
return CachedReference;
}();
var MapperReference = function (_CachedReference) {
_inherits(MapperReference, _CachedReference);
function MapperReference(reference, mapper) {
_classCallCheck(this, MapperReference);
var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this));
_this6.tag = reference.tag;
_this6.reference = reference;
_this6.mapper = mapper;
return _this6;
}
MapperReference.prototype.compute = function compute() {
var reference = this.reference,
mapper = this.mapper;
return mapper(reference.value());
};
return MapperReference;
}(CachedReference);
function map(reference, mapper) {
return new MapperReference(reference, mapper);
}
//////////
var ReferenceCache = exports.ReferenceCache = function () {
function ReferenceCache(reference) {
_classCallCheck(this, ReferenceCache);
this.lastValue = null;
this.lastRevision = null;
this.initialized = false;
this.tag = reference.tag;
this.reference = reference;
}
ReferenceCache.prototype.peek = function peek() {
if (!this.initialized) {
return this.initialize();
}
return this.lastValue;
};
ReferenceCache.prototype.revalidate = function revalidate() {
if (!this.initialized) {
return this.initialize();
}
var reference = this.reference,
lastRevision = this.lastRevision;
var tag = reference.tag;
if (tag.validate(lastRevision)) return NOT_MODIFIED;
this.lastRevision = tag.value();
var lastValue = this.lastValue;
var value = reference.value();
if (value === lastValue) return NOT_MODIFIED;
this.lastValue = value;
return value;
};
ReferenceCache.prototype.initialize = function initialize() {
var reference = this.reference;
var value = this.lastValue = reference.value();
this.lastRevision = reference.tag.value();
this.initialized = true;
return value;
};
return ReferenceCache;
}();
var NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145";
function isModified(value) {
return value !== NOT_MODIFIED;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92YWxpZGF0b3JzLmpzIl0sIm5hbWVzIjpbIkNPTlNUQU5UIiwiSU5JVElBTCIsIlZPTEFUSUxFIiwiTmFOIiwiUmV2aXNpb25UYWciLCJ2YWxpZGF0ZSIsInNuYXBzaG90IiwidmFsdWUiLCJpZCIsIlZBTFVFIiwiVkFMSURBVEUiLCJUYWdXcmFwcGVyIiwidHlwZSIsImlubmVyIiwiZnVuYyIsInJlZ2lzdGVyIiwiVHlwZSIsImxlbmd0aCIsInB1c2giLCJ0YWciLCJfdGFnIiwiQ09OU1RBTlRfVEFHIiwiVk9MQVRJTEVfVEFHIiwiJFJFVklTSU9OIiwiQ1VSUkVOVF9UQUciLCJEaXJ0eWFibGVUYWciLCJjcmVhdGUiLCJyZXZpc2lvbiIsImRpcnR5IiwiY29tYmluZVRhZ2dlZCIsInRhZ2dlZCIsIm9wdGltaXplZCIsImkiLCJsIiwiX2NvbWJpbmUiLCJjb21iaW5lU2xpY2UiLCJzbGljZSIsIm5vZGUiLCJoZWFkIiwibmV4dE5vZGUiLCJjb21iaW5lIiwidGFncyIsIlRhZ3NQYWlyIiwiVGFnc0NvbWJpbmF0b3IiLCJDYWNoZWRUYWciLCJhcmd1bWVudHMiLCJsYXN0Q2hlY2tlZCIsImxhc3RWYWx1ZSIsImNvbXB1dGUiLCJpbnZhbGlkYXRlIiwiZmlyc3QiLCJzZWNvbmQiLCJNYXRoIiwibWF4IiwiVXBkYXRhYmxlVGFnIiwibGFzdFVwZGF0ZWQiLCJ1cGRhdGUiLCJDYWNoZWRSZWZlcmVuY2UiLCJsYXN0UmV2aXNpb24iLCJNYXBwZXJSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJtYXBwZXIiLCJtYXAiLCJSZWZlcmVuY2VDYWNoZSIsImluaXRpYWxpemVkIiwicGVlayIsImluaXRpYWxpemUiLCJyZXZhbGlkYXRlIiwiTk9UX01PRElGSUVEIiwiaXNNb2RpZmllZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUE4RE8sQUFBUztRQVVULEFBQVM7UUFXVCxBQUFTO1FBNEhULEFBQVM7UUF5Q1QsQUFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXhQ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QUFBTyxBQUNWO0FBM0JMOzs2QkFBQSxBQTRCSSxtQ0FBYTtZQUFBLEFBQ0gsWUFERyxBQUNXLEtBRFgsQUFDSCxBQUNOOztZQUFJLFFBQVEsS0FBQSxBQUFLLFlBQVksVUFBN0IsQUFBNkIsQUFBVSxBQUN2QzthQUFBLEFBQUssZUFBZSxVQUFBLEFBQVUsSUFBOUIsQUFBb0IsQUFBYyxBQUNsQzthQUFBLEFBQUssY0FBTCxBQUFtQixBQUNuQjtlQUFBLEFBQU8sQUFDVjtBQWxDTDs7V0FBQTs7QUFvQ0EsSUFBTSxlQUFOLEFBQXFCLEFBQ3JCO0FBQU8sb0JBQUEsQUFBb0IsT0FBTyxBQUM5QjtXQUFPLFVBQVAsQUFBaUIsQUFDcEIiLCJmaWxlIjoibGliL3ZhbGlkYXRvcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQ09OU1RBTlQgPSAwO1xuZXhwb3J0IGNvbnN0IElOSVRJQUwgPSAxO1xuZXhwb3J0IGNvbnN0IFZPTEFUSUxFID0gTmFOO1xuZXhwb3J0IGNsYXNzIFJldmlzaW9uVGFnIHtcbiAgICB2YWxpZGF0ZShzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSgpID09PSBzbmFwc2hvdDtcbiAgICB9XG59XG5SZXZpc2lvblRhZy5pZCA9IDA7XG5jb25zdCBWQUxVRSA9IFtdO1xuY29uc3QgVkFMSURBVEUgPSBbXTtcbmV4cG9ydCBjbGFzcyBUYWdXcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBpbm5lcikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgZnVuYyA9IFZBTFVFW3RoaXMudHlwZV07XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMuaW5uZXIpO1xuICAgIH1cbiAgICB2YWxpZGF0ZShzbmFwc2hvdCkge1xuICAgICAgICBsZXQgZnVuYyA9IFZBTElEQVRFW3RoaXMudHlwZV07XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMuaW5uZXIsIHNuYXBzaG90KTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWdpc3RlcihUeXBlKSB7XG4gICAgbGV0IHR5cGUgPSBWQUxVRS5sZW5ndGg7XG4gICAgVkFMVUUucHVzaCh0YWcgPT4gdGFnLnZhbHVlKCkpO1xuICAgIFZBTElEQVRFLnB1c2goKHRhZywgc25hcHNob3QpID0+IHRhZy52YWxpZGF0ZShzbmFwc2hvdCkpO1xuICAgIFR5cGUuaWQgPSB0eXBlO1xufVxuLy8vXG4vLyBDT05TVEFOVDogMFxuVkFMVUUucHVzaCgoKSA9PiBDT05TVEFOVCk7XG5WQUxJREFURS5wdXNoKChfdGFnLCBzbmFwc2hvdCkgPT4gc25hcHNob3QgPT09IENPTlNUQU5UKTtcbmV4cG9ydCBjb25zdCBDT05TVEFOVF9UQUcgPSBuZXcgVGFnV3JhcHBlcigwLCBudWxsKTtcbi8vIFZPTEFUSUxFOiAxXG5WQUxVRS5wdXNoKCgpID0+IFZPTEFUSUxFKTtcblZBTElEQVRFLnB1c2goKF90YWcsIHNuYXBzaG90KSA9PiBzbmFwc2hvdCA9PT0gVk9MQVRJTEUpO1xuZXhwb3J0IGNvbnN0IFZPTEFUSUxFX1RBRyA9IG5ldyBUYWdXcmFwcGVyKDEsIG51bGwpO1xuLy8gQ1VSUkVOVDogMlxuVkFMVUUucHVzaCgoKSA9PiAkUkVWSVNJT04pO1xuVkFMSURBVEUucHVzaCgoX3RhZywgc25hcHNob3QpID0+IHNuYXBzaG90ID09PSAkUkVWSVNJT04pO1xuZXhwb3J0IGNvbnN0IENVUlJFTlRfVEFHID0gbmV3IFRhZ1dyYXBwZXIoMiwgbnVsbCk7XG4vLy9cbmxldCAkUkVWSVNJT04gPSBJTklUSUFMO1xuZXhwb3J0IGNsYXNzIERpcnR5YWJsZVRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgICBzdGF0aWMgY3JlYXRlKHJldmlzaW9uID0gJFJFVklTSU9OKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgRGlydHlhYmxlVGFnKHJldmlzaW9uKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHJldmlzaW9uID0gJFJFVklTSU9OKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmlzaW9uO1xuICAgIH1cbiAgICBkaXJ0eSgpIHtcbiAgICAgICAgdGhpcy5yZXZpc2lvbiA9ICsrJFJFVklTSU9OO1xuICAgIH1cbn1cbnJlZ2lzdGVyKERpcnR5YWJsZVRhZyk7XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVRhZ2dlZCh0YWdnZWQpIHtcbiAgICBsZXQgb3B0aW1pemVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0YWdnZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGxldCB0YWcgPSB0YWdnZWRbaV0udGFnO1xuICAgICAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpIHJldHVybiBWT0xBVElMRV9UQUc7XG4gICAgICAgIGlmICh0YWcgPT09IENPTlNUQU5UX1RBRykgY29udGludWU7XG4gICAgICAgIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVTbGljZShzbGljZSkge1xuICAgIGxldCBvcHRpbWl6ZWQgPSBbXTtcbiAgICBsZXQgbm9kZSA9IHNsaWNlLmhlYWQoKTtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgdGFnID0gbm9kZS50YWc7XG4gICAgICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyAhPT0gQ09OU1RBTlRfVEFHKSBvcHRpbWl6ZWQucHVzaCh0YWcpO1xuICAgICAgICBub2RlID0gc2xpY2UubmV4dE5vZGUobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmUodGFncykge1xuICAgIGxldCBvcHRpbWl6ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRhZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGxldCB0YWcgPSB0YWdzW2ldO1xuICAgICAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpIHJldHVybiBWT0xBVElMRV9UQUc7XG4gICAgICAgIGlmICh0YWcgPT09IENPTlNUQU5UX1RBRykgY29udGludWU7XG4gICAgICAgIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZnVuY3Rpb24gX2NvbWJpbmUodGFncykge1xuICAgIHN3aXRjaCAodGFncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIENPTlNUQU5UX1RBRztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHRhZ3NbMF07XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBUYWdzUGFpci5jcmVhdGUodGFnc1swXSwgdGFnc1sxXSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gVGFnc0NvbWJpbmF0b3IuY3JlYXRlKHRhZ3MpO1xuICAgIH1cbiAgICA7XG59XG5leHBvcnQgY2xhc3MgQ2FjaGVkVGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgbGV0IHsgbGFzdENoZWNrZWQsIGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGxhc3RDaGVja2VkICE9PSAkUkVWSVNJT04pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSAkUkVWSVNJT047XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IGxhc3RWYWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IG51bGw7XG4gICAgfVxufVxuY2xhc3MgVGFnc1BhaXIgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIHN0YXRpYyBjcmVhdGUoZmlyc3QsIHNlY29uZCkge1xuICAgICAgICByZXR1cm4gbmV3IFRhZ1dyYXBwZXIodGhpcy5pZCwgbmV3IFRhZ3NQYWlyKGZpcnN0LCBzZWNvbmQpKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoZmlyc3QsIHNlY29uZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7XG4gICAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kO1xuICAgIH1cbiAgICBjb21wdXRlKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5maXJzdC52YWx1ZSgpLCB0aGlzLnNlY29uZC52YWx1ZSgpKTtcbiAgICB9XG59XG5yZWdpc3RlcihUYWdzUGFpcik7XG5jbGFzcyBUYWdzQ29tYmluYXRvciBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZSh0YWdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgVGFnc0NvbWJpbmF0b3IodGFncykpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0YWdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIGxldCB7IHRhZ3MgfSA9IHRoaXM7XG4gICAgICAgIGxldCBtYXggPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0YWdzW2ldLnZhbHVlKCk7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heCh2YWx1ZSwgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cbnJlZ2lzdGVyKFRhZ3NDb21iaW5hdG9yKTtcbmV4cG9ydCBjbGFzcyBVcGRhdGFibGVUYWcgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIHN0YXRpYyBjcmVhdGUodGFnKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgVXBkYXRhYmxlVGFnKHRhZykpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSBJTklUSUFMO1xuICAgIH1cbiAgICBjb21wdXRlKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5sYXN0VXBkYXRlZCwgdGhpcy50YWcudmFsdWUoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh0YWcpIHtcbiAgICAgICAgaWYgKHRhZyAhPT0gdGhpcy50YWcpIHtcbiAgICAgICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9ICRSRVZJU0lPTjtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxucmVnaXN0ZXIoVXBkYXRhYmxlVGFnKTtcbmV4cG9ydCBjbGFzcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCB7IHRhZywgbGFzdFJldmlzaW9uLCBsYXN0VmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGFzdFJldmlzaW9uIHx8ICF0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSkge1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmNvbXB1dGUoKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gdGFnLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSBudWxsO1xuICAgIH1cbn1cbmNsYXNzIE1hcHBlclJlZmVyZW5jZSBleHRlbmRzIENhY2hlZFJlZmVyZW5jZSB7XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlLCBtYXBwZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICAgICAgdGhpcy5tYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZSwgbWFwcGVyIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWFwcGVyKHJlZmVyZW5jZS52YWx1ZSgpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gbWFwKHJlZmVyZW5jZSwgbWFwcGVyKSB7XG4gICAgcmV0dXJuIG5ldyBNYXBwZXJSZWZlcmVuY2UocmVmZXJlbmNlLCBtYXBwZXIpO1xufVxuLy8vLy8vLy8vL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICAgIH1cbiAgICByZXZhbGlkYXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyByZWZlcmVuY2UsIGxhc3RSZXZpc2lvbiB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIGlmICh0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSkgcmV0dXJuIE5PVF9NT0RJRklFRDtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0YWcudmFsdWUoKTtcbiAgICAgICAgbGV0IHsgbGFzdFZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmFsdWUgPSByZWZlcmVuY2UudmFsdWUoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBsYXN0VmFsdWUpIHJldHVybiBOT1RfTU9ESUZJRUQ7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmxhc3RWYWx1ZSA9IHJlZmVyZW5jZS52YWx1ZSgpO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHJlZmVyZW5jZS50YWcudmFsdWUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5jb25zdCBOT1RfTU9ESUZJRUQgPSBcImFkYjNiNzhlLTNkMjItNGU0Yi04NzdhLTYzMTdjMmM1YzE0NVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kaWZpZWQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE5PVF9NT0RJRklFRDtcbn0iXX0=