UNPKG

ontimize-web-ngx

Version:
207 lines 26.8 kB
import { EventEmitter } from '@angular/core'; import { Util } from '../../../util/util'; export class OFormCacheClass { constructor(form) { this.form = form; this.initialDataCache = {}; this.valueChangesStack = []; this._componentsSubscritpions = {}; this.blockCaching = false; this.initializedCache = false; this.onCacheStateChanges = new EventEmitter(); this.changedFormControls = []; } updateFormDataCache() { this.formDataCache = this.form.getRegisteredFieldsValues(); } addChangeToStack(comp) { const currentValue = comp.getFormControl().value; this.valueChangesStack.push({ attr: comp.getAttribute(), value: currentValue }); this.onCacheStateChanges.emit(); } registerComponentCaching(comp) { const attr = comp.getAttribute(); const listenTo = this.form.detectChangesOnBlur ? comp.onValueChange : comp.onChange; if (!Util.isDefined(listenTo)) { return; } this._componentsSubscritpions[attr] = listenTo.subscribe(() => { if (this.initializedCache && !this.blockCaching && this.hasComponentChanged(attr, comp)) { if (this.changedFormControls.indexOf(attr) === -1) { this.changedFormControls.push(attr); } this.updateFormDataCache(); this.addChangeToStack(comp); } }); } getCachedValue(attr) { if (this.formDataCache && this.formDataCache.hasOwnProperty(attr)) { return this.formDataCache[attr]; } return undefined; } destroy() { Object.keys(this._componentsSubscritpions).forEach((attr) => { const subs = this._componentsSubscritpions[attr]; subs.unsubscribe(); }); this._componentsSubscritpions = {}; this.formDataCache = undefined; this.changedFormControls = []; } removeUndefinedProperties(arg) { Object.keys(arg).forEach((key) => { if (arg[key] === undefined) { delete arg[key]; } }); return arg; } registerCache() { const initialCache = this.form.getRegisteredFieldsValues(); this.removeUndefinedProperties(initialCache); this.initializeCache(initialCache); this.formDataCache = initialCache; const components = this.form.getComponents(); const self = this; Object.keys(components).forEach(attr => { const comp = components[attr]; if (comp.isAutomaticRegistering()) { self.registerComponentCaching(comp); } }); } initializeCache(val) { this.initialDataCache = val; this.valueChangesStack = []; this.onCacheStateChanges.emit(); this.initializedCache = true; this.changedFormControls = []; } getInitialDataCache() { return this.initialDataCache; } getDataCache() { return this.formDataCache; } restartCache() { this.formDataCache = undefined; this.initializeCache({}); this.initializedCache = false; this.onCacheStateChanges.emit(); } setCacheSnapshot() { this.initializeCache(this.getDataCache()); } undoLastChange() { const lastElement = this.valueChangesStack[this.valueChangesStack.length - 1]; if (lastElement) { const lastCacheValue = this.getCacheLastValue(lastElement.attr); const lastValue = (lastCacheValue !== null) ? lastCacheValue : this.initialDataCache[lastElement.attr]; this.undoComponentValue(lastElement.attr, lastValue); this.updateFormDataCache(); this.onCacheStateChanges.emit(); } } undoComponentValue(attr, val) { this.blockCaching = true; const comp = this.form.getFieldReference(attr); if (comp) { comp.setValue(val); } this.blockCaching = false; } hasComponentChanged(attr, comp) { const currentValue = comp.getFormControl().value; const cache = this.formDataCache || this.initialDataCache; return (currentValue !== cache[attr]); } getCacheLastValue(attr) { this.updateChangesStack(attr); let result = null; for (let i = this.valueChangesStack.length - 1; i >= 0; i--) { const current = this.valueChangesStack[i]; if (current.attr === attr) { result = current.value; break; } } return result; } updateChangesStack(attr) { let index; for (let i = this.valueChangesStack.length - 1; i >= 0; i--) { const current = this.valueChangesStack[i]; if (current.attr === attr) { index = i; break; } } if (index !== undefined) { for (let i = index; i >= 0; i--) { const prev = this.valueChangesStack[i - 1]; const current = this.valueChangesStack[i]; if (current.attr === attr) { this.valueChangesStack.splice(i, 1); if (!prev || prev.attr === attr) { continue; } else { break; } } } } if (this.valueChangesStack.length === 0) { this.onCacheStateChanges.emit(); } } get isCacheStackEmpty() { return (this.valueChangesStack.length === 0); } isInitialStateChanged(ignoreAttrs = []) { const initialCache = Object.assign({}, this.initialDataCache); let currentCache; if (this.formDataCache) { currentCache = Object.assign({}, this.formDataCache); this.removeUndefinedProperties(currentCache); } else { return false; } let initialKeys = Object.keys(initialCache); let currentKeys = currentCache ? Object.keys(currentCache) : initialKeys; if (ignoreAttrs.length) { initialKeys = initialKeys.filter(key => !ignoreAttrs.includes(key)); currentKeys = currentKeys.filter(key => !ignoreAttrs.includes(key)); ignoreAttrs.forEach(key => delete initialCache[key]); } if (currentKeys.length === 0) { return false; } if (initialKeys.length !== currentKeys.length) { return true; } if (ignoreAttrs.length) { initialKeys = initialKeys.filter(key => !ignoreAttrs.includes(key)); ignoreAttrs.forEach(key => delete initialCache[key]); } let res = false; for (let i = 0, len = initialKeys.length; i < len; i++) { const key = initialKeys[i]; res = (initialCache[key] !== currentCache[key]); if (res) { break; } } return res; } getChangedFormControlsAttr() { return this.changedFormControls; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLmNhY2hlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9jYWNoZS9vLWZvcm0uY2FjaGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs3QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHMUMsTUFBTSxPQUFPLGVBQWU7SUFhMUIsWUFBc0IsSUFBZTtRQUFmLFNBQUksR0FBSixJQUFJLENBQVc7UUFYM0IscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBRTlCLHNCQUFpQixHQUFlLEVBQUUsQ0FBQztRQUNuQyw2QkFBd0IsR0FBUSxFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRTVDLHdCQUFtQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXZELHdCQUFtQixHQUFhLEVBQUUsQ0FBQztJQUc3QyxDQUFDO0lBRVMsbUJBQW1CO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUEyQjtRQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDekIsS0FBSyxFQUFFLFlBQVk7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFUyx3QkFBd0IsQ0FB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dCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJRm9ybUNvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2Zvcm0tY29udHJvbC1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JtRGF0YUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZm9ybS1kYXRhLWNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUJhc2UgfSBmcm9tICcuLi9vLWZvcm0tYmFzZS5jbGFzcyc7XG5cbmV4cG9ydCBjbGFzcyBPRm9ybUNhY2hlQ2xhc3Mge1xuXG4gIHByb3RlY3RlZCBpbml0aWFsRGF0YUNhY2hlOiBvYmplY3QgPSB7fTtcbiAgcHJvdGVjdGVkIGZvcm1EYXRhQ2FjaGU6IG9iamVjdDtcbiAgcHJvdGVjdGVkIHZhbHVlQ2hhbmdlc1N0YWNrOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBfY29tcG9uZW50c1N1YnNjcml0cGlvbnM6IGFueSA9IHt9O1xuICBwcm90ZWN0ZWQgYmxvY2tDYWNoaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpbml0aWFsaXplZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgb25DYWNoZVN0YXRlQ2hhbmdlczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwcm90ZWN0ZWQgY2hhbmdlZEZvcm1Db250cm9sczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZm9ybTogT0Zvcm1CYXNlKSB7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybURhdGFDYWNoZSgpIHtcbiAgICB0aGlzLmZvcm1EYXRhQ2FjaGUgPSB0aGlzLmZvcm0uZ2V0UmVnaXN0ZXJlZEZpZWxkc1ZhbHVlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZENoYW5nZVRvU3RhY2soY29tcDogSUZvcm1Db250cm9sQ29tcG9uZW50KSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29tcC5nZXRGb3JtQ29udHJvbCgpLnZhbHVlO1xuICAgIHRoaXMudmFsdWVDaGFuZ2VzU3RhY2sucHVzaCh7XG4gICAgICBhdHRyOiBjb21wLmdldEF0dHJpYnV0ZSgpLFxuICAgICAgdmFsdWU6IGN1cnJlbnRWYWx1ZVxuICAgIH0pO1xuICAgIHRoaXMub25DYWNoZVN0YXRlQ2hhbmdlcy5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDb21wb25lbnRDYWNoaW5nKGNvbXA6IElGb3JtRGF0YUNvbXBvbmVudCkge1xuICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgIGNvbnN0IGxpc3RlblRvID0gdGhpcy5mb3JtLmRldGVjdENoYW5nZXNPbkJsdXIgPyBjb21wLm9uVmFsdWVDaGFuZ2UgOiBjb21wLm9uQ2hhbmdlO1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQobGlzdGVuVG8pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbXBvbmVudHNTdWJzY3JpdHBpb25zW2F0dHJdID0gbGlzdGVuVG8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkQ2FjaGUgJiYgIXRoaXMuYmxvY2tDYWNoaW5nICYmIHRoaXMuaGFzQ29tcG9uZW50Q2hhbmdlZChhdHRyLCBjb21wKSkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkRm9ybUNvbnRyb2xzLmluZGV4T2YoYXR0cikgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkRm9ybUNvbnRyb2xzLnB1c2goYXR0cik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YUNhY2hlKCk7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlVG9TdGFjayhjb21wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENhY2hlZFZhbHVlKGF0dHI6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHRoaXMuZm9ybURhdGFDYWNoZSAmJiB0aGlzLmZvcm1EYXRhQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EYXRhQ2FjaGVbYXR0cl07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuX2NvbXBvbmVudHNTdWJzY3JpdHBpb25zKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICBjb25zdCBzdWJzOiBTdWJzY3JpcHRpb24gPSB0aGlzLl9jb21wb25lbnRzU3Vic2NyaXRwaW9uc1thdHRyXTtcbiAgICAgIHN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLl9jb21wb25lbnRzU3Vic2NyaXRwaW9ucyA9IHt9O1xuICAgIHRoaXMuZm9ybURhdGFDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5nZWRGb3JtQ29udHJvbHMgPSBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKGFyZzogYW55KTogYW55IHtcbiAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGFyZ1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIGFyZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhcmc7XG4gIH1cblxuICByZWdpc3RlckNhY2hlKCkge1xuICAgIGNvbnN0IGluaXRpYWxDYWNoZSA9IHRoaXMuZm9ybS5nZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCk7XG4gICAgdGhpcy5yZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKGluaXRpYWxDYWNoZSk7XG4gICAgdGhpcy5pbml0aWFsaXplQ2FjaGUoaW5pdGlhbENhY2hlKTtcbiAgICB0aGlzLmZvcm1EYXRhQ2FjaGUgPSBpbml0aWFsQ2FjaGU7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5mb3JtLmdldENvbXBvbmVudHMoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgY29uc3QgY29tcDogSUZvcm1EYXRhQ29tcG9uZW50ID0gY29tcG9uZW50c1thdHRyXTtcbiAgICAgIGlmIChjb21wLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSkge1xuICAgICAgICBzZWxmLnJlZ2lzdGVyQ29tcG9uZW50Q2FjaGluZyhjb21wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemVDYWNoZSh2YWw6IGFueSkge1xuICAgIHRoaXMuaW5pdGlhbERhdGFDYWNoZSA9IHZhbDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrID0gW107XG4gICAgdGhpcy5vbkNhY2hlU3RhdGVDaGFuZ2VzLmVtaXQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2FjaGUgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlZEZvcm1Db250cm9scyA9IFtdO1xuICB9XG5cbiAgZ2V0SW5pdGlhbERhdGFDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsRGF0YUNhY2hlO1xuICB9XG5cbiAgZ2V0RGF0YUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1EYXRhQ2FjaGU7XG4gIH1cblxuICByZXN0YXJ0Q2FjaGUoKSB7XG4gICAgdGhpcy5mb3JtRGF0YUNhY2hlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHt9KTtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2FjaGUgPSBmYWxzZTtcbiAgICB0aGlzLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuZW1pdCgpO1xuICB9XG5cbiAgc2V0Q2FjaGVTbmFwc2hvdCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDYWNoZSh0aGlzLmdldERhdGFDYWNoZSgpKTtcbiAgfVxuXG4gIHVuZG9MYXN0Q2hhbmdlKCkge1xuICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1t0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0RWxlbWVudCkge1xuICAgICAgY29uc3QgbGFzdENhY2hlVmFsdWUgPSB0aGlzLmdldENhY2hlTGFzdFZhbHVlKGxhc3RFbGVtZW50LmF0dHIpO1xuICAgICAgY29uc3QgbGFzdFZhbHVlID0gKGxhc3RDYWNoZVZhbHVlICE9PSBudWxsKSA/IGxhc3RDYWNoZVZhbHVlIDogdGhpcy5pbml0aWFsRGF0YUNhY2hlW2xhc3RFbGVtZW50LmF0dHJdO1xuICAgICAgdGhpcy51bmRvQ29tcG9uZW50VmFsdWUobGFzdEVsZW1lbnQuYXR0ciwgbGFzdFZhbHVlKTtcblxuICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YUNhY2hlKCk7XG4gICAgICB0aGlzLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmRvQ29tcG9uZW50VmFsdWUoYXR0cjogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIHRoaXMuYmxvY2tDYWNoaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wID0gdGhpcy5mb3JtLmdldEZpZWxkUmVmZXJlbmNlKGF0dHIpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb21wLnNldFZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHRoaXMuYmxvY2tDYWNoaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzQ29tcG9uZW50Q2hhbmdlZChhdHRyOiBzdHJpbmcsIGNvbXA6IElGb3JtQ29udHJvbENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbXAuZ2V0Rm9ybUNvbnRyb2woKS52YWx1ZTtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuZm9ybURhdGFDYWNoZSB8fCB0aGlzLmluaXRpYWxEYXRhQ2FjaGU7XG4gICAgcmV0dXJuIChjdXJyZW50VmFsdWUgIT09IGNhY2hlW2F0dHJdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWNoZUxhc3RWYWx1ZShhdHRyOiBzdHJpbmcpOiBhbnkge1xuICAgIHRoaXMudXBkYXRlQ2hhbmdlc1N0YWNrKGF0dHIpO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1tpXTtcbiAgICAgIGlmIChjdXJyZW50LmF0dHIgPT09IGF0dHIpIHtcbiAgICAgICAgcmVzdWx0ID0gY3VycmVudC52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ2hhbmdlc1N0YWNrKGF0dHI6IHN0cmluZykge1xuICAgIGxldCBpbmRleDogbnVtYmVyO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1tpXTtcbiAgICAgIGlmIChjdXJyZW50LmF0dHIgPT09IGF0dHIpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMudmFsdWVDaGFuZ2VzU3RhY2tbaSAtIDFdO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1tpXTtcbiAgICAgICAgaWYgKGN1cnJlbnQuYXR0ciA9PT0gYXR0cikge1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzU3RhY2suc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGlmICghcHJldiB8fCBwcmV2LmF0dHIgPT09IGF0dHIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWVDaGFuZ2VzU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0NhY2hlU3RhY2tFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMudmFsdWVDaGFuZ2VzU3RhY2subGVuZ3RoID09PSAwKTtcbiAgfVxuXG4gIGlzSW5pdGlhbFN0YXRlQ2hhbmdlZChpZ25vcmVBdHRyczogc3RyaW5nW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluaXRpYWxDYWNoZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaW5pdGlhbERhdGFDYWNoZSk7XG4gICAgbGV0IGN1cnJlbnRDYWNoZTogb2JqZWN0O1xuICAgIGlmICh0aGlzLmZvcm1EYXRhQ2FjaGUpIHtcbiAgICAgIGN1cnJlbnRDYWNoZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZm9ybURhdGFDYWNoZSk7XG4gICAgICB0aGlzLnJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMoY3VycmVudENhY2hlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKGluaXRpYWxDYWNoZSk7XG4gICAgbGV0IGN1cnJlbnRLZXlzID0gY3VycmVudENhY2hlID8gT2JqZWN0LmtleXMoY3VycmVudENhY2hlKSA6IGluaXRpYWxLZXlzO1xuXG4gICAgLy8gUmVtb3ZlIGlnbm9yZWQgZmllbGRzIGZyb20gdGVtcG9yYXJ5IGluaXRpYWwgY2FjaGUgZGF0YVxuICAgIGlmIChpZ25vcmVBdHRycy5sZW5ndGgpIHtcbiAgICAgIGluaXRpYWxLZXlzID0gaW5pdGlhbEtleXMuZmlsdGVyKGtleSA9PiAhaWdub3JlQXR0cnMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICBjdXJyZW50S2V5cyA9IGN1cnJlbnRLZXlzLmZpbHRlcihrZXkgPT4gIWlnbm9yZUF0dHJzLmluY2x1ZGVzKGtleSkpO1xuICAgICAgaWdub3JlQXR0cnMuZm9yRWFjaChrZXkgPT4gZGVsZXRlIGluaXRpYWxDYWNoZVtrZXldKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxLZXlzLmxlbmd0aCAhPT0gY3VycmVudEtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGlnbm9yZWQgZmllbGRzIGZyb20gdGVtcG9yYXJ5IGluaXRpYWwgY2FjaGUgZGF0YVxuICAgIGlmIChpZ25vcmVBdHRycy5sZW5ndGgpIHtcbiAgICAgIGluaXRpYWxLZXlzID0gaW5pdGlhbEtleXMuZmlsdGVyKGtleSA9PiAhaWdub3JlQXR0cnMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICBpZ25vcmVBdHRycy5mb3JFYWNoKGtleSA9PiBkZWxldGUgaW5pdGlhbENhY2hlW2tleV0pO1xuICAgIH1cblxuICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5pdGlhbEtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGluaXRpYWxLZXlzW2ldO1xuICAgICAgLy8gVE9ETyBiZSBjYXJlZnVsIHdpdGggdHlwZXMgY29tcGFyaXNpb25zXG4gICAgICByZXMgPSAoaW5pdGlhbENhY2hlW2tleV0gIT09IGN1cnJlbnRDYWNoZVtrZXldKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBnZXRDaGFuZ2VkRm9ybUNvbnRyb2xzQXR0cigpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlZEZvcm1Db250cm9scztcbiAgfVxufVxuIl19