@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
163 lines • 24.2 kB
JavaScript
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==