UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

200 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 = {}) { return (/** * @param {?} target * @param {?} propertyName * @return {?} */ (target, propertyName) => { /** @type {?} */ const setupMetadata = (/** * @return {?} */ () => { /** @type {?} */ const belongsTos = Reflect.getMetadata(BelongsToMetadata, target) || []; belongsTos.push({ propertyName, backendName: options.backendName || propertyName, readonly: !!options.readonly, sidepostable: !!options.sidepostable, }); Reflect.defineMetadata(BelongsToMetadata, belongsTos, target); }); /** @type {?} */ const getClass = (/** * @param {?=} fromVal * @return {?} */ (fromVal) => { // const klass = options.class(); if (!Array.isArray(options.class)) { return TypesStore.find(options.class); } /** @type {?} */ const klasses = options.class.map((/** * @param {?} klass * @return {?} */ klass => TypesStore.find(klass))); if (!fromVal) { return klasses[0]; } /** @type {?} */ const type = fromVal.type; if (!type) { throw new Error('Object should be a subclass of ResourceBase or should have a type attribute!'); } /** @type {?} */ const prop = klasses.find((/** * @param {?} k * @return {?} */ k => { /** @type {?} */ const 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 {?} */ const updateSideload = (/** * @param {?} propClass * @param {?} oldValue * @param {?} newValue * @return {?} */ (propClass, oldValue, newValue) => { /** @type {?} */ const noOldId = !(oldValue && oldValue.id); /** @type {?} */ const noNewId = !(newValue && newValue.id); /** @type {?} */ const noIds = noOldId && noNewId; /** @type {?} */ const 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 {?} */ const type1 = oldValue.type; /** @type {?} */ const 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 {?} */ const updateSidepost = (/** * @param {?} propClass * @param {?} oldValue * @param {?} newValue * @return {?} */ (propClass, oldValue, newValue) => { /** @type {?} */ const oldHaveId = !!(oldValue && oldValue.id); /** @type {?} */ const newHaveId = !!(newValue && newValue.id); /** @type {?} */ const newHaveVal = !!(newValue && Object.keys(newValue).filter((/** * @param {?} key * @return {?} */ key => key !== 'id' && key !== 'type')).length > 0); /** @type {?} */ const 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 {?} */ const getter = (/** * @return {?} */ function () { if (!this[`_${propertyName}`] && !this.modelSerialization) { /** @type {?} */ const propClass = getClass(); this[`_${propertyName}`] = ResourceBase.getAsRelationship(propClass, (/** @type {?} */ ({}))); } return this[`_${propertyName}`]; }); /** @type {?} */ const setter = (/** * @param {?} newVal * @return {?} */ function (newVal) { /** @type {?} */ const propClass = getClass(newVal); if (this.isModelInitialization()) { this[`_${propertyName}`] = ResourceBase.getAsRelationship(propClass, newVal, { modelInit: true }); } else { /** @type {?} */ const 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVsb25ncy10by5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWlyYnJ1c2gvIiwic291cmNlcyI6WyJsaWIvZGVjb3JhdG9ycy9iZWxvbmdzLXRvLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRzVDLE1BQU0sVUFBVSxTQUFTLENBQUMsVUFBd0MsRUFBRTtJQUNoRTs7Ozs7SUFBTyxDQUFDLE1BQVcsRUFBRSxZQUFvQixFQUFFLEVBQUU7O2NBRXJDLGFBQWE7OztRQUFHLEdBQUcsRUFBRTs7a0JBQ25CLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFFdkUsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDZCxZQUFZO2dCQUNaLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVk7Z0JBQ2hELFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQzVCLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVk7YUFDckMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFBOztjQUVLLFFBQVE7Ozs7UUFBRyxDQUFDLE9BQWEsRUFBRSxFQUFFO1lBQ2pDLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7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UUFDbEMsQ0FBQyxDQUFBOztjQUVLLE1BQU07Ozs7UUFBRyxVQUFTLE1BQVc7O2tCQUMzQixTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBTSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7YUFDdEc7aUJBQU07O3NCQUNDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMvQixhQUFhLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUU7Z0JBQzFDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNO2dCQUNYLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbnNoaXBEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9vcHRpb24uaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBCZWxvbmdzVG9NZXRhZGF0YSB9IGZyb20gJy4vc3ltYm9sZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VCYXNlIH0gZnJvbSAnLi4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBUeXBlc1N0b3JlIH0gZnJvbSAnLi4vdHlwZXMtc3RvcmUnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBCZWxvbmdzVG8ob3B0aW9uczogUmVsYXRpb25zaGlwRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgY29uc3Qgc2V0dXBNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYmVsb25nc1RvcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoQmVsb25nc1RvTWV0YWRhdGEsIHRhcmdldCkgfHwgW107XG5cbiAgICAgICAgYmVsb25nc1Rvcy5wdXNoKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgYmFja2VuZE5hbWU6IG9wdGlvbnMuYmFja2VuZE5hbWUgfHwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlYWRvbmx5OiAhIW9wdGlvbnMucmVhZG9ubHksXG4gICAgICAgICAgc2lkZXBvc3RhYmxlOiAhIW9wdGlvbnMuc2lkZXBvc3RhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEJlbG9uZ3NUb01ldGFkYXRhLCBiZWxvbmdzVG9zLCB0YXJnZXQpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q2xhc3MgPSAoZnJvbVZhbD86IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zdCBrbGFzcyA9IG9wdGlvbnMuY2xhc3MoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuY2xhc3MpKSB7XG4gICAgICAgICAgcmV0dXJuIFR5cGVzU3RvcmUuZmluZChvcHRpb25zLmNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrbGFzc2VzID0gb3B0aW9ucy5jbGFzcy5tYXAoa2xhc3MgPT4gVHlwZXNTdG9yZS5maW5kKGtsYXNzKSk7XG5cbiAgICAgICAgaWYgKCFmcm9tVmFsKSB7IHJldHVybiBrbGFzc2VzWzBdOyB9XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmcm9tVmFsLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkgeyB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZiBSZXNvdXJjZUJhc2Ugb3Igc2hvdWxkIGhhdmUgYSB0eXBlIGF0dHJpYnV0ZSEnKTsgfVxuXG4gICAgICAgIGNvbnN0IHByb3AgPSBrbGFzc2VzLmZpbmQoayA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqID0gbmV3IGsoKTtcbiAgICAgICAgICByZXR1cm4gb2JqLnR5cGUgPT09IHR5cGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXByb3ApIHsgdGhyb3cgbmV3IEVycm9yKCdPYmplY3Qgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgUmVzb3VyY2VCYXNlIG9yIHNob3VsZCBoYXZlIGEgdHlwZSBhdHRyaWJ1dGUhJyk7IH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVTaWRlbG9hZCA9IChwcm9wQ2xhc3M6IGFueSwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBub09sZElkID0gIShvbGRWYWx1ZSAmJiBvbGRWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5vTmV3SWQgPSAhKG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlkKTtcbiAgICAgICAgY29uc3Qgbm9JZHMgPSBub09sZElkICYmIG5vTmV3SWQ7XG4gICAgICAgIGNvbnN0IGVxSWRzID0gbm9PbGRJZCB8fCBub05ld0lkID8gZmFsc2UgOiBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gbm8gaWRzOiBjYW4ndCBjcmVhdGUgYSByZXNvdXJjZS4gVGhpcyBpcyBhIHNpZGVsb2FkIVxuICAgICAgICBpZiAobm9JZHMpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgLy8gbmV3IGRvbid0IGV4aXN0OiBkaXNhc3NvY2lhdGUgb2xkIGZyb20gdGhlIHJlc291cmNlXG4gICAgICAgIGlmIChub05ld0lkIHx8IG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyByZXR1cm4gb2xkVmFsdWU7IH1cbiAgICAgICAgLy8gc2FtZSBpZHM6IGNhbid0IHVwZGF0ZSBhIHJlc291cmNlLiBUaGlzIGlzIGEgc2lkZWxvYWQhXG4gICAgICAgIGlmIChlcUlkcykge1xuICAgICAgICAgIGNvbnN0IHR5cGUxID0gb2xkVmFsdWUudHlwZTtcbiAgICAgICAgICBjb25zdCB0eXBlMiA9IG5ld1ZhbHVlLnR5cGU7XG4gICAgICAgICAgaWYgKCF0eXBlMiB8fCB0eXBlMSA9PT0gdHlwZTIpIHsgcmV0dXJuIG9sZFZhbHVlOyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gb2xkIG9yIGRpZmZlcmVudCBJRHM6IGNyZWF0ZSBuZXcgcmVsYXRpb25zaGlwXG4gICAgICAgIHJldHVybiBSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIG5ld1ZhbHVlLCB7bWV0aG9kOiAndXBkYXRlJ30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdXBkYXRlU2lkZXBvc3QgPSAocHJvcENsYXNzOiBhbnksIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkSGF2ZUlkID0gISEob2xkVmFsdWUgJiYgb2xkVmFsdWUuaWQpO1xuICAgICAgICBjb25zdCBuZXdIYXZlSWQgPSAhIShuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IG5ld0hhdmVWYWwgPSAhIShuZXdWYWx1ZSAmJiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdpZCcgJiYga2V5ICE9PSAndHlwZScpLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBlcUlkcyA9IG9sZEhhdmVJZCAmJiBuZXdIYXZlSWQgPyBvbGRWYWx1ZS5pZCA9PT0gbmV3VmFsdWUuaWQgOiBmYWxzZTtcblxuICAgICAgICAvLyBlcXVhbCBpZHM6IHVwZGF0ZSBvbGRcbiAgICAgICAgaWYgKGVxSWRzKSB7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlbGV0ZVJlbGF0aW9uKSB7IG9sZFZhbHVlLmRpc2Fzc29jaWF0ZSgpOyB9XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlLmRlc3Ryb3lSZWxhdGlvbikgeyBvbGRWYWx1ZS5kZXN0cm95KCk7IH1cbiAgICAgICAgICBvbGRWYWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXcgaGF2ZSBhbiBpZDogY2hhbmdlIG9sZCBieSBuZXdcbiAgICAgICAgaWYgKG5ld0hhdmVJZCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ3VwZGF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZG9uJ3QgaGF2ZSBpZCBidXQgaGF2ZSB2YWx1ZTogY3JlYXRlIG5ld1xuICAgICAgICBpZiAobmV3SGF2ZVZhbCkgeyByZXR1cm4gUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWx1ZSwge21ldGhvZDogJ2NyZWF0ZSd9KTsgfVxuICAgICAgICAvLyBuZXcgZW1wdHkgYW5kIG9sZCBudWxsOiByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFvbGRWYWx1ZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICAvLyBuZXcgZW1wdHk6IGRpc2Fzc29jaWF0ZSBvbGQgZnJvbSB0aGUgcmVzb3VyY2VcbiAgICAgICAgb2xkVmFsdWUuZGlzYXNzb2NpYXRlKCk7XG4gICAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSAmJiAhdGhpcy5tb2RlbFNlcmlhbGl6YXRpb24pIHtcbiAgICAgICAgICBjb25zdCBwcm9wQ2xhc3MgPSBnZXRDbGFzcygpO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywge30gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2V0dGVyID0gZnVuY3Rpb24obmV3VmFsOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcHJvcENsYXNzID0gZ2V0Q2xhc3MobmV3VmFsKTtcblxuICAgICAgICBpZiAodGhpcy5pc01vZGVsSW5pdGlhbGl6YXRpb24oKSkge1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywgbmV3VmFsLCB7bW9kZWxJbml0OiB0cnVlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IG9wdGlvbnMuc2lkZXBvc3RhYmxlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaWRlcG9zdChwcm9wQ2xhc3MsIG9sZFZhbCwgbmV3VmFsKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2lkZWxvYWQocHJvcENsYXNzLCBvbGRWYWwsIG5ld1ZhbCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChkZWxldGUgdGFyZ2V0W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgc2V0dXBNZXRhZGF0YSgpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHtcbiAgICAgICAgICBnZXQ6IGdldHRlcixcbiAgICAgICAgICBzZXQ6IHNldHRlcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4iXX0=