UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

201 lines 19.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { BelongsToMetadata } from './symboles'; import { ResourceBase } from '../resource-base.model'; import { TypesStore } from '../types-store'; /** * @param {?=} options * @return {?} */ export function BelongsTo(options) { if (options === void 0) { options = {}; } return (/** * @param {?} target * @param {?} propertyName * @return {?} */ function (target, propertyName) { /** @type {?} */ var setupMetadata = (/** * @return {?} */ function () { /** @type {?} */ var belongsTos = Reflect.getMetadata(BelongsToMetadata, target) || []; belongsTos.push({ propertyName: propertyName, backendName: options.backendName || propertyName, readonly: !!options.readonly, sidepostable: !!options.sidepostable, }); Reflect.defineMetadata(BelongsToMetadata, belongsTos, target); }); /** @type {?} */ var getClass = (/** * @param {?=} fromVal * @return {?} */ function (fromVal) { // const klass = options.class(); if (!Array.isArray(options.class)) { return TypesStore.find(options.class); } /** @type {?} */ var klasses = options.class.map((/** * @param {?} klass * @return {?} */ function (klass) { return TypesStore.find(klass); })); if (!fromVal) { return klasses[0]; } /** @type {?} */ var type = fromVal.type; if (!type) { throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!'); } /** @type {?} */ var prop = klasses.find((/** * @param {?} k * @return {?} */ function (k) { /** @type {?} */ var obj = new k(); return obj.type === type; })); if (!prop) { throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!'); } return prop; }); /** @type {?} */ var updateSideload = (/** * @param {?} propClass * @param {?} oldValue * @param {?} newValue * @return {?} */ function (propClass, oldValue, newValue) { /** @type {?} */ var noOldId = !(oldValue && oldValue.id); /** @type {?} */ var noNewId = !(newValue && newValue.id); /** @type {?} */ var noIds = noOldId && noNewId; /** @type {?} */ var eqIds = noOldId || noNewId ? false : oldValue.id === newValue.id; // no ids: can't create a resource. This is a sideload! if (noIds) { return null; } // new don't exist: disassociate old from the resource if (noNewId || newValue.deleteRelation) { oldValue.disassociate(); return oldValue; } // same ids: can't update a resource. This is a sideload! if (eqIds) { /** @type {?} */ var type1 = oldValue.type; /** @type {?} */ var type2 = newValue.type; if (!type2 || type1 === type2) { return oldValue; } } // no old or different IDs: create new relationship return ResourceBase.getAsRelationship(propClass, newValue, { method: 'update' }); }); /** @type {?} */ var updateSidepost = (/** * @param {?} propClass * @param {?} oldValue * @param {?} newValue * @return {?} */ function (propClass, oldValue, newValue) { /** @type {?} */ var oldHaveId = !!(oldValue && oldValue.id); /** @type {?} */ var newHaveId = !!(newValue && newValue.id); /** @type {?} */ var newHaveVal = !!(newValue && Object.keys(newValue).filter((/** * @param {?} key * @return {?} */ function (key) { return key !== 'id' && key !== 'type'; })).length > 0); /** @type {?} */ var eqIds = oldHaveId && newHaveId ? oldValue.id === newValue.id : false; // equal ids: update old if (eqIds) { if (newValue.deleteRelation) { oldValue.disassociate(); } if (newValue.destroyRelation) { oldValue.destroy(); } oldValue.assign(newValue); return oldValue; } // new have an id: change old by new if (newHaveId) { return ResourceBase.getAsRelationship(propClass, newValue, { method: 'update' }); } // new don't have id but have value: create new if (newHaveVal) { return ResourceBase.getAsRelationship(propClass, newValue, { method: 'create' }); } // new empty and old null: return null; if (!oldValue) { return null; } // new empty: disassociate old from the resource oldValue.disassociate(); return oldValue; }); /** @type {?} */ var getter = (/** * @return {?} */ function () { if (!this["_" + propertyName] && !this.modelSerialization) { /** @type {?} */ var propClass = getClass(); this["_" + propertyName] = ResourceBase.getAsRelationship(propClass, (/** @type {?} */ ({}))); } return this["_" + propertyName]; }); /** @type {?} */ var setter = (/** * @param {?} newVal * @return {?} */ function (newVal) { /** @type {?} */ var propClass = getClass(newVal); if (this.isModelInitialization()) { this["_" + propertyName] = ResourceBase.getAsRelationship(propClass, newVal, { modelInit: true }); } else { /** @type {?} */ var oldVal = this["_" + propertyName]; this["_" + propertyName] = options.sidepostable ? updateSidepost(propClass, oldVal, newVal) : updateSideload(propClass, oldVal, newVal); } }); if (delete target[propertyName]) { setupMetadata(); Object.defineProperty(target, propertyName, { get: getter, set: setter, enumerable: true, configurable: true }); } }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVsb25ncy10by5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvZGVjb3JhdG9ycy9iZWxvbmdzLXRvLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRzVDLE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBMEM7SUFBMUMsd0JBQUEsRUFBQSxZQUEwQztJQUNoRTs7Ozs7SUFBTyxVQUFDLE1BQVcsRUFBRSxZQUFvQjs7WUFFakMsYUFBYTs7O1FBQUc7O2dCQUNkLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFFdkUsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDZCxZQUFZLGNBQUE7Z0JBQ1osV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksWUFBWTtnQkFDaEQsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFDNUIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWTthQUNyQyxDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUE7O1lBRUssUUFBUTs7OztRQUFHLFVBQUMsT0FBYTtZQUM3QixpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZDOztn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QU07Ozs7UUFBRyxVQUFTLE1BQVc7O2dCQUMzQixTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsTUFBSSxZQUFjLENBQUMsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQU0sU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQ3RHO2lCQUFNOztvQkFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQUksWUFBYyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsTUFBSSxZQUFjLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMvQixhQUFhLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUU7Z0JBQzFDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNO2dCQUNYLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbnNoaXBEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9vcHRpb24uaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBCZWxvbmdzVG9NZXRhZGF0YSB9IGZyb20gJy4vc3ltYm9sZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VCYXNlIH0gZnJvbSAnLi4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBUeXBlc1N0b3JlIH0gZnJvbSAnLi4vdHlwZXMtc3RvcmUnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBCZWxvbmdzVG8ob3B0aW9uczogUmVsYXRpb25zaGlwRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgY29uc3Qgc2V0dXBNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYmVsb25nc1RvcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoQmVsb25nc1RvTWV0YWRhdGEsIHRhcmdldCkgfHwgW107XG5cbiAgICAgICAgYmVsb25nc1Rvcy5wdXNoKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgYmFja2VuZE5hbWU6IG9wdGlvbnMuYmFja2VuZE5hbWUgfHwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlYWRvbmx5OiAhIW9wdGlvbnMucmVhZG9ubHksXG4gICAgICAgICAgc2lkZXBvc3RhYmxlOiAhIW9wdGlvbnMuc2lkZXBvc3RhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEJlbG9uZ3NUb01ldGFkYXRhLCBiZWxvbmdzVG9zLCB0YXJnZXQpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q2xhc3MgPSAoZnJvbVZhbD86IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zdCBrbGFzcyA9IG9wdGlvbnMuY2xhc3MoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuY2xhc3MpKSB7XG4gICAgICAgICAgcmV0dXJuIFR5cGVzU3RvcmUuZmluZChvcHRpb25zLmNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrbGFzc2VzID0gb3B0aW9ucy5jbGFzcy5tYXAoa2xhc3MgPT4gVHlwZXNTdG9yZS5maW5kKGtsYXNzKSk7XG5cbiAgICAgICAgaWYgKCFmcm9tVmFsKSB7IHJldHVybiBrbGFzc2VzWzBdOyB9XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmcm9tVmFsLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZiBSZXNvdXJjZUJhc2Ugb3Igc2hvdWxkIGhhdmUgYSB0eXBlIGF0dHJpYnV0ZSEnKTsgfVxuXG4gICAgICAgIGNvbnN0IHByb3AgPSBrbGFzc2VzLmZpbmQoayA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqID0gbmV3IGsoKTtcbiAgICAgICAgICByZXR1cm4gb2JqLnR5cGUgPT09IHR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3ApIHsgdGhyb3cgbmV3IEVycm9yKCdPYmplY3Qgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgUmVzb3VyY2VCYXNlIG9yIHNob3VsZCBoYXZlIGEgdHlwZSBhdHRyaWJ1dGUhJyk7IH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVTaWRlbG9hZCA9IChwcm9wQ2xhc3M6IGFueSwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBub09sZElkID0gIShvbGRWYWx1ZSAmJiBvbGRWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5vTmV3SWQgPSAhKG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlkKTtcbiAgICAgICAgY29uc3Qgbm9JZHMgPSBub09sZElkICYmIG5vTmV3SWQ7XG4gICAgICAgIGNvbnN0IGVxSWRzID0gbm9PbGRJZCB8fCBub05ld0lkID8gZmFsc2UgOiBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gbm8gaWRzOiBjYW4ndCBjcmVhdGUgYSByZXNvdXJjZS4gVGhpcyBpcyBhIHNpZGVsb2FkIVxuICAgICAgICBpZiAobm9JZHMpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgLy8gbmV3IGRvbid0IGV4aXN0OiBkaXNhc3NvY2lhdGUgb2xkIGZyb20gdGhlIHJlc291cmNlXG4gICAgICAgIGlmIChub05ld0lkIHx8IG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyByZXR1cm4gb2xkVmFsdWU7IH1cbiAgICAgICAgLy8gc2FtZSBpZHM6IGNhbid0IHVwZGF0ZSBhIHJlc291cmNlLiBUaGlzIGlzIGEgc2lkZWxvYWQhXG4gICAgICAgIGlmIChlcUlkcykge1xuICAgICAgICAgIGNvbnN0IHR5cGUxID0gb2xkVmFsdWUudHlwZTtcbiAgICAgICAgICBjb25zdCB0eXBlMiA9IG5ld1ZhbHVlLnR5cGU7XG4gICAgICAgICAgaWYgKCF0eXBlMiB8fCB0eXBlMSA9PT0gdHlwZTIpIHsgcmV0dXJuIG9sZFZhbHVlOyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gb2xkIG9yIGRpZmZlcmVudCBJRHM6IGNyZWF0ZSBuZXcgcmVsYXRpb25zaGlwXG4gICAgICAgIHJldHVybiBSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIG5ld1ZhbHVlLCB7bWV0aG9kOiAndXBkYXRlJ30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdXBkYXRlU2lkZXBvc3QgPSAocHJvcENsYXNzOiBhbnksIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkSGF2ZUlkID0gISEob2xkVmFsdWUgJiYgb2xkVmFsdWUuaWQpO1xuICAgICAgICBjb25zdCBuZXdIYXZlSWQgPSAhIShuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5ld0hhdmVWYWwgPSAhIShuZXdWYWx1ZSAmJiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdpZCcgJiYga2V5ICE9PSAndHlwZScpLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBlcUlkcyA9IG9sZEhhdmVJZCAmJiBuZXdIYXZlSWQgPyBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQgOiBmYWxzZTtcblxuICAgICAgICAvLyBlcXVhbCBpZHM6IHVwZGF0ZSBvbGRcbiAgICAgICAgaWYgKGVxSWRzKSB7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyB9XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlc3Ryb3lSZWxhdGlvbikgeyBvbGRWYWx1ZS5kZXN0cm95KCk7IH1cbiAgICAgICAgICBvbGRWYWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXcgaGF2ZSBhbiBpZDogY2hhbmdlIG9sZCBieSBuZXdcbiAgICAgICAgaWYgKG5ld0hhdmVJZCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ3VwZGF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZG9uJ3QgaGF2ZSBpZCBidXQgaGF2ZSB2YWx1ZTogY3JlYXRlIG5ld1xuICAgICAgICBpZiAobmV3SGF2ZVZhbCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ2NyZWF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZW1wdHkgYW5kIG9sZCBudWxsOiByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFvbGRWYWx1ZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICAvLyBuZXcgZW1wdHk6IGRpc2Fzc29jaWF0ZSBvbGQgZnJvbSB0aGUgcmVzb3VyY2VcbiAgICAgICAgb2xkVmFsdWUuZGlzYXNzb2NpYXRlKCk7XG4gICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSAmJiAhdGhpcy5tb2RlbFNlcmlhbGl6YXRpb24pIHtcbiAgICAgICAgICBjb25zdCBwcm9wQ2xhc3MgPSBnZXRDbGFzcygpO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywge30gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2V0dGVyID0gZnVuY3Rpb24obmV3VmFsOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcHJvcENsYXNzID0gZ2V0Q2xhc3MobmV3VmFsKTtcblxuICAgICAgICBpZiAodGhpcy5pc01vZGVsSW5pdGlhbGl6YXRpb24oKSkge1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywgbmV3VmFsLCB7bW9kZWxJbml0OiB0cnVlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IG9wdGlvbnMuc2lkZXBvc3RhYmxlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaWRlcG9zdChwcm9wQ2xhc3MsIG9sZFZhbCwgbmV3VmFsKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2lkZWxvYWQocHJvcENsYXNzLCBvbGRWYWwsIG5ld1ZhbCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChkZWxldGUgdGFyZ2V0W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgc2V0dXBNZXRhZGF0YSgpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBnZXQ6IGdldHRlcixcbiAgICAgICAgICBzZXQ6IHNldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4iXX0=