mmhglobal-dynamicform 2.19.0 → 2.20.0
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/README.md +4 -0
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +1 -6
- package/esm2020/lib/virtual-scroll/virtual-scroll.component.mjs +28 -22
- package/esm2020/public-api.mjs +1 -2
- package/fesm2015/mmhglobal-dynamicform.mjs +82 -273
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +81 -273
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/mmhglobal-dynamicform.module.d.ts +72 -73
- package/lib/virtual-scroll/virtual-scroll.component.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +0 -210
- package/lib/zquerybuilder/zquerybuilder.component.d.ts +0 -48
|
@@ -42,80 +42,79 @@ import * as i40 from "./zmodal/zmodal.component";
|
|
|
42
42
|
import * as i41 from "./zmodal/zmodal-mobile.component";
|
|
43
43
|
import * as i42 from "./znumeric/znumeric.component";
|
|
44
44
|
import * as i43 from "./zpostselectinput/zpostselectinput.component";
|
|
45
|
-
import * as i44 from "./
|
|
46
|
-
import * as i45 from "./
|
|
47
|
-
import * as i46 from "./
|
|
48
|
-
import * as i47 from "./
|
|
49
|
-
import * as i48 from "./
|
|
50
|
-
import * as i49 from "./
|
|
51
|
-
import * as i50 from "./
|
|
52
|
-
import * as i51 from "./
|
|
53
|
-
import * as i52 from "./
|
|
54
|
-
import * as i53 from "./
|
|
55
|
-
import * as i54 from "./
|
|
56
|
-
import * as i55 from "./
|
|
57
|
-
import * as i56 from "./
|
|
58
|
-
import * as i57 from "./
|
|
59
|
-
import * as i58 from "./
|
|
60
|
-
import * as i59 from "./
|
|
61
|
-
import * as i60 from "./
|
|
62
|
-
import * as i61 from "./
|
|
63
|
-
import * as i62 from "./
|
|
64
|
-
import * as i63 from "./
|
|
65
|
-
import * as i64 from "./
|
|
66
|
-
import * as i65 from "./input-
|
|
67
|
-
import * as i66 from "./embed-components/
|
|
68
|
-
import * as i67 from "./embed-components/
|
|
69
|
-
import * as i68 from "./embed-components/
|
|
70
|
-
import * as i69 from "./
|
|
71
|
-
import * as i70 from "./
|
|
72
|
-
import * as i71 from "./
|
|
73
|
-
import * as i72 from "./zdatetime/
|
|
74
|
-
import * as i73 from "./zdatetime/
|
|
75
|
-
import * as i74 from "./
|
|
76
|
-
import * as i75 from "./
|
|
77
|
-
import * as i76 from "./
|
|
78
|
-
import * as i77 from "./
|
|
79
|
-
import * as i78 from "./
|
|
80
|
-
import * as i79 from "
|
|
81
|
-
import * as i80 from "
|
|
82
|
-
import * as i81 from "
|
|
83
|
-
import * as i82 from "@angular/
|
|
84
|
-
import * as i83 from "@angular/
|
|
85
|
-
import * as i84 from "
|
|
86
|
-
import * as i85 from "
|
|
87
|
-
import * as i86 from "
|
|
88
|
-
import * as i87 from "
|
|
89
|
-
import * as i88 from "@progress/kendo-angular-
|
|
90
|
-
import * as i89 from "@progress/kendo-angular-
|
|
91
|
-
import * as i90 from "@progress/kendo-angular-
|
|
92
|
-
import * as i91 from "@progress/kendo-angular-
|
|
93
|
-
import * as i92 from "@progress/kendo-angular-
|
|
94
|
-
import * as i93 from "@progress/kendo-angular-
|
|
95
|
-
import * as i94 from "@progress/kendo-angular-
|
|
96
|
-
import * as i95 from "@progress/kendo-angular-
|
|
97
|
-
import * as i96 from "@progress/kendo-angular-
|
|
98
|
-
import * as i97 from "@progress/kendo-angular-
|
|
99
|
-
import * as i98 from "@progress/kendo-angular-
|
|
100
|
-
import * as i99 from "@progress/kendo-angular-
|
|
101
|
-
import * as i100 from "@progress/kendo-angular-
|
|
102
|
-
import * as i101 from "@progress/kendo-angular-
|
|
103
|
-
import * as i102 from "@progress/kendo-angular-
|
|
104
|
-
import * as i103 from "@progress/
|
|
105
|
-
import * as i104 from "@progress/
|
|
106
|
-
import * as i105 from "@progress/kendo-angular-
|
|
107
|
-
import * as i106 from "@progress/kendo-angular-
|
|
108
|
-
import * as i107 from "@progress/kendo-angular-
|
|
109
|
-
import * as i108 from "@progress/kendo-angular-
|
|
110
|
-
import * as i109 from "
|
|
111
|
-
import * as i110 from "mmhglobal-
|
|
112
|
-
import * as i111 from "
|
|
113
|
-
import * as i112 from "@
|
|
114
|
-
import * as i113 from "@
|
|
115
|
-
import * as i114 from "@
|
|
116
|
-
import * as i115 from "@angular/cdk/scrolling";
|
|
45
|
+
import * as i44 from "./zreport/zreport.component";
|
|
46
|
+
import * as i45 from "./zscheduler/zscheduler.component";
|
|
47
|
+
import * as i46 from "./zselectmultiple/zselectmultiple.component";
|
|
48
|
+
import * as i47 from "./ztab/ztab.component";
|
|
49
|
+
import * as i48 from "./ztext/ztext.component";
|
|
50
|
+
import * as i49 from "./ztextarea/ztextarea.component";
|
|
51
|
+
import * as i50 from "./ztexteditor/ztexteditor.component";
|
|
52
|
+
import * as i51 from "./ztree/ztree.component";
|
|
53
|
+
import * as i52 from "./ztreelist/ztreelist.component";
|
|
54
|
+
import * as i53 from "./ztrendcard/ztrendcard.component";
|
|
55
|
+
import * as i54 from "./zunknown/zunknown.component";
|
|
56
|
+
import * as i55 from "./zudf/zudf.component";
|
|
57
|
+
import * as i56 from "./zupload/zupload.component";
|
|
58
|
+
import * as i57 from "./zworkflowbuttons/zworkflowbuttons.component";
|
|
59
|
+
import * as i58 from "./kcard/kcard.component";
|
|
60
|
+
import * as i59 from "./zinput-container/zinput-container.component";
|
|
61
|
+
import * as i60 from "./zprogressbar/zprogressbar.component";
|
|
62
|
+
import * as i61 from "./zinput-container/zinput-container.pipe";
|
|
63
|
+
import * as i62 from "./zselectmultiple/zselectmultiple.pipe";
|
|
64
|
+
import * as i63 from "./pipe/htmlSanitize.pipe";
|
|
65
|
+
import * as i64 from "./input-error-message/input-error-message.component";
|
|
66
|
+
import * as i65 from "./embed-components/input-field-addons/input-field-addons.component";
|
|
67
|
+
import * as i66 from "./embed-components/spinner/spinner.component";
|
|
68
|
+
import * as i67 from "./embed-components/page-loader/page-loader.component";
|
|
69
|
+
import * as i68 from "./embed-components/processing-record-loader/processing-record-loader.component";
|
|
70
|
+
import * as i69 from "./znumeric/znumeric.component.pipe";
|
|
71
|
+
import * as i70 from "./zgrid/container/zgrid-container.component";
|
|
72
|
+
import * as i71 from "./zdatetime/dateKendoFormatParser.pipe";
|
|
73
|
+
import * as i72 from "./zdatetime/dateIonicFormatParser.pipe";
|
|
74
|
+
import * as i73 from "./zdatetime/dateIonicMinMaxDate.pipe";
|
|
75
|
+
import * as i74 from "./sfquerybuilder/sfquerybuilder.component";
|
|
76
|
+
import * as i75 from "./zloop/zloop.component";
|
|
77
|
+
import * as i76 from "./ksplitter/ksplitter.component";
|
|
78
|
+
import * as i77 from "./virtual-scroll/virtual-scroll.component";
|
|
79
|
+
import * as i78 from "./zcolorpicker/zcolorpicker.component";
|
|
80
|
+
import * as i79 from "@ionic/angular";
|
|
81
|
+
import * as i80 from "ionic-selectable";
|
|
82
|
+
import * as i81 from "@angular/common";
|
|
83
|
+
import * as i82 from "@angular/router";
|
|
84
|
+
import * as i83 from "@angular/forms";
|
|
85
|
+
import * as i84 from "ng2-ace-editor";
|
|
86
|
+
import * as i85 from "@fortawesome/angular-fontawesome";
|
|
87
|
+
import * as i86 from "angular2-query-builder";
|
|
88
|
+
import * as i87 from "@progress/kendo-angular-gauges";
|
|
89
|
+
import * as i88 from "@progress/kendo-angular-buttons";
|
|
90
|
+
import * as i89 from "@progress/kendo-angular-charts";
|
|
91
|
+
import * as i90 from "@progress/kendo-angular-dateinputs";
|
|
92
|
+
import * as i91 from "@progress/kendo-angular-dropdowns";
|
|
93
|
+
import * as i92 from "@progress/kendo-angular-editor";
|
|
94
|
+
import * as i93 from "@progress/kendo-angular-grid";
|
|
95
|
+
import * as i94 from "@progress/kendo-angular-filter";
|
|
96
|
+
import * as i95 from "@progress/kendo-angular-indicators";
|
|
97
|
+
import * as i96 from "@progress/kendo-angular-intl";
|
|
98
|
+
import * as i97 from "@progress/kendo-angular-inputs";
|
|
99
|
+
import * as i98 from "@progress/kendo-angular-label";
|
|
100
|
+
import * as i99 from "@progress/kendo-angular-layout";
|
|
101
|
+
import * as i100 from "@progress/kendo-angular-notification";
|
|
102
|
+
import * as i101 from "@progress/kendo-angular-popup";
|
|
103
|
+
import * as i102 from "@progress/kendo-angular-progressbar";
|
|
104
|
+
import * as i103 from "@progress/telerik-angular-report-viewer";
|
|
105
|
+
import * as i104 from "@progress/kendo-angular-scheduler";
|
|
106
|
+
import * as i105 from "@progress/kendo-angular-treelist";
|
|
107
|
+
import * as i106 from "@progress/kendo-angular-treeview";
|
|
108
|
+
import * as i107 from "@progress/kendo-angular-tooltip";
|
|
109
|
+
import * as i108 from "@progress/kendo-angular-upload";
|
|
110
|
+
import * as i109 from "mmhglobal-zcore";
|
|
111
|
+
import * as i110 from "mmhglobal-zmodal";
|
|
112
|
+
import * as i111 from "@progress/kendo-angular-navigation";
|
|
113
|
+
import * as i112 from "@angular/flex-layout";
|
|
114
|
+
import * as i113 from "@syncfusion/ej2-angular-querybuilder";
|
|
115
|
+
import * as i114 from "@angular/cdk/scrolling";
|
|
117
116
|
export declare class MmhglobalDynamicformModule {
|
|
118
117
|
static ɵfac: i0.ɵɵFactoryDeclaration<MmhglobalDynamicformModule, never>;
|
|
119
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<MmhglobalDynamicformModule, [typeof i1.ScrollbarThemeDirective, typeof i2.FieldElementDirective, typeof i3.ZGridBindingDirective, typeof i4.ZGridPopupAnchorDirective, typeof i5.OpenOnFocusDirective, typeof i6.ElementContainerDirective, typeof i7.DateParserFilter, typeof i8.EditorFilter, typeof i9.DivzLayout, typeof i10.TabFilter, typeof i11.DateRangeFilterCellComponent, typeof i12.ZSchedulerToolBarComponent, typeof i13.UiheaderComponent, typeof i14.UicontainerComponent, typeof i15.UicontentComponent, typeof i16.UipageComponent, typeof i17.UibulletinComponent, typeof i18.UiactionbuttonComponent, typeof i19.UimenucontentComponent, typeof i20.UimenubuttonComponent, typeof i21.UiappmenucontentComponent, typeof i22.UivalidationmessageComponent, typeof i23.ZBulletComponent, typeof i24.ZbuttonsComponent, typeof i25.ZcardComponent, typeof i26.ZchartComponent, typeof i27.ZcheckboxComponent, typeof i28.ZChipComponent, typeof i29.ZcodeeditorComponent, typeof i30.ZdaterangeComponent, typeof i31.ZdatetimeComponent, typeof i32.ZdivComponent, typeof i33.ZformComponent, typeof i34.ZformcontrolComponent, typeof i35.ZgaugeComponent, typeof i36.ZgridComponent, typeof i37.ZimgComponent, typeof i38.ZlabelComponent, typeof i39.ZmfbComponent, typeof i40.ZmodalComponent, typeof i41.ZmodalMobileComponent, typeof i42.ZnumericComponent, typeof i43.ZpostselectinputComponent, typeof i44.
|
|
118
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<MmhglobalDynamicformModule, [typeof i1.ScrollbarThemeDirective, typeof i2.FieldElementDirective, typeof i3.ZGridBindingDirective, typeof i4.ZGridPopupAnchorDirective, typeof i5.OpenOnFocusDirective, typeof i6.ElementContainerDirective, typeof i7.DateParserFilter, typeof i8.EditorFilter, typeof i9.DivzLayout, typeof i10.TabFilter, typeof i11.DateRangeFilterCellComponent, typeof i12.ZSchedulerToolBarComponent, typeof i13.UiheaderComponent, typeof i14.UicontainerComponent, typeof i15.UicontentComponent, typeof i16.UipageComponent, typeof i17.UibulletinComponent, typeof i18.UiactionbuttonComponent, typeof i19.UimenucontentComponent, typeof i20.UimenubuttonComponent, typeof i21.UiappmenucontentComponent, typeof i22.UivalidationmessageComponent, typeof i23.ZBulletComponent, typeof i24.ZbuttonsComponent, typeof i25.ZcardComponent, typeof i26.ZchartComponent, typeof i27.ZcheckboxComponent, typeof i28.ZChipComponent, typeof i29.ZcodeeditorComponent, typeof i30.ZdaterangeComponent, typeof i31.ZdatetimeComponent, typeof i32.ZdivComponent, typeof i33.ZformComponent, typeof i34.ZformcontrolComponent, typeof i35.ZgaugeComponent, typeof i36.ZgridComponent, typeof i37.ZimgComponent, typeof i38.ZlabelComponent, typeof i39.ZmfbComponent, typeof i40.ZmodalComponent, typeof i41.ZmodalMobileComponent, typeof i42.ZnumericComponent, typeof i43.ZpostselectinputComponent, typeof i44.ZreportComponent, typeof i45.ZschedulerComponent, typeof i46.ZselectmultipleComponent, typeof i47.ZtabComponent, typeof i48.ZtextComponent, typeof i49.ZtextareaComponent, typeof i50.ZtexteditorComponent, typeof i51.ZtreeComponent, typeof i52.ZtreelistComponent, typeof i53.ZtrendcardComponent, typeof i54.ZunknownComponent, typeof i55.ZudfComponent, typeof i56.ZuploadComponent, typeof i57.ZworkflowbuttonsComponent, typeof i58.KcardComponent, typeof i59.ZInputContainerComponent, typeof i60.ZprogressbarComponent, typeof i61.ZInputParser, typeof i62.ZSelectTranslationParser, typeof i63.HtmlSanitizePipe, typeof i64.InputErrorMessageComponent, typeof i65.InputFieldAddOnsComponent, typeof i66.SpinnerComponent, typeof i67.PageLoaderComponent, typeof i68.ProcessingRecordLoaderComponent, typeof i69.ZNumericParser, typeof i70.ZgridContainerComponent, typeof i71.DateKendoFormatParser, typeof i72.DateIonicFormatParser, typeof i73.DateIonicMinMaxParser, typeof i74.SfquerybuilderComponent, typeof i75.ZloopComponent, typeof i76.KsplitterComponent, typeof i77.VirtualScrollComponent, typeof i78.ZcolorpickerComponent], [typeof i79.IonicModule, typeof i80.IonicSelectableModule, typeof i81.CommonModule, typeof i82.RouterModule, typeof i83.FormsModule, typeof i83.ReactiveFormsModule, typeof i84.AceEditorModule, typeof i85.FontAwesomeModule, typeof i86.QueryBuilderModule, typeof i87.ArcGaugeModule, typeof i88.ButtonsModule, typeof i89.ChartsModule, typeof i90.CalendarModule, typeof i90.DateInputsModule, typeof i91.DropDownsModule, typeof i92.EditorModule, typeof i93.ExcelModule, typeof i93.GridModule, typeof i94.FilterModule, typeof i95.IndicatorsModule, typeof i96.IntlModule, typeof i97.InputsModule, typeof i97.SwitchModule, typeof i97.TextBoxModule, typeof i98.LabelModule, typeof i99.LayoutModule, typeof i99.PanelBarModule, typeof i99.TabStripModule, typeof i100.NotificationModule, typeof i101.PopupModule, typeof i102.ProgressBarModule, typeof i103.TelerikReportingModule, typeof i104.SchedulerModule, typeof i105.TreeListModule, typeof i106.TreeViewModule, typeof i107.TooltipModule, typeof i107.PopoverModule, typeof i108.UploadModule, typeof i108.UploadsModule, typeof i109.ZCoreModule, typeof i110.MmhglobalZmodalModule, typeof i111.NavigationModule, typeof i112.FlexLayoutModule, typeof i113.QueryBuilderModule, typeof i114.ScrollingModule, typeof i86.QueryBuilderModule, typeof i97.ColorPickerModule], [typeof i1.ScrollbarThemeDirective, typeof i2.FieldElementDirective, typeof i3.ZGridBindingDirective, typeof i4.ZGridPopupAnchorDirective, typeof i5.OpenOnFocusDirective, typeof i6.ElementContainerDirective, typeof i7.DateParserFilter, typeof i8.EditorFilter, typeof i9.DivzLayout, typeof i10.TabFilter, typeof i11.DateRangeFilterCellComponent, typeof i12.ZSchedulerToolBarComponent, typeof i13.UiheaderComponent, typeof i14.UicontainerComponent, typeof i15.UicontentComponent, typeof i16.UipageComponent, typeof i19.UimenucontentComponent, typeof i20.UimenubuttonComponent, typeof i21.UiappmenucontentComponent, typeof i17.UibulletinComponent, typeof i18.UiactionbuttonComponent, typeof i22.UivalidationmessageComponent, typeof i23.ZBulletComponent, typeof i24.ZbuttonsComponent, typeof i25.ZcardComponent, typeof i26.ZchartComponent, typeof i27.ZcheckboxComponent, typeof i28.ZChipComponent, typeof i29.ZcodeeditorComponent, typeof i30.ZdaterangeComponent, typeof i31.ZdatetimeComponent, typeof i32.ZdivComponent, typeof i33.ZformComponent, typeof i34.ZformcontrolComponent, typeof i35.ZgaugeComponent, typeof i36.ZgridComponent, typeof i37.ZimgComponent, typeof i38.ZlabelComponent, typeof i39.ZmfbComponent, typeof i40.ZmodalComponent, typeof i41.ZmodalMobileComponent, typeof i42.ZnumericComponent, typeof i43.ZpostselectinputComponent, typeof i44.ZreportComponent, typeof i45.ZschedulerComponent, typeof i46.ZselectmultipleComponent, typeof i47.ZtabComponent, typeof i48.ZtextComponent, typeof i49.ZtextareaComponent, typeof i50.ZtexteditorComponent, typeof i51.ZtreeComponent, typeof i52.ZtreelistComponent, typeof i53.ZtrendcardComponent, typeof i54.ZunknownComponent, typeof i55.ZudfComponent, typeof i56.ZuploadComponent, typeof i57.ZworkflowbuttonsComponent, typeof i59.ZInputContainerComponent, typeof i60.ZprogressbarComponent, typeof i61.ZInputParser, typeof i62.ZSelectTranslationParser, typeof i63.HtmlSanitizePipe, typeof i64.InputErrorMessageComponent, typeof i65.InputFieldAddOnsComponent, typeof i66.SpinnerComponent, typeof i67.PageLoaderComponent, typeof i68.ProcessingRecordLoaderComponent, typeof i69.ZNumericParser, typeof i70.ZgridContainerComponent, typeof i71.DateKendoFormatParser, typeof i72.DateIonicFormatParser, typeof i73.DateIonicMinMaxParser, typeof i74.SfquerybuilderComponent, typeof i75.ZloopComponent, typeof i76.KsplitterComponent, typeof i77.VirtualScrollComponent, typeof i78.ZcolorpickerComponent]>;
|
|
120
119
|
static ɵinj: i0.ɵɵInjectorDeclaration<MmhglobalDynamicformModule>;
|
|
121
120
|
}
|
|
@@ -33,6 +33,7 @@ export declare class VirtualScrollComponent extends ContainerFieldBase implement
|
|
|
33
33
|
private updateDataByIndex;
|
|
34
34
|
private updateViewPortData;
|
|
35
35
|
setupFooter(): void;
|
|
36
|
+
getComponentOptions(): VirtualScrollOption;
|
|
36
37
|
getGroupByLabelTemplate(dataItem: any, options: any): string;
|
|
37
38
|
groupByOnClick(groupByValue: string): void;
|
|
38
39
|
private computeDataItems;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -55,7 +55,6 @@ export * from './lib/zmodal/zmodal.component';
|
|
|
55
55
|
export * from './lib/zmodal/zmodal-mobile.component';
|
|
56
56
|
export * from './lib/znumeric/znumeric.component';
|
|
57
57
|
export * from './lib/zpostselectinput/zpostselectinput.component';
|
|
58
|
-
export * from './lib/zquerybuilder/zquerybuilder.component';
|
|
59
58
|
export * from './lib/zreport/zreport.component';
|
|
60
59
|
export * from './lib/zscheduler/zscheduler.component';
|
|
61
60
|
export * from './lib/zselectmultiple/zselectmultiple.component';
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/********** Angular **********/
|
|
2
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
3
|
-
/********** Ionic **********/
|
|
4
|
-
/********** Plugin **********/
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import { QueryBuilderComponent } from 'angular2-query-builder';
|
|
7
|
-
/********** Component & Service **********/
|
|
8
|
-
import { ZComponentHelper, ZComponentProperties, DefaultPageSettingParams } from 'mmhglobal-zcore';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "mmhglobal-zcore";
|
|
11
|
-
import * as i2 from "@ionic/angular";
|
|
12
|
-
import * as i3 from "angular2-query-builder";
|
|
13
|
-
import * as i4 from "@progress/kendo-angular-dropdowns";
|
|
14
|
-
import * as i5 from "@fortawesome/angular-fontawesome";
|
|
15
|
-
import * as i6 from "@progress/kendo-angular-inputs";
|
|
16
|
-
import * as i7 from "@progress/kendo-angular-dateinputs";
|
|
17
|
-
import * as i8 from "@angular/common";
|
|
18
|
-
import * as i9 from "@angular/forms";
|
|
19
|
-
export class ZquerybuilderComponent {
|
|
20
|
-
constructor(fieldService, resourceApiService, webApiService) {
|
|
21
|
-
this.fieldService = fieldService;
|
|
22
|
-
this.resourceApiService = resourceApiService;
|
|
23
|
-
this.webApiService = webApiService;
|
|
24
|
-
//qbItems: Array<any> = [];
|
|
25
|
-
this.qbItems = {};
|
|
26
|
-
this.componentProperties = new ZComponentProperties();
|
|
27
|
-
this.currentConfig = {
|
|
28
|
-
fields: {},
|
|
29
|
-
allowEmptyRulesets: true
|
|
30
|
-
};
|
|
31
|
-
this.allowRuleset = true;
|
|
32
|
-
this.allowCollapse = false;
|
|
33
|
-
this.persistValueOnFieldChange = false;
|
|
34
|
-
this.isDisabled = false;
|
|
35
|
-
this.bootstrapClassNames = {
|
|
36
|
-
arrowIcon: 'fa fa-chevron-right px-2',
|
|
37
|
-
button: 'btn',
|
|
38
|
-
buttonGroup: 'btn-group',
|
|
39
|
-
rightAlign: 'order-12 ml-auto',
|
|
40
|
-
switchRow: 'd-flex px-2',
|
|
41
|
-
switchGroup: 'd-flex align-items-center',
|
|
42
|
-
switchRadio: 'custom-control-input',
|
|
43
|
-
switchLabel: 'custom-control-label',
|
|
44
|
-
switchControl: 'custom-control custom-radio custom-control-inline',
|
|
45
|
-
row: 'row p-2 m-1',
|
|
46
|
-
rule: 'border',
|
|
47
|
-
ruleSet: 'border',
|
|
48
|
-
invalidRuleSet: 'alert alert-danger',
|
|
49
|
-
emptyWarning: 'text-danger mx-auto',
|
|
50
|
-
operatorControl: 'form-control',
|
|
51
|
-
operatorControlSize: 'col-auto pr-0',
|
|
52
|
-
fieldControl: 'form-control',
|
|
53
|
-
fieldControlSize: 'col-auto pr-0',
|
|
54
|
-
entityControl: 'form-control',
|
|
55
|
-
entityControlSize: 'col-auto pr-0',
|
|
56
|
-
inputControl: 'form-control',
|
|
57
|
-
inputControlSize: 'col-auto'
|
|
58
|
-
};
|
|
59
|
-
this.conditionList = [
|
|
60
|
-
"AND",
|
|
61
|
-
"OR"
|
|
62
|
-
];
|
|
63
|
-
}
|
|
64
|
-
ngOnInit() {
|
|
65
|
-
ZComponentHelper.setComponentProperties(this);
|
|
66
|
-
ZComponentHelper.registerComponent(this);
|
|
67
|
-
if (this.data['AllowCollapse'] === true) {
|
|
68
|
-
this.allowCollapse = this.data['AllowCollapse'];
|
|
69
|
-
}
|
|
70
|
-
if (this.data['AllowRuleset'] === false) {
|
|
71
|
-
this.allowRuleset = this.data['AllowRuleset'];
|
|
72
|
-
}
|
|
73
|
-
if (this.data['Filters']) {
|
|
74
|
-
this.filters = ZComponentHelper.getGroupEvalValue.call(this, this.data['Filters'], this.group);
|
|
75
|
-
}
|
|
76
|
-
this.fields = this.fieldService.getFormFieldCode(this.data.Value, "FormField", null, null);
|
|
77
|
-
try {
|
|
78
|
-
this.fields.subscribe(data => {
|
|
79
|
-
data.forEach((field) => {
|
|
80
|
-
// Handle Options
|
|
81
|
-
let optionList = [];
|
|
82
|
-
if (field.Type == 'category' || field.Type == 'multiselect') {
|
|
83
|
-
if (field['ValueOptions']) {
|
|
84
|
-
field['ValueOptions'].forEach((valueOption) => {
|
|
85
|
-
optionList.push({
|
|
86
|
-
name: valueOption.Name,
|
|
87
|
-
value: valueOption.Value
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
const selectOptions = field['SelectOptions'];
|
|
93
|
-
if (this.filters) {
|
|
94
|
-
selectOptions['Filters'] = this.filters;
|
|
95
|
-
}
|
|
96
|
-
const param = Object.assign({}, DefaultPageSettingParams);
|
|
97
|
-
param.pageSize = selectOptions['PageSize'];
|
|
98
|
-
param.columns = selectOptions['Columns'];
|
|
99
|
-
param.filters += selectOptions['Filters'];
|
|
100
|
-
param.sortColumnName = selectOptions['SortColumnName'];
|
|
101
|
-
param.sortOrder = selectOptions['SortOrder'];
|
|
102
|
-
this.webApiService
|
|
103
|
-
.httpPost$(this.resourceApiService.getPageUrl(selectOptions['ResourceURL']), param)
|
|
104
|
-
.pipe(map((resp) => {
|
|
105
|
-
resp.dataSet.forEach((item) => {
|
|
106
|
-
optionList.push({
|
|
107
|
-
name: item[selectOptions['Name']],
|
|
108
|
-
value: item[selectOptions['Value']]
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
this.qbItems[field.Value]['options'] = optionList;
|
|
112
|
-
})).subscribe();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Default rule to display
|
|
116
|
-
this.qbItems[field.Value] = {
|
|
117
|
-
name: field.Name,
|
|
118
|
-
value: field.Value,
|
|
119
|
-
type: field.Type,
|
|
120
|
-
operatorList: field['Operators'],
|
|
121
|
-
options: optionList,
|
|
122
|
-
nullable: field['IsNullable'],
|
|
123
|
-
defaultValue: field['DefaultValue'] ? field['DefaultValue'] : null
|
|
124
|
-
};
|
|
125
|
-
});
|
|
126
|
-
this.currentConfig = {
|
|
127
|
-
fields: this.qbItems,
|
|
128
|
-
allowEmptyRulesets: true
|
|
129
|
-
};
|
|
130
|
-
});
|
|
131
|
-
// append default query if any.
|
|
132
|
-
if (this.data['DefaultQuery']) {
|
|
133
|
-
let defaultQueryValueString = ZComponentHelper.getGroupEvalValue.call(this, this.data['DefaultQuery'], this.group);
|
|
134
|
-
if (defaultQueryValueString) {
|
|
135
|
-
this.setQueryValue(defaultQueryValueString);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
console.error("error: ", error);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
completeRule(isUndo, queryValue) {
|
|
144
|
-
this.isDisabled = isUndo;
|
|
145
|
-
const qbResultValueName = this.data.Type + '_' + this.data.Value;
|
|
146
|
-
this.group[qbResultValueName] = this.queryBuilder.value;
|
|
147
|
-
if (queryValue) {
|
|
148
|
-
this.group[qbResultValueName] = queryValue;
|
|
149
|
-
}
|
|
150
|
-
if (!isUndo) {
|
|
151
|
-
this.group[qbResultValueName] = [];
|
|
152
|
-
}
|
|
153
|
-
if (this.group.zModel) {
|
|
154
|
-
ZComponentHelper.setModelValue(this.data.Value, this.group[qbResultValueName], this.group);
|
|
155
|
-
}
|
|
156
|
-
if (this.data['OnApplyClick'] && !queryValue) {
|
|
157
|
-
let callFunc = ZComponentHelper.getGroupEvalValue.call(this, this.data['OnApplyClick'], this.group);
|
|
158
|
-
const newFunc = callFunc.bind(this);
|
|
159
|
-
newFunc(this.group, this.group[qbResultValueName], this.fields);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
getOperators(defaultOperatorList, rule) {
|
|
163
|
-
return this.qbItems[rule.field].operatorList ? this.qbItems[rule.field].operatorList : defaultOperatorList;
|
|
164
|
-
}
|
|
165
|
-
getOptionList(optionsList, rule) {
|
|
166
|
-
return this.qbItems[rule.field].options ? this.qbItems[rule.field].options : optionsList;
|
|
167
|
-
}
|
|
168
|
-
setQueryValue(queryValueString) {
|
|
169
|
-
if (queryValueString) {
|
|
170
|
-
const defaultQueryValueJson = toQueryRule(JSON.parse(queryValueString));
|
|
171
|
-
this.queryCtrl = defaultQueryValueJson;
|
|
172
|
-
// default lock the query builder if there default query
|
|
173
|
-
this.completeRule(true, defaultQueryValueJson);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
ZquerybuilderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ZquerybuilderComponent, deps: [{ token: i1.FieldService }, { token: i1.ResourceApiService }, { token: i1.WebApiService }], target: i0.ɵɵFactoryTarget.Component });
|
|
178
|
-
ZquerybuilderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ZquerybuilderComponent, selector: "app-zquerybuilder", inputs: { classNames: "classNames", data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "queryBuilder", first: true, predicate: QueryBuilderComponent, descendants: true }], ngImport: i0, template: "<ion-item *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\"\r\n *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\"\r\n [position]=\"data.LabelPosition ? data.LabelPosition : 'stacked'\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\"\r\n color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"qbcontainer\">\r\n <query-builder [(ngModel)]='queryCtrl'\r\n [(config)]='currentConfig'\r\n [allowRuleset]='allowRuleset'\r\n [allowCollapse]='allowCollapse'\r\n [filters]='filters'\r\n [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <!--AND OR Swtich-->\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n <kendo-dropdownlist [(ngModel)]=\"ruleset.condition\"\r\n (ngModelChange)=\"onChange($event, rule)\"\r\n [data]=\"conditionList\"\r\n [disabled]=\"isDisabled\"\r\n style=\"text-transform: uppercase;\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--Rule RuleSet Remove Rule Set Button-->\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <!--Add Rule Button-->\r\n <ion-button fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"addRule()\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonadd\">\r\n <fa-icon [icon]=\"'plus'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Add</span>\r\n </ion-button>\r\n <!--Add RuleSet Button-->\r\n <ion-button *ngIf=\"addRuleSet\"\r\n fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"addRuleSet()\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonadd\">\r\n <fa-icon [icon]=\"'plus'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Add Rule Set</span>\r\n </ion-button>\r\n <!--Remove RuleSet Button-->\r\n <ion-button *ngIf=\"removeRuleSet\"\r\n fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"removeRuleSet()\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonremove\">\r\n <fa-icon [icon]=\"'times'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Remove Rule Set</span>\r\n </ion-button>\r\n </ng-container>\r\n <!--Remove Rule Button-->\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n <ion-button fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"removeRule(rule)\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonremove\">\r\n <fa-icon [icon]=\"'minus'\"\r\n style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Remove Rule</span>\r\n </ion-button>\r\n </ng-container>\r\n <!--Name dropdown-->\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields=getFields\">\r\n <kendo-dropdownlist [(ngModel)]=\"rule.field\"\r\n (ngModelChange)=\"onChange($event, rule)\"\r\n [data]=\"getFields(rule.entity)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [disabled]=\"isDisabled\"\r\n style=\"padding-right:10px;\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--Operator dropdown-->\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\" style=\"padding:10px\">\r\n <kendo-dropdownlist [(ngModel)]=\"rule.operator\"\r\n (ngModelChange)=\"onChange($event, rule)\"\r\n [data]=\"getOperators(operators, rule)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [disabled]=\"isDisabled\"\r\n style=\"padding-right:10px;\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--Text Field-->\r\n <ng-container *queryInput=\"let rule; let field=field; type: 'string'; let onChange=onChange\">\r\n <kendo-textbox [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [clearButton]=\"true\"\r\n [disabled]=\"isDisabled\"\r\n class=\"customTextbox\">\r\n </kendo-textbox>\r\n </ng-container>\r\n <!--TextArea Field-->\r\n <ng-container *queryInput=\"let rule; type: 'textarea'; let onChange=onChange\">\r\n <kendo-textarea [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [rows]=\"5\"\r\n [cols]=\"40\"\r\n resizable=\"none\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-textarea>\r\n </ng-container>\r\n <!--Number Field-->\r\n <ng-container *queryInput=\"let rule; let field=field; type: 'number'; let onChange=onChange\">\r\n <kendo-numerictextbox [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [value]=\"value\"\r\n [decimals]=\"0\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-numerictextbox>\r\n </ng-container>\r\n <!--Date Field-->\r\n <ng-container *queryInput=\"let rule; type: 'date'; let onChange=onChange\">\r\n <kendo-datepicker [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n calendarType=\"classic\"\r\n [value]=\"value\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-datepicker>\r\n </ng-container>\r\n <!--Category Field-->\r\n <ng-container *queryInput=\"let rule; let options=options; type: 'category'; let onChange=onChange\">\r\n <kendo-dropdownlist [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [data]=\"getOptionList(options, rule)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--DropDown MultiSelect Field-->\r\n <ng-container *queryInput=\"let rule; let options=options; type: 'multiselect'; let onChange=onChange\">\r\n <kendo-multiselect [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [data]=\"getOptionList(options, rule)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [autoClose]=\"false\"\r\n style=\"width:30%\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-multiselect>\r\n </ng-container>\r\n <!--Boolean Field-->\r\n <ng-container *queryInput=\"let rule; type: 'boolean'; let onChange=onChange\">\r\n <input type=\"checkbox\"\r\n [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n class=\"customCheckBox\"\r\n [disabled]=\"isDisabled\"\r\n kendoCheckBox />\r\n </ng-container>\r\n </query-builder>\r\n <br>\r\n <div *ngIf=\"data.ShowQueryResult\">\r\n <div>\r\n <label>Query Result</label>\r\n </div>\r\n <textarea class=\"output\"\r\n resizable=\"none\"\r\n [rows]=\"10\"\r\n [cols]=\"40\">{{queryCtrl | json}}</textarea>\r\n <br>\r\n </div>\r\n <div style=\"width:100%\" slot=\"end\">\r\n <ion-button *ngIf=\"!isDisabled\"\r\n strong=\"false\"\r\n (click)=\"completeRule(true, null)\"\r\n class=\"buttonapply\">\r\n <fa-icon [icon]=\"'save'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Apply</span>\r\n </ion-button>\r\n <ion-button *ngIf=\"isDisabled\"\r\n strong=\"false\"\r\n (click)=\"completeRule(false, null)\"\r\n class=\"buttonapply\">\r\n <fa-icon [icon]=\"'save'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Undo Apply</span>\r\n </ion-button>\r\n </div>\r\n </div>\r\n</ion-item>\r\n", styles: [".qbcontainer{border-radius:5px;border:1px solid rgba(0,0,0,.08);padding:10px;margin:10px 0;width:100%}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}:host ::ng-deep query-builder .k-dropdown .k-dropdown-wrap,:host ::ng-deep query-builder .k-dropdowntree .k-dropdown-wrap{background-color:#fff}:host ::ng-deep query-builder .customTextbox{width:calc(100% - 440px);min-width:230px}:host ::ng-deep query-builder .customCheckBox{width:27px;height:27px}:host ::ng-deep query-builder .buttonadd{background-color:#479400;color:#fff;border-color:#479400}:host ::ng-deep query-builder .buttonremove{background-color:#f04141;color:#fff;border-color:#f04141;margin-top:0}.buttonapply{background-color:#5596e6;color:#fff;border-color:#5596e6}\n"], components: [{ type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i3.QueryBuilderComponent, selector: "query-builder", inputs: ["data", "allowRuleset", "allowCollapse", "emptyMessage", "config", "persistValueOnFieldChange", "value", "disabled", "classNames", "operatorMap", "parentValue", "parentArrowIconTemplate", "parentInputTemplates", "parentOperatorTemplate", "parentFieldTemplate", "parentEntityTemplate", "parentSwitchGroupTemplate", "parentButtonGroupTemplate", "parentRemoveButtonTemplate", "parentEmptyWarningTemplate", "parentChangeCallback", "parentTouchedCallback"] }, { type: i4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "errorIcon", "clearButtonIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i6.TextAreaComponent, selector: "kendo-textarea", inputs: ["focusableId", "flow", "rows", "cols", "maxlength", "tabindex", "tabIndex", "resizable", "size", "rounded", "fillMode"], outputs: ["focus", "blur", "valueChange"], exportAs: ["kendoTextArea"] }, { type: i6.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i7.DatePickerComponent, selector: "kendo-datepicker", inputs: ["cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }, { type: i4.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["focusableId", "autoClose", "loading", "data", "value", "valueField", "textField", "tabindex", "tabIndex", "size", "rounded", "fillMode", "placeholder", "disabled", "itemDisabled", "checkboxes", "readonly", "filterable", "virtual", "popupSettings", "listHeight", "valuePrimitive", "clearButton", "tagMapper", "allowCustom", "valueNormalizer"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.QuerySwitchGroupDirective, selector: "[querySwitchGroup]" }, { type: i3.QueryButtonGroupDirective, selector: "[queryButtonGroup]" }, { type: i3.QueryRemoveButtonDirective, selector: "[queryRemoveButton]" }, { type: i3.QueryFieldDirective, selector: "[queryField]" }, { type: i3.QueryOperatorDirective, selector: "[queryOperator]" }, { type: i3.QueryInputDirective, selector: "[queryInput]", inputs: ["queryInputType"] }, { type: i9.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i6.CheckBoxDirective, selector: "input[kendoCheckBox]", inputs: ["size", "rounded"] }], pipes: { "json": i8.JsonPipe } });
|
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ZquerybuilderComponent, decorators: [{
|
|
180
|
-
type: Component,
|
|
181
|
-
args: [{ selector: 'app-zquerybuilder', template: "<ion-item *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\"\r\n *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\"\r\n [position]=\"data.LabelPosition ? data.LabelPosition : 'stacked'\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\"\r\n color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"qbcontainer\">\r\n <query-builder [(ngModel)]='queryCtrl'\r\n [(config)]='currentConfig'\r\n [allowRuleset]='allowRuleset'\r\n [allowCollapse]='allowCollapse'\r\n [filters]='filters'\r\n [persistValueOnFieldChange]='persistValueOnFieldChange'>\r\n <!--AND OR Swtich-->\r\n <ng-container *querySwitchGroup=\"let ruleset; let onChange=onChange\">\r\n <kendo-dropdownlist [(ngModel)]=\"ruleset.condition\"\r\n (ngModelChange)=\"onChange($event, rule)\"\r\n [data]=\"conditionList\"\r\n [disabled]=\"isDisabled\"\r\n style=\"text-transform: uppercase;\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--Rule RuleSet Remove Rule Set Button-->\r\n <ng-container *queryButtonGroup=\"let ruleset; let addRule=addRule; let addRuleSet=addRuleSet; let removeRuleSet=removeRuleSet\">\r\n <!--Add Rule Button-->\r\n <ion-button fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"addRule()\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonadd\">\r\n <fa-icon [icon]=\"'plus'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Add</span>\r\n </ion-button>\r\n <!--Add RuleSet Button-->\r\n <ion-button *ngIf=\"addRuleSet\"\r\n fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"addRuleSet()\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonadd\">\r\n <fa-icon [icon]=\"'plus'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Add Rule Set</span>\r\n </ion-button>\r\n <!--Remove RuleSet Button-->\r\n <ion-button *ngIf=\"removeRuleSet\"\r\n fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"removeRuleSet()\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonremove\">\r\n <fa-icon [icon]=\"'times'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Remove Rule Set</span>\r\n </ion-button>\r\n </ng-container>\r\n <!--Remove Rule Button-->\r\n <ng-container *queryRemoveButton=\"let rule; let removeRule=removeRule\">\r\n <ion-button fill=\"outline\"\r\n size=\"small\"\r\n strong=\"false\"\r\n (click)=\"removeRule(rule)\"\r\n [disabled]=\"isDisabled\"\r\n class=\"buttonremove\">\r\n <fa-icon [icon]=\"'minus'\"\r\n style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Remove Rule</span>\r\n </ion-button>\r\n </ng-container>\r\n <!--Name dropdown-->\r\n <ng-container *queryField=\"let rule; let fields=fields; let onChange=onChange; let getFields=getFields\">\r\n <kendo-dropdownlist [(ngModel)]=\"rule.field\"\r\n (ngModelChange)=\"onChange($event, rule)\"\r\n [data]=\"getFields(rule.entity)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [disabled]=\"isDisabled\"\r\n style=\"padding-right:10px;\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--Operator dropdown-->\r\n <ng-container *queryOperator=\"let rule; let operators=operators; let onChange=onChange\" style=\"padding:10px\">\r\n <kendo-dropdownlist [(ngModel)]=\"rule.operator\"\r\n (ngModelChange)=\"onChange($event, rule)\"\r\n [data]=\"getOperators(operators, rule)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [disabled]=\"isDisabled\"\r\n style=\"padding-right:10px;\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--Text Field-->\r\n <ng-container *queryInput=\"let rule; let field=field; type: 'string'; let onChange=onChange\">\r\n <kendo-textbox [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [clearButton]=\"true\"\r\n [disabled]=\"isDisabled\"\r\n class=\"customTextbox\">\r\n </kendo-textbox>\r\n </ng-container>\r\n <!--TextArea Field-->\r\n <ng-container *queryInput=\"let rule; type: 'textarea'; let onChange=onChange\">\r\n <kendo-textarea [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [rows]=\"5\"\r\n [cols]=\"40\"\r\n resizable=\"none\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-textarea>\r\n </ng-container>\r\n <!--Number Field-->\r\n <ng-container *queryInput=\"let rule; let field=field; type: 'number'; let onChange=onChange\">\r\n <kendo-numerictextbox [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [value]=\"value\"\r\n [decimals]=\"0\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-numerictextbox>\r\n </ng-container>\r\n <!--Date Field-->\r\n <ng-container *queryInput=\"let rule; type: 'date'; let onChange=onChange\">\r\n <kendo-datepicker [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n calendarType=\"classic\"\r\n [value]=\"value\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-datepicker>\r\n </ng-container>\r\n <!--Category Field-->\r\n <ng-container *queryInput=\"let rule; let options=options; type: 'category'; let onChange=onChange\">\r\n <kendo-dropdownlist [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [data]=\"getOptionList(options, rule)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-dropdownlist>\r\n </ng-container>\r\n <!--DropDown MultiSelect Field-->\r\n <ng-container *queryInput=\"let rule; let options=options; type: 'multiselect'; let onChange=onChange\">\r\n <kendo-multiselect [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n [data]=\"getOptionList(options, rule)\"\r\n textField=\"name\"\r\n valueField=\"value\"\r\n [value]=\"value\"\r\n [valuePrimitive]=\"true\"\r\n [autoClose]=\"false\"\r\n style=\"width:30%\"\r\n [disabled]=\"isDisabled\">\r\n </kendo-multiselect>\r\n </ng-container>\r\n <!--Boolean Field-->\r\n <ng-container *queryInput=\"let rule; type: 'boolean'; let onChange=onChange\">\r\n <input type=\"checkbox\"\r\n [(ngModel)]=\"rule.value\"\r\n (ngModelChange)=\"onChange()\"\r\n class=\"customCheckBox\"\r\n [disabled]=\"isDisabled\"\r\n kendoCheckBox />\r\n </ng-container>\r\n </query-builder>\r\n <br>\r\n <div *ngIf=\"data.ShowQueryResult\">\r\n <div>\r\n <label>Query Result</label>\r\n </div>\r\n <textarea class=\"output\"\r\n resizable=\"none\"\r\n [rows]=\"10\"\r\n [cols]=\"40\">{{queryCtrl | json}}</textarea>\r\n <br>\r\n </div>\r\n <div style=\"width:100%\" slot=\"end\">\r\n <ion-button *ngIf=\"!isDisabled\"\r\n strong=\"false\"\r\n (click)=\"completeRule(true, null)\"\r\n class=\"buttonapply\">\r\n <fa-icon [icon]=\"'save'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Apply</span>\r\n </ion-button>\r\n <ion-button *ngIf=\"isDisabled\"\r\n strong=\"false\"\r\n (click)=\"completeRule(false, null)\"\r\n class=\"buttonapply\">\r\n <fa-icon [icon]=\"'save'\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">Undo Apply</span>\r\n </ion-button>\r\n </div>\r\n </div>\r\n</ion-item>\r\n", styles: [".qbcontainer{border-radius:5px;border:1px solid rgba(0,0,0,.08);padding:10px;margin:10px 0;width:100%}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}:host ::ng-deep query-builder .k-dropdown .k-dropdown-wrap,:host ::ng-deep query-builder .k-dropdowntree .k-dropdown-wrap{background-color:#fff}:host ::ng-deep query-builder .customTextbox{width:calc(100% - 440px);min-width:230px}:host ::ng-deep query-builder .customCheckBox{width:27px;height:27px}:host ::ng-deep query-builder .buttonadd{background-color:#479400;color:#fff;border-color:#479400}:host ::ng-deep query-builder .buttonremove{background-color:#f04141;color:#fff;border-color:#f04141;margin-top:0}.buttonapply{background-color:#5596e6;color:#fff;border-color:#5596e6}\n"] }]
|
|
182
|
-
}], ctorParameters: function () { return [{ type: i1.FieldService }, { type: i1.ResourceApiService }, { type: i1.WebApiService }]; }, propDecorators: { queryBuilder: [{
|
|
183
|
-
type: ViewChild,
|
|
184
|
-
args: [QueryBuilderComponent, { static: false }]
|
|
185
|
-
}], classNames: [{
|
|
186
|
-
type: Input
|
|
187
|
-
}], data: [{
|
|
188
|
-
type: Input
|
|
189
|
-
}], group: [{
|
|
190
|
-
type: Input
|
|
191
|
-
}], form: [{
|
|
192
|
-
type: Input
|
|
193
|
-
}] } });
|
|
194
|
-
export function toQueryRule(queryBuilderModel) {
|
|
195
|
-
let rule = {};
|
|
196
|
-
if (queryBuilderModel.condition) {
|
|
197
|
-
rule.condition = queryBuilderModel.condition;
|
|
198
|
-
rule.rules = queryBuilderModel.rules.map(q => toQueryRule(q));
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
rule.field = queryBuilderModel.field;
|
|
202
|
-
rule.type = queryBuilderModel.type;
|
|
203
|
-
rule.operator = queryBuilderModel.operator;
|
|
204
|
-
rule.value = queryBuilderModel.value instanceof Array
|
|
205
|
-
? queryBuilderModel.type === 'date' ? new Date(queryBuilderModel.value) : queryBuilderModel.value
|
|
206
|
-
: [queryBuilderModel.type === 'date' ? new Date(queryBuilderModel.value) : queryBuilderModel.value];
|
|
207
|
-
}
|
|
208
|
-
return rule;
|
|
209
|
-
}
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienF1ZXJ5YnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96cXVlcnlidWlsZGVyL3pxdWVyeWJ1aWxkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenF1ZXJ5YnVpbGRlci96cXVlcnlidWlsZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEUsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQUUsR0FBRyxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBOEMscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRywyQ0FBMkM7QUFDM0MsT0FBTyxFQUNTLGdCQUFnQixFQUFFLG9CQUFvQixFQUNoQyx3QkFBd0IsRUFDN0MsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFTekIsTUFBTSxPQUFPLHNCQUFzQjtJQXlCakMsWUFDVSxZQUEwQixFQUMxQixrQkFBc0MsRUFDdEMsYUFBNEI7UUFGNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXJCdEMsMkJBQTJCO1FBQzNCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFTix3QkFBbUIsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFFakQsa0JBQWEsR0FBdUI7WUFDekMsTUFBTSxFQUFFLEVBQUU7WUFDVixrQkFBa0IsRUFBRSxJQUFJO1NBQ3pCLENBQUM7UUFDSyxpQkFBWSxHQUFZLElB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c0JBQVosS0FBSzs7QUF3TlIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxpQkFBc0I7SUFDaEQsSUFBSSxJQUFJLEdBQWMsRUFBRSxDQUFDO0lBQ3pCLElBQUksaUJBQWlCLENBQUMsU0FBUyxFQUFFO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO1NBQU07UUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssWUFBWSxLQUFLO1lBQ25ELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSztZQUNqRyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdkc7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlckNvbmZpZywgUXVlcnlCdWlsZGVyQ2xhc3NOYW1lcywgUXVlcnlCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhcjItcXVlcnktYnVpbGRlcic7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgRmllbGRTZXJ2aWNlLCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50UHJvcGVydGllcywgWkZpZWxkLCBaR3JvdXAsXHJcbiAgRm9udEF3ZVNvbWVTZXJ2aWNlLCBEZWZhdWx0UGFnZVNldHRpbmdQYXJhbXMsIFdlYkFwaVNlcnZpY2UsIFJlc291cmNlQXBpU2VydmljZVxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenF1ZXJ5YnVpbGRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3pxdWVyeWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3pxdWVyeWJ1aWxkZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBacXVlcnlidWlsZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKFF1ZXJ5QnVpbGRlckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHF1ZXJ5QnVpbGRlcjogUXVlcnlCdWlsZGVyQ29tcG9uZW50O1xyXG4gIEBJbnB1dCgpIGNsYXNzTmFtZXM6IFF1ZXJ5QnVpbGRlckNsYXNzTmFtZXM7XHJcbiAgQElucHV0KCkgZGF0YTogWkZpZWxkO1xyXG4gIEBJbnB1dCgpIGdyb3VwOiBaR3JvdXA7XHJcbiAgQElucHV0KCkgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICAvL3FiSXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBxYkl0ZW1zID0ge307XHJcblxyXG4gIHB1YmxpYyBjb21wb25lbnRQcm9wZXJ0aWVzID0gbmV3IFpDb21wb25lbnRQcm9wZXJ0aWVzKCk7XHJcbiAgcHVibGljIHF1ZXJ5Q3RybDogYW55O1xyXG4gIHB1YmxpYyBjdXJyZW50Q29uZmlnOiBRdWVyeUJ1aWxkZXJDb25maWcgPSB7XHJcbiAgICBmaWVsZHM6IHt9LFxyXG4gICAgYWxsb3dFbXB0eVJ1bGVzZXRzOiB0cnVlXHJcbiAgfTtcclxuICBwdWJsaWMgYWxsb3dSdWxlc2V0OiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgYWxsb3dDb2xsYXBzZTogYm9vbGVhbj0gZmFsc2U7XHJcbiAgcHVibGljIHBlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZTsgXHJcbiAgcHVibGljIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcnVsZTogYW55O1xyXG4gIHB1YmxpYyB2YWx1ZTogYW55O1xyXG4gIHByaXZhdGUgZmllbGRzOiBhbnk7XHJcbiAgcHVibGljIGZpbHRlcnM6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuICAgIFxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRQcm9wZXJ0aWVzKHRoaXMpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcclxuICAgICBcclxuICAgIGlmICh0aGlzLmRhdGFbJ0FsbG93Q29sbGFwc2UnXSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmFsbG93Q29sbGFwc2UgPSB0aGlzLmRhdGFbJ0FsbG93Q29sbGFwc2UnXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhWydBbGxvd1J1bGVzZXQnXSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5hbGxvd1J1bGVzZXQgPSB0aGlzLmRhdGFbJ0FsbG93UnVsZXNldCddO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGFbJ0ZpbHRlcnMnXSkge1xyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgdGhpcyxcclxuICAgICAgICB0aGlzLmRhdGFbJ0ZpbHRlcnMnXSxcclxuICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWVsZHMgPSB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKHRoaXMuZGF0YS5WYWx1ZSwgXCJGb3JtRmllbGRcIiwgbnVsbCwgbnVsbCk7IFxyXG4gICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5maWVsZHMuc3Vic2NyaWJlKGRhdGEgPT4geyBcclxuICAgICAgICBkYXRhLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBPcHRpb25zXHJcbiAgICAgICAgICBsZXQgb3B0aW9uTGlzdCA9IFtdO1xyXG4gICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gJ2NhdGVnb3J5JyB8fCBmaWVsZC5UeXBlID09ICdtdWx0aXNlbGVjdCcpIHtcclxuICAgICAgICAgICAgaWYgKGZpZWxkWydWYWx1ZU9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICAgIGZpZWxkWydWYWx1ZU9wdGlvbnMnXS5mb3JFYWNoKCh2YWx1ZU9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25MaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiB2YWx1ZU9wdGlvbi5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVPcHRpb24uVmFsdWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBmaWVsZFsnU2VsZWN0T3B0aW9ucyddO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RPcHRpb25zWydGaWx0ZXJzJ10gPSB0aGlzLmZpbHRlcnM7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjb25zdCBwYXJhbSA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRQYWdlU2V0dGluZ1BhcmFtcyk7XHJcbiAgICAgICAgICAgICAgcGFyYW0ucGFnZVNpemUgPSBzZWxlY3RPcHRpb25zWydQYWdlU2l6ZSddO1xyXG4gICAgICAgICAgICAgIHBhcmFtLmNvbHVtbnMgPSBzZWxlY3RPcHRpb25zWydDb2x1bW5zJ107XHJcbiAgICAgICAgICAgICAgcGFyYW0uZmlsdGVycyArPSBzZWxlY3RPcHRpb25zWydGaWx0ZXJzJ107XHJcbiAgICAgICAgICAgICAgcGFyYW0uc29ydENvbHVtbk5hbWUgPSBzZWxlY3RPcHRpb25zWydTb3J0Q29sdW1uTmFtZSddO1xyXG4gICAgICAgICAgICAgIHBhcmFtLnNvcnRPcmRlciA9IHNlbGVjdE9wdGlvbnNbJ1NvcnRPcmRlciddO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5odHRwUG9zdCQodGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0UGFnZVVybChzZWxlY3RPcHRpb25zWydSZXNvdXJjZVVSTCddKSwgcGFyYW0pXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgbWFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhU2V0LmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbVtzZWxlY3RPcHRpb25zWydOYW1lJ11dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVtzZWxlY3RPcHRpb25zWydWYWx1ZSddXVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xYkl0ZW1zW2ZpZWxkLlZhbHVlXVsnb3B0aW9ucyddID0gb3B0aW9uTGlzdFxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIERlZmF1bHQgcnVsZSB0byBkaXNwbGF5XHJcbiAgICAgICAgICB0aGlzLnFiSXRlbXNbZmllbGQuVmFsdWVdID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBmaWVsZC5OYW1lLFxyXG4gICAgICAgICAgICB2YWx1ZTogZmllbGQuVmFsdWUsXHJcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgICAgICAgIG9wZXJhdG9yTGlzdDogZmllbGRbJ09wZXJhdG9ycyddLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25MaXN0LFxyXG4gICAgICAgICAgICBudWxsYWJsZTogZmllbGRbJ0lzTnVsbGFibGUnXSxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmaWVsZFsnRGVmYXVsdFZhbHVlJ10gPyBmaWVsZFsnRGVmYXVsdFZhbHVlJ10gOiBudWxsXHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICBcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSB7XHJcbiAgICAgICAgICBmaWVsZHM6IHRoaXMucWJJdGVtcyxcclxuICAgICAgICAgIGFsbG93RW1wdHlSdWxlc2V0czogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgIFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGFwcGVuZCBkZWZhdWx0IHF1ZXJ5IGlmIGFueS5cclxuICAgICAgaWYgKHRoaXMuZGF0YVsnRGVmYXVsdFF1ZXJ5J10pIHtcclxuICAgICAgICBsZXQgZGVmYXVsdFF1ZXJ5VmFsdWVTdHJpbmcgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgdGhpcy5kYXRhWydEZWZhdWx0UXVlcnknXSxcclxuICAgICAgICAgIHRoaXMuZ3JvdXBcclxuICAgICAgICApOyBcclxuXHJcbiAgICAgICAgaWYgKGRlZmF1bHRRdWVyeVZhbHVlU3RyaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnNldFF1ZXJ5VmFsdWUoZGVmYXVsdFF1ZXJ5VmFsdWVTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcImVycm9yOiBcIiwgZXJyb3IpO1xyXG4gICAgfSBcclxuICB9XHJcbiAgICBcclxuICBwdWJsaWMgY29tcGxldGVSdWxlKGlzVW5kbzogYm9vbGVhbiwgcXVlcnlWYWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBpc1VuZG87IFxyXG4gICAgY29uc3QgcWJSZXN1bHRWYWx1ZU5hbWUgPSB0aGlzLmRhdGEuVHlwZSArICdfJyArIHRoaXMuZGF0YS5WYWx1ZTtcclxuICAgIHRoaXMuZ3JvdXBbcWJSZXN1bHRWYWx1ZU5hbWVdID0gdGhpcy5xdWVyeUJ1aWxkZXIudmFsdWUgIFxyXG5cclxuICAgIGlmIChxdWVyeVZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXBbcWJSZXN1bHRWYWx1ZU5hbWVdID0gcXVlcnlWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzVW5kbykge1xyXG4gICAgICB0aGlzLmdyb3VwW3FiUmVzdWx0VmFsdWVOYW1lXSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwLnpNb2RlbCkge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCB0aGlzLmdyb3VwW3FiUmVzdWx0VmFsdWVOYW1lXSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YVsnT25BcHBseUNsaWNrJ10gJiYgIXF1ZXJ5VmFsdWUpIHtcclxuICAgICAgbGV0IGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIHRoaXMsXHJcbiAgICAgICAgdGhpcy5kYXRhWydPbkFwcGx5Q2xpY2snXSxcclxuICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKHRoaXMpO1xyXG4gICAgICBuZXdGdW5jKHRoaXMuZ3JvdXAsIHRoaXMuZ3JvdXBbcWJSZXN1bHRWYWx1ZU5hbWVdLCB0aGlzLmZpZWxkcyk7XHJcbiAgICB9IFxyXG4gIH1cclxuICAgXHJcbiAgcHVibGljIGJvb3RzdHJhcENsYXNzTmFtZXM6IFF1ZXJ5QnVpbGRlckNsYXNzTmFtZXMgPSB7XHJcbiAgICBhcnJvd0ljb246ICdmYSBmYS1jaGV2cm9uLXJpZ2h0IHB4LTInLFxyXG4gICAgYnV0dG9uOiAnYnRuJyxcclxuICAgIGJ1dHRvbkdyb3VwOiAnYnRuLWdyb3VwJyxcclxuICAgIHJpZ2h0QWxpZ246ICdvcmRlci0xMiBtbC1hdXRvJyxcclxuICAgIHN3aXRjaFJvdzogJ2QtZmxleCBweC0yJyxcclxuICAgIHN3aXRjaEdyb3VwOiAnZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlcicsXHJcbiAgICBzd2l0Y2hSYWRpbzogJ2N1c3RvbS1jb250cm9sLWlucHV0JyxcclxuICAgIHN3aXRjaExhYmVsOiAnY3VzdG9tLWNvbnRyb2wtbGFiZWwnLFxyXG4gICAgc3dpdGNoQ29udHJvbDogJ2N1c3RvbS1jb250cm9sIGN1c3RvbS1yYWRpbyBjdXN0b20tY29udHJvbC1pbmxpbmUnLFxyXG4gICAgcm93OiAncm93IHAtMiBtLTEnLFxyXG4gICAgcnVsZTogJ2JvcmRlcicsXHJcbiAgICBydWxlU2V0OiAnYm9yZGVyJyxcclxuICAgIGludmFsaWRSdWxlU2V0OiAnYWxlcnQgYWxlcnQtZGFuZ2VyJyxcclxuICAgIGVtcHR5V2FybmluZzogJ3RleHQtZGFuZ2VyIG14LWF1dG8nLFxyXG4gICAgb3BlcmF0b3JDb250cm9sOiAnZm9ybS1jb250cm9sJyxcclxuICAgIG9wZXJhdG9yQ29udHJvbFNpemU6ICdjb2wtYXV0byBwci0wJyxcclxuICAgIGZpZWxkQ29udHJvbDogJ2Zvcm0tY29udHJvbCcsXHJcbiAgICBmaWVsZENvbnRyb2xTaXplOiAnY29sLWF1dG8gcHItMCcsXHJcbiAgICBlbnRpdHlDb250cm9sOiAnZm9ybS1jb250cm9sJyxcclxuICAgIGVudGl0eUNvbnRyb2xTaXplOiAnY29sLWF1dG8gcHItMCcsXHJcbiAgICBpbnB1dENvbnRyb2w6ICdmb3JtLWNvbnRyb2wnLFxyXG4gICAgaW5wdXRDb250cm9sU2l6ZTogJ2NvbC1hdXRvJ1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBjb25kaXRpb25MaXN0OiBBcnJheTxzdHJpbmc+ID0gW1xyXG4gICAgXCJBTkRcIixcclxuICAgIFwiT1JcIlxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyBnZXRPcGVyYXRvcnMoZGVmYXVsdE9wZXJhdG9yTGlzdDogYW55LCBydWxlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnFiSXRlbXNbcnVsZS5maWVsZF0ub3BlcmF0b3JMaXN0ID8gdGhpcy5xYkl0ZW1zW3J1bGUuZmllbGRdLm9wZXJhdG9yTGlzdCA6IGRlZmF1bHRPcGVyYXRvckxpc3Q7XHJcbiAgfVxyXG4gICBcclxuICBwdWJsaWMgZ2V0T3B0aW9uTGlzdChvcHRpb25zTGlzdDogYW55LCBydWxlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnFiSXRlbXNbcnVsZS5maWVsZF0ub3B0aW9ucyA/IHRoaXMucWJJdGVtc1tydWxlLmZpZWxkXS5vcHRpb25zIDogb3B0aW9uc0xpc3Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UXVlcnlWYWx1ZShxdWVyeVZhbHVlU3RyaW5nOiBzdHJpbmcpIHtcclxuICAgIGlmIChxdWVyeVZhbHVlU3RyaW5nKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRRdWVyeVZhbHVlSnNvbiA9IHRvUXVlcnlSdWxlKEpTT04ucGFyc2UocXVlcnlWYWx1ZVN0cmluZykpO1xyXG4gICAgICB0aGlzLnF1ZXJ5Q3RybCA9IGRlZmF1bHRRdWVyeVZhbHVlSnNvbjtcclxuXHJcbiAgICAgIC8vIGRlZmF1bHQgbG9jayB0aGUgcXVlcnkgYnVpbGRlciBpZiB0aGVyZSBkZWZhdWx0IHF1ZXJ5XHJcbiAgICAgIHRoaXMuY29tcGxldGVSdWxlKHRydWUsIGRlZmF1bHRRdWVyeVZhbHVlSnNvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UnVsZSB7XHJcbiAgY29uZGl0aW9uOiBzdHJpbmc7XHJcbiAgcnVsZXM6IFF1ZXJ5UnVsZVtdO1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIG9wZXJhdG9yOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9RdWVyeVJ1bGUocXVlcnlCdWlsZGVyTW9kZWw6IGFueSk6IFF1ZXJ5UnVsZSB7XHJcbiAgbGV0IHJ1bGUgPSA8UXVlcnlSdWxlPnt9O1xyXG4gIGlmIChxdWVyeUJ1aWxkZXJNb2RlbC5jb25kaXRpb24pIHtcclxuICAgIHJ1bGUuY29uZGl0aW9uID0gcXVlcnlCdWlsZGVyTW9kZWwuY29uZGl0aW9uO1xyXG4gICAgcnVsZS5ydWxlcyA9IHF1ZXJ5QnVpbGRlck1vZGVsLnJ1bGVzLm1hcChxID0+IHRvUXVlcnlSdWxlKHEpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcnVsZS5maWVsZCA9IHF1ZXJ5QnVpbGRlck1vZGVsLmZpZWxkO1xyXG4gICAgcnVsZS50eXBlID0gcXVlcnlCdWlsZGVyTW9kZWwudHlwZTtcclxuICAgIHJ1bGUub3BlcmF0b3IgPSBxdWVyeUJ1aWxkZXJNb2RlbC5vcGVyYXRvcjtcclxuICAgIHJ1bGUudmFsdWUgPSBxdWVyeUJ1aWxkZXJNb2RlbC52YWx1ZSBpbnN0YW5jZW9mIEFycmF5XHJcbiAgICAgID8gcXVlcnlCdWlsZGVyTW9kZWwudHlwZSA9PT0gJ2RhdGUnID8gbmV3IERhdGUocXVlcnlCdWlsZGVyTW9kZWwudmFsdWUpIDogcXVlcnlCdWlsZGVyTW9kZWwudmFsdWVcclxuICAgICAgOiBbcXVlcnlCdWlsZGVyTW9kZWwudHlwZSA9PT0gJ2RhdGUnID8gbmV3IERhdGUocXVlcnlCdWlsZGVyTW9kZWwudmFsdWUpIDogcXVlcnlCdWlsZGVyTW9kZWwudmFsdWVdO1xyXG4gIH1cclxuICByZXR1cm4gcnVsZTtcclxufVxyXG4iLCI8aW9uLWl0ZW0gKm5nSWY9XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIj5cclxuICA8aW9uLWxhYmVsIFthdHRyLmZvcl09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5TaG93TGFiZWwgPT09IHVuZGVmaW5lZCB8fCBkYXRhLlNob3dMYWJlbFwiXHJcbiAgICAgICAgICAgICBbcG9zaXRpb25dPVwiZGF0YS5MYWJlbFBvc2l0aW9uID8gZGF0YS5MYWJlbFBvc2l0aW9uIDogJ3N0YWNrZWQnXCI+XHJcbiAgICB7e2RhdGEuTGFiZWx9fVxyXG4gICAgPGlvbi10ZXh0ICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWRGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQpXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiPio8L2lvbi10ZXh0PlxyXG4gIDwvaW9uLWxhYmVsPlxyXG4gIDxkaXYgY2xhc3M9XCJxYmNvbnRhaW5lclwiPlxyXG4gICAgPHF1ZXJ5LWJ1aWxkZXIgWyhuZ01vZGVsKV09J3F1ZXJ5Q3RybCdcclxuICAgICAgICAgICAgICAgICAgIFsoY29uZmlnKV09J2N1cnJlbnRDb25maWcnXHJcbiAgICAgICAgICAgICAgICAgICBbYWxsb3dSdWxlc2V0XT0nYWxsb3dSdWxlc2V0J1xyXG4gICAgICAgICAgICAgICAgICAgW2FsbG93Q29sbGFwc2VdPSdhbGxvd0NvbGxhcHNlJ1xyXG4gICAgICAgICAgICAgICAgICAgW2ZpbHRlcnNdPSdmaWx0ZXJzJ1xyXG4gICAgICAgICAgICAgICAgICAgW3BlcnNpc3RWYWx1ZU9uRmllbGRDaGFuZ2VdPSdwZXJzaXN0VmFsdWVPbkZpZWxkQ2hhbmdlJz5cclxuICAgICAgPCEtLUFORCBPUiBTd3RpY2gtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlTd2l0Y2hHcm91cD1cImxldCBydWxlc2V0OyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0IFsobmdNb2RlbCldPVwicnVsZXNldC5jb25kaXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBydWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJjb25kaXRpb25MaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcIj5cclxuICAgICAgICA8L2tlbmRvLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1SdWxlIFJ1bGVTZXQgUmVtb3ZlIFJ1bGUgU2V0IEJ1dHRvbi0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpxdWVyeUJ1dHRvbkdyb3VwPVwibGV0IHJ1bGVzZXQ7IGxldCBhZGRSdWxlPWFkZFJ1bGU7IGxldCBhZGRSdWxlU2V0PWFkZFJ1bGVTZXQ7IGxldCByZW1vdmVSdWxlU2V0PXJlbW92ZVJ1bGVTZXRcIj5cclxuICAgICAgICA8IS0tQWRkIFJ1bGUgQnV0dG9uLS0+XHJcbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb25nPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRSdWxlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbmFkZFwiPlxyXG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiJ3BsdXMnXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiA1cHg7XCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpb24tdGV4dC1jYXBpdGFsaXplXCI+QWRkPC9zcGFuPlxyXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICA8IS0tQWRkIFJ1bGVTZXQgQnV0dG9uLS0+XHJcbiAgICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJhZGRSdWxlU2V0XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJvbmc9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFJ1bGVTZXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uYWRkXCI+XHJcbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCIncGx1cydcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDVweDtcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlvbi10ZXh0LWNhcGl0YWxpemVcIj5BZGQgUnVsZSBTZXQ8L3NwYW4+XHJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDwhLS1SZW1vdmUgUnVsZVNldCBCdXR0b24tLT5cclxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cInJlbW92ZVJ1bGVTZXRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9uZz1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUnVsZVNldCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b25yZW1vdmVcIj5cclxuICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cIid0aW1lcydcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDVweDtcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlvbi10ZXh0LWNhcGl0YWxpemVcIj5SZW1vdmUgUnVsZSBTZXQ8L3NwYW4+XHJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPCEtLVJlbW92ZSBSdWxlIEJ1dHRvbi0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpxdWVyeVJlbW92ZUJ1dHRvbj1cImxldCBydWxlOyBsZXQgcmVtb3ZlUnVsZT1yZW1vdmVSdWxlXCI+XHJcbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb25nPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVSdWxlKHJ1bGUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b25yZW1vdmVcIj5cclxuICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cIidtaW51cydcIlxyXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiA1cHg7XCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpb24tdGV4dC1jYXBpdGFsaXplXCI+UmVtb3ZlIFJ1bGU8L3NwYW4+XHJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPCEtLU5hbWUgZHJvcGRvd24tLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlGaWVsZD1cImxldCBydWxlOyBsZXQgZmllbGRzPWZpZWxkczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlOyBsZXQgZ2V0RmllbGRzPWdldEZpZWxkc1wiPlxyXG4gICAgICAgIDxrZW5kby1kcm9wZG93bmxpc3QgWyhuZ01vZGVsKV09XCJydWxlLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgcnVsZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0RmllbGRzKHJ1bGUuZW50aXR5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OjEwcHg7XCI+XHJcbiAgICAgICAgPC9rZW5kby1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8IS0tT3BlcmF0b3IgZHJvcGRvd24tLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlPcGVyYXRvcj1cImxldCBydWxlOyBsZXQgb3BlcmF0b3JzPW9wZXJhdG9yczsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCIgc3R5bGU9XCJwYWRkaW5nOjEwcHhcIj5cclxuICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0IFsobmdNb2RlbCldPVwicnVsZS5vcGVyYXRvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIHJ1bGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldE9wZXJhdG9ycyhvcGVyYXRvcnMsIHJ1bGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cIm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVGaWVsZD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctcmlnaHQ6MTBweDtcIj5cclxuICAgICAgICA8L2tlbmRvLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1UZXh0IEZpZWxkLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgbGV0IGZpZWxkPWZpZWxkOyB0eXBlOiAnc3RyaW5nJzsgbGV0IG9uQ2hhbmdlPW9uQ2hhbmdlXCI+XHJcbiAgICAgICAgPGtlbmRvLXRleHRib3ggWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbY2xlYXJCdXR0b25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tVGV4dGJveFwiPlxyXG4gICAgICAgIDwva2VuZG8tdGV4dGJveD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1UZXh0QXJlYSBGaWVsZC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IHR5cGU6ICd0ZXh0YXJlYSc7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgIDxrZW5kby10ZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xzXT1cIjQwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXphYmxlPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XHJcbiAgICAgICAgPC9rZW5kby10ZXh0YXJlYT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1OdW1iZXIgRmllbGQtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyBsZXQgZmllbGQ9ZmllbGQ7IHR5cGU6ICdudW1iZXInOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICA8a2VuZG8tbnVtZXJpY3RleHRib3ggWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWNpbWFsc109XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIj5cclxuICAgICAgICA8L2tlbmRvLW51bWVyaWN0ZXh0Ym94PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPCEtLURhdGUgRmllbGQtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqcXVlcnlJbnB1dD1cImxldCBydWxlOyB0eXBlOiAnZGF0ZSc7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgIDxrZW5kby1kYXRlcGlja2VyIFsobmdNb2RlbCldPVwicnVsZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJUeXBlPVwiY2xhc3NpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxyXG4gICAgICAgIDwva2VuZG8tZGF0ZXBpY2tlcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1DYXRlZ29yeSBGaWVsZC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBvcHRpb25zPW9wdGlvbnM7IHR5cGU6ICdjYXRlZ29yeSc7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgIDxrZW5kby1kcm9wZG93bmxpc3QgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0T3B0aW9uTGlzdChvcHRpb25zLCBydWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIj5cclxuICAgICAgICA8L2tlbmRvLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1Ecm9wRG93biBNdWx0aVNlbGVjdCBGaWVsZC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpxdWVyeUlucHV0PVwibGV0IHJ1bGU7IGxldCBvcHRpb25zPW9wdGlvbnM7IHR5cGU6ICdtdWx0aXNlbGVjdCc7IGxldCBvbkNoYW5nZT1vbkNoYW5nZVwiPlxyXG4gICAgICAgIDxrZW5kby1tdWx0aXNlbGVjdCBbKG5nTW9kZWwpXT1cInJ1bGUudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZ2V0T3B0aW9uTGlzdChvcHRpb25zLCBydWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cIm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjMwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XHJcbiAgICAgICAgPC9rZW5kby1tdWx0aXNlbGVjdD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS1Cb29sZWFuIEZpZWxkLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKnF1ZXJ5SW5wdXQ9XCJsZXQgcnVsZTsgdHlwZTogJ2Jvb2xlYW4nOyBsZXQgb25DaGFuZ2U9b25DaGFuZ2VcIj5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJydWxlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tQ2hlY2tCb3hcIlxyXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgIGtlbmRvQ2hlY2tCb3ggLz5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3F1ZXJ5LWJ1aWxkZXI+XHJcbiAgICA8YnI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5TaG93UXVlcnlSZXN1bHRcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8bGFiZWw+UXVlcnkgUmVzdWx0PC9sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cIm91dHB1dFwiXHJcbiAgICAgICAgICAgICAgICByZXNpemFibGU9XCJub25lXCJcclxuICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCJcclxuICAgICAgICAgICAgICAgIFtjb2xzXT1cIjQwXCI+e3txdWVyeUN0cmwgfCBqc29ufX08L3RleHRhcmVhPlxyXG4gICAgICA8YnI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDoxMDAlXCIgc2xvdD1cImVuZFwiPlxyXG4gICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiFpc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb25nPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29tcGxldGVSdWxlKHRydWUsIG51bGwpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b25hcHBseVwiPlxyXG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cIidzYXZlJ1wiIHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4O1wiPjwvZmEtaWNvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImlvbi10ZXh0LWNhcGl0YWxpemVcIj5BcHBseTwvc3Bhbj5cclxuICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cImlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJvbmc9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb21wbGV0ZVJ1bGUoZmFsc2UsIG51bGwpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b25hcHBseVwiPlxyXG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cIidzYXZlJ1wiIHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4O1wiPjwvZmEtaWNvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImlvbi10ZXh0LWNhcGl0YWxpemVcIj5VbmRvIEFwcGx5PC9zcGFuPlxyXG4gICAgICA8L2lvbi1idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9pb24taXRlbT5cclxuIl19
|