UNPKG

@yyasinaslan/easyform

Version:
230 lines 29.7 kB
import { FormArray, FormControl, FormGroup } from "@angular/forms"; import { AdvancedControlTypes } from "./interfaces/advanced-control-types"; import { EasyFormGenerator } from "./easy-form-generator"; import { EasyFormField } from "./easy-form-field"; export class EasyForm extends EasyFormGenerator { constructor(schema, options) { super(); // default options this.options = { showErrors: 'submitted', components: {} }; this.schema = schema; this.options = { ...this.options, ...options }; this.formGroup = this.createFormGroup(this.schema); } get invalid() { return this.formGroup.invalid; } get valid() { return this.formGroup.valid; } get value() { return this.formGroup.value; } get valueChanges() { return this.formGroup.valueChanges; } /** * Create a new instance of EasyForm * @param schema * @param options */ static create(schema, options) { return new EasyForm(schema, options); } /** * Traverse through schema and get definition * @param path */ getSchema(path) { const normalisedPath = typeof path == 'string' ? path.split('.') : path; if (!path || path.length == 0) { return null; } return this._getSchemaWithPath(normalisedPath, this.schema); } /** * Disable all form */ disable() { this.formGroup.disable(); } /** * Enable all form */ enable() { this.formGroup.enable(); } getComponentType(type) { if (!this.options.components) { return null; } const c = this.options.components[type]; if (!c) { return null; } return c; } getControl(path) { return this.formGroup.get(path); } getArrayControls(path) { const arrayControl = this.getControl(path); if (!arrayControl) return []; return arrayControl.controls; } getValue(path) { if (path) { return this.formGroup.get(path)?.value; } return this.formGroup.value; } getRawValue(path) { if (path) { return this.formGroup.get(path)?.getRawValue(); } return this.formGroup.getRawValue(); } setValue(value, path) { if (path) { this.formGroup.get(path)?.setValue(value); return; } this.formGroup.setValue(value); } patchValue(value, path) { if (path) { this.formGroup.get(path)?.patchValue(value); return; } this.formGroup.patchValue(value); } addToArray(path, value) { const arr = this.formGroup.get(path); const schema = this.getSchema(path); if (!schema) { throw new Error(`Cannot find form schema for ${path}`); } if (!arr) { throw new Error(`Cannot find form array for ${path}`); } if (schema.controlType === AdvancedControlTypes.Array) { const g = this.createFormGroup(schema.schema, value); arr.push(g); } else if (schema.controlType === AdvancedControlTypes.ArraySimple) { const arrayField = schema.schema; const validations = arrayField.validations ?? {}; const control = new FormControl(value, this.createValidations(validations)); arr.push(control); } } removeFromArray(path, index) { const arr = this.formGroup.get(path); if (arr) { arr.removeAt(index); } } createFormGroup(schema, initialValue, validations) { const group = new FormGroup({}); for (const key in schema) { const field = schema[key]; if (field.controlType == 'group') { const g = this.createFormGroup(field.schema, field.initialValue, field.validations); group.addControl(key, g); } else if (field.controlType == 'array') { const a = this.createFormArray(field.schema, field.initialValue, field.validations); group.addControl(key, a); } else if (field.controlType == 'arraySimple') { const a = this.createSimpleFormArray(field, field.initialValue, field.validations); group.addControl(key, a); } else { const control = new FormControl(field.initialValue, field.validations ? this.createValidations(field.validations) : []); group.addControl(key, control); } } if (validations) { group.addValidators(this.createValidations(validations)); } if (initialValue) { group.patchValue(initialValue); } return group; } createFormArray(schema, initialValue, validations) { const array = new FormArray([]); if (initialValue && Array.isArray(initialValue)) { initialValue.forEach((item) => { const group = this.createFormGroup(schema); group.patchValue(item); array.push(group); }); } if (validations) { array.addValidators(this.createValidations(validations)); } return array; } createSimpleFormArray(schema, initialValue, validations) { const array = new FormArray([]); const field = schema.schema; if (initialValue && Array.isArray(initialValue)) { initialValue.forEach((item, index) => { const control = new FormControl(item, field.validations ? this.createValidations(field.validations) : []); array.push(control); }); } if (validations) { array.addValidators(this.createValidations(validations)); } return array; } createValidations(validations) { const validators = []; if (validations) { for (const validationKey in validations) { const v = validations[validationKey]; validators.push(v.validator); } } return validators; } _getSchemaWithPath(path, schema) { const head = path[0]; const tail = path.slice(1); const hasIndex = !!head.toString().match(/^[0-9]+/); if (hasIndex) { if (schema instanceof EasyFormField) { return schema ?? null; } else { if (tail.length == 0) { return schema ?? null; } else { return this._getSchemaWithPath(tail, schema); } } } if (schema instanceof EasyFormField) { return schema.schema ?? null; } const childSchema = schema[head.toString()]; if (childSchema) { if (tail.length == 0) { return childSchema; } else { return this._getSchemaWithPath(tail, childSchema.schema ?? {}); } } return null; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWFzeS1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWFzeS1mb3JtL3NyYy9saWIvZWFzeS1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQWlCaEQsTUFBTSxPQUFPLFFBQTBCLFNBQVEsaUJBQWlCO0lBYzlELFlBQVksTUFBNkIsRUFBRSxPQUF5QjtRQUNsRSxLQUFLLEVBQUUsQ0FBQztRQVBWLGtCQUFrQjtRQUNYLFlBQU8sR0FBb0I7WUFDaEMsVUFBVSxFQUFFLFdBQVc7WUFDdkIsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBSUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUks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QUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyQixPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Rm9ybVNjaGVtYX0gZnJvbSBcIi4vaW50ZXJmYWNlcy9mb3JtLXNjaGVtYVwiO1xyXG5pbXBvcnQge1ZhbGlkYXRpb259IGZyb20gXCIuL2ludGVyZmFjZXMvdmFsaWRhdGlvblwiO1xyXG5pbXBvcnQge1NpZ25hbH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFzaWNDb250cm9sVHlwZXN9IGZyb20gXCIuL2ludGVyZmFjZXMvYmFzaWMtY29udHJvbC10eXBlc1wiO1xyXG5pbXBvcnQge0FkdmFuY2VkQ29udHJvbFR5cGVzfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2FkdmFuY2VkLWNvbnRyb2wtdHlwZXNcIjtcclxuaW1wb3J0IHtFYXN5Rm9ybUdlbmVyYXRvcn0gZnJvbSBcIi4vZWFzeS1mb3JtLWdlbmVyYXRvclwiO1xyXG5pbXBvcnQge0Vhc3lGb3JtQ29udHJvbENvbXBvbmVudCwgTGF6eUxvYWRpbmdDb21wb25lbnR9IGZyb20gXCIuL3Rva2Vucy9lYXN5LWZvcm0tY29uZmlnXCI7XHJcbmltcG9ydCB7RWFzeUZvcm1GaWVsZH0gZnJvbSBcIi4vZWFzeS1mb3JtLWZpZWxkXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVhc3lGb3JtT3B0aW9ucyB7XHJcbiAgc2hvd0Vycm9ycz86ICdzdWJtaXR0ZWQnIHwgJ3RvdWNoZWQnIHwgJ2RpcnR5JyB8ICdhbHdheXMnIHwgJ25ldmVyJztcclxuICAvLyBGb3JtIGJhc2VkIHZhbGlkYXRpb25zXHJcblxyXG4gIHZhbGlkYXRpb25zPzogUmVjb3JkPHN0cmluZywgVmFsaWRhdGlvbj47XHJcbiAgLy8gRGlzYWJsZWQgc3RhdGUgb2YgdGhlIGZvcm1cclxuXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuIHwgU2lnbmFsPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAvLyBGb3JtIGZpZWxkIGNvbXBvbmVudHNcclxuXHJcbiAgY29tcG9uZW50cz86IFJlY29yZDxzdHJpbmcsIEVhc3lGb3JtQ29udHJvbENvbXBvbmVudCB8IExhenlMb2FkaW5nQ29tcG9uZW50PlxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJbmZlclZhbHVlVHlwZTxTY2hlbWEgZXh0ZW5kcyBGb3JtU2NoZW1hPiA9IHsgW2tleSBpbiBrZXlvZiBTY2hlbWFdOiBTY2hlbWFba2V5XVsnaW5pdGlhbFZhbHVlJ10gfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBFYXN5Rm9ybTxWYWx1ZVR5cGUgPSBhbnk+IGV4dGVuZHMgRWFzeUZvcm1HZW5lcmF0b3Ige1xyXG5cclxuICAvKipcclxuICAgKiBSZWFjdGl2aXR5IG9mIGFjdHVhbCBmb3JtIGlzIG1hbmFnZWQgYnkgYW5ndWxhciByZWFjdGl2ZSBmb3JtXHJcbiAgICovXHJcbiAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgc2NoZW1hITogRm9ybVNjaGVtYTxWYWx1ZVR5cGU+O1xyXG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xyXG4gIHB1YmxpYyBvcHRpb25zOiBFYXN5Rm9ybU9wdGlvbnMgPSB7XHJcbiAgICBzaG93RXJyb3JzOiAnc3VibWl0dGVkJyxcclxuICAgIGNvbXBvbmVudHM6IHt9XHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3Ioc2NoZW1hOiBGb3JtU2NoZW1hPFZhbHVlVHlwZT4sIG9wdGlvbnM/OiBFYXN5Rm9ybU9wdGlvbnMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcclxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLm9wdGlvbnMsIC4uLm9wdGlvbnN9O1xyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUZvcm1Hcm91cCh0aGlzLnNjaGVtYSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5pbnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbGlkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IFZhbHVlVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAudmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWVDaGFuZ2VzKCk6IE9ic2VydmFibGU8VmFsdWVUeXBlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEVhc3lGb3JtXHJcbiAgICogQHBhcmFtIHNjaGVtYVxyXG4gICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8VCA9IGFueT4oc2NoZW1hOiBGb3JtU2NoZW1hPFQ+LCBvcHRpb25zPzogRWFzeUZvcm1PcHRpb25zKSB7XHJcbiAgICByZXR1cm4gbmV3IEVhc3lGb3JtPFQ+KHNjaGVtYSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmF2ZXJzZSB0aHJvdWdoIHNjaGVtYSBhbmQgZ2V0IGRlZmluaXRpb25cclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqL1xyXG4gIGdldFNjaGVtYShwYXRoOiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XHJcbiAgICBjb25zdCBub3JtYWxpc2VkUGF0aCA9IHR5cGVvZiBwYXRoID09ICdzdHJpbmcnID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcclxuICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2dldFNjaGVtYVdpdGhQYXRoKG5vcm1hbGlzZWRQYXRoLCB0aGlzLnNjaGVtYSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNhYmxlIGFsbCBmb3JtXHJcbiAgICovXHJcbiAgZGlzYWJsZSgpIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlIGFsbCBmb3JtXHJcbiAgICovXHJcbiAgZW5hYmxlKCkge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKClcclxuICB9XHJcblxyXG4gIGdldENvbXBvbmVudFR5cGUodHlwZTogQmFzaWNDb250cm9sVHlwZXMgfCBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmNvbXBvbmVudHMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjID0gdGhpcy5vcHRpb25zLmNvbXBvbmVudHNbdHlwZV07XHJcbiAgICBpZiAoIWMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2w8Q29udHJvbFR5cGUgPSBGb3JtQ29udHJvbD4ocGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKSBhcyBDb250cm9sVHlwZTtcclxuICB9XHJcblxyXG4gIGdldEFycmF5Q29udHJvbHMocGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikge1xyXG4gICAgY29uc3QgYXJyYXlDb250cm9sID0gdGhpcy5nZXRDb250cm9sPEZvcm1BcnJheT4ocGF0aCk7XHJcbiAgICBpZiAoIWFycmF5Q29udHJvbCkgcmV0dXJuIFtdO1xyXG4gICAgcmV0dXJuIGFycmF5Q29udHJvbC5jb250cm9scyBhcyBGb3JtQ29udHJvbFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmFsdWU8VmFsdWVUeXBlID0gYW55PihwYXRoPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPik6IFZhbHVlVHlwZSB7XHJcbiAgICBpZiAocGF0aCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KHBhdGgpPy52YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldFJhd1ZhbHVlPFZhbHVlVHlwZSA9IGFueT4ocGF0aD86IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiBWYWx1ZVR5cGUge1xyXG4gICAgaWYgKHBhdGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKT8uZ2V0UmF3VmFsdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWUodmFsdWU6IGFueSwgcGF0aD86IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4pIHtcclxuICAgIGlmIChwYXRoKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKT8uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Hcm91cC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFZhbHVlKHZhbHVlOiBhbnksIHBhdGg/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XHJcbiAgICBpZiAocGF0aCkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5nZXQocGF0aCk/LnBhdGNoVmFsdWUodmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZFRvQXJyYXkocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmZvcm1Hcm91cC5nZXQocGF0aCkgYXMgRm9ybUFycmF5O1xyXG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEocGF0aCk7XHJcbiAgICBpZiAoIXNjaGVtYSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGZvcm0gc2NoZW1hIGZvciAke3BhdGh9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWFycikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGZvcm0gYXJyYXkgZm9yICR7cGF0aH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NoZW1hLmNvbnRyb2xUeXBlID09PSBBZHZhbmNlZENvbnRyb2xUeXBlcy5BcnJheSkge1xyXG4gICAgICBjb25zdCBnID0gdGhpcy5jcmVhdGVGb3JtR3JvdXAoc2NoZW1hLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBFYXN5Rm9ybUZpZWxkPiwgdmFsdWUpO1xyXG4gICAgICBhcnIucHVzaChnKTtcclxuICAgIH0gZWxzZSBpZiAoc2NoZW1hLmNvbnRyb2xUeXBlID09PSBBZHZhbmNlZENvbnRyb2xUeXBlcy5BcnJheVNpbXBsZSkge1xyXG4gICAgICBjb25zdCBhcnJheUZpZWxkID0gc2NoZW1hLnNjaGVtYSBhcyBFYXN5Rm9ybUZpZWxkO1xyXG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IGFycmF5RmllbGQudmFsaWRhdGlvbnMgPz8ge307XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodmFsdWUsIHRoaXMuY3JlYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbnMpKTtcclxuICAgICAgYXJyLnB1c2goY29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRnJvbUFycmF5KHBhdGg6IHN0cmluZywgaW5kZXg6IGFueSkge1xyXG4gICAgY29uc3QgYXJyID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHBhdGgpIGFzIEZvcm1BcnJheTtcclxuICAgIGlmIChhcnIpIHtcclxuICAgICAgYXJyLnJlbW92ZUF0KGluZGV4KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoc2NoZW1hOiBGb3JtU2NoZW1hLCBpbml0aWFsVmFsdWU/OiBhbnksIHZhbGlkYXRpb25zPzogRWFzeUZvcm1GaWVsZFsndmFsaWRhdGlvbnMnXSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSkge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtrZXldO1xyXG4gICAgICBpZiAoZmllbGQuY29udHJvbFR5cGUgPT0gJ2dyb3VwJykge1xyXG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLmNyZWF0ZUZvcm1Hcm91cChmaWVsZC5zY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgRWFzeUZvcm1GaWVsZD4sIGZpZWxkLmluaXRpYWxWYWx1ZSwgZmllbGQudmFsaWRhdGlvbnMpO1xyXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBnKTtcclxuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sVHlwZSA9PSAnYXJyYXknKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuY3JlYXRlRm9ybUFycmF5KGZpZWxkLnNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBFYXN5Rm9ybUZpZWxkPiwgZmllbGQuaW5pdGlhbFZhbHVlLCBmaWVsZC52YWxpZGF0aW9ucyk7XHJcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLmNvbnRyb2xUeXBlID09ICdhcnJheVNpbXBsZScpIHtcclxuICAgICAgICBjb25zdCBhID0gdGhpcy5jcmVhdGVTaW1wbGVGb3JtQXJyYXkoZmllbGQgYXMgYW55LCBmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLnZhbGlkYXRpb25zKTtcclxuICAgICAgICBncm91cC5hZGRDb250cm9sKGtleSwgYSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLnZhbGlkYXRpb25zID8gdGhpcy5jcmVhdGVWYWxpZGF0aW9ucyhmaWVsZC52YWxpZGF0aW9ucykgOiBbXSk7XHJcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGNvbnRyb2wpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25zKSB7XHJcbiAgICAgIGdyb3VwLmFkZFZhbGlkYXRvcnModGhpcy5jcmVhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbml0aWFsVmFsdWUpIHtcclxuICAgICAgZ3JvdXAucGF0Y2hWYWx1ZShpbml0aWFsVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRm9ybUFycmF5KHNjaGVtYTogRm9ybVNjaGVtYSwgaW5pdGlhbFZhbHVlPzogYW55LCB2YWxpZGF0aW9ucz86IEVhc3lGb3JtRmllbGRbJ3ZhbGlkYXRpb25zJ10pOiBGb3JtQXJyYXkge1xyXG4gICAgY29uc3QgYXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xyXG5cclxuICAgIGlmIChpbml0aWFsVmFsdWUgJiYgQXJyYXkuaXNBcnJheShpbml0aWFsVmFsdWUpKSB7XHJcbiAgICAgIGluaXRpYWxWYWx1ZS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuY3JlYXRlRm9ybUdyb3VwKHNjaGVtYSk7XHJcbiAgICAgICAgZ3JvdXAucGF0Y2hWYWx1ZShpdGVtKTtcclxuICAgICAgICBhcnJheS5wdXNoKGdyb3VwKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25zKSB7XHJcbiAgICAgIGFycmF5LmFkZFZhbGlkYXRvcnModGhpcy5jcmVhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2ltcGxlRm9ybUFycmF5KHNjaGVtYTogRWFzeUZvcm1GaWVsZCwgaW5pdGlhbFZhbHVlPzogYW55LCB2YWxpZGF0aW9ucz86IEVhc3lGb3JtRmllbGRbJ3ZhbGlkYXRpb25zJ10pOiBGb3JtQXJyYXkge1xyXG4gICAgY29uc3QgYXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xyXG4gICAgY29uc3QgZmllbGQgPSBzY2hlbWEuc2NoZW1hIGFzIEVhc3lGb3JtRmllbGQ7XHJcblxyXG4gICAgaWYgKGluaXRpYWxWYWx1ZSAmJiBBcnJheS5pc0FycmF5KGluaXRpYWxWYWx1ZSkpIHtcclxuICAgICAgaW5pdGlhbFZhbHVlLmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKGl0ZW0sIGZpZWxkLnZhbGlkYXRpb25zID8gdGhpcy5jcmVhdGVWYWxpZGF0aW9ucyhmaWVsZC52YWxpZGF0aW9ucykgOiBbXSk7XHJcbiAgICAgICAgYXJyYXkucHVzaChjb250cm9sKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkYXRpb25zKSB7XHJcbiAgICAgIGFycmF5LmFkZFZhbGlkYXRvcnModGhpcy5jcmVhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRpb24+KSB7XHJcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XHJcbiAgICBpZiAodmFsaWRhdGlvbnMpIHtcclxuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uS2V5IGluIHZhbGlkYXRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRpb25zW3ZhbGlkYXRpb25LZXldO1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCh2LnZhbGlkYXRvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0U2NoZW1hV2l0aFBhdGgocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2NoZW1hOiBGb3JtU2NoZW1hIHwgRWFzeUZvcm1GaWVsZCk6IEZvcm1TY2hlbWEgfCBFYXN5Rm9ybUZpZWxkIHwgbnVsbCB7XHJcbiAgICBjb25zdCBoZWFkID0gcGF0aFswXTtcclxuICAgIGNvbnN0IHRhaWwgPSBwYXRoLnNsaWNlKDEpXHJcblxyXG4gICAgY29uc3QgaGFzSW5kZXggPSAhIWhlYWQudG9TdHJpbmcoKS5tYXRjaCgvXlswLTldKy8pO1xyXG4gICAgaWYgKGhhc0luZGV4KSB7XHJcbiAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBFYXN5Rm9ybUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYSA/PyBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0YWlsLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gc2NoZW1hID8/IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTY2hlbWFXaXRoUGF0aCh0YWlsLCBzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgRWFzeUZvcm1GaWVsZCkge1xyXG4gICAgICByZXR1cm4gc2NoZW1hLnNjaGVtYSA/PyBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoaWxkU2NoZW1hID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBFYXN5Rm9ybUZpZWxkPilbaGVhZC50b1N0cmluZygpXTtcclxuICAgIGlmIChjaGlsZFNjaGVtYSkge1xyXG4gICAgICBpZiAodGFpbC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBjaGlsZFNjaGVtYTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2NoZW1hV2l0aFBhdGgodGFpbCwgY2hpbGRTY2hlbWEuc2NoZW1hID8/IHt9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=