UNPKG

@pebula/metap

Version:
524 lines 30.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { isFunction } from '@pebula/utils'; import { targetStore as _targetStore, RelationMetadata, PropMetadata, ExcludeMetadata, TargetStore, TargetMetadata } from '@pebula/metap/internal'; import { Model } from '@pebula/metap'; import { Prop, Identity, Exclude, Relation } from '@pebula/metap'; /** @type {?} */ var targetStore = _targetStore; /** * @param {?} target * @return {?} */ function getTargetMetaStore(target) { return (/** @type {?} */ (targetStore.getTargetMeta(target))); } var TestTargetStore = /** @class */ (function (_super) { tslib_1.__extends(TestTargetStore, _super); function TestTargetStore() { return _super !== null && _super.apply(this, arguments) || this; } /** * @param {?} target * @return {?} */ TestTargetStore.getTargetMeta = /** * @param {?} target * @return {?} */ function (target) { return targetStore.builtTargets.get(target); }; /** * @template T * @param {?} target * @return {?} */ TestTargetStore.getModel = /** * @template T * @param {?} target * @return {?} */ function (target) { /** @type {?} */ var t = targetStore.getTargetMeta(target); return t && t.model(); }; /** * @return {?} */ TestTargetStore.clearAll = /** * @return {?} */ function () { targetStore.namedTargets.clear(); targetStore.builtTargets.clear(); targetStore.targets.clear(); targetStore.locals.clear(); }; /** * @param {?} target * @return {?} */ TestTargetStore.clear = /** * @param {?} target * @return {?} */ function (target) { /** @type {?} */ var meta = targetStore.builtTargets.get(target); if (meta) { targetStore.namedTargets.delete(meta.model().resName); targetStore.builtTargets.delete(target); targetStore.targets.get(target).clear(); } }; return TestTargetStore; }(TargetStore)); export { TestTargetStore }; // @dynamic var TestTargetMetadata = /** @class */ (function (_super) { tslib_1.__extends(TestTargetMetadata, _super); function TestTargetMetadata() { return _super !== null && _super.apply(this, arguments) || this; } /** * @template T, Z * @param {?} type * @return {?} */ TestTargetMetadata.getFactory = /** * @template T, Z * @param {?} type * @return {?} */ function (type) { return (/** * @param {?} target * @param {?} key * @return {?} */ function (target, key) { /** @type {?} */ var t = getTargetMetaStore(target); if (t) { return t.config.get(type, key); } }); }; /** * @template T, Z * @param {?} type * @return {?} */ TestTargetMetadata.removeFactory = /** * @template T, Z * @param {?} type * @return {?} */ function (type) { return (/** * @param {?} target * @param {?} key * @return {?} */ function (target, key) { /** @type {?} */ var t = TestTargetStore.getTargetMeta(target); if (t) { return t.config.delete(type, key); } }); }; /** * @param {?} target * @param {?} key * @param {?=} meta * @return {?} */ TestTargetMetadata.addRelation = /** * @param {?} target * @param {?} key * @param {?=} meta * @return {?} */ function (target, key, meta) { Relation(meta)(target.prototype, key); }; /** * @param {?} target * @param {?} key * @param {?=} meta * @return {?} */ TestTargetMetadata.addProp = /** * @param {?} target * @param {?} key * @param {?=} meta * @return {?} */ function (target, key, meta) { Prop(meta)(target.prototype, key); }; /** * @param {?} target * @return {?} */ TestTargetMetadata.setExcludeClass = /** * @param {?} target * @return {?} */ function (target) { Exclude()(target); }; /** * @param {?} target * @param {?} key * @param {?=} meta * @return {?} */ TestTargetMetadata.addExclude = /** * @param {?} target * @param {?} key * @param {?=} meta * @return {?} */ function (target, key, meta) { Exclude(meta)(target.prototype, key); }; TestTargetMetadata.getRelation = TestTargetMetadata.getFactory(RelationMetadata); TestTargetMetadata.getProp = TestTargetMetadata.getFactory(PropMetadata); TestTargetMetadata.getExclude = TestTargetMetadata.getFactory(ExcludeMetadata); TestTargetMetadata.removeRelation = TestTargetMetadata.removeFactory(RelationMetadata); TestTargetMetadata.removeProp = TestTargetMetadata.removeFactory(PropMetadata); TestTargetMetadata.removeExclude = TestTargetMetadata.removeFactory(ExcludeMetadata); return TestTargetMetadata; }(TargetMetadata)); export { TestTargetMetadata }; if (false) { /** @type {?} */ TestTargetMetadata.getRelation; /** @type {?} */ TestTargetMetadata.getProp; /** @type {?} */ TestTargetMetadata.getExclude; /** @type {?} */ TestTargetMetadata.removeRelation; /** @type {?} */ TestTargetMetadata.removeProp; /** @type {?} */ TestTargetMetadata.removeExclude; } /** * @template T, Z */ var /** * @template T, Z */ TargetMetaModifier = /** @class */ (function () { function TargetMetaModifier(target) { this.target = target; } /** * @return {?} */ TargetMetaModifier.prototype.build = /** * @return {?} */ function () { targetStore .getTargetMeta(this.target) .model() .build(); }; /** * @template THIS * @this {THIS} * @return {THIS} */ TargetMetaModifier.prototype.clear = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { TestTargetStore.clear((/** @type {?} */ (this)).target); return (/** @type {?} */ (this)); }; /** * Registers a new model * * > Clears the model from the registry before trying to register. * @param metaArgs * @param type * @returns */ /** * Registers a new model * * > Clears the model from the registry before trying to register. * @template THIS,T * @this {THIS} * @param {?=} metaArgs * @return {THIS} */ TargetMetaModifier.prototype.setModel = /** * Registers a new model * * > Clears the model from the registry before trying to register. * @template THIS,T * @this {THIS} * @param {?=} metaArgs * @return {THIS} */ function (metaArgs) { if (metaArgs === void 0) { metaArgs = undefined; } (/** @type {?} */ (this)).clear(); Model(metaArgs)((/** @type {?} */ (this)).target); return (/** @type {?} */ (this)); }; /** * Set/Update/Remove the identity field. * If key is empty will remove identity. * @param key * @returns */ /** * Set/Update/Remove the identity field. * If key is empty will remove identity. * @template THIS * @this {THIS} * @param {?=} key * @return {THIS} */ TargetMetaModifier.prototype.setIdentity = /** * Set/Update/Remove the identity field. * If key is empty will remove identity. * @template THIS * @this {THIS} * @param {?=} key * @return {THIS} */ function (key) { Identity()((/** @type {?} */ (this)).target.prototype, key); return (/** @type {?} */ (this)); }; /** * Set exclusion/inclusion at the class level * @param exclude * @returns */ /** * Set exclusion/inclusion at the class level * @template THIS * @this {THIS} * @param {?} exclude * @return {THIS} */ TargetMetaModifier.prototype.setExclude = /** * Set exclusion/inclusion at the class level * @template THIS * @this {THIS} * @param {?} exclude * @return {THIS} */ function (exclude) { if (!exclude) { delete targetStore.getTargetMeta((/** @type {?} */ (this)).target).model().transformStrategy; } else { TestTargetMetadata.setExcludeClass((/** @type {?} */ (this)).target); } return (/** @type {?} */ (this)); }; /** * @template P * @param {?} key * @return {?} */ TargetMetaModifier.prototype.getProp = /** * @template P * @param {?} key * @return {?} */ function (key) { return TestTargetMetadata.getProp(this.target, key); }; /** * @template P * @param {?} key * @return {?} */ TargetMetaModifier.prototype.getType = /** * @template P * @param {?} key * @return {?} */ function (key) { return this.getProp(key).type; }; /** * @template P * @param {?} key * @return {?} */ TargetMetaModifier.prototype.getRelation = /** * @template P * @param {?} key * @return {?} */ function (key) { return TestTargetMetadata.getRelation(this.target, key); }; /** * @template P * @param {?} key * @return {?} */ TargetMetaModifier.prototype.getExclude = /** * @template P * @param {?} key * @return {?} */ function (key) { return TestTargetMetadata.getExclude(this.target, key); }; /** * @template THIS * @this {THIS} * @param {?} key * @param {?=} meta * @return {THIS} */ TargetMetaModifier.prototype.relation = /** * @template THIS * @this {THIS} * @param {?} key * @param {?=} meta * @return {THIS} */ function (key, meta) { TestTargetMetadata.removeRelation((/** @type {?} */ (this)).target, key); if (typeof meta !== 'boolean') { TestTargetMetadata.addRelation((/** @type {?} */ (this)).target, key.toString(), meta); } return (/** @type {?} */ (this)); }; /** * Add or remove prop, to remove set meta to false * @param key * @param meta * @param type * @returns */ /** * Add or remove prop, to remove set meta to false * @template THIS * @this {THIS} * @param {?} key * @param {?=} meta * @param {?=} type * @return {THIS} */ TargetMetaModifier.prototype.prop = /** * Add or remove prop, to remove set meta to false * @template THIS * @this {THIS} * @param {?} key * @param {?=} meta * @param {?=} type * @return {THIS} */ function (key, meta, type) { TestTargetMetadata.removeProp((/** @type {?} */ (this)).target, key); if ((!type && isFunction(meta)) || isFunction(type)) { ((/** @type {?} */ (Reflect))).defineMetadata('design:type', type || meta, (/** @type {?} */ (this)).target.prototype, key); } if (typeof meta !== 'boolean' && !isFunction(meta)) { TestTargetMetadata.addProp((/** @type {?} */ (this)).target, key.toString(), meta); } return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {...?} args * @return {THIS} */ TargetMetaModifier.prototype.props = /** * @template THIS * @this {THIS} * @param {...?} args * @return {THIS} */ function () { var _this = this; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } args.forEach((/** * @template THIS * @this {THIS} * @param {?} a * @return {THIS} */ function (a) { return (/** @type {?} */ (_this)).prop(a); })); return (/** @type {?} */ (this)); }; /** * Add or remove exclude, to remove set meta to false * @param key * @param meta * @returns */ /** * Add or remove exclude, to remove set meta to false * @template THIS * @this {THIS} * @param {?} key * @param {?=} meta * @return {THIS} */ TargetMetaModifier.prototype.exclude = /** * Add or remove exclude, to remove set meta to false * @template THIS * @this {THIS} * @param {?} key * @param {?=} meta * @return {THIS} */ function (key, meta) { TestTargetMetadata.removeExclude((/** @type {?} */ (this)).target, key); if (typeof meta !== 'boolean') { TestTargetMetadata.addExclude((/** @type {?} */ (this)).target, key.toString(), meta); } return (/** @type {?} */ (this)); }; /** * @template T, Z * @param {?} target * @return {?} */ TargetMetaModifier.create = /** * @template T, Z * @param {?} target * @return {?} */ function (target) { return new TargetMetaModifier(target); }; return TargetMetaModifier; }()); /** * @template T, Z */ export { TargetMetaModifier }; if (false) { /** @type {?} */ TargetMetaModifier.prototype.target; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kaWZpZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcGVidWxhL21ldGFwL3Rlc3RpbmcvIiwic291cmNlcyI6WyJsaWIvbW9kaWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFDTCxXQUFXLElBQUksWUFBWSxFQUszQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsY0FBYyxFQUdmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztJQUU1RCxXQUFXLEdBQW9CLFlBQVk7Ozs7O0FBRWpELFNBQVMsa0JBQWtCLENBQUMsTUFBVztJQUNyQyxPQUFPLG1CQUFBLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQU8sQ0FBQztBQUNsRCxDQUFDO0FBRUQ7SUFBcUMsMkNBQVc7SUFBaEQ7O0lBeUJBLENBQUM7Ozs7O0lBeEJRLDZCQUFhOzs7O0lBQXBCLFVBQXFCLE1BQVc7UUFDOUIsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7Ozs7SUFFTSx3QkFBUTs7Ozs7SUFBZixVQUF5RCxNQUF3Qjs7WUFDekUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQztJQUMzQixDQUFDOzs7O0lBRU0sd0JBQVE7OztJQUFmO1FBQ0UsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FB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QyxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7Ozs7SUFDSCxvQ0FBTzs7Ozs7Ozs7SUFBUCxVQUFRLEdBQVksRUFBRSxJQUFrQztRQUN0RCxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELElBQUksT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzdCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Ozs7OztJQUVNLHlCQUFNOzs7OztJQUFiLFVBQW9CLE1BQTBCO1FBQzVDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDLEFBcElELElBb0lDOzs7Ozs7O0lBbklhLG9DQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRnVuY3Rpb24sIENvbnN0cnVjdG9yIH0gZnJvbSAnQHBlYnVsYS91dGlscyc7XG5pbXBvcnQge1xuICB0YXJnZXRTdG9yZSBhcyBfdGFyZ2V0U3RvcmUsXG4gIFByb3BNZXRhZGF0YUFyZ3MsXG4gIE1vZGVsTWV0YWRhdGFBcmdzLFxuICBFeGNsdWRlTWV0YWRhdGFBcmdzLFxuICBSZWxhdGlvbk1ldGFkYXRhQXJncyxcbiAgUmVsYXRpb25NZXRhZGF0YSxcbiAgUHJvcE1ldGFkYXRhLFxuICBFeGNsdWRlTWV0YWRhdGEsXG4gIFRhcmdldFN0b3JlLFxuICBUYXJnZXRNZXRhZGF0YSxcbiAgTW9kZWxNZXRhZGF0YSxcbiAgVHlwZU1ldGFkYXRhXG59IGZyb20gJ0BwZWJ1bGEvbWV0YXAvaW50ZXJuYWwnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAcGVidWxhL21ldGFwJztcblxuaW1wb3J0IHsgUHJvcCwgSWRlbnRpdHksIEV4Y2x1ZGUsIFJlbGF0aW9uIH0gZnJvbSAnQHBlYnVsYS9tZXRhcCc7XG5cbmNvbnN0IHRhcmdldFN0b3JlOiBUZXN0VGFyZ2V0U3RvcmUgPSBfdGFyZ2V0U3RvcmU7XG5cbmZ1bmN0aW9uIGdldFRhcmdldE1ldGFTdG9yZSh0YXJnZXQ6IGFueSk6IFRlc3RUYXJnZXRNZXRhZGF0YSB7XG4gIHJldHVybiB0YXJnZXRTdG9yZS5nZXRUYXJnZXRNZXRhKHRhcmdldCkgYXMgYW55O1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdFRhcmdldFN0b3JlIGV4dGVuZHMgVGFyZ2V0U3RvcmUge1xuICBzdGF0aWMgZ2V0VGFyZ2V0TWV0YSh0YXJnZXQ6IGFueSk6IFRlc3RUYXJnZXRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRhcmdldFN0b3JlLmJ1aWx0VGFyZ2V0cy5nZXQodGFyZ2V0KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb2RlbDxUIGV4dGVuZHMgTW9kZWxNZXRhZGF0YSA9IE1vZGVsTWV0YWRhdGE+KHRhcmdldDogQ29uc3RydWN0b3I8YW55Pik6IFQge1xuICAgIGNvbnN0IHQgPSB0YXJnZXRTdG9yZS5nZXRUYXJnZXRNZXRhKHRhcmdldCk7XG4gICAgcmV0dXJuIHQgJiYgdC5tb2RlbDxUPigpO1xuICB9XG5cbiAgc3RhdGljIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgIHRhcmdldFN0b3JlLm5hbWVkVGFyZ2V0cy5jbGVhcigpO1xuICAgIHRhcmdldFN0b3JlLmJ1aWx0VGFyZ2V0cy5jbGVhcigpO1xuICAgIHRhcmdldFN0b3JlLnRhcmdldHMuY2xlYXIoKTtcbiAgICB0YXJnZXRTdG9yZS5sb2NhbHMuY2xlYXIoKTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhcih0YXJnZXQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSB0YXJnZXRTdG9yZS5idWlsdFRhcmdldHMuZ2V0KHRhcmdldCk7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHRhcmdldFN0b3JlLm5hbWVkVGFyZ2V0cy5kZWxldGUobWV0YS5tb2RlbCgpLnJlc05hbWUpO1xuICAgICAgdGFyZ2V0U3RvcmUuYnVpbHRUYXJnZXRzLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgdGFyZ2V0U3RvcmUudGFyZ2V0cy5nZXQodGFyZ2V0KS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIFRlc3RUYXJnZXRNZXRhZGF0YSBleHRlbmRzIFRhcmdldE1ldGFkYXRhIHtcbiAgc3RhdGljIGdldEZhY3Rvcnk8VCwgWj4odHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+KTogKHRhcmdldDogYW55LCBrZXk6IGFueSkgPT4gVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBnZXRUYXJnZXRNZXRhU3RvcmUodGFyZ2V0KTtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHJldHVybiB0LmNvbmZpZy5nZXQodHlwZSwga2V5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZUZhY3Rvcnk8VCwgWj4odHlwZTogWiAmIENvbnN0cnVjdG9yPFQ+KTogKHRhcmdldDogYW55LCBrZXk6IGFueSkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBUZXN0VGFyZ2V0U3RvcmUuZ2V0VGFyZ2V0TWV0YSh0YXJnZXQpO1xuICAgICAgaWYgKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuY29uZmlnLmRlbGV0ZSh0eXBlLCBrZXkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVsYXRpb24gPSBUZXN0VGFyZ2V0TWV0YWRhdGEuZ2V0RmFjdG9yeShSZWxhdGlvbk1ldGFkYXRhKTtcbiAgc3RhdGljIGdldFByb3AgPSBUZXN0VGFyZ2V0TWV0YWRhdGEuZ2V0RmFjdG9yeShQcm9wTWV0YWRhdGEpO1xuICBzdGF0aWMgZ2V0RXhjbHVkZSA9IFRlc3RUYXJnZXRNZXRhZGF0YS5nZXRGYWN0b3J5KEV4Y2x1ZGVNZXRhZGF0YSk7XG5cbiAgc3RhdGljIHJlbW92ZVJlbGF0aW9uID0gVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZUZhY3RvcnkoUmVsYXRpb25NZXRhZGF0YSk7XG4gIHN0YXRpYyByZW1vdmVQcm9wID0gVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZUZhY3RvcnkoUHJvcE1ldGFkYXRhKTtcbiAgc3RhdGljIHJlbW92ZUV4Y2x1ZGUgPSBUZXN0VGFyZ2V0TWV0YWRhdGEucmVtb3ZlRmFjdG9yeShFeGNsdWRlTWV0YWRhdGEpO1xuXG4gIHN0YXRpYyBhZGRSZWxhdGlvbihcbiAgICB0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbWV0YT86IFJlbGF0aW9uTWV0YWRhdGFBcmdzXG4gICk6IHZvaWQge1xuICAgIFJlbGF0aW9uKG1ldGEpKHRhcmdldC5wcm90b3R5cGUsIGtleSk7XG4gIH1cblxuICBzdGF0aWMgYWRkUHJvcChcbiAgICB0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbWV0YT86IFByb3BNZXRhZGF0YUFyZ3NcbiAgKTogdm9pZCB7XG4gICAgUHJvcChtZXRhKSh0YXJnZXQucHJvdG90eXBlLCBrZXkpO1xuICB9XG5cbiAgc3RhdGljIHNldEV4Y2x1ZGVDbGFzcyh0YXJnZXQ6IENvbnN0cnVjdG9yPGFueT4pOiB2b2lkIHtcbiAgICBFeGNsdWRlKCkodGFyZ2V0KTtcbiAgfVxuXG4gIHN0YXRpYyBhZGRFeGNsdWRlKFxuICAgIHRhcmdldDogQ29uc3RydWN0b3I8YW55PixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBtZXRhPzogRXhjbHVkZU1ldGFkYXRhQXJnc1xuICApOiB2b2lkIHtcbiAgICBFeGNsdWRlKG1ldGEpKHRhcmdldC5wcm90b3R5cGUsIGtleSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhcmdldE1ldGFNb2RpZmllcjxULCBaPiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0YXJnZXQ6IFogJiBDb25zdHJ1Y3RvcjxUPikge31cblxuICBidWlsZCgpOiB2b2lkIHtcbiAgICB0YXJnZXRTdG9yZVxuICAgICAgLmdldFRhcmdldE1ldGEodGhpcy50YXJnZXQpXG4gICAgICAubW9kZWwoKVxuICAgICAgLmJ1aWxkKCk7XG4gIH1cblxuICBjbGVhcigpOiB0aGlzIHtcbiAgICBUZXN0VGFyZ2V0U3RvcmUuY2xlYXIodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBtb2RlbFxuICAgKlxuICAgKiA+IENsZWFycyB0aGUgbW9kZWwgZnJvbSB0aGUgcmVnaXN0cnkgYmVmb3JlIHRyeWluZyB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIG1ldGFBcmdzXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzZXRNb2RlbDxUIGV4dGVuZHMgTW9kZWxNZXRhZGF0YUFyZ3M+KG1ldGFBcmdzOiBUID0gdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIE1vZGVsKG1ldGFBcmdzKSh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0L1VwZGF0ZS9SZW1vdmUgdGhlIGlkZW50aXR5IGZpZWxkLlxuICAgKiBJZiBrZXkgaXMgZW1wdHkgd2lsbCByZW1vdmUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIHNldElkZW50aXR5KGtleT86IGtleW9mIFQpOiB0aGlzIHtcbiAgICBJZGVudGl0eSgpKHRoaXMudGFyZ2V0LnByb3RvdHlwZSwga2V5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZXhjbHVzaW9uL2luY2x1c2lvbiBhdCB0aGUgY2xhc3MgbGV2ZWxcbiAgICogQHBhcmFtIGV4Y2x1ZGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHNldEV4Y2x1ZGUoZXhjbHVkZTogYm9vbGVhbik6IHRoaXMge1xuICAgIGlmICghZXhjbHVkZSkge1xuICAgICAgZGVsZXRlIHRhcmdldFN0b3JlLmdldFRhcmdldE1ldGEodGhpcy50YXJnZXQpLm1vZGVsKCkudHJhbnNmb3JtU3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRlc3RUYXJnZXRNZXRhZGF0YS5zZXRFeGNsdWRlQ2xhc3ModGhpcy50YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldFByb3A8UCBleHRlbmRzIGtleW9mIFQ+KGtleTogUCk6IFByb3BNZXRhZGF0YSB7XG4gICAgcmV0dXJuIFRlc3RUYXJnZXRNZXRhZGF0YS5nZXRQcm9wKHRoaXMudGFyZ2V0LCBrZXkpO1xuICB9XG5cbiAgZ2V0VHlwZTxQIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBQKTogVHlwZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKGtleSkudHlwZTtcbiAgfVxuXG4gIGdldFJlbGF0aW9uPFAgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IFApOiBSZWxhdGlvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4gVGVzdFRhcmdldE1ldGFkYXRhLmdldFJlbGF0aW9uKHRoaXMudGFyZ2V0LCBrZXkpO1xuICB9XG5cbiAgZ2V0RXhjbHVkZTxQIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBQKTogRXhjbHVkZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gVGVzdFRhcmdldE1ldGFkYXRhLmdldEV4Y2x1ZGUodGhpcy50YXJnZXQsIGtleSk7XG4gIH1cblxuICByZWxhdGlvbihrZXk6IGtleW9mIFQsIG1ldGE/OiBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IGZhbHNlKTogdGhpcyB7XG4gICAgVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZVJlbGF0aW9uKHRoaXMudGFyZ2V0LCBrZXkpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXRhICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIFRlc3RUYXJnZXRNZXRhZGF0YS5hZGRSZWxhdGlvbih0aGlzLnRhcmdldCwga2V5LnRvU3RyaW5nKCksIG1ldGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvciByZW1vdmUgcHJvcCwgdG8gcmVtb3ZlIHNldCBtZXRhIHRvIGZhbHNlXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG1ldGFcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3AoXG4gICAga2V5OiBrZXlvZiBULFxuICAgIG1ldGE/OiBQcm9wTWV0YWRhdGFBcmdzIHwgZmFsc2UgfCBGdW5jdGlvbixcbiAgICB0eXBlPzogRnVuY3Rpb25cbiAgKTogdGhpcyB7XG4gICAgVGVzdFRhcmdldE1ldGFkYXRhLnJlbW92ZVByb3AodGhpcy50YXJnZXQsIGtleSk7XG5cbiAgICBpZiAoKCF0eXBlICYmIGlzRnVuY3Rpb24obWV0YSkpIHx8IGlzRnVuY3Rpb24odHlwZSkpIHtcbiAgICAgIChSZWZsZWN0IGFzIGFueSkuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgICdkZXNpZ246dHlwZScsXG4gICAgICAgIHR5cGUgfHwgbWV0YSxcbiAgICAgICAgdGhpcy50YXJnZXQucHJvdG90eXBlLFxuICAgICAgICBrZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtZXRhICE9PSAnYm9vbGVhbicgJiYgIWlzRnVuY3Rpb24obWV0YSkpIHtcbiAgICAgIFRlc3RUYXJnZXRNZXRhZGF0YS5hZGRQcm9wKHRoaXMudGFyZ2V0LCBrZXkudG9TdHJpbmcoKSwgbWV0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm9wcyguLi5hcmdzOiBBcnJheTxrZXlvZiBUPik6IHRoaXMge1xuICAgIGFyZ3MuZm9yRWFjaChhID0+IHRoaXMucHJvcChhKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG9yIHJlbW92ZSBleGNsdWRlLCB0byByZW1vdmUgc2V0IG1ldGEgdG8gZmFsc2VcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gbWV0YVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZXhjbHVkZShrZXk6IGtleW9mIFQsIG1ldGE/OiBFeGNsdWRlTWV0YWRhdGFBcmdzIHwgZmFsc2UpOiB0aGlzIHtcbiAgICBUZXN0VGFyZ2V0TWV0YWRhdGEucmVtb3ZlRXhjbHVkZSh0aGlzLnRhcmdldCwga2V5KTtcbiAgICBpZiAodHlwZW9mIG1ldGEgIT09ICdib29sZWFuJykge1xuICAgICAgVGVzdFRhcmdldE1ldGFkYXRhLmFkZEV4Y2x1ZGUodGhpcy50YXJnZXQsIGtleS50b1N0cmluZygpLCBtZXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlPFQsIFo+KHRhcmdldDogWiAmIENvbnN0cnVjdG9yPFQ+KTogVGFyZ2V0TWV0YU1vZGlmaWVyPFQsIFo+IHtcbiAgICByZXR1cm4gbmV3IFRhcmdldE1ldGFNb2RpZmllcih0YXJnZXQpO1xuICB9XG59XG4iXX0=