UNPKG

@ng-flexy/form

Version:

Flexy components and tools to build Angular 8+ applications

113 lines 16.5 kB
import { FlexyLayout } from '@ng-flexy/layout'; import { cloneDeep, merge } from 'lodash'; import { BehaviorSubject } from 'rxjs'; import { HIDDEN_CALC_GROUP_NAME } from '../services/json-mapper.utils'; import { calculate, clearEmptyArrayAndObjects, findErrors, findRemoved, findSchema, FlexyFormDataMode, getSchemaData } from './form.utils'; export class FlexyForm extends FlexyLayout { constructor(formGroup, schema, data) { super(schema); this.isStarted = false; this._calculatedRefs = {}; this._currentDataSubject = new BehaviorSubject(data); this.currentData$ = this._currentDataSubject.asObservable(); this.formGroup = formGroup; this.schema = schema; this._initCalculatedRefs(schema); this._originalData = cloneDeep(data); this._setCurrentData(); // refresh attributes this._setCurrentData(); // jump to next tick // setTimeout(() => { this._subscribeChangesAndCalculate(); // }); } get valid() { return !this.getAllErrors(); } getAllData() { const data = cloneDeep(getSchemaData(this.schema, this.currentData)); this._clearHiddenData(data); return data; } // @deprecated getDirtyData() { const data = cloneDeep(getSchemaData(this.schema, this.currentData, FlexyFormDataMode.Dirty)); this._clearHiddenData(data); clearEmptyArrayAndObjects(data); const allData = this.getAllData(); const removed = findRemoved(allData, this._originalData); clearEmptyArrayAndObjects(removed); return merge(data, removed); } getAllErrors() { return this._lastErrors; } containsFieldSchema(fieldName) { return !!findSchema(fieldName, this.schema); } getFieldSchema(fieldName) { return findSchema(fieldName, this.schema); } getFieldInstance(fieldName) { const schema = findSchema(fieldName, this.schema); if (schema && schema.componentRef) { return schema.componentRef.instance; } return null; } _subscribeChangesAndCalculate() { this._setCurrentData(); this.isStarted = true; // this._setCurrentData(); this._changesSubscription = this.formGroup.valueChanges.subscribe(data => { const hash = this.currentDataHash; this._setCurrentData(); if (hash !== this.currentDataHash) { this._currentDataSubject.next(this.currentData); } }); this._currentDataSubject.next(this.currentData); } _setCurrentData() { this.currentData = getSchemaData(this.schema, this.currentData); this.currentDataHash = JSON.stringify(this.currentData); this._calculate(); this.currentData = getSchemaData(this.schema, this.currentData); this.currentDataHash = JSON.stringify(this.currentData); const errors = findErrors(this.schema, this.currentData); this._lastErrors = errors && Object.keys(errors).length ? errors : null; } _initCalculatedRefs(schema) { if (schema) { schema.forEach((schemaItem) => { if (schemaItem.formName && schemaItem.formControl && schemaItem.calc) { this._calculatedRefs[schemaItem.formName] = { calc: schemaItem.calc, control: schemaItem.formControl }; } if (schemaItem.children) { this._initCalculatedRefs(schemaItem.children); } }); } } _calculate() { if (this._calculatedRefs) { Object.values(this._calculatedRefs).forEach(calc => { const value = calculate(calc.calc, this.currentData); if (value !== calc.control.value) { calc.control.setValue(value); calc.control.markAsDirty(); } }); } } _clearHiddenData(data) { if (data[HIDDEN_CALC_GROUP_NAME]) { delete data[HIDDEN_CALC_GROUP_NAME]; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9tb2RlbHMvZm9ybS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFnQjNJLE1BQU0sT0FBTyxTQUFVLFNBQVEsV0FBVztJQXlCeEMsWUFBWSxTQUFvQixFQUFFLE1BQStCLEVBQUUsSUFBbUI7UUFDcEYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBaEJoQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBU2xCLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBUzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU1RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsb0JBQW9CO1FBQ3BCLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUNyQyxNQUFNO0lBQ1IsQ0FBQztJQXRDRCxJQUFJLEtBQUs7UUFDUCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFzQ0QsVUFBVTtRQUNSLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsY0FBYztJQUNkLFlBQVk7UUFDVixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1Qix5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekQseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxTQUFpQjtRQUNuQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE9BQU8sVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELGdCQUFnQixDQUFJLFNBQWlCO1FBQ25DLE1BQU0sTUFBTSxHQUErQixVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7U0FDckM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyw2QkFBNkI7UUFDbkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2pEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUUsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQStCO1FBQ3pELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQXNDLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRTtvQkFDcEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUc7d0JBQzFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTt3QkFDckIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxXQUEwQjtxQkFDL0MsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQy9DO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUM1QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBSTtRQUMzQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmxleHlMYXlvdXQgfSBmcm9tICdAbmctZmxleHkvbGF5b3V0JztcbmltcG9ydCB7IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBGbGV4eUZvcm1MYXlvdXRTY2hlbWEgfSBmcm9tICcuL2xheW91dC1zY2hlbWEubW9kZWwnO1xuaW1wb3J0IHsgRmxleHlGb3JtRGF0YSB9IGZyb20gJy4vZm9ybS5kYXRhJztcbmltcG9ydCB7IGNsb25lRGVlcCwgbWVyZ2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEhJRERFTl9DQUxDX0dST1VQX05BTUUgfSBmcm9tICcuLi9zZXJ2aWNlcy9qc29uLW1hcHBlci51dGlscyc7XG5pbXBvcnQgeyBjYWxjdWxhdGUsIGNsZWFyRW1wdHlBcnJheUFuZE9iamVjdHMsIGZpbmRFcnJvcnMsIGZpbmRSZW1vdmVkLCBmaW5kU2NoZW1hLCBGbGV4eUZvcm1EYXRhTW9kZSwgZ2V0U2NoZW1hRGF0YSB9IGZyb20gJy4vZm9ybS51dGlscyc7XG5cbmludGVyZmFjZSBDYWxjUmVmcyB7XG4gIFtuYW1lOiBzdHJpbmddOiB7XG4gICAgY2FsYzogc3RyaW5nO1xuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sO1xuICAgIGlmQ29udHJvbD86IEZvcm1Hcm91cDtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIElmUmVmcyB7XG4gIGlmOiBzdHJpbmc7XG4gIHN0YXRlOiBib29sZWFuO1xuICBpZkNvbnRyb2w/OiBGb3JtR3JvdXA7XG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4eUZvcm0gZXh0ZW5kcyBGbGV4eUxheW91dCB7XG4gIGN1cnJlbnREYXRhOiBGbGV4eUZvcm1EYXRhO1xuICBjdXJyZW50RGF0YUhhc2g6IHN0cmluZztcblxuICByZWFkb25seSBjdXJyZW50RGF0YSQ6IE9ic2VydmFibGU8RmxleHlGb3JtRGF0YT47XG5cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiAhdGhpcy5nZXRBbGxFcnJvcnMoKTtcbiAgfVxuXG4gIGlzU3RhcnRlZCA9IGZhbHNlO1xuXG4gIC8vIFRPRE8gdG8gdGhpbmsgY2hhbmdlIHRvIHByaXZhdGVcbiAgcmVhZG9ubHkgc2NoZW1hOiBGbGV4eUZvcm1MYXlvdXRTY2hlbWFbXTtcbiAgcmVhZG9ubHkgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3JpZ2luYWxEYXRhOiBGbGV4eUZvcm1EYXRhO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50RGF0YVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxGbGV4eUZvcm1EYXRhPjtcblxuICBfY2FsY3VsYXRlZFJlZnM6IENhbGNSZWZzID0ge307XG5cbiAgX2xhc3RFcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgcHJpdmF0ZSBfY2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBzY2hlbWE6IEZsZXh5Rm9ybUxheW91dFNjaGVtYVtdLCBkYXRhOiBGbGV4eUZvcm1EYXRhKSB7XG4gICAgc3VwZXIoc2NoZW1hKTtcblxuICAgIHRoaXMuX2N1cnJlbnREYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZGF0YSk7XG4gICAgdGhpcy5jdXJyZW50RGF0YSQgPSB0aGlzLl9jdXJyZW50RGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cCA9IGZvcm1Hcm91cDtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcblxuICAgIHRoaXMuX2luaXRDYWxjdWxhdGVkUmVmcyhzY2hlbWEpO1xuICAgIHRoaXMuX29yaWdpbmFsRGF0YSA9IGNsb25lRGVlcChkYXRhKTtcbiAgICB0aGlzLl9zZXRDdXJyZW50RGF0YSgpO1xuICAgIC8vIHJlZnJlc2ggYXR0cmlidXRlc1xuICAgIHRoaXMuX3NldEN1cnJlbnREYXRhKCk7XG5cbiAgICAvLyBqdW1wIHRvIG5leHQgdGlja1xuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRoaXMuX3N1YnNjcmliZUNoYW5nZXNBbmRDYWxjdWxhdGUoKTtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGdldEFsbERhdGEoKTogRmxleHlGb3JtRGF0YSB7XG4gICAgY29uc3QgZGF0YSA9IGNsb25lRGVlcChnZXRTY2hlbWFEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmN1cnJlbnREYXRhKSk7XG4gICAgdGhpcy5fY2xlYXJIaWRkZW5EYXRhKGRhdGEpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gQGRlcHJlY2F0ZWRcbiAgZ2V0RGlydHlEYXRhKCk6IEZsZXh5Rm9ybURhdGEge1xuICAgIGNvbnN0IGRhdGEgPSBjbG9uZURlZXAoZ2V0U2NoZW1hRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy5jdXJyZW50RGF0YSwgRmxleHlGb3JtRGF0YU1vZGUuRGlydHkpKTtcbiAgICB0aGlzLl9jbGVhckhpZGRlbkRhdGEoZGF0YSk7XG4gICAgY2xlYXJFbXB0eUFycmF5QW5kT2JqZWN0cyhkYXRhKTtcbiAgICBjb25zdCBhbGxEYXRhID0gdGhpcy5nZXRBbGxEYXRhKCk7XG4gICAgY29uc3QgcmVtb3ZlZCA9IGZpbmRSZW1vdmVkKGFsbERhdGEsIHRoaXMuX29yaWdpbmFsRGF0YSk7XG4gICAgY2xlYXJFbXB0eUFycmF5QW5kT2JqZWN0cyhyZW1vdmVkKTtcbiAgICByZXR1cm4gbWVyZ2UoZGF0YSwgcmVtb3ZlZCk7XG4gIH1cblxuICBnZXRBbGxFcnJvcnMoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcnM7XG4gIH1cblxuICBjb250YWluc0ZpZWxkU2NoZW1hKGZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZmluZFNjaGVtYShmaWVsZE5hbWUsIHRoaXMuc2NoZW1hKTtcbiAgfVxuICBnZXRGaWVsZFNjaGVtYShmaWVsZE5hbWU6IHN0cmluZyk6IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hIHtcbiAgICByZXR1cm4gZmluZFNjaGVtYShmaWVsZE5hbWUsIHRoaXMuc2NoZW1hKTtcbiAgfVxuICBnZXRGaWVsZEluc3RhbmNlPFQ+KGZpZWxkTmFtZTogc3RyaW5nKTogVCB7XG4gICAgY29uc3Qgc2NoZW1hOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSA9IGZpbmRTY2hlbWEoZmllbGROYW1lLCB0aGlzLnNjaGVtYSk7XG4gICAgaWYgKHNjaGVtYSAmJiBzY2hlbWEuY29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm4gc2NoZW1hLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVDaGFuZ2VzQW5kQ2FsY3VsYXRlKCkge1xuICAgIHRoaXMuX3NldEN1cnJlbnREYXRhKCk7XG4gICAgdGhpcy5pc1N0YXJ0ZWQgPSB0cnVlO1xuICAgIC8vIHRoaXMuX3NldEN1cnJlbnREYXRhKCk7XG4gICAgdGhpcy5fY2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5jdXJyZW50RGF0YUhhc2g7XG4gICAgICB0aGlzLl9zZXRDdXJyZW50RGF0YSgpO1xuICAgICAgaWYgKGhhc2ggIT09IHRoaXMuY3VycmVudERhdGFIYXNoKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnREYXRhU3ViamVjdC5uZXh0KHRoaXMuY3VycmVudERhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX2N1cnJlbnREYXRhU3ViamVjdC5uZXh0KHRoaXMuY3VycmVudERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VycmVudERhdGEoKSB7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IGdldFNjaGVtYURhdGEodGhpcy5zY2hlbWEsIHRoaXMuY3VycmVudERhdGEpO1xuICAgIHRoaXMuY3VycmVudERhdGFIYXNoID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50RGF0YSk7XG4gICAgdGhpcy5fY2FsY3VsYXRlKCk7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IGdldFNjaGVtYURhdGEodGhpcy5zY2hlbWEsIHRoaXMuY3VycmVudERhdGEpO1xuICAgIHRoaXMuY3VycmVudERhdGFIYXNoID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50RGF0YSk7XG4gICAgY29uc3QgZXJyb3JzID0gZmluZEVycm9ycyh0aGlzLnNjaGVtYSwgdGhpcy5jdXJyZW50RGF0YSk7XG4gICAgdGhpcy5fbGFzdEVycm9ycyA9IGVycm9ycyAmJiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0Q2FsY3VsYXRlZFJlZnMoc2NoZW1hOiBGbGV4eUZvcm1MYXlvdXRTY2hlbWFbXSkge1xuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIHNjaGVtYS5mb3JFYWNoKChzY2hlbWFJdGVtOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkgPT4ge1xuICAgICAgICBpZiAoc2NoZW1hSXRlbS5mb3JtTmFtZSAmJiBzY2hlbWFJdGVtLmZvcm1Db250cm9sICYmIHNjaGVtYUl0ZW0uY2FsYykge1xuICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZWRSZWZzW3NjaGVtYUl0ZW0uZm9ybU5hbWVdID0ge1xuICAgICAgICAgICAgY2FsYzogc2NoZW1hSXRlbS5jYWxjLFxuICAgICAgICAgICAgY29udHJvbDogc2NoZW1hSXRlbS5mb3JtQ29udHJvbCBhcyBGb3JtQ29udHJvbFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYUl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLl9pbml0Q2FsY3VsYXRlZFJlZnMoc2NoZW1hSXRlbS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZSgpIHtcbiAgICBpZiAodGhpcy5fY2FsY3VsYXRlZFJlZnMpIHtcbiAgICAgIE9iamVjdC52YWx1ZXModGhpcy5fY2FsY3VsYXRlZFJlZnMpLmZvckVhY2goY2FsYyA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2FsY3VsYXRlKGNhbGMuY2FsYywgdGhpcy5jdXJyZW50RGF0YSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gY2FsYy5jb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgY2FsYy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICBjYWxjLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJIaWRkZW5EYXRhKGRhdGEpIHtcbiAgICBpZiAoZGF0YVtISURERU5fQ0FMQ19HUk9VUF9OQU1FXSkge1xuICAgICAgZGVsZXRlIGRhdGFbSElEREVOX0NBTENfR1JPVVBfTkFNRV07XG4gICAgfVxuICB9XG59XG4iXX0=