ngx-antd-form-builder
Version:
Simple Drag&Drop form builder using ng-zorro-antd
165 lines • 21.4 kB
JavaScript
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { ReactiveFormsModule, UntypedFormGroup } from "@angular/forms";
import { NzLayoutModule } from "ng-zorro-antd/layout";
import { NzFormModule } from "ng-zorro-antd/form";
import { CommonModule } from "@angular/common";
import { BuildBlocksComponent } from "./components/build-blocks/build-blocks.component";
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "ng-zorro-antd/form";
import * as i3 from "@angular/common";
export class NgxAntdFormViewerComponent {
constructor(fb) {
this.fb = fb;
this.initData = {};
this.readonly = false;
this.needInit = true;
this.Submit = new EventEmitter();
this._form = new UntypedFormGroup({});
}
ngOnChanges(changes) {
if (changes["json"]) {
this.refreshFormGroup();
this.refreshReadOnly(this.readonly);
}
if (changes["readonly"] && changes["readonly"].currentValue != changes["readonly"].previousValue) {
this.refreshReadOnly(changes["readonly"].currentValue);
}
}
refreshReadOnly(readonly) {
Object.values(this._form.controls).forEach(control => {
if (readonly) {
control.disable();
}
else {
control.enable();
}
});
}
refreshFormGroup() {
if (!this.json) {
return;
}
const genRulesValidatorFn = (rules) => {
return (control) => {
const value = control.value;
if (rules.length == 0) {
return null;
}
if (typeof value == 'string') {
if (!value && rules[0].required) {
return {
message: rules[0].message
};
}
for (let i = 1; i < rules.length; i++) {
const regex = new RegExp(rules[i].pattern);
if (!regex.test(value)) {
return {
message: rules[i].message
};
}
}
}
else {
//多选框
if (rules[0].required && (!value || value.length == 0)) {
return {
message: rules[0].message
};
}
else {
return null;
}
}
return null;
};
};
const getFlatList = (list, parent) => {
const result = [];
const recursive = (list, parent) => {
list.forEach(data => {
data.__parent = parent;
if (['tabs', 'grid', 'collapse'].includes(data.type)) {
data.columns.forEach(col => {
recursive(col.list, data);
});
}
else if (data.type == 'card' || data.type == 'block') {
recursive(data.list, data);
}
else {
result.push(data);
}
});
};
recursive(list, parent ? parent : {});
return result;
};
const result = getFlatList(this.json.list);
this._flatResult = result;
const obj = result.reduce((prev, cur) => {
prev[cur.key] =
this.initData && this.initData[cur.key] !== undefined ? [this.initData[cur.key]] : /**/
[this.needInit && cur.options?.defaultValue || ''];
if (cur.rules) {
prev[cur.key].push(genRulesValidatorFn(cur.rules));
}
return prev;
}, {});
this._form = this.fb.group(obj);
}
getData() {
return {
...this._form.value
};
}
checkValid() {
Object.values(this._form.controls).forEach(control => {
control.markAsDirty();
control.updateValueAndValidity();
});
return Object.entries(this._form.controls).filter(([k, c]) => !c.valid)
.map(([c]) => this._flatResult.find(f => f.key == c)).filter(c => !!c).map(c => c.label);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: NgxAntdFormViewerComponent, deps: [{ token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: NgxAntdFormViewerComponent, isStandalone: true, selector: "ngx-antd-form-viewer", inputs: { json: "json", initData: "initData", readonly: "readonly", needInit: "needInit" }, outputs: { Submit: "Submit" }, usesOnChanges: true, ngImport: i0, template: `
<form *ngIf="json && json.list" nz-form [nzLayout]="json.config.layout"
class="k-form-build-9136076486841527"
[formGroup]="_form" [ngStyle]="{'width': json.config.previewWidth}">
<app-build-blocks *ngFor="let record of json.list; index as i"
[record]="record"
[form]="_form"
[formConfig]="json.config"
></app-build-blocks>
</form>
`, isInline: true, styles: [""], dependencies: [{ kind: "component", type: BuildBlocksComponent, selector: "app-build-blocks", inputs: ["formConfig", "record", "form"] }, { kind: "ngmodule", type: NzLayoutModule }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: NgxAntdFormViewerComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-antd-form-viewer', standalone: true, template: `
<form *ngIf="json && json.list" nz-form [nzLayout]="json.config.layout"
class="k-form-build-9136076486841527"
[formGroup]="_form" [ngStyle]="{'width': json.config.previewWidth}">
<app-build-blocks *ngFor="let record of json.list; index as i"
[record]="record"
[form]="_form"
[formConfig]="json.config"
></app-build-blocks>
</form>
`, imports: [
BuildBlocksComponent,
NzLayoutModule, NzFormModule, CommonModule, ReactiveFormsModule,
] }]
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }], propDecorators: { json: [{
type: Input
}], initData: [{
type: Input
}], readonly: [{
type: Input
}], needInit: [{
type: Input
}], Submit: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFudGQtZm9ybS12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWFudGQtZm9ybS1idWlsZGVyL3NyYy9saWIvbmd4LWFudGQtZm9ybS12aWV3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLEtBQUssRUFBdUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQW1CLG1CQUFtQixFQUFzQixnQkFBZ0IsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7OztBQXNCeEYsTUFBTSxPQUFPLDBCQUEwQjtJQVNyQyxZQUNVLEVBQXNCO1FBQXRCLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBUnZCLGFBQVEsR0FBeUIsRUFBRSxDQUFDO1FBQzNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN4QixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU83QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFB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QyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzVGLENBQUM7K0dBdEhVLDBCQUEwQjttR0FBMUIsMEJBQTBCLGdPQWpCM0I7Ozs7Ozs7Ozs7R0FVVCwwRUFHQyxvQkFBb0Isc0dBQ3BCLGNBQWMsOEJBQUUsWUFBWSxrUEFBQyxZQUFZLG9WQUFFLG1CQUFtQjs7NEZBR3JELDBCQUEwQjtrQkFwQnRDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksWUFDTjs7Ozs7Ozs7OztHQVVULFdBRVE7d0JBQ1Asb0JBQW9CO3dCQUNwQixjQUFjLEVBQUUsWUFBWSxFQUFDLFlBQVksRUFBRSxtQkFBbUI7cUJBQy9EO3VGQUdRLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNZLFFBQVE7c0JBQXpCLEtBQUs7Z0JBQ1ksUUFBUTtzQkFBekIsS0FBSztnQkFDYSxNQUFNO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBOekxheW91dE1vZHVsZSB9IGZyb20gXCJuZy16b3Jyby1hbnRkL2xheW91dFwiO1xyXG5pbXBvcnQgeyBOekZvcm1Nb2R1bGUgfSBmcm9tIFwibmctem9ycm8tYW50ZC9mb3JtXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQnVpbGRCbG9ja3NDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2J1aWxkLWJsb2Nrcy9idWlsZC1ibG9ja3MuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1hbnRkLWZvcm0tdmlld2VyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgPGZvcm0gKm5nSWY9XCJqc29uICYmIGpzb24ubGlzdFwiIG56LWZvcm0gW256TGF5b3V0XT1cImpzb24uY29uZmlnLmxheW91dFwiXHJcbiAgICBjbGFzcz1cImstZm9ybS1idWlsZC05MTM2MDc2NDg2ODQxNTI3XCJcclxuICAgIFtmb3JtR3JvdXBdPVwiX2Zvcm1cIiBbbmdTdHlsZV09XCJ7J3dpZHRoJzoganNvbi5jb25maWcucHJldmlld1dpZHRofVwiPlxyXG4gICAgPGFwcC1idWlsZC1ibG9ja3MgKm5nRm9yPVwibGV0IHJlY29yZCBvZiBqc29uLmxpc3Q7IGluZGV4IGFzIGlcIlxyXG4gICAgICBbcmVjb3JkXT1cInJlY29yZFwiXHJcbiAgICAgIFtmb3JtXT1cIl9mb3JtXCJcclxuICAgICAgW2Zvcm1Db25maWddPVwianNvbi5jb25maWdcIlxyXG4gICAgPjwvYXBwLWJ1aWxkLWJsb2Nrcz5cclxuICA8L2Zvcm0+XHJcbiAgYCxcclxuICBzdHlsZXM6IGBgLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIEJ1aWxkQmxvY2tzQ29tcG9uZW50LFxyXG4gICAgTnpMYXlvdXRNb2R1bGUsIE56Rm9ybU1vZHVsZSxDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4QW50ZEZvcm1WaWV3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGpzb246IGFueTtcclxuICBASW5wdXQoKSBpbml0RGF0YToge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcclxuICBASW5wdXQoKSByZWFkb25seSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5IG5lZWRJbml0OiBib29sZWFuID0gdHJ1ZTtcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBfZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBwcml2YXRlIF9mbGF0UmVzdWx0XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9mb3JtID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pXHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1tcImpzb25cIl0pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoRm9ybUdyb3VwKClcclxuICAgICAgdGhpcy5yZWZyZXNoUmVhZE9ubHkodGhpcy5yZWFkb25seSlcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzW1wicmVhZG9ubHlcIl0gJiYgY2hhbmdlc1tcInJlYWRvbmx5XCJdLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzW1wicmVhZG9ubHlcIl0ucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICB0aGlzLnJlZnJlc2hSZWFkT25seShjaGFuZ2VzW1wicmVhZG9ubHlcIl0uY3VycmVudFZhbHVlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFJlYWRPbmx5KHJlYWRvbmx5OiBib29sZWFuKSB7XHJcbiAgICBPYmplY3QudmFsdWVzKHRoaXMuX2Zvcm0uY29udHJvbHMpLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgIGlmIChyZWFkb25seSkge1xyXG4gICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udHJvbC5lbmFibGUoKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEZvcm1Hcm91cCgpIHtcclxuICAgIGlmICghdGhpcy5qc29uKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgY29uc3QgZ2VuUnVsZXNWYWxpZGF0b3JGbjogKChydWxlczogYW55W10pID0+IFZhbGlkYXRvckZuKSA9IChydWxlcykgID0+IHtcclxuICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWVcclxuICAgICAgICBpZiAocnVsZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBpZiAoIXZhbHVlICYmIHJ1bGVzWzBdLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogcnVsZXNbMF0ubWVzc2FnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChydWxlc1tpXS5wYXR0ZXJuKVxyXG4gICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJ1bGVzW2ldLm1lc3NhZ2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy/lpJrpgInmoYZcclxuICAgICAgICAgIGlmIChydWxlc1swXS5yZXF1aXJlZCAmJiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHJ1bGVzWzBdLm1lc3NhZ2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0RmxhdExpc3QgPSAobGlzdCwgcGFyZW50PykgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IGFueVtdID0gW11cclxuICAgICAgY29uc3QgcmVjdXJzaXZlID0gKGxpc3QsIHBhcmVudCkgPT4ge1xyXG4gICAgICAgIGxpc3QuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgIGRhdGEuX19wYXJlbnQgPSBwYXJlbnRcclxuICAgICAgICAgIGlmIChbJ3RhYnMnLCAnZ3JpZCcsICdjb2xsYXBzZSddLmluY2x1ZGVzKGRhdGEudHlwZSkpIHtcclxuICAgICAgICAgICAgZGF0YS5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgICByZWN1cnNpdmUoY29sLmxpc3QsIGRhdGEpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSAnY2FyZCcgfHwgZGF0YS50eXBlID09ICdibG9jaycpIHtcclxuICAgICAgICAgICAgcmVjdXJzaXZlKGRhdGEubGlzdCwgZGF0YSlcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICByZWN1cnNpdmUobGlzdCwgcGFyZW50ID8gcGFyZW50IDp7fSlcclxuICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0RmxhdExpc3QodGhpcy5qc29uLmxpc3QpXHJcbiAgICB0aGlzLl9mbGF0UmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgY29uc3Qgb2JqID0gcmVzdWx0LnJlZHVjZSgocHJldiwgY3VyKSA9PiB7XHJcbiAgICAgIHByZXZbY3VyLmtleV0gPSBcclxuICAgICAgICB0aGlzLmluaXREYXRhICYmIHRoaXMuaW5pdERhdGFbY3VyLmtleV0gIT09IHVuZGVmaW5lZCA/IFt0aGlzLmluaXREYXRhW2N1ci5rZXldXSA6IC8qKi9cclxuICAgICAgICBbdGhpcy5uZWVkSW5pdCAmJiBjdXIub3B0aW9ucz8uZGVmYXVsdFZhbHVlIHx8ICcnXTtcclxuICAgICAgaWYgKGN1ci5ydWxlcykge1xyXG4gICAgICAgIHByZXZbY3VyLmtleV0ucHVzaChnZW5SdWxlc1ZhbGlkYXRvckZuKGN1ci5ydWxlcykpXHJcbiAgICAgIH0gXHJcbiAgICAgIHJldHVybiBwcmV2XHJcbiAgICB9LCB7fSlcclxuICAgIHRoaXMuX2Zvcm0gPSB0aGlzLmZiLmdyb3VwKG9iailcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4udGhpcy5fZm9ybS52YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrVmFsaWQoKSB7XHJcbiAgICBPYmplY3QudmFsdWVzKHRoaXMuX2Zvcm0uY29udHJvbHMpLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX2Zvcm0uY29udHJvbHMpLmZpbHRlcigoW2ssIGNdKSA9PiAhYy52YWxpZClcclxuICAgICAgLm1hcCgoW2NdKSA9PiB0aGlzLl9mbGF0UmVzdWx0LmZpbmQoZiA9PiBmLmtleSA9PSBjKSkuZmlsdGVyKGMgPT4gISFjKS5tYXAoYyA9PiBjLmxhYmVsKVxyXG4gIH1cclxufVxyXG4iXX0=