ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
311 lines (305 loc) • 37.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.InstanceMeta = exports.ClassMeta = exports.EMPTY_CACHE = undefined;
exports.turbocharge = turbocharge;
var _objectReference = require('@glimmer/object-reference');
var _util = require('@glimmer/util');
var _mixin = require('./mixin');
var _utils = require('./utils');
const { isArray } = Array;
const EMPTY_CACHE = exports.EMPTY_CACHE = function EMPTY_CACHE() {};
const CLASS_META = "df8be4c8-4e89-44e2-a8f9-550c8dacdca7";
function turbocharge(obj) {
// function Dummy() {}
// Dummy.prototype = obj;
return obj;
}
class SealedMeta extends _objectReference.Meta {
addReferenceTypeFor(..._args) {
throw new Error("Cannot modify reference types on a sealed meta");
}
}
class ClassMeta {
constructor() {
this.referenceTypes = (0, _util.dict)();
this.propertyMetadata = (0, _util.dict)();
this.concatenatedProperties = (0, _util.dict)();
this.hasConcatenatedProperties = false;
this.mergedProperties = (0, _util.dict)();
this.hasMergedProperties = false;
this.mixins = [];
this.appliedMixins = [];
this.staticMixins = [];
this.subclasses = [];
this.slots = [];
this.InstanceMetaConstructor = null;
}
static fromParent(parent) {
let meta = new this();
meta.reset(parent);
return meta;
}
static for(object) {
if (CLASS_META in object) return object[CLASS_META];else if (object.constructor) return object.constructor[CLASS_META] || null;else return null;
}
init(object, attrs) {
if (typeof attrs !== 'object' || attrs === null) return;
if (this.hasConcatenatedProperties) {
let concatProps = this.concatenatedProperties;
for (let prop in concatProps) {
if (prop in attrs) {
let concat = concatProps[prop].slice();
object[prop] = concat.concat(attrs[prop]);
}
}
}
if (this.hasMergedProperties) {
let mergedProps = this.mergedProperties;
for (let prop in mergedProps) {
if (prop in attrs) {
let merged = (0, _util.assign)({}, mergedProps[prop]);
object[prop] = (0, _util.assign)(merged, attrs[prop]);
}
}
}
}
addStaticMixin(mixin) {
this.staticMixins.push(mixin);
}
addMixin(mixin) {
this.mixins.push(mixin);
}
getStaticMixins() {
return this.staticMixins;
}
getMixins() {
return this.mixins;
}
addAppliedMixin(mixin) {
this.appliedMixins.push(mixin);
}
hasAppliedMixin(mixin) {
return this.appliedMixins.indexOf(mixin) !== -1;
}
getAppliedMixins() {
return this.appliedMixins;
}
hasStaticMixin(mixin) {
return this.staticMixins.indexOf(mixin) !== -1;
}
static applyAllMixins(Subclass, Parent) {
Subclass[CLASS_META].getMixins().forEach(m => m.extendPrototypeOnto(Subclass, Parent));
Subclass[CLASS_META].getStaticMixins().forEach(m => m.extendStatic(Subclass));
Subclass[CLASS_META].seal();
}
addSubclass(constructor) {
this.subclasses.push(constructor);
}
getSubclasses() {
return this.subclasses;
}
addPropertyMetadata(property, value) {
this.propertyMetadata[property] = value;
}
metadataForProperty(property) {
return this.propertyMetadata[property];
}
addReferenceTypeFor(property, type) {
this.referenceTypes[property] = type;
}
addSlotFor(property) {
this.slots.push(property);
}
hasConcatenatedProperty(property) {
if (!this.hasConcatenatedProperties) return false;
return property in this.concatenatedProperties;
}
getConcatenatedProperty(property) {
return this.concatenatedProperties[property];
}
getConcatenatedProperties() {
return Object.keys(this.concatenatedProperties);
}
addConcatenatedProperty(property, value) {
this.hasConcatenatedProperties = true;
if (property in this.concatenatedProperties) {
let val = this.concatenatedProperties[property].concat(value);
this.concatenatedProperties[property] = val;
} else {
this.concatenatedProperties[property] = value;
}
}
hasMergedProperty(property) {
if (!this.hasMergedProperties) return false;
return property in this.mergedProperties;
}
getMergedProperty(property) {
return this.mergedProperties[property];
}
getMergedProperties() {
return Object.keys(this.mergedProperties);
}
addMergedProperty(property, value) {
this.hasMergedProperties = true;
if (isArray(value)) {
throw new Error(`You passed in \`${JSON.stringify(value)}\` as the value for \`foo\` but \`foo\` cannot be an Array`);
}
if (property in this.mergedProperties && this.mergedProperties[property] && value) {
this.mergedProperties[property] = mergeMergedProperties(value, this.mergedProperties[property]);
} else {
value = value === null ? value : value || {};
this.mergedProperties[property] = value;
}
}
getReferenceTypes() {
return this.referenceTypes;
}
getPropertyMetadata() {
return this.propertyMetadata;
}
reset(parent) {
this.referenceTypes = (0, _util.dict)();
this.propertyMetadata = (0, _util.dict)();
this.concatenatedProperties = (0, _util.dict)();
this.mergedProperties = (0, _util.dict)();
if (parent) {
this.hasConcatenatedProperties = parent.hasConcatenatedProperties;
for (let prop in parent.concatenatedProperties) {
this.concatenatedProperties[prop] = parent.concatenatedProperties[prop].slice();
}
this.hasMergedProperties = parent.hasMergedProperties;
for (let prop in parent.mergedProperties) {
this.mergedProperties[prop] = (0, _util.assign)({}, parent.mergedProperties[prop]);
}
(0, _util.assign)(this.referenceTypes, parent.referenceTypes);
(0, _util.assign)(this.propertyMetadata, parent.propertyMetadata);
}
}
reseal(obj) {
let meta = _objectReference.Meta.for(obj);
let fresh = new this.InstanceMetaConstructor(obj, {});
let referenceTypes = meta.getReferenceTypes();
let slots = meta.getSlots();
turbocharge((0, _util.assign)(referenceTypes, this.referenceTypes));
turbocharge((0, _util.assign)(slots, fresh.getSlots()));
}
seal() {
let referenceTypes = turbocharge((0, _util.assign)({}, this.referenceTypes));
turbocharge(this.concatenatedProperties);
turbocharge(this.mergedProperties);
if (!this.hasMergedProperties && !this.hasConcatenatedProperties) {
this.init = function () {};
}
let slots = this.slots;
class Slots {
constructor() {
slots.forEach(name => {
this[name] = EMPTY_CACHE;
});
}
}
this.InstanceMetaConstructor = class extends SealedMeta {
constructor() {
super(...arguments);
this.slots = new Slots();
this.referenceTypes = referenceTypes;
}
getReferenceTypes() {
return this.referenceTypes;
}
referenceTypeFor(property) {
return this.referenceTypes[property] || _objectReference.PropertyReference;
}
getSlots() {
return this.slots;
}
};
turbocharge(this);
}
}
exports.ClassMeta = ClassMeta;
function mergeMergedProperties(attrs, parent) {
let merged = (0, _util.assign)({}, parent);
for (let prop in attrs) {
if (prop in parent && typeof parent[prop] === 'function' && typeof attrs[prop] === 'function') {
let wrapped = (0, _mixin.wrapMethod)(parent, prop, attrs[prop]);
merged[prop] = wrapped;
} else {
merged[prop] = attrs[prop];
}
}
return merged;
}
class InstanceMeta extends ClassMeta {
constructor() {
super(...arguments);
this["df8be4c8-4e89-44e2-a8f9-550c8dacdca7"] = ClassMeta.fromParent(null);
}
static fromParent(parent) {
return super.fromParent(parent);
}
reset(parent) {
super.reset(parent);
if (parent) this[CLASS_META].reset(parent[CLASS_META]);
}
seal() {
super.seal();
this[CLASS_META].seal();
}
}
exports.InstanceMeta = InstanceMeta;
class GlimmerObject {
constructor(attrs) {
this._super = _utils.ROOT;
this._meta = null;
if (attrs) (0, _util.assign)(this, attrs);
this.constructor[CLASS_META].init(this, attrs || null);
this._super = _utils.ROOT;
(0, _util.initializeGuid)(this);
this.init();
}
static extend(...extensions) {
return (0, _mixin.extend)(this, ...extensions);
}
static create(attrs) {
return new this(attrs);
}
static reopen(extensions) {
(0, _mixin.toMixin)(extensions).extendPrototype(this);
this[CLASS_META].seal();
(0, _mixin.relinkSubclasses)(this);
}
static reopenClass(extensions) {
(0, _mixin.toMixin)(extensions).extendStatic(this);
this[CLASS_META].seal();
}
static metaForProperty(property) {
let value = this[CLASS_META].metadataForProperty(property);
if (!value) throw new Error(`metaForProperty() could not find a computed property with key '${property}'.`);
return value;
}
static eachComputedProperty(callback) {
let metadata = this[CLASS_META].getPropertyMetadata();
if (!metadata) return;
for (let prop in metadata) {
callback(prop, metadata[prop]);
}
}
init() {}
get(key) {
return this[key];
}
set(key, value) {
this[key] = value;
}
setProperties(attrs) {
(0, _util.assign)(this, attrs);
}
destroy() {}
}
exports.default = GlimmerObject;
GlimmerObject["df8be4c8-4e89-44e2-a8f9-550c8dacdca7"] = InstanceMeta.fromParent(null);
GlimmerObject.isClass = true;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vYmplY3QuanMiXSwibmFtZXMiOlsidHVyYm9jaGFyZ2UiLCJpc0FycmF5IiwiQXJyYXkiLCJFTVBUWV9DQUNIRSIsIkNMQVNTX01FVEEiLCJvYmoiLCJTZWFsZWRNZXRhIiwiYWRkUmVmZXJlbmNlVHlwZUZvciIsIl9hcmdzIiwiRXJyb3IiLCJDbGFzc01ldGEiLCJjb25zdHJ1Y3RvciIsInJlZmVyZW5jZVR5cGVzIiwicHJvcGVydHlNZXRhZGF0YSIsImNvbmNhdGVuYXRlZFByb3BlcnRpZXMiLCJoYXNDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzIiwibWVyZ2VkUHJvcGVydGllcyIsImhhc01lcmdlZFByb3BlcnRpZXMiLCJtaXhpbnMiLCJhcHBsaWVkTWl4aW5zIiwic3RhdGljTWl4aW5zIiwic3ViY2xhc3NlcyIsInNsb3RzIiwiSW5zdGFuY2VNZXRhQ29uc3RydWN0b3IiLCJmcm9tUGFyZW50IiwicGFyZW50IiwibWV0YSIsInJlc2V0IiwiZm9yIiwib2JqZWN0IiwiaW5pdCIsImF0dHJzIiwiY29uY2F0UHJvcHMiLCJwcm9wIiwiY29uY2F0Iiwic2xpY2UiLCJtZXJnZWRQcm9wcyIsIm1lcmdlZCIsImFkZFN0YXRpY01peGluIiwibWl4aW4iLCJwdXNoIiwiYWRkTWl4aW4iLCJnZXRTdGF0aWNNaXhpbnMiLCJnZXRNaXhpbnMiLCJhZGRBcHBsaWVkTWl4aW4iLCJoYXNBcHBsaWVkTWl4aW4iLCJpbmRleE9mIiwiZ2V0QXBwbGllZE1peGlucyIsImhhc1N0YXRpY01peGluIiwiYXBwbHlBbGxNaXhpbnMiLCJTdWJjbGFzcyIsIlBhcmVudCIsImZvckVhY2giLCJtIiwiZXh0ZW5kUHJvdG90eXBlT250byIsImV4dGVuZFN0YXRpYyIsInNlYWwiLCJhZGRTdWJjbGFzcyIsImdldFN1YmNsYXNzZXMiLCJhZGRQcm9wZXJ0eU1ldGFkYXRhIiwicHJvcGVydHkiLCJ2YWx1ZSIsIm1ldGFkYXRhRm9yUHJvcGVydHkiLCJ0eXBlIiwiYWRkU2xvdEZvciIsImhhc0NvbmNhdGVuYXRlZFByb3BlcnR5IiwiZ2V0Q29uY2F0ZW5hdGVkUHJvcGVydHkiLCJnZXRDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzIiwiT2JqZWN0Iiwia2V5cyIsImFkZENvbmNhdGVuYXRlZFByb3BlcnR5IiwidmFsIiwiaGFzTWVyZ2VkUHJvcGVydHkiLCJnZXRNZXJnZWRQcm9wZXJ0eSIsImdldE1lcmdlZFByb3BlcnRpZXMiLCJhZGRNZXJnZWRQcm9wZXJ0eSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtZXJnZU1lcmdlZFByb3BlcnRpZXMiLCJnZXRSZWZlcmVuY2VUeXBlcyIsImdldFByb3BlcnR5TWV0YWRhdGEiLCJyZXNlYWwiLCJmcmVzaCIsImdldFNsb3RzIiwiU2xvdHMiLCJuYW1lIiwiYXJndW1lbnRzIiwicmVmZXJlbmNlVHlwZUZvciIsIndyYXBwZWQiLCJJbnN0YW5jZU1ldGEiLCJHbGltbWVyT2JqZWN0IiwiX3N1cGVyIiwiX21ldGEiLCJleHRlbmQiLCJleHRlbnNpb25zIiwiY3JlYXRlIiwicmVvcGVuIiwiZXh0ZW5kUHJvdG90eXBlIiwicmVvcGVuQ2xhc3MiLCJtZXRhRm9yUHJvcGVydHkiLCJlYWNoQ29tcHV0ZWRQcm9wZXJ0eSIsImNhbGxiYWNrIiwibWV0YWRhdGEiLCJnZXQiLCJrZXkiLCJzZXQiLCJzZXRQcm9wZXJ0aWVzIiwiZGVzdHJveSIsImlzQ2xhc3MiXSwibWFwcGluZ3MiOiI7Ozs7OztRQU9nQkEsVyxHQUFBQSxXOztBQVBoQjs7QUFDQTs7QUFDQTs7QUFFQTs7QUFEQSxNQUFNLEVBQUVDLE9BQUYsS0FBY0MsS0FBcEI7QUFFTyxNQUFNQyxvQ0FBYyxTQUFTQSxXQUFULEdBQXVCLENBQUUsQ0FBN0M7QUFDUCxNQUFNQyxhQUFhLHNDQUFuQjtBQUNPLFNBQVNKLFdBQVQsQ0FBcUJLLEdBQXJCLEVBQTBCO0FBQzdCO0FBQ0E7QUFDQSxXQUFPQSxHQUFQO0FBQ0g7QUFDRCxNQUFNQyxVQUFOLCtCQUE4QjtBQUMxQkMsd0JBQW9CLEdBQUdDLEtBQXZCLEVBQThC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QUNBLGFBQUtuRCxVQUFMLEVBQWlCb0QsSUFBakI7QUFDSDtBQUNELFdBQU8yQyxlQUFQLENBQXVCdkMsUUFBdkIsRUFBaUM7QUFDN0IsWUFBSUMsUUFBUSxLQUFLekQsVUFBTCxFQUFpQjBELG1CQUFqQixDQUFxQ0YsUUFBckMsQ0FBWjtBQUNBLFlBQUksQ0FBQ0MsS0FBTCxFQUFZLE1BQU0sSUFBSXBELEtBQUosQ0FBVyxrRUFBaUVtRCxRQUFTLElBQXJGLENBQU47QUFDWixlQUFPQyxLQUFQO0FBQ0g7QUFDRCxXQUFPdUMsb0JBQVAsQ0FBNEJDLFFBQTVCLEVBQXNDO0FBQ2xDLFlBQUlDLFdBQVcsS0FBS2xHLFVBQUwsRUFBaUI0RSxtQkFBakIsRUFBZjtBQUNBLFlBQUksQ0FBQ3NCLFFBQUwsRUFBZTtBQUNmLGFBQUssSUFBSXJFLElBQVQsSUFBaUJxRSxRQUFqQixFQUEyQjtBQUN2QkQscUJBQVNwRSxJQUFULEVBQWVxRSxTQUFTckUsSUFBVCxDQUFmO0FBQ0g7QUFDSjtBQUNESCxXQUFPLENBQUU7QUFDVHlFLFFBQUlDLEdBQUosRUFBUztBQUNMLGVBQU8sS0FBS0EsR0FBTCxDQUFQO0FBQ0g7QUFDREMsUUFBSUQsR0FBSixFQUFTM0MsS0FBVCxFQUFnQjtBQUNaLGFBQUsyQyxHQUFMLElBQVkzQyxLQUFaO0FBQ0g7QUFDRDZDLGtCQUFjM0UsS0FBZCxFQUFxQjtBQUNqQiwwQkFBTyxJQUFQLEVBQWFBLEtBQWI7QUFDSDtBQUNENEUsY0FBVSxDQUFFO0FBL0NtQjtrQkFBZGpCLGE7QUFpRHJCQSxjQUFjLHNDQUFkLElBQXdERCxhQUFhakUsVUFBYixDQUF3QixJQUF4QixDQUF4RDtBQUNBa0UsY0FBY2tCLE9BQWQsR0FBd0IsSUFBeEIiLCJmaWxlIjoibGliL29iamVjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1ldGEsIFByb3BlcnR5UmVmZXJlbmNlIH0gZnJvbSAnQGdsaW1tZXIvb2JqZWN0LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBkaWN0LCBhc3NpZ24sIGluaXRpYWxpemVHdWlkIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBleHRlbmQgYXMgZXh0ZW5kQ2xhc3MsIHRvTWl4aW4sIHJlbGlua1N1YmNsYXNzZXMsIHdyYXBNZXRob2QgfSBmcm9tICcuL21peGluJztcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5pbXBvcnQgeyBST09UIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgY29uc3QgRU1QVFlfQ0FDSEUgPSBmdW5jdGlvbiBFTVBUWV9DQUNIRSgpIHt9O1xuY29uc3QgQ0xBU1NfTUVUQSA9IFwiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCI7XG5leHBvcnQgZnVuY3Rpb24gdHVyYm9jaGFyZ2Uob2JqKSB7XG4gICAgLy8gZnVuY3Rpb24gRHVtbXkoKSB7fVxuICAgIC8vIER1bW15LnByb3RvdHlwZSA9IG9iajtcbiAgICByZXR1cm4gb2JqO1xufVxuY2xhc3MgU2VhbGVkTWV0YSBleHRlbmRzIE1ldGEge1xuICAgIGFkZFJlZmVyZW5jZVR5cGVGb3IoLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IG1vZGlmeSByZWZlcmVuY2UgdHlwZXMgb24gYSBzZWFsZWQgbWV0YVwiKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ2xhc3NNZXRhIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlcyA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU1ldGFkYXRhID0gZGljdCgpO1xuICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1lcmdlZFByb3BlcnRpZXMgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1peGlucyA9IFtdO1xuICAgICAgICB0aGlzLmFwcGxpZWRNaXhpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGF0aWNNaXhpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zdWJjbGFzc2VzID0gW107XG4gICAgICAgIHRoaXMuc2xvdHMgPSBbXTtcbiAgICAgICAgdGhpcy5JbnN0YW5jZU1ldGFDb25zdHJ1Y3RvciA9IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tUGFyZW50KHBhcmVudCkge1xuICAgICAgICBsZXQgbWV0YSA9IG5ldyB0aGlzKCk7XG4gICAgICAgIG1ldGEucmVzZXQocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIG1ldGE7XG4gICAgfVxuICAgIHN0YXRpYyBmb3Iob2JqZWN0KSB7XG4gICAgICAgIGlmIChDTEFTU19NRVRBIGluIG9iamVjdCkgcmV0dXJuIG9iamVjdFtDTEFTU19NRVRBXTtlbHNlIGlmIChvYmplY3QuY29uc3RydWN0b3IpIHJldHVybiBvYmplY3QuY29uc3RydWN0b3JbQ0xBU1NfTUVUQV0gfHwgbnVsbDtlbHNlIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpbml0KG9iamVjdCwgYXR0cnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhdHRycyAhPT0gJ29iamVjdCcgfHwgYXR0cnMgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcykge1xuICAgICAgICAgICAgbGV0IGNvbmNhdFByb3BzID0gdGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBjb25jYXRQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jYXQgPSBjb25jYXRQcm9wc1twcm9wXS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RbcHJvcF0gPSBjb25jYXQuY29uY2F0KGF0dHJzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcykge1xuICAgICAgICAgICAgbGV0IG1lcmdlZFByb3BzID0gdGhpcy5tZXJnZWRQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtZXJnZWRQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXJnZWQgPSBhc3NpZ24oe30sIG1lcmdlZFByb3BzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BdID0gYXNzaWduKG1lcmdlZCwgYXR0cnNbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNNaXhpbihtaXhpbikge1xuICAgICAgICB0aGlzLnN0YXRpY01peGlucy5wdXNoKG1peGluKTtcbiAgICB9XG4gICAgYWRkTWl4aW4obWl4aW4pIHtcbiAgICAgICAgdGhpcy5taXhpbnMucHVzaChtaXhpbik7XG4gICAgfVxuICAgIGdldFN0YXRpY01peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljTWl4aW5zO1xuICAgIH1cbiAgICBnZXRNaXhpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1peGlucztcbiAgICB9XG4gICAgYWRkQXBwbGllZE1peGluKG1peGluKSB7XG4gICAgICAgIHRoaXMuYXBwbGllZE1peGlucy5wdXNoKG1peGluKTtcbiAgICB9XG4gICAgaGFzQXBwbGllZE1peGluKG1peGluKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGxpZWRNaXhpbnMuaW5kZXhPZihtaXhpbikgIT09IC0xO1xuICAgIH1cbiAgICBnZXRBcHBsaWVkTWl4aW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWVkTWl4aW5zO1xuICAgIH1cbiAgICBoYXNTdGF0aWNNaXhpbihtaXhpbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNNaXhpbnMuaW5kZXhPZihtaXhpbikgIT09IC0xO1xuICAgIH1cbiAgICBzdGF0aWMgYXBwbHlBbGxNaXhpbnMoU3ViY2xhc3MsIFBhcmVudCkge1xuICAgICAgICBTdWJjbGFzc1tDTEFTU19NRVRBXS5nZXRNaXhpbnMoKS5mb3JFYWNoKG0gPT4gbS5leHRlbmRQcm90b3R5cGVPbnRvKFN1YmNsYXNzLCBQYXJlbnQpKTtcbiAgICAgICAgU3ViY2xhc3NbQ0xBU1NfTUVUQV0uZ2V0U3RhdGljTWl4aW5zKCkuZm9yRWFjaChtID0+IG0uZXh0ZW5kU3RhdGljKFN1YmNsYXNzKSk7XG4gICAgICAgIFN1YmNsYXNzW0NMQVNTX01FVEFdLnNlYWwoKTtcbiAgICB9XG4gICAgYWRkU3ViY2xhc3MoY29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhpcy5zdWJjbGFzc2VzLnB1c2goY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICBnZXRTdWJjbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJjbGFzc2VzO1xuICAgIH1cbiAgICBhZGRQcm9wZXJ0eU1ldGFkYXRhKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGFbcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICAgIG1ldGFkYXRhRm9yUHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlNZXRhZGF0YVtwcm9wZXJ0eV07XG4gICAgfVxuICAgIGFkZFJlZmVyZW5jZVR5cGVGb3IocHJvcGVydHksIHR5cGUpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlc1twcm9wZXJ0eV0gPSB0eXBlO1xuICAgIH1cbiAgICBhZGRTbG90Rm9yKHByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuc2xvdHMucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICAgIGhhc0NvbmNhdGVuYXRlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXM7XG4gICAgfVxuICAgIGdldENvbmNhdGVuYXRlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgYWRkQ29uY2F0ZW5hdGVkUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IHRydWU7XG4gICAgICAgIGlmIChwcm9wZXJ0eSBpbiB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcGVydHldLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcGVydHldID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc01lcmdlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNNZXJnZWRQcm9wZXJ0aWVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzLm1lcmdlZFByb3BlcnRpZXM7XG4gICAgfVxuICAgIGdldE1lcmdlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlZFByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRNZXJnZWRQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tZXJnZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgYWRkTWVyZ2VkUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcyA9IHRydWU7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgcGFzc2VkIGluIFxcYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfVxcYCBhcyB0aGUgdmFsdWUgZm9yIFxcYGZvb1xcYCBidXQgXFxgZm9vXFxgIGNhbm5vdCBiZSBhbiBBcnJheWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eSBpbiB0aGlzLm1lcmdlZFByb3BlcnRpZXMgJiYgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IG1lcmdlTWVyZ2VkUHJvcGVydGllcyh2YWx1ZSwgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gdmFsdWUgOiB2YWx1ZSB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMubWVyZ2VkUHJvcGVydGllc1twcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlVHlwZXM7XG4gICAgfVxuICAgIGdldFByb3BlcnR5TWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5TWV0YWRhdGE7XG4gICAgfVxuICAgIHJlc2V0KHBhcmVudCkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gZGljdCgpO1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGEgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzID0gZGljdCgpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmhhc0NvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSBwYXJlbnQuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcztcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcGFyZW50LmNvbmNhdGVuYXRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcF0gPSBwYXJlbnQuY29uY2F0ZW5hdGVkUHJvcGVydGllc1twcm9wXS5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYXNNZXJnZWRQcm9wZXJ0aWVzID0gcGFyZW50Lmhhc01lcmdlZFByb3BlcnRpZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBhcmVudC5tZXJnZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BdID0gYXNzaWduKHt9LCBwYXJlbnQubWVyZ2VkUHJvcGVydGllc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ24odGhpcy5yZWZlcmVuY2VUeXBlcywgcGFyZW50LnJlZmVyZW5jZVR5cGVzKTtcbiAgICAgICAgICAgIGFzc2lnbih0aGlzLnByb3BlcnR5TWV0YWRhdGEsIHBhcmVudC5wcm9wZXJ0eU1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNlYWwob2JqKSB7XG4gICAgICAgIGxldCBtZXRhID0gTWV0YS5mb3Iob2JqKTtcbiAgICAgICAgbGV0IGZyZXNoID0gbmV3IHRoaXMuSW5zdGFuY2VNZXRhQ29uc3RydWN0b3Iob2JqLCB7fSk7XG4gICAgICAgIGxldCByZWZlcmVuY2VUeXBlcyA9IG1ldGEuZ2V0UmVmZXJlbmNlVHlwZXMoKTtcbiAgICAgICAgbGV0IHNsb3RzID0gbWV0YS5nZXRTbG90cygpO1xuICAgICAgICB0dXJib2NoYXJnZShhc3NpZ24ocmVmZXJlbmNlVHlwZXMsIHRoaXMucmVmZXJlbmNlVHlwZXMpKTtcbiAgICAgICAgdHVyYm9jaGFyZ2UoYXNzaWduKHNsb3RzLCBmcmVzaC5nZXRTbG90cygpKSk7XG4gICAgfVxuICAgIHNlYWwoKSB7XG4gICAgICAgIGxldCByZWZlcmVuY2VUeXBlcyA9IHR1cmJvY2hhcmdlKGFzc2lnbih7fSwgdGhpcy5yZWZlcmVuY2VUeXBlcykpO1xuICAgICAgICB0dXJib2NoYXJnZSh0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMpO1xuICAgICAgICB0dXJib2NoYXJnZSh0aGlzLm1lcmdlZFByb3BlcnRpZXMpO1xuICAgICAgICBpZiAoIXRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcyAmJiAhdGhpcy5oYXNDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLmluaXQgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2xvdHMgPSB0aGlzLnNsb3RzO1xuICAgICAgICBjbGFzcyBTbG90cyB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICBzbG90cy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW25hbWVdID0gRU1QVFlfQ0FDSEU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5JbnN0YW5jZU1ldGFDb25zdHJ1Y3RvciA9IGNsYXNzIGV4dGVuZHMgU2VhbGVkTWV0YSB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2xvdHMgPSBuZXcgU2xvdHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gcmVmZXJlbmNlVHlwZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZmVyZW5jZVR5cGVGb3IocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlc1twcm9wZXJ0eV0gfHwgUHJvcGVydHlSZWZlcmVuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRTbG90cygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zbG90cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdHVyYm9jaGFyZ2UodGhpcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VNZXJnZWRQcm9wZXJ0aWVzKGF0dHJzLCBwYXJlbnQpIHtcbiAgICBsZXQgbWVyZ2VkID0gYXNzaWduKHt9LCBwYXJlbnQpO1xuICAgIGZvciAobGV0IHByb3AgaW4gYXR0cnMpIHtcbiAgICAgICAgaWYgKHByb3AgaW4gcGFyZW50ICYmIHR5cGVvZiBwYXJlbnRbcHJvcF0gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGF0dHJzW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZCA9IHdyYXBNZXRob2QocGFyZW50LCBwcm9wLCBhdHRyc1twcm9wXSk7XG4gICAgICAgICAgICBtZXJnZWRbcHJvcF0gPSB3cmFwcGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVyZ2VkW3Byb3BdID0gYXR0cnNbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cbmV4cG9ydCBjbGFzcyBJbnN0YW5jZU1ldGEgZXh0ZW5kcyBDbGFzc01ldGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzW1wiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCJdID0gQ2xhc3NNZXRhLmZyb21QYXJlbnQobnVsbCk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tUGFyZW50KHBhcmVudCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZnJvbVBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgICByZXNldChwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIucmVzZXQocGFyZW50KTtcbiAgICAgICAgaWYgKHBhcmVudCkgdGhpc1tDTEFTU19NRVRBXS5yZXNldChwYXJlbnRbQ0xBU1NfTUVUQV0pO1xuICAgIH1cbiAgICBzZWFsKCkge1xuICAgICAgICBzdXBlci5zZWFsKCk7XG4gICAgICAgIHRoaXNbQ0xBU1NfTUVUQV0uc2VhbCgpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsaW1tZXJPYmplY3Qge1xuICAgIGNvbnN0cnVjdG9yKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuX3N1cGVyID0gUk9PVDtcbiAgICAgICAgdGhpcy5fbWV0YSA9IG51bGw7XG4gICAgICAgIGlmIChhdHRycykgYXNzaWduKHRoaXMsIGF0dHJzKTtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvcltDTEFTU19NRVRBXS5pbml0KHRoaXMsIGF0dHJzIHx8IG51bGwpO1xuICAgICAgICB0aGlzLl9zdXBlciA9IFJPT1Q7XG4gICAgICAgIGluaXRpYWxpemVHdWlkKHRoaXMpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgc3RhdGljIGV4dGVuZCguLi5leHRlbnNpb25zKSB7XG4gICAgICAgIHJldHVybiBleHRlbmRDbGFzcyh0aGlzLCAuLi5leHRlbnNpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhdHRycykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoYXR0cnMpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVvcGVuKGV4dGVuc2lvbnMpIHtcbiAgICAgICAgdG9NaXhpbihleHRlbnNpb25zKS5leHRlbmRQcm90b3R5cGUodGhpcyk7XG4gICAgICAgIHRoaXNbQ0xBU1NfTUVUQV0uc2VhbCgpO1xuICAgICAgICByZWxpbmtTdWJjbGFzc2VzKHRoaXMpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVvcGVuQ2xhc3MoZXh0ZW5zaW9ucykge1xuICAgICAgICB0b01peGluKGV4dGVuc2lvbnMpLmV4dGVuZFN0YXRpYyh0aGlzKTtcbiAgICAgICAgdGhpc1tDTEFTU19NRVRBXS5zZWFsKCk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXRhRm9yUHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpc1tDTEFTU19NRVRBXS5tZXRhZGF0YUZvclByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgdGhyb3cgbmV3IEVycm9yKGBtZXRhRm9yUHJvcGVydHkoKSBjb3VsZCBub3QgZmluZCBhIGNvbXB1dGVkIHByb3BlcnR5IHdpdGgga2V5ICcke3Byb3BlcnR5fScuYCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc3RhdGljIGVhY2hDb21wdXRlZFByb3BlcnR5KGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IHRoaXNbQ0xBU1NfTUVUQV0uZ2V0UHJvcGVydHlNZXRhZGF0YSgpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhKSByZXR1cm47XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gbWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHByb3AsIG1ldGFkYXRhW3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0KCkge31cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tleV07XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBzZXRQcm9wZXJ0aWVzKGF0dHJzKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLCBhdHRycyk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7fVxufVxuR2xpbW1lck9iamVjdFtcImRmOGJlNGM4LTRlODktNDRlMi1hOGY5LTU1MGM4ZGFjZGNhN1wiXSA9IEluc3RhbmNlTWV0YS5mcm9tUGFyZW50KG51bGwpO1xuR2xpbW1lck9iamVjdC5pc0NsYXNzID0gdHJ1ZTsiXX0=