UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

163 lines 24.2 kB
import { Injectable } from '@angular/core'; import { FormControl } from '@angular/forms'; import { deepCopy, deepEqual } from '@iotize/common/utility'; import { TapInfo, TapInfoCacheService, TapInfoConfigService, TapInfoDAOService, createCacheKey, toTapInfoKeyObject, } from '@iotize/ionic'; import { BehaviorSubject, Subject, concat, defer, of } from 'rxjs'; import { distinctUntilChanged, map, shareReplay, switchMap, tap, } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@iotize/ionic"; export class TapConfigItemStateService { tapInfoDAOService; tapInfoCacheService; tapInfoConfigService; _pendingChanges = new BehaviorSubject([]); loading = false; hasPendingChanges = this._pendingChanges.pipe(map((changes) => changes.length > 0)); validationErrorsChange = this._pendingChanges.pipe(map((changes) => { return changes.reduce((acc, change) => { const tapConfigItem = this.tapInfoConfigService.findByKey(change.key); if (!tapConfigItem) { console.warn(`Failed to find Tap Config Item Key "${change.key}"`); return acc; } tapConfigItem.input?.formValidators?.forEach((validator) => { const error = validator(new FormControl(change.value)); if (error) { acc.set(change.key, { value: change.value, errors: error, }); } }); return acc; }, new Map()); })); validationErrorsCountChange = this.validationErrorsChange.pipe(map((changeErrors) => { return Array.from(changeErrors.keys()).length; }), shareReplay({ bufferSize: 1, refCount: true })); hasValidationErrors = this.validationErrorsCountChange.pipe(map((count) => { return count > 0; })); /** * Value change taking into acccount the edited value. * If no editaded value for the key, it will take the lasted fetched value from the Tap * @param key * @returns */ valueChange(key) { return this._pendingChanges.pipe(switchMap((changes) => { const hashKey = createCacheKey(toTapInfoKeyObject(key)); const editedValue = changes.find((entry) => createCacheKey(entry.key) === hashKey); if (editedValue !== undefined) { return of(editedValue.value); } else { return this.tapInfoCacheService.valueChange(key); } }), distinctUntilChanged(deepEqual), shareReplay(1)); } getPendingChangeForKey(key) { return this._pendingChanges.pipe(map((changes) => { const hashKey = createCacheKey(toTapInfoKeyObject(key)); return changes.find((entry) => createCacheKey(entry.key) === hashKey) ?.value; }), distinctUntilChanged(deepEqual), shareReplay(1)); } get pendingChangesChange() { return this._pendingChanges.asObservable(); } _saveProgress = new Subject(); get saveProgress() { return this._saveProgress.asObservable(); } constructor(tapInfoDAOService, tapInfoCacheService, tapInfoConfigService) { this.tapInfoDAOService = tapInfoDAOService; this.tapInfoCacheService = tapInfoCacheService; this.tapInfoConfigService = tapInfoConfigService; } async savePendingChanges() { try { this.loading = true; await this._savePendingChangesWithProgress().toPromise(); } finally { this.loading = false; } } _savePendingChangesWithProgress() { const configItemStateChanges = this.getPendingChangesSnapshot().filter(({ key }) => { return key.key !== TapInfo.configVersion; }); const observables = configItemStateChanges.map(({ key, value }) => { return defer(async () => { await this.tapInfoDAOService.put(key, value); this.tapInfoDAOService.get(key).catch((err) => { }); }); }); const total = configItemStateChanges.length; const saveProgress = concat(...observables).pipe(map((info, index) => { return { total, loaded: index + 1, payload: info, }; }), tap(this._saveProgress)); return saveProgress; } clearPendingChanges() { this._pendingChanges.next([]); } getPendingChangesSnapshot() { return deepCopy(this._pendingChanges.value); } clearPendingChange(tapInfoKey) { const hashKey = createCacheKey(tapInfoKey); const pendingChangesSnapshot = this._pendingChanges.value; const pendingChangeIndex = pendingChangesSnapshot.findIndex((entry) => createCacheKey(entry.key) === hashKey); if (pendingChangeIndex >= 0) { pendingChangesSnapshot.splice(pendingChangeIndex, 1); this._pendingChanges.next(pendingChangesSnapshot); } } setPendingChange(info, newValue) { // Make sure we don't store any other info otherwise deepCopy may failed info = { key: info.key, params: info.params, }; const hashKey = createCacheKey(info); const pendingChangesSnapshot = this._pendingChanges.value; const item = pendingChangesSnapshot.find((entry) => createCacheKey(entry.key) === hashKey); if (!item) { pendingChangesSnapshot.push({ key: info, value: newValue, }); this._pendingChanges.next(pendingChangesSnapshot); } else { if (!deepEqual(item.value, newValue)) { item.value = newValue; this._pendingChanges.next(pendingChangesSnapshot); } } } removePendingChange(info) { const hashKey = createCacheKey(info); const pendingChangesSnapshot = this._pendingChanges.value; const indexOfItem = pendingChangesSnapshot.findIndex((entry) => createCacheKey(entry.key) === hashKey); if (indexOfItem >= 0) { pendingChangesSnapshot.splice(indexOfItem, 1); this._pendingChanges.next(pendingChangesSnapshot); } } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapConfigItemStateService, deps: [{ token: i1.TapInfoDAOService }, { token: i1.TapInfoCacheService }, { token: i1.TapInfoConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapConfigItemStateService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapConfigItemStateService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: i1.TapInfoDAOService }, { type: i1.TapInfoCacheService }, { type: i1.TapInfoConfigService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWNvbmZpZy1pdGVtLXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvY29uZmlnL3NyYy9saWIvdGFwLWNvbmZpZy1pdGVtLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUNMLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUdqQixjQUFjLEVBQ2Qsa0JBQWtCLEdBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7OztBQUt4QixNQUFNLE9BQU8seUJBQXlCO0lBMEcxQjtJQUNBO0lBQ0E7SUEzR0YsZUFBZSxHQUFHLElBQUksZUFBZSxDQUszQyxFQUFFLENBQUMsQ0FBQztJQUVOLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFFekIsaUJBQWlCLEdBQXdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUNoRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFFRixzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDaEQsR0FBRyxDQUFD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QVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQWdCO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FDbEQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssT0FBTyxDQUNqRCxDQUFDO1FBRUYsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckIsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDOzJIQTFNVSx5QkFBeUI7K0hBQXpCLHlCQUF5QixjQUZ4QixNQUFNOzs0RkFFUCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBQcm9ncmVzc1N0YXRlIH0gZnJvbSAnQGlvdGl6ZS9jb21tb24vcHJvZ3Jlc3MvYXBpJztcbmltcG9ydCB7IGRlZXBDb3B5LCBkZWVwRXF1YWwgfSBmcm9tICdAaW90aXplL2NvbW1vbi91dGlsaXR5JztcbmltcG9ydCB7XG4gIFRhcEluZm8sXG4gIFRhcEluZm9DYWNoZVNlcnZpY2UsXG4gIFRhcEluZm9Db25maWdTZXJ2aWNlLFxuICBUYXBJbmZvREFPU2VydmljZSxcbiAgVGFwSW5mb0tleSxcbiAgVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nLFxuICBjcmVhdGVDYWNoZUtleSxcbiAgdG9UYXBJbmZvS2V5T2JqZWN0LFxufSBmcm9tICdAaW90aXplL2lvbmljJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY29uY2F0LCBkZWZlciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGFwQ29uZmlnSXRlbVN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgX3BlbmRpbmdDaGFuZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICB7XG4gICAgICBrZXk6IFRhcEluZm9LZXk7XG4gICAgICB2YWx1ZTogYW55O1xuICAgIH1bXVxuICA+KFtdKTtcblxuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaGFzUGVuZGluZ0NoYW5nZXM6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9wZW5kaW5nQ2hhbmdlcy5waXBlKFxuICAgIG1hcCgoY2hhbmdlcykgPT4gY2hhbmdlcy5sZW5ndGggPiAwKVxuICApO1xuXG4gIHZhbGlkYXRpb25FcnJvcnNDaGFuZ2UgPSB0aGlzLl9wZW5kaW5nQ2hhbmdlcy5waXBlKFxuICAgIG1hcCgoY2hhbmdlcykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMucmVkdWNlPFxuICAgICAgICBNYXA8XG4gICAgICAgICAgVGFwSW5mb0tleSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogYW55O1xuICAgICAgICAgICAgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzO1xuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgPigoYWNjLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgY29uc3QgdGFwQ29uZmlnSXRlbSA9IHRoaXMudGFwSW5mb0NvbmZpZ1NlcnZpY2UuZmluZEJ5S2V5KGNoYW5nZS5rZXkpO1xuICAgICAgICBpZiAoIXRhcENvbmZpZ0l0ZW0pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBmaW5kIFRhcCBDb25maWcgSXRlbSBLZXkgXCIke2NoYW5nZS5rZXl9XCJgKTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG4gICAgICAgIHRhcENvbmZpZ0l0ZW0uaW5wdXQ/LmZvcm1WYWxpZGF0b3JzPy5mb3JFYWNoKCh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRvcihuZXcgRm9ybUNvbnRyb2woY2hhbmdlLnZhbHVlKSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBhY2Muc2V0KGNoYW5nZS5rZXksIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGNoYW5nZS52YWx1ZSxcbiAgICAgICAgICAgICAgZXJyb3JzOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkpO1xuICAgIH0pXG4gICk7XG5cbiAgdmFsaWRhdGlvbkVycm9yc0NvdW50Q2hhbmdlID0gdGhpcy52YWxpZGF0aW9uRXJyb3JzQ2hhbmdlLnBpcGUoXG4gICAgbWFwKChjaGFuZ2VFcnJvcnMpID0+IHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGNoYW5nZUVycm9ycy5rZXlzKCkpLmxlbmd0aDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICk7XG5cbiAgaGFzVmFsaWRhdGlvbkVycm9ycyA9IHRoaXMudmFsaWRhdGlvbkVycm9yc0NvdW50Q2hhbmdlLnBpcGUoXG4gICAgbWFwKChjb3VudCkgPT4ge1xuICAgICAgcmV0dXJuIGNvdW50ID4gMDtcbiAgICB9KVxuICApO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBjaGFuZ2UgdGFraW5nIGludG8gYWNjY291bnQgdGhlIGVkaXRlZCB2YWx1ZS5cbiAgICogSWYgbm8gZWRpdGFkZWQgdmFsdWUgZm9yIHRoZSBrZXksIGl0IHdpbGwgdGFrZSB0aGUgbGFzdGVkIGZldGNoZWQgdmFsdWUgZnJvbSB0aGUgVGFwXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIHZhbHVlQ2hhbmdlPFQ+KGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdDaGFuZ2VzLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGNoYW5nZXMpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcbiAgICAgICAgY29uc3QgaGFzaEtleSA9IGNyZWF0ZUNhY2hlS2V5KHRvVGFwSW5mb0tleU9iamVjdChrZXkpKTtcbiAgICAgICAgY29uc3QgZWRpdGVkVmFsdWUgPSBjaGFuZ2VzLmZpbmQoXG4gICAgICAgICAgKGVudHJ5KSA9PiBjcmVhdGVDYWNoZUtleShlbnRyeS5rZXkpID09PSBoYXNoS2V5XG4gICAgICAgICk7XG4gICAgICAgIGlmIChlZGl0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGVkaXRlZFZhbHVlLnZhbHVlIGFzIFQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2UudmFsdWVDaGFuZ2U8VD4oa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChkZWVwRXF1YWwpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UGVuZGluZ0NoYW5nZUZvcktleTxUID0gdW5rbm93bj4oXG4gICAga2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdDaGFuZ2VzLnBpcGUoXG4gICAgICBtYXAoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaEtleSA9IGNyZWF0ZUNhY2hlS2V5KHRvVGFwSW5mb0tleU9iamVjdChrZXkpKTtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXMuZmluZCgoZW50cnkpID0+IGNyZWF0ZUNhY2hlS2V5KGVudHJ5LmtleSkgPT09IGhhc2hLZXkpXG4gICAgICAgICAgPy52YWx1ZTtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoZGVlcEVxdWFsKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nQ2hhbmdlc0NoYW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NoYW5nZXMuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUHJvZ3Jlc3MgPSBuZXcgU3ViamVjdDxQcm9ncmVzc1N0YXRlPigpO1xuXG4gIGdldCBzYXZlUHJvZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhdmVQcm9ncmVzcy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFwSW5mb0RBT1NlcnZpY2U6IFRhcEluZm9EQU9TZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwSW5mb0NhY2hlU2VydmljZTogVGFwSW5mb0NhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIHRhcEluZm9Db25maWdTZXJ2aWNlOiBUYXBJbmZvQ29uZmlnU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgc2F2ZVBlbmRpbmdDaGFuZ2VzKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy5fc2F2ZVBlbmRpbmdDaGFuZ2VzV2l0aFByb2dyZXNzKCkudG9Qcm9taXNlKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVQZW5kaW5nQ2hhbmdlc1dpdGhQcm9ncmVzcygpIHtcbiAgICBjb25zdCBjb25maWdJdGVtU3RhdGVDaGFuZ2VzID0gdGhpcy5nZXRQZW5kaW5nQ2hhbmdlc1NuYXBzaG90KCkuZmlsdGVyKFxuICAgICAgKHsga2V5IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGtleS5rZXkgIT09IFRhcEluZm8uY29uZmlnVmVyc2lvbjtcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IG9ic2VydmFibGVzID0gY29uZmlnSXRlbVN0YXRlQ2hhbmdlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICByZXR1cm4gZGVmZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnRhcEluZm9EQU9TZXJ2aWNlLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgdGhpcy50YXBJbmZvREFPU2VydmljZS5nZXQoa2V5KS5jYXRjaCgoZXJyKSA9PiB7fSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0b3RhbCA9IGNvbmZpZ0l0ZW1TdGF0ZUNoYW5nZXMubGVuZ3RoO1xuICAgIGNvbnN0IHNhdmVQcm9ncmVzcyA9IGNvbmNhdCguLi5vYnNlcnZhYmxlcykucGlwZShcbiAgICAgIG1hcCgoaW5mbywgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICBsb2FkZWQ6IGluZGV4ICsgMSxcbiAgICAgICAgICBwYXlsb2FkOiBpbmZvLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICB0YXAodGhpcy5fc2F2ZVByb2dyZXNzKVxuICAgICk7XG4gICAgcmV0dXJuIHNhdmVQcm9ncmVzcztcbiAgfVxuXG4gIGNsZWFyUGVuZGluZ0NoYW5nZXMoKSB7XG4gICAgdGhpcy5fcGVuZGluZ0NoYW5nZXMubmV4dChbXSk7XG4gIH1cblxuICBnZXRQZW5kaW5nQ2hhbmdlc1NuYXBzaG90KCkge1xuICAgIHJldHVybiBkZWVwQ29weSh0aGlzLl9wZW5kaW5nQ2hhbmdlcy52YWx1ZSk7XG4gIH1cblxuICBjbGVhclBlbmRpbmdDaGFuZ2UodGFwSW5mb0tleTogVGFwSW5mb0tleSkge1xuICAgIGNvbnN0IGhhc2hLZXkgPSBjcmVhdGVDYWNoZUtleSh0YXBJbmZvS2V5KTtcbiAgICBjb25zdCBwZW5kaW5nQ2hhbmdlc1NuYXBzaG90ID0gdGhpcy5fcGVuZGluZ0NoYW5nZXMudmFsdWU7XG4gICAgY29uc3QgcGVuZGluZ0NoYW5nZUluZGV4ID0gcGVuZGluZ0NoYW5nZXNTbmFwc2hvdC5maW5kSW5kZXgoXG4gICAgICAoZW50cnkpID0+IGNyZWF0ZUNhY2hlS2V5KGVudHJ5LmtleSkgPT09IGhhc2hLZXlcbiAgICApO1xuICAgIGlmIChwZW5kaW5nQ2hhbmdlSW5kZXggPj0gMCkge1xuICAgICAgcGVuZGluZ0NoYW5nZXNTbmFwc2hvdC5zcGxpY2UocGVuZGluZ0NoYW5nZUluZGV4LCAxKTtcbiAgICAgIHRoaXMuX3BlbmRpbmdDaGFuZ2VzLm5leHQocGVuZGluZ0NoYW5nZXNTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGVuZGluZ0NoYW5nZShpbmZvOiBUYXBJbmZvS2V5LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHN0b3JlIGFueSBvdGhlciBpbmZvIG90aGVyd2lzZSBkZWVwQ29weSBtYXkgZmFpbGVkXG4gICAgaW5mbyA9IHtcbiAgICAgIGtleTogaW5mby5rZXksXG4gICAgICBwYXJhbXM6IGluZm8ucGFyYW1zLFxuICAgIH07XG4gICAgY29uc3QgaGFzaEtleSA9IGNyZWF0ZUNhY2hlS2V5KGluZm8pO1xuICAgIGNvbnN0IHBlbmRpbmdDaGFuZ2VzU25hcHNob3QgPSB0aGlzLl9wZW5kaW5nQ2hhbmdlcy52YWx1ZTtcbiAgICBjb25zdCBpdGVtID0gcGVuZGluZ0NoYW5nZXNTbmFwc2hvdC5maW5kKFxuICAgICAgKGVudHJ5KSA9PiBjcmVhdGVDYWNoZUtleShlbnRyeS5rZXkpID09PSBoYXNoS2V5XG4gICAgKTtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHBlbmRpbmdDaGFuZ2VzU25hcHNob3QucHVzaCh7XG4gICAgICAgIGtleTogaW5mbyxcbiAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLl9wZW5kaW5nQ2hhbmdlcy5uZXh0KHBlbmRpbmdDaGFuZ2VzU25hcHNob3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChpdGVtLnZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgaXRlbS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLl9wZW5kaW5nQ2hhbmdlcy5uZXh0KHBlbmRpbmdDaGFuZ2VzU25hcHNob3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVBlbmRpbmdDaGFuZ2UoaW5mbzogVGFwSW5mb0tleSkge1xuICAgIGNvbnN0IGhhc2hLZXkgPSBjcmVhdGVDYWNoZUtleShpbmZvKTtcbiAgICBjb25zdCBwZW5kaW5nQ2hhbmdlc1NuYXBzaG90ID0gdGhpcy5fcGVuZGluZ0NoYW5nZXMudmFsdWU7XG4gICAgY29uc3QgaW5kZXhPZkl0ZW0gPSBwZW5kaW5nQ2hhbmdlc1NuYXBzaG90LmZpbmRJbmRleChcbiAgICAgIChlbnRyeSkgPT4gY3JlYXRlQ2FjaGVLZXkoZW50cnkua2V5KSA9PT0gaGFzaEtleVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXhPZkl0ZW0gPj0gMCkge1xuICAgICAgcGVuZGluZ0NoYW5nZXNTbmFwc2hvdC5zcGxpY2UoaW5kZXhPZkl0ZW0sIDEpO1xuICAgICAgdGhpcy5fcGVuZGluZ0NoYW5nZXMubmV4dChwZW5kaW5nQ2hhbmdlc1NuYXBzaG90KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==