@eqproject/eqp-dynamic-module 2.3.11 → 2.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +12 -4
- package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +11 -2
- package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +3 -3
- package/fesm2015/eqproject-eqp-dynamic-module.mjs +23 -6
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +23 -6
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.d.ts +3 -1
- package/package.json +1 -1
package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs
CHANGED
|
@@ -435,10 +435,10 @@ export class AddFormRecordComponent {
|
|
|
435
435
|
}
|
|
436
436
|
}
|
|
437
437
|
AddFormRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AddFormRecordComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
|
|
438
|
-
AddFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AddFormRecordComponent, selector: "add-form-record", inputs: { debugMode: "debugMode", configurations: "configurations", endPointConfiguration: "endPointConfiguration", userID: "userID", formID: "formID", form: "form", record: "record", onlyView: "onlyView" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent" }, viewQueries: [{ propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i3.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i3.MatStepperNext, selector: "button[matStepperNext]", inputs: ["type"] }, { kind: "directive", type: i3.MatStepperPrevious, selector: "button[matStepperPrevious]", inputs: ["type"] }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: ["field", "form", "record"], outputs: ["recordChange"] }] });
|
|
438
|
+
AddFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AddFormRecordComponent, selector: "add-form-record", inputs: { debugMode: "debugMode", configurations: "configurations", endPointConfiguration: "endPointConfiguration", userID: "userID", formID: "formID", form: "form", record: "record", onlyView: "onlyView" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent" }, viewQueries: [{ propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [debugMode]=\"debugMode\" [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i3.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i3.MatStepperNext, selector: "button[matStepperNext]", inputs: ["type"] }, { kind: "directive", type: i3.MatStepperPrevious, selector: "button[matStepperPrevious]", inputs: ["type"] }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: ["debugMode", "field", "form", "record"], outputs: ["recordChange"] }] });
|
|
439
439
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AddFormRecordComponent, decorators: [{
|
|
440
440
|
type: Component,
|
|
441
|
-
args: [{ selector: "add-form-record", template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>" }]
|
|
441
|
+
args: [{ selector: "add-form-record", template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [debugMode]=\"debugMode\" [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>" }]
|
|
442
442
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.UtilityHelperService }]; }, propDecorators: { debugMode: [{
|
|
443
443
|
type: Input
|
|
444
444
|
}], configurations: [{
|
|
@@ -463,4 +463,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
463
463
|
type: ViewChildren,
|
|
464
464
|
args: ["fieldTemplate"]
|
|
465
465
|
}] } });
|
|
466
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9mb3JtLXJlY29yZHMvYWRkLWZvcm0tcmVjb3JkL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2FkZC1mb3JtLXJlY29yZC9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNILE9BQU8sRUFBRSxXQUFXLEVBQWEsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0YsT0FBTyxFQUFRLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVuRixPQUFPLEVBQTZDLGFBQWEsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7O0FBRTVILDJHQUEyRztBQU8zRyxNQUFNLE9BQU8sc0JBQXNCO0lBR2pDLFFBQVEsQ0FBQyxPQUFlLEVBQUUsT0FBYTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDOUI7SUFDSCxDQUFDO0lBOEJELFlBQ1UsR0FBc0IsRUFDdkIs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Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQVlJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUlQLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2R5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgQW5zd2VyU3R5bGUsIEJhc2VGaWVsZCwgRmllbGRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBGb3JtLCBGb3JtU2NhbGFyVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IER5blJlY29yZCwgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVGaWVsZEZpeENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2R5bmFtaWMtbW9kdWxlLWZpZWxkLWZpeC9keW5hbWljLW1vZHVsZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24sIEVuZFBvaW50RGF0YVBhcmFtcywgUGFyYW1UeXBlRW51bSB9IGZyb20gJy4vLi4vLi4vLi4vLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IExpc3RWYWx1ZUZpZWxkIH0gZnJvbSAncHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvbW9kZWxzL2ZpZWxkcy9saXN0VmFsdWVGaWVsZC5tb2RlbCc7XHJcbi8vIGltcG9ydCB7IER5bmFtaWNNb2R1bGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2R5bmFtaWMtbW9kdWxlLWZpZWxkL2R5bmFtaWMtbW9kdWxlLWZpZWxkLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhZGQtZm9ybS1yZWNvcmRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRGb3JtUmVjb3JkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgZGVidWdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGVidWdMb2cobWVzc2FnZTogc3RyaW5nLCBlbGVtZW50PzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Z01vZGUpIHtcclxuICAgICAgY29uc29sZS5sb2cobWVzc2FnZSwgZWxlbWVudClcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uczogRHluYW1pY01vZHVsZUNvbXBpbGVDb25maWc7XHJcbiAgQElucHV0KCkgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb247XHJcbiAgQElucHV0KCkgdXNlcklEOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIGZvcm1JRDogc3RyaW5nID0gbnVsbDsgLy8gcHJldmlld1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm0gPSBudWxsOyAvLyBwcmV2aWV3IGNvbmZpZ1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkIHwgc3RyaW5nID0gbnVsbDsgLy8gZWRpdFxyXG4gIEBJbnB1dCgpIG9ubHlWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNob3dUaXRsZSA9IHRydWU7XHJcbiAgc2hvd1NhdmVCdXR0b24gPSB0cnVlO1xyXG4gIHNob3dCYWNrQnV0dG9uID0gdHJ1ZTtcclxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZm9ybUZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgZmllbGRHcm91cHM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8QmFzZUZpZWxkPiB9ID0ge307XHJcbiAgRm9ybVNjYWxhclR5cGVFbnVtID0gRm9ybVNjYWxhclR5cGVFbnVtO1xyXG4gIEZpZWxkVHlwZUVudW0gPSBGaWVsZFR5cGVFbnVtO1xyXG5cclxuICBAT3V0cHV0KCkgc2F2ZVJlY29yZEV2ZW50OiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBhZnRlclNhdmVSZWNvcmRFdmVudDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPVxyXG4gICAgbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oXCJmaWVsZFRlbXBsYXRlXCIpXHJcbiAgZmllbGRUZW1wbGF0ZTogUXVlcnlMaXN0PER5bmFtaWNNb2R1bGVGaWVsZEZpeENvbXBvbmVudD47XHJcbiAgYWRkaXRpb25hbFBhcmFtczogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB1dGlsaXR5U2VydmljZTogVXRpbGl0eUhlbHBlclNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGFkZCBwdcOyIGZ1bnppb25hcmUgYW5jaGUgY29tZSBtb2RpZmljYSBlIGNvbWUgcHJldmlld1xyXG4gICAgLy8gaW4gYWRkIGFiYmlhbW8gaW4gaW5wdXQgbCdJRCBkZWwgRm9ybVxyXG4gICAgLy8gaW4gbW9kaWZpY2EgYWJiaWFtbyBpbiBpbnB1dCBsJ0lEIGRlbCBSZWNvcmRcclxuICAgIC8vIGluIHByZXZpZXcgYWJiaWFtbyBpbiBpbnB1dCBpbCBGb3JtKGNhc28gY29uZmlndXJhdG9yKSBvIGwnSUQgZGVsIG1vZHVsbyBvbiBvbmx5VmlldyBpbXBvc3RhdG8gYSB0cnVlXHJcbiAgICB0aGlzLnNob3dUaXRsZSA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd1RpdGxlO1xyXG4gICAgdGhpcy5zaG93U2F2ZUJ1dHRvbiA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd1NhdmVCdXR0b247XHJcbiAgICB0aGlzLnNob3dCYWNrQnV0dG9uID0gdGhpcy5jb25maWd1cmF0aW9ucy5zaG93QmFja0J1dHRvbjtcclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coXCJ0aGlzLnJlY29yZFwiLHRoaXMucmVjb3JkKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZWNvcmQgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnByZXZpZXdPck5ld1Jlc3BvbnNlUmVjb3JkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRSZXNwb25zZVJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGwnaW5pemlhbGl6emF6aW9uZSB0ZXJtaW5hIGNvbiBpbCByZWN1cGVybyBkZWwgcmVjb3JkIG8gY29uIGwnaW5pemlhbGl6emF6aW9uZSBkZWwgZm9ybSB2dW90b1xyXG5cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuZGVidWdMb2coJ29uaW5pdCAtIER5bmFGb3JtJywgdGhpcy5mb3JtKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGFsIGNhbWJpbyBkZWwgdmFsb3JlIGRpIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gcmVjb3JkLlxyXG4gICAqIFNlcnZlIGFkIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRpIHR1dHRpIGkgY2FtcGkgY2hlIGhhbm5vIHVuYSBmb3JtdWxhLlxyXG4gICAqL1xyXG4gIG9uUmVjb3JkQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGRUZW1wbGF0ZSAmJiB0aGlzLmZpZWxkVGVtcGxhdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZpZWxkVGVtcGxhdGUuZm9yRWFjaCgoZikgPT4gZi51cGRhdGVGaWVsZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByZXZpZXdPck5ld1Jlc3BvbnNlUmVjb3JkKCkge1xyXG4gICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkKCk7XHJcbiAgICAvLyBhZ2dpdWduaSBudW92b1xyXG4gICAgaWYgKHRoaXMuZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHByZXZpZXcgcGVyIGlsIGNvbmZpZ3VyYXRvclxyXG4gICAgICB0aGlzLmZpZWxkc0NvbmZpZygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1JRCAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHByZXZpZXcgcGVyIGFkbWluXHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUJ5SUQoKTsgLy8gZGVudHJvIGNoaWFtYSBmaWVsZHNDb25maWdcclxuICAgIH1cclxuICB9XHJcbiAgZWRpdFJlc3BvbnNlUmVjb3JkKCkge1xyXG4gICAgLy8gbW9kaWlsdMOgIG1vZGlmaWNhXHJcbiAgICBpZiAodHlwZW9mIHRoaXMucmVjb3JkID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIC8vIGFsbG9yYSDDqCB1biBJRFxyXG4gICAgICB0aGlzLmdldFJlY29yZEJ5SUQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGlsIHJlY29yZCB2aWVuZSBwYXNzYXRvIGNvbWUgdGFsZVxyXG4gICAgICAvLyAoPFJlY29yZD50aGlzLnJlY29yZCkuRW50SUQgPSBcIjNcIjtcclxuICAgICAgLy8gKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLlZlcnNpb247XHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaSBkYXRpIGluc2VyaXRpIGRhbGwndXRlbnRlIHVuYSB2b2x0YSBjb25jbHVzYSBsYSBjb21waWxhemlvbmUgZGVsbGEgZm9ybS5cclxuICAgKi9cclxuICBzYXZlT3JFeGl0Rm9ybShleGl0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKCdhZGQtZm9ybS1yZWNvcmQgc2F2ZVJlY29yZEV2ZW50JylcclxuICAgIGlmIChleGl0KSB7XHJcbiAgICAgIC8vIHRoaXMuc2F2ZVJlY29yZEV2ZW50LmVtaXQobnVsbCk7XHJcbiAgICAgIHRoaXMub25TYXZlUmVjb3JkKG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdGhpcy5zYXZlUmVjb3JkRXZlbnQuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICAgIHRoaXMub25TYXZlUmVjb3JkKCg8UmVjb3JkPnRoaXMucmVjb3JkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaWwgcmVjb3JkIGFnZ2l1bnRvIG8gbW9kaWZpY2F0by5cclxuICAgKiBTZSDDqCBzdGF0byBjb25maWd1cmF0byB1biBlbmRQb2ludCBwZXIgaWwgc2FsdmF0YWdnaW8gdmllbmUgZWZmZXR0dWF0YSB1bmEgY2hpYW1hdGEgYWwgc2VydmVyIHBhc3NhbmRvIGwnb2dnZXRvIGRhIHNhbHZhcmVcclxuICAgKiBuZWwgYm9keSBkZWxsYSBjaGlhbWF0YSwgYWx0cmltZW50aSBzY2F0ZW5hIGwnZXZlbnRvIFwic2F2ZVJlY29yZFwiLlxyXG4gICAqIEBwYXJhbSBldmVudCBPZ2dldHRvIGRpIHRpcG8gUmVjb3JkIGRhIHNhbHZhcmUuXHJcbiAgICovXHJcbiAgb25TYXZlUmVjb3JkKGV2ZW50OiBSZWNvcmQpIHtcclxuICAgIHRoaXMuZGVidWdMb2coJ29uU2F2ZVJlY29yZCAtIGV2ZW50JywgZXZlbnQpXHJcbiAgICB0aGlzLmRlYnVnTG9nKCdvblNhdmVSZWNvcmQgLSBmb3JtJywgdGhpcy5mb3JtKVxyXG4gICAgaWYgKFxyXG4gICAgICBldmVudCAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5TYXZlRW5kUG9pbnRcclxuICAgICkge1xyXG4gICAgICB2YXIgZHluUmVjOiBEeW5SZWNvcmQgPSBuZXcgRHluUmVjb3JkKCk7XHJcbiAgICAgIGR5blJlYy5JRCA9IGV2ZW50LklEID8/IG51bGw7XHJcbiAgICAgIGR5blJlYy5FbnRJRCA9IHRoaXMuZm9ybS5JRDtcclxuICAgICAgZHluUmVjLlZlcnNpb24gPSB0aGlzLmZvcm0uVmVyc2lvbjtcclxuICAgICAgZHluUmVjLnVzZXJJRCA9IHRoaXMudXNlcklEO1xyXG4gICAgICBkeW5SZWMuVmFsdWVzID0gZXZlbnQgPz8gbnVsbDtcclxuICAgICAgZHluUmVjLkhUTUxyZWFkYWJsZVZhbHVlcyA9IHRoaXMuY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzKGV2ZW50KTtcclxuICAgICAgZHluUmVjLkFkZGl0aW9uYWxQYXJhbXMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFkZGl0aW9uYWxQYXJhbXMpO1xyXG4gICAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBQYXJhbU5hbWU6IFwiUmVjb3JkXCIsXHJcbiAgICAgICAgICBQYXJhbVZhbHVlOiBkeW5SZWMsXHJcbiAgICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJJbiBCb2R5XCJdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuU2F2ZUVuZFBvaW50LFxyXG4gICAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgICAgKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hZnRlclNhdmVSZWNvcmRFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNhdmVSZWNvcmRFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm1CeUlEKGlkOiBzdHJpbmcgPSB0aGlzLmZvcm1JRCkge1xyXG4gICAgY29uc3QgZHluYW1pY01vZHVsZVBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9XHJcbiAgICAgIG5ldyBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+KCk7XHJcbiAgICBkeW5hbWljTW9kdWxlUGFyYW1zLnB1c2goe1xyXG4gICAgICBQYXJhbU5hbWU6IFwiaWRcIixcclxuICAgICAgUGFyYW1WYWx1ZTogaWQsXHJcbiAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMuR2V0QnlJREVuZFBvaW50LFxyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAocmVzOiBGb3JtKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gcmVzO1xyXG4gICAgICAgIHRoaXMuZGVidWdMb2coJ2dldEZvcm1CeUlEIC0gRHluYUZvcm0nLCB0aGlzLmZvcm0pXHJcbiAgICAgICAgdGhpcy5maWVsZHNDb25maWcoKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4geyB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gY2kgZW50cm8gc29sbyBzZSDDqCBzdGF0byBwYXNzYXRvIGlsIHBhcmFtZXRybyBcInJlY29yZFwiIGNvbWUgc3RyaW5nYVxyXG4gIGdldFJlY29yZEJ5SUQoKSB7XHJcbiAgICAvLyBwcmVwYXJvIGkgZGF0aSBkZWwgcmVjb3JkXHJcbiAgICB2YXIgZHluYW1pY1JlY29yZFBhcmFtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIFBhcmFtTmFtZTogXCJpZFwiLFxyXG4gICAgICAgIFBhcmFtVmFsdWU6IHRoaXMucmVjb3JkLFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEJ5SURFbmRQb2ludCxcclxuICAgICAgZHluYW1pY1JlY29yZFBhcmFtcyxcclxuICAgICAgKHJlczogRHluUmVjb3JkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkKCk7XHJcblxyXG4gICAgICAgICg8UmVjb3JkPnRoaXMucmVjb3JkKSA9IEpTT04ucGFyc2UocmVzLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLklEID0gcmVzLklEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLkVudElEID0gcmVzLkVudElEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLnVzZXJJRCA9IHJlcy51c2VySUQ7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuVmVyc2lvbiA9IHJlcy5WZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLlZhbHVlcyA9IEpTT04ucGFyc2UocmVzLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgIC8vIHRoaXMudmlld01vZGUgPSBEeW5hbWljTW9kdWxlVmlld01vZGVFbnVtLkNPTVBJTEU7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uKCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGdldEZvcm1CeUlEYW5kVmVyc2lvbigpIHtcclxuICAgIC8vIHByZXBhcm8gbGEgdmVyc2lvbmUgY29ycmV0dGEgZGVsIGZvcm1cclxuICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcIkVudElEXCIsXHJcbiAgICAgICAgUGFyYW1WYWx1ZTogKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLkVudElELFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcIlZlcnNpb25cIixcclxuICAgICAgICBQYXJhbVZhbHVlOiAoPFJlY29yZD50aGlzLnJlY29yZCkuVmVyc2lvbixcclxuICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uIC0gdGhpcyByZWNvcmRcIiwgPFJlY29yZD50aGlzLnJlY29yZClcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3Jtcy5HZXRCeUlEQW5kVmVyc2lvbkVuZFBvaW50LFxyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAocmVzOiBGb3JtKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gcmVzO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKTtcclxuICAgICAgICB0aGlzLnJlb3JkZXJGb3JtRmllbGRzKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZSkge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmaWVsZHNDb25maWcoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMucmVvcmRlckZvcm1GaWVsZHMoKTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwKCk7XHJcbiAgICBpZiAodGhpcy5mb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZSkge1xyXG4gICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXBzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiZmllbGRzQ29uZmlnIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgbmVsbCdvZ2dldHRvIFJlY29yZCBsZSBwcm9wcmlldMOgIG1hbmNhbnRpIHJpc3BldHRvIGFpIGNhbXBpIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZWNvcmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgY29uc3QgcmVjb3JkUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKHRoaXMucmVjb3JkKTtcclxuICAgIHRoaXMuZm9ybS5GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGZpZWxkLk5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbZmllbGQuTmFtZV0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmZvcm0uSW5uZXJGb3JtcyAmJiB0aGlzLmZvcm0uSW5uZXJGb3Jtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5Jbm5lckZvcm1zLmZvckVhY2goKGZvcm0pID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheU5hbWU6IHN0cmluZyA9IGZvcm0uTmFtZS5zcGxpdChcIiBcIikuam9pbihcIl9cIik7XHJcbiAgICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGFycmF5TmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMucmVjb3JkW2FycmF5TmFtZV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZVJlY29yZFByb3BlcnRpZXMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHJpb3JkaW5hcmUgaSBjYW1waSBjaGUgY29tcG9uZ29ubyBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVvcmRlckZvcm1GaWVsZHMoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLkZpZWxkcyAmJiB0aGlzLmZvcm0uRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5mb3JtLkZpZWxkcy5zb3J0KChhLCBiKSA9PlxyXG4gICAgICAgIGEuT3JkaW5hbFBvc2l0aW9uID4gYi5PcmRpbmFsUG9zaXRpb24gPyAxIDogYi5PcmRpbmFsUG9zaXRpb24gPiBhLk9yZGluYWxQb3NpdGlvbiA/IC0xIDogMCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwicmVvcmRlckZvcm1GaWVsZHMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpbCBGb3JtR3JvdXAgY2hlIHJhcHByZXNlbnRhIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoKSB7XHJcbiAgICB0aGlzLmZvcm1Gb3JtID0gdGhpcy51dGlsaXR5U2VydmljZS5DcmVhdGVGb3JtRm9ybUdyb3VwKFxyXG4gICAgICB0aGlzLmZvcm0uRmllbGRzLFxyXG4gICAgICAoPFJlY29yZD50aGlzLnJlY29yZCksXHJcbiAgICAgIHRoaXMub25seVZpZXdcclxuICAgICk7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiY3JlYXRlRm9ybUdyb3VwIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaSBncnVwcGkgaW4gY3VpIHJhZ2dydXBwYXJlIGkgY2FtcGkgZGVsbGEgZm9ybSBpbiBiYXNlXHJcbiAgICogYSBjb21lIMOoIHN0YXRhIGNvbmZpZ3VyYXRhIGRhbGwndXRlbnRlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlRmllbGRHcm91cHMoKSB7XHJcbiAgICB0aGlzLmZvcm0uRm9ybUZpZWxkc0dyb3Vwcy5zb3J0KChhLCBiKSA9PiBhLk9yZGluYWxQb3NpdGlvbiA+IGIuT3JkaW5hbFBvc2l0aW9uID8gMSA6IGIuT3JkaW5hbFBvc2l0aW9uID4gYS5PcmRpbmFsUG9zaXRpb24gPyAtMSA6IDApXHJcbiAgICAgIC5tYXAoKGcpID0+IGcuTmFtZSlcclxuICAgICAgLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmllbGRHcm91cHNbZ3JvdXBOYW1lXSA9IHRoaXMuZm9ybS5GaWVsZHMuZmlsdGVyKFxyXG4gICAgICAgICAgKGYpID0+IGYuRmllbGRHcm91cCA9PSBncm91cE5hbWVcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZUZpZWxkR3JvdXBzIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaWwgRm9ybUdyb3VwIGNoZSByYXBwcmVzZW50YSBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzKHJlY29yZDogUmVjb3JkKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzIC0gcmVjb3JkXCIsIHJlY29yZCk7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gICAgLy8gYWxlcnQoXCJjb250aW51ZSBmb3IgdmFsdWVzP1wiKVxyXG4gICAgbGV0IG91dHB1dFZhbHVlc0FycmF5OiBBcnJheTxhbnk+ID0gdGhpcy5nZXRSZXNwb25zZVZhbHVlcyhyZWNvcmQsIHRoaXMuZm9ybSk7XHJcbiAgICBcclxuICAgIHRoaXMuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSBvdXRwdXRWYWx1ZXNBcnJheVwiLCBvdXRwdXRWYWx1ZXNBcnJheSk7XHJcbiAgICAvLyBhbGVydChcImNvbnRpbnVlIGZvciB0ZW1wbGF0ZXM/XCIpXHJcbiAgICBsZXQgdGVtcGxhdGU6IHN0cmluZyA9IHRoaXMuZ2V0UmVzcG9uc2VUZW1wbGF0ZShyZWNvcmQsIHRoaXMuZm9ybSk7IC8vIG9nZ2V0dG8gbmVsIHF1YWxlIHZpZW5lIGNvc3RydWl0byBpbCB0ZW1wbGF0ZSBvIGNoZSBwcmVuZGUgaWwgdmFsb3JlIGRhIHVuIHRlbXBsYXRlIGVzdGVybm9cclxuICAgIFxyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIHRlbXBsYXRlXCIsIHRlbXBsYXRlKTtcclxuICAgIC8vIGFsZXJ0KFwiY29udGludWUgZm9yIG91dHB1dD9cIilcclxuICAgIGNvbnN0IHJlZ2V4ID0gLyMjKFtcXHddKykjIy9nO1xyXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5yZXBsYWNlVGVtcGxhdGVQbGFjZWhvbGRlcnNXaXRoVmFsdWVzKHRlbXBsYXRlLCBvdXRwdXRWYWx1ZXNBcnJheSwgcmVnZXgpXHJcblxyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIG91dHB1dFwiLCBvdXRwdXQpO1xyXG4gICAgLy8gYWxlcnQoXCJjb250aW51ZSBmb3IgZW5kaW5nP1wiKVxyXG4gICAgcmV0dXJuIG91dHB1dDsgLy8gb2dnZXR0byBjaGUgY29udGVycsOgIGwnb3V0cHV0IGVsYWJvcmF0byAgICBcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlc3BvbnNlVmFsdWVzKHJlY29yZDogUmVjb3JkLCBmb3JtOiBGb3JtKTogQXJyYXk8YW55PiB7XHJcbiAgICBsZXQgb3V0cHV0VmFsdWVzQXJyYXk6IEFycmF5PGFueT4gPSBbXTsgLy8gYXJyYXkgY29uIGkgdmFsb3JpIGRlbGxlIHJpc3Bvc3RlXHJcbiAgICAvLyg8RHluUmVjb3JkPnRoaXMucmVjb3JkKS5WYWx1ZXMgw6ggbGEgbGlzdGEgZGkgb2dnZXR0aSB7ZmllbGROYW1lOiB2YWxvcmV9XHJcbiAgICAvLyB0aGlzLmRlYnVnTG9nKFwiKHJlY29yZCkuVmFsdWVzXCIsIHJlY29yZCk7XHJcblxyXG4gICAgZm9ybS5GaWVsZHMuZm9yRWFjaChcclxuICAgICAgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJnZXRSZXNwb25zZVZhbHVlcyBmaWVsZFwiLCBmaWVsZCk7XHJcbiAgICAgICAgICAvLyBsZXQgZm91bmRPYmplY3QgPSByZWNvcmQuZmluZChcclxuICAgICAgICAgIC8vICAgKG9iaikgPT4gb2JqID09PSBmaWVsZC5OYW1lXHJcbiAgICAgICAgICAvLyApO1xyXG4gICAgICAgICAgbGV0IGZvdW5kT2JqZWN0ID0gcmVjb3JkW2ZpZWxkLk5hbWVdO1xyXG5cclxuICAgICAgICAgIC8vIGdlc3RpcmUgY2FzbyBmaWVsZHR5cGUgOCBbZWxlbmNvIGdlbmVyaWNvXVxyXG4gICAgICAgICAgLy8gZmFyZSB1biBldmFsIHBlciBwb3BvbGFyZSBpIHZhbHVlUGFpcnMgc2Ugw6ggcHJlc2VudGUgdW5hIGZvcm11bGFcclxuICAgICAgICAgIC8vIHByZW5kZXJlIGxhIGxhYmVsIGNvcnJldHRhXHJcbiAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgaWYgKGZpZWxkLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgICAgICAgICAgLy8gYWdnaXVuZ28gYSB2YWx1ZXBhaXJzIGkgdmFsb3JpIGNhbGNvbGF0aVxyXG4gICAgICAgICAgICAgIC8vICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnMgPSB7fTtcclxuICAgICAgICAgICAgICB2YXIgdGVtcCA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKFxyXG4gICAgICAgICAgICAgICAgZmllbGQuRm9ybXVsYSxcclxuICAgICAgICAgICAgICAgIHJlY29yZCxcclxuICAgICAgICAgICAgICAgIG51bGxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCJ0ZW1wXCIsIHRlbXApO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGtleTIgaW4gdGVtcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmlzTnVtZXJpYyh0ZW1wW2tleTJdKSkge1xyXG4gICAgICAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW051bWJlcihrZXkyKV0gPSB0ZW1wW2tleTJdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlyc1trZXkyXSA9IHRlbXBba2V5Ml07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCIocmVjb3JkKS5WYWx1ZXNbZmllbGROYW1lXVwiLCByZWNvcmRbZmllbGQuTmFtZV0pO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCIoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZE5hbWVdXVwiLCAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZC5OYW1lXV0pO1xyXG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlyc1tyZWNvcmRbZmllbGQuTmFtZV1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpbnZlcnRlZCA9IHt9O1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRlYnVnTG9nKFwiKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1wiLCAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzKTtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnMpIHtcclxuICAgICAgICAgICAgICBpbnZlcnRlZFsoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW2tleV1dID0ga2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnMgPSBpbnZlcnRlZDtcclxuICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZC5OYW1lXV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRlYnVnTG9nKFwicmVjb3JkW2ZpZWxkTmFtZV1cIiwgcmVjb3JkW2ZpZWxkLk5hbWVdKTtcclxuICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSByZWNvcmRbZmllbGQuTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuXHJcbiAgICAvLyBmb3IgKGxldCBmaWVsZE5hbWUgaW4gcmVjb3JkKSB7XHJcbiAgICAvLyAgIHRyeSB7XHJcbiAgICAvLyAgICAgLy8gZmllbGROYW1lIMOoIGlsIG5vbWUgZGVsIGNhbXBvXHJcbiAgICAvLyAgICAgLy8gUFJFUEFSTyBWQVJJQUJJTEkgVkFMT1JJIENPUlJFVFRJXHJcbiAgICAvLyAgICAgbGV0IGZvdW5kT2JqZWN0ID0gZm9ybS5GaWVsZHMuZmluZChcclxuICAgIC8vICAgICAgIChvYmopID0+IHtcclxuICAgIC8vICAgICAgICAgaWYgKGZpZWxkTmFtZSA9PSBcIklEXCIpIHtcclxuICAgIC8vICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwib2JqXCIsIG9iaik7XHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImZpZWxkTmFtZVwiLCBmaWVsZE5hbWUpO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICByZXR1cm4gb2JqLk5hbWUgPT09IGZpZWxkTmFtZVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgdGhpcy5kZWJ1Z0xvZyhcImZpZWxkTmFtZVwiLCBmaWVsZE5hbWUpO1xyXG4gICAgLy8gICAgIHRoaXMuZGVidWdMb2coXCJmb3VuZE9iamVjdFwiLCBmb3VuZE9iamVjdCk7XHJcbiAgICAvLyAgICAgLy8gZ2VzdGlyZSBjYXNvIGZpZWxkdHlwZSA4IFtlbGVuY28gZ2VuZXJpY29dXHJcbiAgICAvLyAgICAgLy8gZmFyZSB1biBldmFsIHBlciBwb3BvbGFyZSBpIHZhbHVlUGFpcnMgc2Ugw6ggcHJlc2VudGUgdW5hIGZvcm11bGFcclxuICAgIC8vICAgICAvLyBwcmVuZGVyZSBsYSBsYWJlbCBjb3JyZXR0YVxyXG4gICAgLy8gICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyAgICAgaWYgKGZvdW5kT2JqZWN0LkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdKSB7XHJcbiAgICAvLyAgICAgICBpZiAoZm91bmRPYmplY3QuRm9ybXVsYSkge1xyXG4gICAgLy8gICAgICAgICAvLyBhZ2dpdW5nbyBhIHZhbHVlcGFpcnMgaSB2YWxvcmkgY2FsY29sYXRpXHJcbiAgICAvLyAgICAgICAgIC8vICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnMgPSB7fTtcclxuICAgIC8vICAgICAgICAgdmFyIHRlbXAgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShcclxuICAgIC8vICAgICAgICAgICBmb3VuZE9iamVjdC5Gb3JtdWxhLFxyXG4gICAgLy8gICAgICAgICAgIHJlY29yZCxcclxuICAgIC8vICAgICAgICAgICBudWxsXHJcbiAgICAvLyAgICAgICAgICk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZGVidWdMb2coXCJ0ZW1wXCIsIHRlbXApO1xyXG4gICAgLy8gICAgICAgICBmb3IgKGxldCBrZXkyIGluIHRlbXApIHtcclxuICAgIC8vICAgICAgICAgICBpZiAoVXRpbGl0eUhlbHBlclNlcnZpY2UuaXNOdW1lcmljKHRlbXBba2V5Ml0pKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzW051bWJlcihrZXkyKV0gPSB0ZW1wW2tleTJdO1xyXG4gICAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzW2tleTJdID0gdGVtcFtrZXkyXTtcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIihyZWNvcmQpLlZhbHVlc1tmaWVsZE5hbWVdXCIsIHJlY29yZFtmaWVsZE5hbWVdKTtcclxuICAgIC8vICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIig8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkTmFtZV1dXCIsICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkTmFtZV1dKTtcclxuICAgIC8vICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGROYW1lXSA9ICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkTmFtZV1dO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgbGV0IGludmVydGVkID0ge307XHJcbiAgICAvLyAgICAgICB0aGlzLmRlYnVnTG9nKFwiKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1wiLCAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzKTtcclxuICAgIC8vICAgICAgIGZvciAobGV0IGtleSBpbiAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzKSB7XHJcbiAgICAvLyAgICAgICAgIGludmVydGVkWyg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNba2V5XV0gPSBrZXk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzID0gaW52ZXJ0ZWQ7XHJcbiAgICAvLyAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZE5hbWVdID0gKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1tyZWNvcmRbZmllbGROYW1lXV07XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgIHRoaXMuZGVidWdMb2coXCJyZWNvcmRbZmllbGROYW1lXVwiLCByZWNvcmRbZmllbGROYW1lXSk7XHJcbiAgICAvLyAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZE5hbWVdID0gcmVjb3JkW2ZpZWxkTmFtZV07XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwib3V0cHV0VmFsdWVzQXJyYXkgMVwiLCBvdXRwdXRWYWx1ZXNBcnJheSk7XHJcbiAgICAvLyBjYW5jZWxsbyBpIHZhbG9yaSBpbmRlZmluaXRpIG8gbnVsbGlcclxuICAgIGZvciAoY29uc3QgY2hpYXZlIGluIG91dHB1dFZhbHVlc0FycmF5KSB7XHJcbiAgICAgIGlmIChvdXRwdXRWYWx1ZXNBcnJheVtjaGlhdmVdID09IHVuZGVmaW5lZCB8fCBvdXRwdXRWYWx1ZXNBcnJheVtjaGlhdmVdID09IG51bGwpXHJcbiAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbY2hpYXZlXSA9ICcnXHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0cHV0VmFsdWVzQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlc3BvbnNlVGVtcGxhdGUocmVjb3JkOiBSZWNvcmQsIGZvcm06IEZvcm0pOiBzdHJpbmcge1xyXG4gICAgICBsZXQgdGVtcGxhdGU6IHN0cmluZyA9ICc8ZGl2IGNsYXNzPVwicm93XCI+JztcclxuICAgIC8vIFBSRVBBUk8gTyBQUkVORE8gTEEgU1RSVVRUVVJBIERBIFNUQU1QQVJFXHJcbiAgICBmb3JtLkZpZWxkcy5mb3JFYWNoKChiYXNlRmllbGQ6IEJhc2VGaWVsZCkgPT4ge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKCdnZXRSZXNwb3NuZVRlbXBsYXRlIC0gcHJlIC0gZmllbGQnLCBiYXNlRmllbGQpXHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9PSBudWxsIHx8IGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9PSB1bmRlZmluZWQpe1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9IG5ldyBBbnN3ZXJTdHlsZSgpO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMgPSBiYXNlRmllbGQuQ29sU3BhblNpemVzO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5GaWVsZHN0eWxlQ1NTID0gYmFzZUZpZWxkLkZpZWxkc3R5bGVDU1M7XHJcbiAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkxhYmVsc3R5bGVDU1MgPSBiYXNlRmllbGQuTGFiZWxzdHlsZUNTUztcclxuICAgICAgICBpZihiYXNlRmllbGQuVmlzaWJsZUlmKXtcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEoYmFzZUZpZWxkLlZpc2libGVJZiwgcmVjb3JkLCBudWxsKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gYmFzZUZpZWxkLkluTGlzdFZpZXc7XHJcbiAgICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuVmlzaWJsZUlmID0gYmFzZUZpZWxkLlZpc2libGVJZjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gXHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5WaXNpYmxlSWYpe1xyXG4gICAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShiYXNlRmllbGQuQW5zd2VyU3R5bGUuVmlzaWJsZUlmLCByZWNvcmQsIG51bGwpXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkV2YWx1YXRlRmllbGRGb3JtdWxhIC0gdmlzaWJpbGl0eVwiLCB2aXNpYmlsaXR5KTtcclxuICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuSW5MaXN0VmlldyA9ICh2aXNpYmlsaXR5ID09IHRydWUpID8gdHJ1ZSA6IGZhbHNlIDtcclxuICAgICAgfVxyXG4gICAgICBpZihiYXNlRmllbGQuQW5zd2VyU3R5bGUuSW5MaXN0Vmlldyl7XHJcbiAgICAgICAgdGVtcGxhdGUgKz0gJzxkaXYgY2xhc3M9XCInKyB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkQW5zd2VyU3R5bGVDbGFzcyhiYXNlRmllbGQpICsnXCI+ICcrXHJcbiAgICAgICAgJyA8c3BhbiBjbGFzcz1cImR5bmFmb3JtLXF1ZXN0aW9uXCIgc3R5bGU9XCInICsgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkxhYmVsc3R5bGVDU1MgKyAnXCI+JyArIGJhc2VGaWVsZC5EZXNjcmlwdGlvbiArICc6PC9zcGFuPicgKyBcclxuICAgICAgICAnIDxzcGFuIGNsYXNzPVwiZHluYWZvcm0tcmVzcG9uc2VcIiBzdHlsZT1cIicgKyBiYXNlRmllbGQuQW5zd2VyU3R5bGUuRmllbGRzdHlsZUNTUyArICdcIj4gIyMnICsgYmFzZUZpZWxkLk5hbWUgKyAnIyM8L3NwYW4+JyArIFxyXG4gICAgICAgICc8L2Rpdj4gXFxuICc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kZWJ1Z0xvZygnZ2V0UmVzcG9zbmVUZW1wbGF0ZSAtIHBvc3QgLSBmaWVsZCcsIGJhc2VGaWVsZClcclxuICAgIH0pO1xyXG4gICAgLy8gKGF0dHVhbG1lbnRlIG5vbiBlc2lzdGUgaWwgY29uY2V0dG8gZGkgdGVtcGF0ZSBkaSBvdXRwdXQpXHJcbiAgICAgIHRlbXBsYXRlICs9ICc8L2Rpdj4nO1xyXG4gICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcGxhY2VUZW1wbGF0ZVBsYWNlaG9sZGVyc1dpdGhWYWx1ZXModGVtcGxhdGU6IHN0cmluZywgb3V0cHV0VmFsdWVzQXJyYXk6IEFycmF5PGFueT4sIHJlZ2V4KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gsIGdyb3VwKSA9PiB7XHJcbiAgICAgIHJldHVybiA8c3RyaW5nPm91dHB1dFZhbHVlc0FycmF5W2dyb3VwXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlclwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZXFwLWR5bmFtaWMtbW9kdWxlLXRpdGxlIGFkZC1mb3JtLXJlY29yZC1oZWFkZXJcIiAqbmdJZj1cInNob3dUaXRsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGg0PjxiPnt7Zm9ybS5OYW1lfX08L2I+PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUZvcm1cIiBjbGFzcz1cImFkZC1mb3JtLXJlY29yZC1mb3JtXCI+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIFNFTVBMSUNFIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtLkZvcm1TY2FsYXJUeXBlID09IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmb3JtLkZpZWxkcyB9XCIgY2xhc3M9XCJhZGQtZm9ybS1yZWNvcmQtc2VtcGxpY2VcIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgQSBTVEVQUEVSIC0tPlxyXG4gICAgICAgIDxtYXQtaG9yaXpvbnRhbC1zdGVwcGVyIGxpbmVhciAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydBIHN0ZXAnXVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLXN0ZXBwZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1zdGVwICpuZ0Zvcj1cImxldCBncm91cCBvZiBmb3JtLkZvcm1GaWVsZHNHcm91cHM7IGxldCBpID0gaW5kZXg7IGxldCBmaXJzdCA9IGZpcnN0OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwTGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhZGQtZm9ybS1yZWNvcmQtYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZmlyc3RcIiBjbGFzcz1cIm1yLTIgcHJldmlvdXNcIiBtYXQtcmFpc2VkLWJ1dHRvbiBtYXRTdGVwcGVyUHJldmlvdXM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFByZWNlZGVudGVcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWxhc3RcIiBjbGFzcz1cImJ1dHRvbi1uZXh0XCIgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24gbWF0U3RlcHBlck5leHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3Npdm9cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibGFzdCAmJiBzaG93U2F2ZUJ1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybShmYWxzZSlcIiBjbGFzcz1cImJ1dHRvbi1uZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNhbHZhXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvbWF0LXN0ZXA+XHJcbiAgICAgICAgPC9tYXQtaG9yaXpvbnRhbC1zdGVwcGVyPlxyXG5cclxuICAgICAgICA8IS0tIFZJU1VBTElaWkFaSU9ORSBBIFRBQiAtLT5cclxuICAgICAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiB0YWInXVwiIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLXRhYlwiPlxyXG4gICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZm9ybS5Gb3JtRmllbGRzR3JvdXBzXCIgW2xhYmVsXT1cImdyb3VwLk5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkczogZmllbGRHcm91cHNbZ3JvdXAuTmFtZV0gfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbWF0LXRhYj5cclxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIEFEIEFDQ09SRElPTiAtLT5cclxuICAgICAgICA8bWF0LWFjY29yZGlvbiBtdWx0aSAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiBhY2NvcmRpb24nXVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZm9ybS5Gb3JtRmllbGRzR3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuICAgIDwvZm9ybT5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG10LTIgYWRkLWZvcm0tcmVjb3JkLWJ1dHRvbnNcIlxyXG4gICAgICAgICpuZ0lmPVwiKHNob3dCYWNrQnV0dG9uIHx8IHNob3dTYXZlQnV0dG9uKSAmJiBmb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bVsnQSBzdGVwJ11cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIHRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93QmFja0J1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybSh0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgQW5udWxsYVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93U2F2ZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZU9yRXhpdEZvcm0oZmFsc2UpXCIgW2Rpc2FibGVkXT1cImZvcm1Gb3JtLmludmFsaWQgfHwgZm9ybUZvcm0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIFNhbHZhXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuPCEtLSBURU1QTEFURSBQRVIgTEEgVklTVUFMSVpaQVpJT05FIERFSSBDQU1QSSBERUxMQSBGT1JNIC0tPlxyXG48bmctdGVtcGxhdGUgI2ZpZWxkVGVtcGxhdGVzIGxldC1maWVsZHM9J2ZpZWxkcyc+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCIgW2hpZGRlbl09XCIhZmllbGQuSW5MaXN0Vmlld1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkU3lsZUNsYXNzKGZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8ZHluYW1pYy1tb2R1bGUtZmllbGQtZml4ICNmaWVsZFRlbXBsYXRlIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbcmVjb3JkXT1cInJlY29yZFwiXHJcbiAgICAgICAgICAgICAgICAocmVjb3JkQ2hhbmdlKT1cIm9uUmVjb3JkQ2hhbmdlKClcIj5cclxuICAgICAgICAgICAgPC9keW5hbWljLW1vZHVsZS1maWVsZC1maXg+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9mb3JtLXJlY29yZHMvYWRkLWZvcm0tcmVjb3JkL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2FkZC1mb3JtLXJlY29yZC9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNILE9BQU8sRUFBRSxXQUFXLEVBQWEsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0YsT0FBTyxFQUFRLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVuRixPQUFPLEVBQTZDLGFBQWEsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7O0FBRTVILDJHQUEyRztBQU8zRyxNQUFNLE9BQU8sc0JBQXNCO0lBR2pDLFFBQVEsQ0FBQyxPQUFlLEVBQUUsT0FBYTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDOUI7SUFDSCxDQUFDO0lBOEJELFlBQ1UsR0FBc0IsRUFDdkIs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Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQVlJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUlQLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2R5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgQW5zd2VyU3R5bGUsIEJhc2VGaWVsZCwgRmllbGRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBGb3JtLCBGb3JtU2NhbGFyVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IER5blJlY29yZCwgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVGaWVsZEZpeENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2R5bmFtaWMtbW9kdWxlLWZpZWxkLWZpeC9keW5hbWljLW1vZHVsZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24sIEVuZFBvaW50RGF0YVBhcmFtcywgUGFyYW1UeXBlRW51bSB9IGZyb20gJy4vLi4vLi4vLi4vLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IExpc3RWYWx1ZUZpZWxkIH0gZnJvbSAncHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvbW9kZWxzL2ZpZWxkcy9saXN0VmFsdWVGaWVsZC5tb2RlbCc7XHJcbi8vIGltcG9ydCB7IER5bmFtaWNNb2R1bGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2R5bmFtaWMtbW9kdWxlLWZpZWxkL2R5bmFtaWMtbW9kdWxlLWZpZWxkLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhZGQtZm9ybS1yZWNvcmRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRGb3JtUmVjb3JkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgZGVidWdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGVidWdMb2cobWVzc2FnZTogc3RyaW5nLCBlbGVtZW50PzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Z01vZGUpIHtcclxuICAgICAgY29uc29sZS5sb2cobWVzc2FnZSwgZWxlbWVudClcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uczogRHluYW1pY01vZHVsZUNvbXBpbGVDb25maWc7XHJcbiAgQElucHV0KCkgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb247XHJcbiAgQElucHV0KCkgdXNlcklEOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIGZvcm1JRDogc3RyaW5nID0gbnVsbDsgLy8gcHJldmlld1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm0gPSBudWxsOyAvLyBwcmV2aWV3IGNvbmZpZ1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkIHwgc3RyaW5nID0gbnVsbDsgLy8gZWRpdFxyXG4gIEBJbnB1dCgpIG9ubHlWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHNob3dUaXRsZSA9IHRydWU7XHJcbiAgc2hvd1NhdmVCdXR0b24gPSB0cnVlO1xyXG4gIHNob3dCYWNrQnV0dG9uID0gdHJ1ZTtcclxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZm9ybUZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgZmllbGRHcm91cHM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8QmFzZUZpZWxkPiB9ID0ge307XHJcbiAgRm9ybVNjYWxhclR5cGVFbnVtID0gRm9ybVNjYWxhclR5cGVFbnVtO1xyXG4gIEZpZWxkVHlwZUVudW0gPSBGaWVsZFR5cGVFbnVtO1xyXG5cclxuICBAT3V0cHV0KCkgc2F2ZVJlY29yZEV2ZW50OiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBhZnRlclNhdmVSZWNvcmRFdmVudDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPVxyXG4gICAgbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oXCJmaWVsZFRlbXBsYXRlXCIpXHJcbiAgZmllbGRUZW1wbGF0ZTogUXVlcnlMaXN0PER5bmFtaWNNb2R1bGVGaWVsZEZpeENvbXBvbmVudD47XHJcbiAgYWRkaXRpb25hbFBhcmFtczogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB1dGlsaXR5U2VydmljZTogVXRpbGl0eUhlbHBlclNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGFkZCBwdcOyIGZ1bnppb25hcmUgYW5jaGUgY29tZSBtb2RpZmljYSBlIGNvbWUgcHJldmlld1xyXG4gICAgLy8gaW4gYWRkIGFiYmlhbW8gaW4gaW5wdXQgbCdJRCBkZWwgRm9ybVxyXG4gICAgLy8gaW4gbW9kaWZpY2EgYWJiaWFtbyBpbiBpbnB1dCBsJ0lEIGRlbCBSZWNvcmRcclxuICAgIC8vIGluIHByZXZpZXcgYWJiaWFtbyBpbiBpbnB1dCBpbCBGb3JtKGNhc28gY29uZmlndXJhdG9yKSBvIGwnSUQgZGVsIG1vZHVsbyBvbiBvbmx5VmlldyBpbXBvc3RhdG8gYSB0cnVlXHJcbiAgICB0aGlzLnNob3dUaXRsZSA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd1RpdGxlO1xyXG4gICAgdGhpcy5zaG93U2F2ZUJ1dHRvbiA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd1NhdmVCdXR0b247XHJcbiAgICB0aGlzLnNob3dCYWNrQnV0dG9uID0gdGhpcy5jb25maWd1cmF0aW9ucy5zaG93QmFja0J1dHRvbjtcclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coXCJ0aGlzLnJlY29yZFwiLHRoaXMucmVjb3JkKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZWNvcmQgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnByZXZpZXdPck5ld1Jlc3BvbnNlUmVjb3JkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRSZXNwb25zZVJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGwnaW5pemlhbGl6emF6aW9uZSB0ZXJtaW5hIGNvbiBpbCByZWN1cGVybyBkZWwgcmVjb3JkIG8gY29uIGwnaW5pemlhbGl6emF6aW9uZSBkZWwgZm9ybSB2dW90b1xyXG5cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuZGVidWdMb2coJ29uaW5pdCAtIER5bmFGb3JtJywgdGhpcy5mb3JtKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGFsIGNhbWJpbyBkZWwgdmFsb3JlIGRpIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gcmVjb3JkLlxyXG4gICAqIFNlcnZlIGFkIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRpIHR1dHRpIGkgY2FtcGkgY2hlIGhhbm5vIHVuYSBmb3JtdWxhLlxyXG4gICAqL1xyXG4gIG9uUmVjb3JkQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGRUZW1wbGF0ZSAmJiB0aGlzLmZpZWxkVGVtcGxhdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZpZWxkVGVtcGxhdGUuZm9yRWFjaCgoZikgPT4gZi51cGRhdGVGaWVsZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByZXZpZXdPck5ld1Jlc3BvbnNlUmVjb3JkKCkge1xyXG4gICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkKCk7XHJcbiAgICAvLyBhZ2dpdWduaSBudW92b1xyXG4gICAgaWYgKHRoaXMuZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHByZXZpZXcgcGVyIGlsIGNvbmZpZ3VyYXRvclxyXG4gICAgICB0aGlzLmZpZWxkc0NvbmZpZygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1JRCAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHByZXZpZXcgcGVyIGFkbWluXHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUJ5SUQoKTsgLy8gZGVudHJvIGNoaWFtYSBmaWVsZHNDb25maWdcclxuICAgIH1cclxuICB9XHJcbiAgZWRpdFJlc3BvbnNlUmVjb3JkKCkge1xyXG4gICAgLy8gbW9kaWlsdMOgIG1vZGlmaWNhXHJcbiAgICBpZiAodHlwZW9mIHRoaXMucmVjb3JkID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIC8vIGFsbG9yYSDDqCB1biBJRFxyXG4gICAgICB0aGlzLmdldFJlY29yZEJ5SUQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGlsIHJlY29yZCB2aWVuZSBwYXNzYXRvIGNvbWUgdGFsZVxyXG4gICAgICAvLyAoPFJlY29yZD50aGlzLnJlY29yZCkuRW50SUQgPSBcIjNcIjtcclxuICAgICAgLy8gKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLlZlcnNpb247XHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaSBkYXRpIGluc2VyaXRpIGRhbGwndXRlbnRlIHVuYSB2b2x0YSBjb25jbHVzYSBsYSBjb21waWxhemlvbmUgZGVsbGEgZm9ybS5cclxuICAgKi9cclxuICBzYXZlT3JFeGl0Rm9ybShleGl0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKCdhZGQtZm9ybS1yZWNvcmQgc2F2ZVJlY29yZEV2ZW50JylcclxuICAgIGlmIChleGl0KSB7XHJcbiAgICAgIC8vIHRoaXMuc2F2ZVJlY29yZEV2ZW50LmVtaXQobnVsbCk7XHJcbiAgICAgIHRoaXMub25TYXZlUmVjb3JkKG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdGhpcy5zYXZlUmVjb3JkRXZlbnQuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICAgIHRoaXMub25TYXZlUmVjb3JkKCg8UmVjb3JkPnRoaXMucmVjb3JkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaWwgcmVjb3JkIGFnZ2l1bnRvIG8gbW9kaWZpY2F0by5cclxuICAgKiBTZSDDqCBzdGF0byBjb25maWd1cmF0byB1biBlbmRQb2ludCBwZXIgaWwgc2FsdmF0YWdnaW8gdmllbmUgZWZmZXR0dWF0YSB1bmEgY2hpYW1hdGEgYWwgc2VydmVyIHBhc3NhbmRvIGwnb2dnZXRvIGRhIHNhbHZhcmVcclxuICAgKiBuZWwgYm9keSBkZWxsYSBjaGlhbWF0YSwgYWx0cmltZW50aSBzY2F0ZW5hIGwnZXZlbnRvIFwic2F2ZVJlY29yZFwiLlxyXG4gICAqIEBwYXJhbSBldmVudCBPZ2dldHRvIGRpIHRpcG8gUmVjb3JkIGRhIHNhbHZhcmUuXHJcbiAgICovXHJcbiAgb25TYXZlUmVjb3JkKGV2ZW50OiBSZWNvcmQpIHtcclxuICAgIHRoaXMuZGVidWdMb2coJ29uU2F2ZVJlY29yZCAtIGV2ZW50JywgZXZlbnQpXHJcbiAgICB0aGlzLmRlYnVnTG9nKCdvblNhdmVSZWNvcmQgLSBmb3JtJywgdGhpcy5mb3JtKVxyXG4gICAgaWYgKFxyXG4gICAgICBldmVudCAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5TYXZlRW5kUG9pbnRcclxuICAgICkge1xyXG4gICAgICB2YXIgZHluUmVjOiBEeW5SZWNvcmQgPSBuZXcgRHluUmVjb3JkKCk7XHJcbiAgICAgIGR5blJlYy5JRCA9IGV2ZW50LklEID8/IG51bGw7XHJcbiAgICAgIGR5blJlYy5FbnRJRCA9IHRoaXMuZm9ybS5JRDtcclxuICAgICAgZHluUmVjLlZlcnNpb24gPSB0aGlzLmZvcm0uVmVyc2lvbjtcclxuICAgICAgZHluUmVjLnVzZXJJRCA9IHRoaXMudXNlcklEO1xyXG4gICAgICBkeW5SZWMuVmFsdWVzID0gZXZlbnQgPz8gbnVsbDtcclxuICAgICAgZHluUmVjLkhUTUxyZWFkYWJsZVZhbHVlcyA9IHRoaXMuY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzKGV2ZW50KTtcclxuICAgICAgZHluUmVjLkFkZGl0aW9uYWxQYXJhbXMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFkZGl0aW9uYWxQYXJhbXMpO1xyXG4gICAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBQYXJhbU5hbWU6IFwiUmVjb3JkXCIsXHJcbiAgICAgICAgICBQYXJhbVZhbHVlOiBkeW5SZWMsXHJcbiAgICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJJbiBCb2R5XCJdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuU2F2ZUVuZFBvaW50LFxyXG4gICAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgICAgKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hZnRlclNhdmVSZWNvcmRFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNhdmVSZWNvcmRFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm1CeUlEKGlkOiBzdHJpbmcgPSB0aGlzLmZvcm1JRCkge1xyXG4gICAgY29uc3QgZHluYW1pY01vZHVsZVBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9XHJcbiAgICAgIG5ldyBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+KCk7XHJcbiAgICBkeW5hbWljTW9kdWxlUGFyYW1zLnB1c2goe1xyXG4gICAgICBQYXJhbU5hbWU6IFwiaWRcIixcclxuICAgICAgUGFyYW1WYWx1ZTogaWQsXHJcbiAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMuR2V0QnlJREVuZFBvaW50LFxyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAocmVzOiBGb3JtKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gcmVzO1xyXG4gICAgICAgIHRoaXMuZGVidWdMb2coJ2dldEZvcm1CeUlEIC0gRHluYUZvcm0nLCB0aGlzLmZvcm0pXHJcbiAgICAgICAgdGhpcy5maWVsZHNDb25maWcoKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4geyB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gY2kgZW50cm8gc29sbyBzZSDDqCBzdGF0byBwYXNzYXRvIGlsIHBhcmFtZXRybyBcInJlY29yZFwiIGNvbWUgc3RyaW5nYVxyXG4gIGdldFJlY29yZEJ5SUQoKSB7XHJcbiAgICAvLyBwcmVwYXJvIGkgZGF0aSBkZWwgcmVjb3JkXHJcbiAgICB2YXIgZHluYW1pY1JlY29yZFBhcmFtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIFBhcmFtTmFtZTogXCJpZFwiLFxyXG4gICAgICAgIFBhcmFtVmFsdWU6IHRoaXMucmVjb3JkLFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEJ5SURFbmRQb2ludCxcclxuICAgICAgZHluYW1pY1JlY29yZFBhcmFtcyxcclxuICAgICAgKHJlczogRHluUmVjb3JkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkKCk7XHJcblxyXG4gICAgICAgICg8UmVjb3JkPnRoaXMucmVjb3JkKSA9IEpTT04ucGFyc2UocmVzLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLklEID0gcmVzLklEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLkVudElEID0gcmVzLkVudElEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLnVzZXJJRCA9IHJlcy51c2VySUQ7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuVmVyc2lvbiA9IHJlcy5WZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLlZhbHVlcyA9IEpTT04ucGFyc2UocmVzLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgIC8vIHRoaXMudmlld01vZGUgPSBEeW5hbWljTW9kdWxlVmlld01vZGVFbnVtLkNPTVBJTEU7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uKCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGdldEZvcm1CeUlEYW5kVmVyc2lvbigpIHtcclxuICAgIC8vIHByZXBhcm8gbGEgdmVyc2lvbmUgY29ycmV0dGEgZGVsIGZvcm1cclxuICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcIkVudElEXCIsXHJcbiAgICAgICAgUGFyYW1WYWx1ZTogKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLkVudElELFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcIlZlcnNpb25cIixcclxuICAgICAgICBQYXJhbVZhbHVlOiAoPFJlY29yZD50aGlzLnJlY29yZCkuVmVyc2lvbixcclxuICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uIC0gdGhpcyByZWNvcmRcIiwgPFJlY29yZD50aGlzLnJlY29yZClcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3Jtcy5HZXRCeUlEQW5kVmVyc2lvbkVuZFBvaW50LFxyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAocmVzOiBGb3JtKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gcmVzO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKTtcclxuICAgICAgICB0aGlzLnJlb3JkZXJGb3JtRmllbGRzKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZSkge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmaWVsZHNDb25maWcoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMucmVvcmRlckZvcm1GaWVsZHMoKTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwKCk7XHJcbiAgICBpZiAodGhpcy5mb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZSkge1xyXG4gICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXBzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiZmllbGRzQ29uZmlnIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgbmVsbCdvZ2dldHRvIFJlY29yZCBsZSBwcm9wcmlldMOgIG1hbmNhbnRpIHJpc3BldHRvIGFpIGNhbXBpIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZWNvcmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgY29uc3QgcmVjb3JkUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKHRoaXMucmVjb3JkKTtcclxuICAgIHRoaXMuZm9ybS5GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGZpZWxkLk5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbZmllbGQuTmFtZV0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmZvcm0uSW5uZXJGb3JtcyAmJiB0aGlzLmZvcm0uSW5uZXJGb3Jtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5Jbm5lckZvcm1zLmZvckVhY2goKGZvcm0pID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheU5hbWU6IHN0cmluZyA9IGZvcm0uTmFtZS5zcGxpdChcIiBcIikuam9pbihcIl9cIik7XHJcbiAgICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGFycmF5TmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMucmVjb3JkW2FycmF5TmFtZV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZVJlY29yZFByb3BlcnRpZXMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHJpb3JkaW5hcmUgaSBjYW1waSBjaGUgY29tcG9uZ29ubyBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVvcmRlckZvcm1GaWVsZHMoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLkZpZWxkcyAmJiB0aGlzLmZvcm0uRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5mb3JtLkZpZWxkcy5zb3J0KChhLCBiKSA9PlxyXG4gICAgICAgIGEuT3JkaW5hbFBvc2l0aW9uID4gYi5PcmRpbmFsUG9zaXRpb24gPyAxIDogYi5PcmRpbmFsUG9zaXRpb24gPiBhLk9yZGluYWxQb3NpdGlvbiA/IC0xIDogMCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwicmVvcmRlckZvcm1GaWVsZHMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpbCBGb3JtR3JvdXAgY2hlIHJhcHByZXNlbnRhIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoKSB7XHJcbiAgICB0aGlzLmZvcm1Gb3JtID0gdGhpcy51dGlsaXR5U2VydmljZS5DcmVhdGVGb3JtRm9ybUdyb3VwKFxyXG4gICAgICB0aGlzLmZvcm0uRmllbGRzLFxyXG4gICAgICAoPFJlY29yZD50aGlzLnJlY29yZCksXHJcbiAgICAgIHRoaXMub25seVZpZXdcclxuICAgICk7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiY3JlYXRlRm9ybUdyb3VwIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaSBncnVwcGkgaW4gY3VpIHJhZ2dydXBwYXJlIGkgY2FtcGkgZGVsbGEgZm9ybSBpbiBiYXNlXHJcbiAgICogYSBjb21lIMOoIHN0YXRhIGNvbmZpZ3VyYXRhIGRhbGwndXRlbnRlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlRmllbGRHcm91cHMoKSB7XHJcbiAgICB0aGlzLmZvcm0uRm9ybUZpZWxkc0dyb3Vwcy5zb3J0KChhLCBiKSA9PiBhLk9yZGluYWxQb3NpdGlvbiA+IGIuT3JkaW5hbFBvc2l0aW9uID8gMSA6IGIuT3JkaW5hbFBvc2l0aW9uID4gYS5PcmRpbmFsUG9zaXRpb24gPyAtMSA6IDApXHJcbiAgICAgIC5tYXAoKGcpID0+IGcuTmFtZSlcclxuICAgICAgLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmllbGRHcm91cHNbZ3JvdXBOYW1lXSA9IHRoaXMuZm9ybS5GaWVsZHMuZmlsdGVyKFxyXG4gICAgICAgICAgKGYpID0+IGYuRmllbGRHcm91cCA9PSBncm91cE5hbWVcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZUZpZWxkR3JvdXBzIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaWwgRm9ybUdyb3VwIGNoZSByYXBwcmVzZW50YSBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzKHJlY29yZDogUmVjb3JkKSB7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzIC0gcmVjb3JkXCIsIHJlY29yZCk7XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwiY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gICAgLy8gYWxlcnQoXCJjb250aW51ZSBmb3IgdmFsdWVzP1wiKVxyXG4gICAgbGV0IG91dHB1dFZhbHVlc0FycmF5OiBBcnJheTxhbnk+ID0gdGhpcy5nZXRSZXNwb25zZVZhbHVlcyhyZWNvcmQsIHRoaXMuZm9ybSk7XHJcbiAgICBcclxuICAgIHRoaXMuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSBvdXRwdXRWYWx1ZXNBcnJheVwiLCBvdXRwdXRWYWx1ZXNBcnJheSk7XHJcbiAgICAvLyBhbGVydChcImNvbnRpbnVlIGZvciB0ZW1wbGF0ZXM/XCIpXHJcbiAgICBsZXQgdGVtcGxhdGU6IHN0cmluZyA9IHRoaXMuZ2V0UmVzcG9uc2VUZW1wbGF0ZShyZWNvcmQsIHRoaXMuZm9ybSk7IC8vIG9nZ2V0dG8gbmVsIHF1YWxlIHZpZW5lIGNvc3RydWl0byBpbCB0ZW1wbGF0ZSBvIGNoZSBwcmVuZGUgaWwgdmFsb3JlIGRhIHVuIHRlbXBsYXRlIGVzdGVybm9cclxuICAgIFxyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIHRlbXBsYXRlXCIsIHRlbXBsYXRlKTtcclxuICAgIC8vIGFsZXJ0KFwiY29udGludWUgZm9yIG91dHB1dD9cIilcclxuICAgIGNvbnN0IHJlZ2V4ID0gLyMjKFtcXHddKykjIy9nO1xyXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5yZXBsYWNlVGVtcGxhdGVQbGFjZWhvbGRlcnNXaXRoVmFsdWVzKHRlbXBsYXRlLCBvdXRwdXRWYWx1ZXNBcnJheSwgcmVnZXgpXHJcblxyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIG91dHB1dFwiLCBvdXRwdXQpO1xyXG4gICAgLy8gYWxlcnQoXCJjb250aW51ZSBmb3IgZW5kaW5nP1wiKVxyXG4gICAgcmV0dXJuIG91dHB1dDsgLy8gb2dnZXR0byBjaGUgY29udGVycsOgIGwnb3V0cHV0IGVsYWJvcmF0byAgICBcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlc3BvbnNlVmFsdWVzKHJlY29yZDogUmVjb3JkLCBmb3JtOiBGb3JtKTogQXJyYXk8YW55PiB7XHJcbiAgICBsZXQgb3V0cHV0VmFsdWVzQXJyYXk6IEFycmF5PGFueT4gPSBbXTsgLy8gYXJyYXkgY29uIGkgdmFsb3JpIGRlbGxlIHJpc3Bvc3RlXHJcbiAgICAvLyg8RHluUmVjb3JkPnRoaXMucmVjb3JkKS5WYWx1ZXMgw6ggbGEgbGlzdGEgZGkgb2dnZXR0aSB7ZmllbGROYW1lOiB2YWxvcmV9XHJcbiAgICAvLyB0aGlzLmRlYnVnTG9nKFwiKHJlY29yZCkuVmFsdWVzXCIsIHJlY29yZCk7XHJcblxyXG4gICAgZm9ybS5GaWVsZHMuZm9yRWFjaChcclxuICAgICAgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJnZXRSZXNwb25zZVZhbHVlcyBmaWVsZFwiLCBmaWVsZCk7XHJcbiAgICAgICAgICAvLyBsZXQgZm91bmRPYmplY3QgPSByZWNvcmQuZmluZChcclxuICAgICAgICAgIC8vICAgKG9iaikgPT4gb2JqID09PSBmaWVsZC5OYW1lXHJcbiAgICAgICAgICAvLyApO1xyXG4gICAgICAgICAgbGV0IGZvdW5kT2JqZWN0ID0gcmVjb3JkW2ZpZWxkLk5hbWVdO1xyXG5cclxuICAgICAgICAgIC8vIGdlc3RpcmUgY2FzbyBmaWVsZHR5cGUgOCBbZWxlbmNvIGdlbmVyaWNvXVxyXG4gICAgICAgICAgLy8gZmFyZSB1biBldmFsIHBlciBwb3BvbGFyZSBpIHZhbHVlUGFpcnMgc2Ugw6ggcHJlc2VudGUgdW5hIGZvcm11bGFcclxuICAgICAgICAgIC8vIHByZW5kZXJlIGxhIGxhYmVsIGNvcnJldHRhXHJcbiAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgaWYgKGZpZWxkLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgICAgICAgICAgLy8gYWdnaXVuZ28gYSB2YWx1ZXBhaXJzIGkgdmFsb3JpIGNhbGNvbGF0aVxyXG4gICAgICAgICAgICAgIC8vICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnMgPSB7fTtcclxuICAgICAgICAgICAgICB2YXIgdGVtcCA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKFxyXG4gICAgICAgICAgICAgICAgZmllbGQuRm9ybXVsYSxcclxuICAgICAgICAgICAgICAgIHJlY29yZCxcclxuICAgICAgICAgICAgICAgIG51bGxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCJ0ZW1wXCIsIHRlbXApO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGtleTIgaW4gdGVtcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmlzTnVtZXJpYyh0ZW1wW2tleTJdKSkge1xyXG4gICAgICAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW051bWJlcihrZXkyKV0gPSB0ZW1wW2tleTJdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlyc1trZXkyXSA9IHRlbXBba2V5Ml07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCIocmVjb3JkKS5WYWx1ZXNbZmllbGROYW1lXVwiLCByZWNvcmRbZmllbGQuTmFtZV0pO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZGVidWdMb2coXCIoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZE5hbWVdXVwiLCAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZC5OYW1lXV0pO1xyXG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlyc1tyZWNvcmRbZmllbGQuTmFtZV1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpbnZlcnRlZCA9IHt9O1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRlYnVnTG9nKFwiKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1wiLCAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzKTtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnMpIHtcclxuICAgICAgICAgICAgICBpbnZlcnRlZFsoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW2tleV1dID0ga2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnMgPSBpbnZlcnRlZDtcclxuICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZC5OYW1lXV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmRlYnVnTG9nKFwicmVjb3JkW2ZpZWxkTmFtZV1cIiwgcmVjb3JkW2ZpZWxkLk5hbWVdKTtcclxuICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSByZWNvcmRbZmllbGQuTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuXHJcbiAgICAvLyBmb3IgKGxldCBmaWVsZE5hbWUgaW4gcmVjb3JkKSB7XHJcbiAgICAvLyAgIHRyeSB7XHJcbiAgICAvLyAgICAgLy8gZmllbGROYW1lIMOoIGlsIG5vbWUgZGVsIGNhbXBvXHJcbiAgICAvLyAgICAgLy8gUFJFUEFSTyBWQVJJQUJJTEkgVkFMT1JJIENPUlJFVFRJXHJcbiAgICAvLyAgICAgbGV0IGZvdW5kT2JqZWN0ID0gZm9ybS5GaWVsZHMuZmluZChcclxuICAgIC8vICAgICAgIChvYmopID0+IHtcclxuICAgIC8vICAgICAgICAgaWYgKGZpZWxkTmFtZSA9PSBcIklEXCIpIHtcclxuICAgIC8vICAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwib2JqXCIsIG9iaik7XHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImZpZWxkTmFtZVwiLCBmaWVsZE5hbWUpO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICByZXR1cm4gb2JqLk5hbWUgPT09IGZpZWxkTmFtZVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgdGhpcy5kZWJ1Z0xvZyhcImZpZWxkTmFtZVwiLCBmaWVsZE5hbWUpO1xyXG4gICAgLy8gICAgIHRoaXMuZGVidWdMb2coXCJmb3VuZE9iamVjdFwiLCBmb3VuZE9iamVjdCk7XHJcbiAgICAvLyAgICAgLy8gZ2VzdGlyZSBjYXNvIGZpZWxkdHlwZSA4IFtlbGVuY28gZ2VuZXJpY29dXHJcbiAgICAvLyAgICAgLy8gZmFyZSB1biBldmFsIHBlciBwb3BvbGFyZSBpIHZhbHVlUGFpcnMgc2Ugw6ggcHJlc2VudGUgdW5hIGZvcm11bGFcclxuICAgIC8vICAgICAvLyBwcmVuZGVyZSBsYSBsYWJlbCBjb3JyZXR0YVxyXG4gICAgLy8gICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyAgICAgaWYgKGZvdW5kT2JqZWN0LkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdKSB7XHJcbiAgICAvLyAgICAgICBpZiAoZm91bmRPYmplY3QuRm9ybXVsYSkge1xyXG4gICAgLy8gICAgICAgICAvLyBhZ2dpdW5nbyBhIHZhbHVlcGFpcnMgaSB2YWxvcmkgY2FsY29sYXRpXHJcbiAgICAvLyAgICAgICAgIC8vICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnMgPSB7fTtcclxuICAgIC8vICAgICAgICAgdmFyIHRlbXAgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShcclxuICAgIC8vICAgICAgICAgICBmb3VuZE9iamVjdC5Gb3JtdWxhLFxyXG4gICAgLy8gICAgICAgICAgIHJlY29yZCxcclxuICAgIC8vICAgICAgICAgICBudWxsXHJcbiAgICAvLyAgICAgICAgICk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZGVidWdMb2coXCJ0ZW1wXCIsIHRlbXApO1xyXG4gICAgLy8gICAgICAgICBmb3IgKGxldCBrZXkyIGluIHRlbXApIHtcclxuICAgIC8vICAgICAgICAgICBpZiAoVXRpbGl0eUhlbHBlclNlcnZpY2UuaXNOdW1lcmljKHRlbXBba2V5Ml0pKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzW051bWJlcihrZXkyKV0gPSB0ZW1wW2tleTJdO1xyXG4gICAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzW2tleTJdID0gdGVtcFtrZXkyXTtcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIihyZWNvcmQpLlZhbHVlc1tmaWVsZE5hbWVdXCIsIHJlY29yZFtmaWVsZE5hbWVdKTtcclxuICAgIC8vICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIig8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkTmFtZV1dXCIsICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkTmFtZV1dKTtcclxuICAgIC8vICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGROYW1lXSA9ICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkTmFtZV1dO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgbGV0IGludmVydGVkID0ge307XHJcbiAgICAvLyAgICAgICB0aGlzLmRlYnVnTG9nKFwiKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1wiLCAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzKTtcclxuICAgIC8vICAgICAgIGZvciAobGV0IGtleSBpbiAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzKSB7XHJcbiAgICAvLyAgICAgICAgIGludmVydGVkWyg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNba2V5XV0gPSBrZXk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzID0gaW52ZXJ0ZWQ7XHJcbiAgICAvLyAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZE5hbWVdID0gKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1tyZWNvcmRbZmllbGROYW1lXV07XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgIHRoaXMuZGVidWdMb2coXCJyZWNvcmRbZmllbGROYW1lXVwiLCByZWNvcmRbZmllbGROYW1lXSk7XHJcbiAgICAvLyAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZE5hbWVdID0gcmVjb3JkW2ZpZWxkTmFtZV07XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLmRlYnVnTG9nKFwib3V0cHV0VmFsdWVzQXJyYXkgMVwiLCBvdXRwdXRWYWx1ZXNBcnJheSk7XHJcbiAgICAvLyBjYW5jZWxsbyBpIHZhbG9yaSBpbmRlZmluaXRpIG8gbnVsbGlcclxuICAgIGZvciAoY29uc3QgY2hpYXZlIGluIG91dHB1dFZhbHVlc0FycmF5KSB7XHJcbiAgICAgIGlmIChvdXRwdXRWYWx1ZXNBcnJheVtjaGlhdmVdID09IHVuZGVmaW5lZCB8fCBvdXRwdXRWYWx1ZXNBcnJheVtjaGlhdmVdID09IG51bGwpXHJcbiAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbY2hpYXZlXSA9ICcnXHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0cHV0VmFsdWVzQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlc3BvbnNlVGVtcGxhdGUocmVjb3JkOiBSZWNvcmQsIGZvcm06IEZvcm0pOiBzdHJpbmcge1xyXG4gICAgICBsZXQgdGVtcGxhdGU6IHN0cmluZyA9ICc8ZGl2IGNsYXNzPVwicm93XCI+JztcclxuICAgIC8vIFBSRVBBUk8gTyBQUkVORE8gTEEgU1RSVVRUVVJBIERBIFNUQU1QQVJFXHJcbiAgICBmb3JtLkZpZWxkcy5mb3JFYWNoKChiYXNlRmllbGQ6IEJhc2VGaWVsZCkgPT4ge1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKCdnZXRSZXNwb3NuZVRlbXBsYXRlIC0gcHJlIC0gZmllbGQnLCBiYXNlRmllbGQpXHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9PSBudWxsIHx8IGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9PSB1bmRlZmluZWQpe1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9IG5ldyBBbnN3ZXJTdHlsZSgpO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMgPSBiYXNlRmllbGQuQ29sU3BhblNpemVzO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5GaWVsZHN0eWxlQ1NTID0gYmFzZUZpZWxkLkZpZWxkc3R5bGVDU1M7XHJcbiAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkxhYmVsc3R5bGVDU1MgPSBiYXNlRmllbGQuTGFiZWxzdHlsZUNTUztcclxuICAgICAgICBpZihiYXNlRmllbGQuVmlzaWJsZUlmKXtcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEoYmFzZUZpZWxkLlZpc2libGVJZiwgcmVjb3JkLCBudWxsKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gYmFzZUZpZWxkLkluTGlzdFZpZXc7XHJcbiAgICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuVmlzaWJsZUlmID0gYmFzZUZpZWxkLlZpc2libGVJZjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gXHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5WaXNpYmxlSWYpe1xyXG4gICAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShiYXNlRmllbGQuQW5zd2VyU3R5bGUuVmlzaWJsZUlmLCByZWNvcmQsIG51bGwpXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkV2YWx1YXRlRmllbGRGb3JtdWxhIC0gdmlzaWJpbGl0eVwiLCB2aXNpYmlsaXR5KTtcclxuICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuSW5MaXN0VmlldyA9ICh2aXNpYmlsaXR5ID09IHRydWUpID8gdHJ1ZSA6IGZhbHNlIDtcclxuICAgICAgfVxyXG4gICAgICBpZihiYXNlRmllbGQuQW5zd2VyU3R5bGUuSW5MaXN0Vmlldyl7XHJcbiAgICAgICAgdGVtcGxhdGUgKz0gJzxkaXYgY2xhc3M9XCInKyB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkQW5zd2VyU3R5bGVDbGFzcyhiYXNlRmllbGQpICsnXCI+ICcrXHJcbiAgICAgICAgJyA8c3BhbiBjbGFzcz1cImR5bmFmb3JtLXF1ZXN0aW9uXCIgc3R5bGU9XCInICsgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkxhYmVsc3R5bGVDU1MgKyAnXCI+JyArIGJhc2VGaWVsZC5EZXNjcmlwdGlvbiArICc6PC9zcGFuPicgKyBcclxuICAgICAgICAnIDxzcGFuIGNsYXNzPVwiZHluYWZvcm0tcmVzcG9uc2VcIiBzdHlsZT1cIicgKyBiYXNlRmllbGQuQW5zd2VyU3R5bGUuRmllbGRzdHlsZUNTUyArICdcIj4gIyMnICsgYmFzZUZpZWxkLk5hbWUgKyAnIyM8L3NwYW4+JyArIFxyXG4gICAgICAgICc8L2Rpdj4gXFxuICc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kZWJ1Z0xvZygnZ2V0UmVzcG9zbmVUZW1wbGF0ZSAtIHBvc3QgLSBmaWVsZCcsIGJhc2VGaWVsZClcclxuICAgIH0pO1xyXG4gICAgLy8gKGF0dHVhbG1lbnRlIG5vbiBlc2lzdGUgaWwgY29uY2V0dG8gZGkgdGVtcGF0ZSBkaSBvdXRwdXQpXHJcbiAgICAgIHRlbXBsYXRlICs9ICc8L2Rpdj4nO1xyXG4gICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcGxhY2VUZW1wbGF0ZVBsYWNlaG9sZGVyc1dpdGhWYWx1ZXModGVtcGxhdGU6IHN0cmluZywgb3V0cHV0VmFsdWVzQXJyYXk6IEFycmF5PGFueT4sIHJlZ2V4KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gsIGdyb3VwKSA9PiB7XHJcbiAgICAgIHJldHVybiA8c3RyaW5nPm91dHB1dFZhbHVlc0FycmF5W2dyb3VwXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlclwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZXFwLWR5bmFtaWMtbW9kdWxlLXRpdGxlIGFkZC1mb3JtLXJlY29yZC1oZWFkZXJcIiAqbmdJZj1cInNob3dUaXRsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGg0PjxiPnt7Zm9ybS5OYW1lfX08L2I+PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUZvcm1cIiBjbGFzcz1cImFkZC1mb3JtLXJlY29yZC1mb3JtXCI+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIFNFTVBMSUNFIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtLkZvcm1TY2FsYXJUeXBlID09IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmb3JtLkZpZWxkcyB9XCIgY2xhc3M9XCJhZGQtZm9ybS1yZWNvcmQtc2VtcGxpY2VcIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgQSBTVEVQUEVSIC0tPlxyXG4gICAgICAgIDxtYXQtaG9yaXpvbnRhbC1zdGVwcGVyIGxpbmVhciAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydBIHN0ZXAnXVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLXN0ZXBwZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1zdGVwICpuZ0Zvcj1cImxldCBncm91cCBvZiBmb3JtLkZvcm1GaWVsZHNHcm91cHM7IGxldCBpID0gaW5kZXg7IGxldCBmaXJzdCA9IGZpcnN0OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwTGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhZGQtZm9ybS1yZWNvcmQtYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZmlyc3RcIiBjbGFzcz1cIm1yLTIgcHJldmlvdXNcIiBtYXQtcmFpc2VkLWJ1dHRvbiBtYXRTdGVwcGVyUHJldmlvdXM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFByZWNlZGVudGVcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWxhc3RcIiBjbGFzcz1cImJ1dHRvbi1uZXh0XCIgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24gbWF0U3RlcHBlck5leHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3Npdm9cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibGFzdCAmJiBzaG93U2F2ZUJ1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybShmYWxzZSlcIiBjbGFzcz1cImJ1dHRvbi1uZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNhbHZhXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvbWF0LXN0ZXA+XHJcbiAgICAgICAgPC9tYXQtaG9yaXpvbnRhbC1zdGVwcGVyPlxyXG5cclxuICAgICAgICA8IS0tIFZJU1VBTElaWkFaSU9ORSBBIFRBQiAtLT5cclxuICAgICAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiB0YWInXVwiIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLXRhYlwiPlxyXG4gICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZm9ybS5Gb3JtRmllbGRzR3JvdXBzXCIgW2xhYmVsXT1cImdyb3VwLk5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkczogZmllbGRHcm91cHNbZ3JvdXAuTmFtZV0gfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbWF0LXRhYj5cclxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIEFEIEFDQ09SRElPTiAtLT5cclxuICAgICAgICA8bWF0LWFjY29yZGlvbiBtdWx0aSAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiBhY2NvcmRpb24nXVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZm9ybS5Gb3JtRmllbGRzR3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuICAgIDwvZm9ybT5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG10LTIgYWRkLWZvcm0tcmVjb3JkLWJ1dHRvbnNcIlxyXG4gICAgICAgICpuZ0lmPVwiKHNob3dCYWNrQnV0dG9uIHx8IHNob3dTYXZlQnV0dG9uKSAmJiBmb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bVsnQSBzdGVwJ11cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIHRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93QmFja0J1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybSh0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgQW5udWxsYVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93U2F2ZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZU9yRXhpdEZvcm0oZmFsc2UpXCIgW2Rpc2FibGVkXT1cImZvcm1Gb3JtLmludmFsaWQgfHwgZm9ybUZvcm0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIFNhbHZhXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuPCEtLSBURU1QTEFURSBQRVIgTEEgVklTVUFMSVpaQVpJT05FIERFSSBDQU1QSSBERUxMQSBGT1JNIC0tPlxyXG48bmctdGVtcGxhdGUgI2ZpZWxkVGVtcGxhdGVzIGxldC1maWVsZHM9J2ZpZWxkcyc+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCIgW2hpZGRlbl09XCIhZmllbGQuSW5MaXN0Vmlld1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkU3lsZUNsYXNzKGZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8ZHluYW1pYy1tb2R1bGUtZmllbGQtZml4ICNmaWVsZFRlbXBsYXRlIFtkZWJ1Z01vZGVdPVwiZGVidWdNb2RlXCIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiZm9ybVwiIFtyZWNvcmRdPVwicmVjb3JkXCJcclxuICAgICAgICAgICAgICAgIChyZWNvcmRDaGFuZ2UpPVwib25SZWNvcmRDaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgICA8L2R5bmFtaWMtbW9kdWxlLWZpZWxkLWZpeD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
@@ -2052,6 +2052,8 @@ class ListValueFieldTemplateComponent {
|
|
|
2052
2052
|
this.LabelstyleObj = UtilityHelperService.initStyles(this.field.LabelstyleCSS);
|
|
2053
2053
|
}
|
|
2054
2054
|
ngOnInit() {
|
|
2055
|
+
this.debugLog("combobox debugMode", this.debugMode);
|
|
2056
|
+
this.debugLog("combobox filed", this.field);
|
|
2055
2057
|
this.updateField();
|
|
2056
2058
|
this.setArrayData();
|
|
2057
2059
|
if (this.field.IsMultiChoiche && !this.record[this.field.Name]) {
|
|
@@ -2077,6 +2079,7 @@ class ListValueFieldTemplateComponent {
|
|
|
2077
2079
|
// devo controllare se ho la stringa (ValueString) o il dizionario (ValuePairs)
|
|
2078
2080
|
this.debugLog("list-value-field updateField", this.field);
|
|
2079
2081
|
if (this.field.Formula) {
|
|
2082
|
+
this.debugLog("list-value-field - updateField - Formula");
|
|
2080
2083
|
this.field.ValuePairs = {};
|
|
2081
2084
|
const temp = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);
|
|
2082
2085
|
// temp dovrebbe essere una stringa del tipo "chiave1! valore 1 ; chiave2 | valore 2 "
|
|
@@ -2093,8 +2096,10 @@ class ListValueFieldTemplateComponent {
|
|
|
2093
2096
|
//this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);
|
|
2094
2097
|
}
|
|
2095
2098
|
else if (this.field.ValuePairs != null && this.field.ValuePairs.lenght > 0) {
|
|
2099
|
+
this.debugLog("list-value-field - updateField - ValuePairs");
|
|
2096
2100
|
}
|
|
2097
2101
|
else if (this.field.ValueString != null && this.field.ValueString != "") {
|
|
2102
|
+
this.debugLog("list-value-field - updateField - ValueString");
|
|
2098
2103
|
this.field.ValuePairs = this.stringToValuePairs(this.field.ValueString);
|
|
2099
2104
|
}
|
|
2100
2105
|
if (this.field.VisibleIf) {
|
|
@@ -2186,10 +2191,14 @@ class ListValueFieldTemplateComponent {
|
|
|
2186
2191
|
const keyvals = valueString.split(";");
|
|
2187
2192
|
keyvals.forEach((x) => {
|
|
2188
2193
|
const parts = x.split("|");
|
|
2189
|
-
|
|
2194
|
+
this.debugLog('stringToValuePair() - parts', parts);
|
|
2195
|
+
this.debugLog('stringToValuePair() - parts.lenght', parts.length);
|
|
2196
|
+
if (parts.length == 1) {
|
|
2190
2197
|
valuePairs[parts[0].trim()] = parts[0].trim();
|
|
2191
2198
|
}
|
|
2192
2199
|
else if (parts.length > 1) {
|
|
2200
|
+
this.debugLog('stringToValuePair() - parts[0].trim()', parts[0].trim());
|
|
2201
|
+
this.debugLog('stringToValuePair() - parts[1].trim()', parts[1].trim());
|
|
2193
2202
|
valuePairs[parts[0].trim()] = parts[1].trim();
|
|
2194
2203
|
}
|
|
2195
2204
|
});
|
|
@@ -2546,8 +2555,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
2546
2555
|
}] } });
|
|
2547
2556
|
|
|
2548
2557
|
class DynamicModuleFieldFixComponent {
|
|
2558
|
+
debugLog(message, element) {
|
|
2559
|
+
if (this.debugMode) {
|
|
2560
|
+
console.log(message, element);
|
|
2561
|
+
}
|
|
2562
|
+
}
|
|
2549
2563
|
constructor(dialog) {
|
|
2550
2564
|
this.dialog = dialog;
|
|
2565
|
+
this.debugMode = false;
|
|
2551
2566
|
this.recordChange = new EventEmitter();
|
|
2552
2567
|
this.configList = new DynamicModuleListConfig();
|
|
2553
2568
|
this.FieldTypeEnum = FieldTypeEnum;
|
|
@@ -2639,11 +2654,13 @@ class DynamicModuleFieldFixComponent {
|
|
|
2639
2654
|
}
|
|
2640
2655
|
}
|
|
2641
2656
|
DynamicModuleFieldFixComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DynamicModuleFieldFixComponent, deps: [{ token: i1$2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
2642
|
-
DynamicModuleFieldFixComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: { field: "field", form: "form", record: "record" }, outputs: { recordChange: "recordChange" }, viewQueries: [{ propertyName: "dialogInnerFormRecord", first: true, predicate: ["dialogInnerFormRecord"], descendants: true, static: true }, { propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }, { propertyName: "listInnerFormRecords", predicate: ["listInnerFormRecords"], descendants: true }], ngImport: i0, template: "<text-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</text-field-template>\r\n\r\n<textarea-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Area di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</textarea-field-template>\r\n\r\n<boolean-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Booleano']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</boolean-field-template>\r\n\r\n<date-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Data e/o ora']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</date-field-template>\r\n\r\n<numeric-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo numerico']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</numeric-field-template>\r\n\r\n<list-value-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Elenco generico']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</list-value-field-template>\r\n\r\n <attachment-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Allegato']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</attachment-field-template>\r\n\r\n<image-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Immagine']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</image-field-template> \r\n\r\n<list-form-record #listInnerFormRecords *ngIf=\"field.FieldType == FieldTypeEnum['Form di dettaglio']\"\r\n [form]=\"getInnerFormFromField(field)\" [configurations]=\"configList\"\r\n (onAddViewEditRecord)=\"onAddViewEditInnerFormRecord($event, field)\">\r\n</list-form-record>", styles: [""], dependencies: [{ kind: "directive", type: i2$4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TextFieldTemplateComponent, selector: "text-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: BooleanFieldTemplateComponent, selector: "boolean-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: DateFieldTemplateComponent, selector: "date-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: NumericFieldTemplateComponent, selector: "numeric-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: ListValueFieldTemplateComponent, selector: "list-value-field-template", inputs: ["debugMode", "field", "record"], outputs: ["recordChange"] }, { kind: "component", type: AttachmentFieldTemplateComponent, selector: "attachment-field-template", inputs: ["onlyImages", "field", "record"], outputs: ["recordChange", "onAttachmentsChange"] }, { kind: "component", type: ImageFieldTemplateComponent, selector: "image-field-template", inputs: ["record", "field"], outputs: ["recordChange"] }, { kind: "component", type: ListFormRecordComponent, selector: "list-form-record", inputs: ["debugMode", "configurations", "endPointConfiguration", "formID", "form", "externalButtons"], outputs: ["onViewRecord", "onAddViewEditRecord", "onDuplicateRecord", "onAfterDuplicateRecord", "onDeleteRecord", "onAfterDeleteRecord"] }] });
|
|
2657
|
+
DynamicModuleFieldFixComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: { debugMode: "debugMode", field: "field", form: "form", record: "record" }, outputs: { recordChange: "recordChange" }, viewQueries: [{ propertyName: "dialogInnerFormRecord", first: true, predicate: ["dialogInnerFormRecord"], descendants: true, static: true }, { propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }, { propertyName: "listInnerFormRecords", predicate: ["listInnerFormRecords"], descendants: true }], ngImport: i0, template: "<text-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</text-field-template>\r\n\r\n<textarea-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Area di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</textarea-field-template>\r\n\r\n<boolean-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Booleano']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</boolean-field-template>\r\n\r\n<date-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Data e/o ora']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</date-field-template>\r\n\r\n<numeric-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo numerico']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</numeric-field-template>\r\n\r\n<list-value-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Elenco generico']\"\r\n [debugMode]=\"debugMode\" [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</list-value-field-template>\r\n\r\n <attachment-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Allegato']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</attachment-field-template>\r\n\r\n<image-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Immagine']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</image-field-template> \r\n\r\n<list-form-record #listInnerFormRecords *ngIf=\"field.FieldType == FieldTypeEnum['Form di dettaglio']\"\r\n [form]=\"getInnerFormFromField(field)\" [configurations]=\"configList\"\r\n (onAddViewEditRecord)=\"onAddViewEditInnerFormRecord($event, field)\">\r\n</list-form-record>", styles: [""], dependencies: [{ kind: "directive", type: i2$4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TextFieldTemplateComponent, selector: "text-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: BooleanFieldTemplateComponent, selector: "boolean-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: DateFieldTemplateComponent, selector: "date-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: NumericFieldTemplateComponent, selector: "numeric-field-template", inputs: ["field", "record"], outputs: ["recordChange"] }, { kind: "component", type: ListValueFieldTemplateComponent, selector: "list-value-field-template", inputs: ["debugMode", "field", "record"], outputs: ["recordChange"] }, { kind: "component", type: AttachmentFieldTemplateComponent, selector: "attachment-field-template", inputs: ["onlyImages", "field", "record"], outputs: ["recordChange", "onAttachmentsChange"] }, { kind: "component", type: ImageFieldTemplateComponent, selector: "image-field-template", inputs: ["record", "field"], outputs: ["recordChange"] }, { kind: "component", type: ListFormRecordComponent, selector: "list-form-record", inputs: ["debugMode", "configurations", "endPointConfiguration", "formID", "form", "externalButtons"], outputs: ["onViewRecord", "onAddViewEditRecord", "onDuplicateRecord", "onAfterDuplicateRecord", "onDeleteRecord", "onAfterDeleteRecord"] }] });
|
|
2643
2658
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DynamicModuleFieldFixComponent, decorators: [{
|
|
2644
2659
|
type: Component,
|
|
2645
|
-
args: [{ selector: 'dynamic-module-field-fix', template: "<text-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</text-field-template>\r\n\r\n<textarea-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Area di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</textarea-field-template>\r\n\r\n<boolean-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Booleano']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</boolean-field-template>\r\n\r\n<date-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Data e/o ora']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</date-field-template>\r\n\r\n<numeric-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo numerico']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</numeric-field-template>\r\n\r\n<list-value-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Elenco generico']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</list-value-field-template>\r\n\r\n <attachment-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Allegato']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</attachment-field-template>\r\n\r\n<image-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Immagine']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</image-field-template> \r\n\r\n<list-form-record #listInnerFormRecords *ngIf=\"field.FieldType == FieldTypeEnum['Form di dettaglio']\"\r\n [form]=\"getInnerFormFromField(field)\" [configurations]=\"configList\"\r\n (onAddViewEditRecord)=\"onAddViewEditInnerFormRecord($event, field)\">\r\n</list-form-record>" }]
|
|
2646
|
-
}], ctorParameters: function () { return [{ type: i1$2.MatDialog }]; }, propDecorators: {
|
|
2660
|
+
args: [{ selector: 'dynamic-module-field-fix', template: "<text-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</text-field-template>\r\n\r\n<textarea-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Area di testo']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</textarea-field-template>\r\n\r\n<boolean-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Booleano']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</boolean-field-template>\r\n\r\n<date-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Data e/o ora']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</date-field-template>\r\n\r\n<numeric-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Campo numerico']\"\r\n [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</numeric-field-template>\r\n\r\n<list-value-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Elenco generico']\"\r\n [debugMode]=\"debugMode\" [matTooltip]=\"field.Tooltip\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</list-value-field-template>\r\n\r\n <attachment-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Allegato']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</attachment-field-template>\r\n\r\n<image-field-template #fieldTemplate *ngIf=\"field.FieldType == FieldTypeEnum['Immagine']\"\r\n [matTooltip]=\"field.Description\" [(record)]=\"record\" [field]=\"field\" (recordChange)=\"onRecordChange()\">\r\n</image-field-template> \r\n\r\n<list-form-record #listInnerFormRecords *ngIf=\"field.FieldType == FieldTypeEnum['Form di dettaglio']\"\r\n [form]=\"getInnerFormFromField(field)\" [configurations]=\"configList\"\r\n (onAddViewEditRecord)=\"onAddViewEditInnerFormRecord($event, field)\">\r\n</list-form-record>" }]
|
|
2661
|
+
}], ctorParameters: function () { return [{ type: i1$2.MatDialog }]; }, propDecorators: { debugMode: [{
|
|
2662
|
+
type: Input
|
|
2663
|
+
}], field: [{
|
|
2647
2664
|
type: Input
|
|
2648
2665
|
}], form: [{
|
|
2649
2666
|
type: Input
|
|
@@ -3085,10 +3102,10 @@ class AddFormRecordComponent {
|
|
|
3085
3102
|
}
|
|
3086
3103
|
}
|
|
3087
3104
|
AddFormRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AddFormRecordComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
|
|
3088
|
-
AddFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AddFormRecordComponent, selector: "add-form-record", inputs: { debugMode: "debugMode", configurations: "configurations", endPointConfiguration: "endPointConfiguration", userID: "userID", formID: "formID", form: "form", record: "record", onlyView: "onlyView" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent" }, viewQueries: [{ propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [""], dependencies: [{ kind: "component", type: i2$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i11.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i11.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i11.MatStepperNext, selector: "button[matStepperNext]", inputs: ["type"] }, { kind: "directive", type: i11.MatStepperPrevious, selector: "button[matStepperPrevious]", inputs: ["type"] }, { kind: "component", type: i4$2.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i4$2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i5$2.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5$2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5$2.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5$2.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: ["field", "form", "record"], outputs: ["recordChange"] }] });
|
|
3105
|
+
AddFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AddFormRecordComponent, selector: "add-form-record", inputs: { debugMode: "debugMode", configurations: "configurations", endPointConfiguration: "endPointConfiguration", userID: "userID", formID: "formID", form: "form", record: "record", onlyView: "onlyView" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent" }, viewQueries: [{ propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [debugMode]=\"debugMode\" [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [""], dependencies: [{ kind: "component", type: i2$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i11.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i11.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i11.MatStepperNext, selector: "button[matStepperNext]", inputs: ["type"] }, { kind: "directive", type: i11.MatStepperPrevious, selector: "button[matStepperPrevious]", inputs: ["type"] }, { kind: "component", type: i4$2.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i4$2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i5$2.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5$2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5$2.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5$2.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: ["debugMode", "field", "form", "record"], outputs: ["recordChange"] }] });
|
|
3089
3106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AddFormRecordComponent, decorators: [{
|
|
3090
3107
|
type: Component,
|
|
3091
|
-
args: [{ selector: "add-form-record", template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>" }]
|
|
3108
|
+
args: [{ selector: "add-form-record", template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled\">\r\n Salva\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [hidden]=\"!field.InListView\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [debugMode]=\"debugMode\" [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>" }]
|
|
3092
3109
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: UtilityHelperService }]; }, propDecorators: { debugMode: [{
|
|
3093
3110
|
type: Input
|
|
3094
3111
|
}], configurations: [{
|