mmhglobal-dynamicform 1.2.3 → 1.3.2
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 +14 -2
- package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
- package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
- package/esm2020/lib/services/main.service.mjs +752 -0
- package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
- package/esm2020/lib/services/zcomponent.service.mjs +81 -0
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
- package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
- package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
- package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
- package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
- package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
- package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
- package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
- package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
- package/esm2020/lib/zcard/zcard.component.mjs +72 -0
- package/esm2020/lib/zchart/zchart.component.mjs +201 -0
- package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
- package/esm2020/lib/zchip/zchip.component.mjs +121 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
- package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
- package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
- package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
- package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
- package/esm2020/lib/zform/zform.component.mjs +147 -0
- package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
- package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
- package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
- package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
- package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
- package/esm2020/lib/zimg/zimg.component.mjs +121 -0
- package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
- package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
- package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
- package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
- package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
- package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
- package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
- package/esm2020/lib/zreport/zreport.component.mjs +105 -0
- package/esm2020/lib/zreport/zreport.config.mjs +117 -0
- package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
- package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
- package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
- package/esm2020/lib/ztab/ztab.component.mjs +187 -0
- package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
- package/esm2020/lib/ztext/ztext.component.mjs +297 -0
- package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
- package/esm2020/lib/ztree/ztree.component.mjs +380 -0
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
- package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
- package/esm2020/lib/zudf/zudf.component.mjs +205 -0
- package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
- package/esm2020/lib/zupload/zupload.component.mjs +359 -0
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
- package/esm2020/mmhglobal-dynamicform.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
- package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
- package/lib/directives/fieldelement.directive.d.ts +3 -0
- package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
- package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
- package/lib/services/main.service.d.ts +3 -0
- package/lib/services/zcomponent.debug.service.d.ts +8 -5
- package/lib/services/zcomponent.service.d.ts +7 -2
- package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
- package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
- package/lib/uicontent/uicontent.component.d.ts +3 -0
- package/lib/uiheader/uiheader.component.d.ts +3 -0
- package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
- package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
- package/lib/uipage/uipage.component.d.ts +3 -0
- package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
- package/lib/zbullet/zbullet.component.d.ts +3 -0
- package/lib/zbuttons/zbuttons.component.d.ts +3 -0
- package/lib/zcard/zcard.component.d.ts +3 -0
- package/lib/zchart/zchart.component.d.ts +3 -0
- package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
- package/lib/zchip/zchip.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
- package/lib/zdaterange/zdaterange.component.d.ts +3 -0
- package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
- package/lib/zdatetime/zdatetime.component.d.ts +3 -0
- package/lib/zdiv/zdiv.component.d.ts +3 -0
- package/lib/zdiv/zdiv.pipe.d.ts +3 -0
- package/lib/zform/zform.component.d.ts +3 -0
- package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
- package/lib/zgauge/zgauge.component.d.ts +3 -0
- package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
- package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
- package/lib/zgrid/zgrid.component.d.ts +4 -1
- package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
- package/lib/zimg/zimg.component.d.ts +3 -0
- package/lib/zkcard/zkcard.component.d.ts +3 -0
- package/lib/zlabel/zlabel.component.d.ts +3 -0
- package/lib/zmfb/zmfb.component.d.ts +3 -0
- package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
- package/lib/zmodal/zmodal.component.d.ts +3 -0
- package/lib/znumeric/znumeric.component.d.ts +3 -0
- package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
- package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
- package/lib/zreport/zreport.component.d.ts +3 -0
- package/lib/zreport/zreport.config.d.ts +3 -0
- package/lib/zscheduler/zscheduler.component.d.ts +3 -0
- package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
- package/lib/ztab/ztab.component.d.ts +3 -0
- package/lib/ztab/ztab.pipe.d.ts +3 -0
- package/lib/ztext/ztext.component.d.ts +3 -0
- package/lib/ztextarea/ztextarea.component.d.ts +3 -0
- package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
- package/lib/ztree/ztree.component.d.ts +3 -0
- package/lib/ztreelist/ztreelist.component.d.ts +3 -0
- package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
- package/lib/zudf/zudf.component.d.ts +3 -0
- package/lib/zunknown/zunknown.component.d.ts +3 -0
- package/lib/zupload/zupload.component.d.ts +3 -0
- package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
- package/mmhglobal-dynamicform.d.ts +1 -2
- package/package.json +20 -11
- package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
- package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
- package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
- package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
- package/esm2015/lib/directives/fieldelement.directive.js +0 -15
- package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
- package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
- package/esm2015/lib/services/main.service.js +0 -766
- package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
- package/esm2015/lib/services/zcomponent.service.js +0 -167
- package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
- package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
- package/esm2015/lib/uicontent/uicontent.component.js +0 -41
- package/esm2015/lib/uiheader/uiheader.component.js +0 -65
- package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
- package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
- package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
- package/esm2015/lib/zbullet/zbullet.component.js +0 -71
- package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
- package/esm2015/lib/zcard/zcard.component.js +0 -68
- package/esm2015/lib/zchart/zchart.component.js +0 -199
- package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
- package/esm2015/lib/zchip/zchip.component.js +0 -117
- package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
- package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
- package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
- package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
- package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
- package/esm2015/lib/zdiv/zdiv.component.js +0 -48
- package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
- package/esm2015/lib/zform/zform.component.js +0 -148
- package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
- package/esm2015/lib/zgauge/zgauge.component.js +0 -146
- package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
- package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
- package/esm2015/lib/zgrid/zgrid.component.js +0 -834
- package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
- package/esm2015/lib/zimg/zimg.component.js +0 -123
- package/esm2015/lib/zkcard/zkcard.component.js +0 -372
- package/esm2015/lib/zlabel/zlabel.component.js +0 -59
- package/esm2015/lib/zmfb/zmfb.component.js +0 -215
- package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
- package/esm2015/lib/zmodal/zmodal.component.js +0 -130
- package/esm2015/lib/znumeric/znumeric.component.js +0 -114
- package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
- package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
- package/esm2015/lib/zreport/zreport.component.js +0 -104
- package/esm2015/lib/zreport/zreport.config.js +0 -115
- package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
- package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
- package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
- package/esm2015/lib/ztab/ztab.component.js +0 -180
- package/esm2015/lib/ztab/ztab.pipe.js +0 -22
- package/esm2015/lib/ztext/ztext.component.js +0 -286
- package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
- package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
- package/esm2015/lib/ztree/ztree.component.js +0 -374
- package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
- package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
- package/esm2015/lib/zudf/zudf.component.js +0 -206
- package/esm2015/lib/zunknown/zunknown.component.js +0 -20
- package/esm2015/lib/zupload/zupload.component.js +0 -358
- package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
- package/esm2015/mmhglobal-dynamicform.js +0 -7
- package/fesm2015/mmhglobal-dynamicform.js +0 -10729
- package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
- package/mmhglobal-dynamicform.metadata.json +0 -1
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
/********** Angular **********/
|
|
2
|
+
import { Component, Input, ViewChild } from "@angular/core";
|
|
3
|
+
import { Validators } from "@angular/forms";
|
|
4
|
+
/********** Plugin **********/
|
|
5
|
+
import { of } from "rxjs";
|
|
6
|
+
import { delay } from "rxjs/operators";
|
|
7
|
+
/********** Component & Service **********/
|
|
8
|
+
import { ZComponentHelper, ZSelectPostApiParams, ZComponentProperties } 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 "@progress/kendo-angular-label";
|
|
13
|
+
import * as i4 from "ionic-selectable";
|
|
14
|
+
import * as i5 from "@fortawesome/angular-fontawesome";
|
|
15
|
+
import * as i6 from "../uivalidationmessage/uivalidationmessage.component";
|
|
16
|
+
import * as i7 from "@progress/kendo-angular-dropdowns";
|
|
17
|
+
import * as i8 from "@angular/common";
|
|
18
|
+
import * as i9 from "@angular/forms";
|
|
19
|
+
import * as i10 from "@progress/kendo-angular-tooltip";
|
|
20
|
+
import * as i11 from "./zselectmultiple.directive";
|
|
21
|
+
import * as i12 from "@progress/kendo-angular-inputs";
|
|
22
|
+
export class ZselectmultipleComponent {
|
|
23
|
+
// private loadInfiniteDataSub: Subject<boolean> = new Subject<boolean>();
|
|
24
|
+
constructor(resourceApiService, webApiService, cacheService) {
|
|
25
|
+
this.resourceApiService = resourceApiService;
|
|
26
|
+
this.webApiService = webApiService;
|
|
27
|
+
this.cacheService = cacheService;
|
|
28
|
+
this.showTooltipsInfoIcon = false;
|
|
29
|
+
this.showTooltipsInfoBySide = false;
|
|
30
|
+
this.tooltipsInfo = null;
|
|
31
|
+
this.tooltipsDisplayText = null;
|
|
32
|
+
this.items = [];
|
|
33
|
+
this.infinitezData = [];
|
|
34
|
+
this.infiniteSearchText = null;
|
|
35
|
+
// subscription: Subscription;
|
|
36
|
+
this.toggleSelectable = true;
|
|
37
|
+
this.itemValueField = null;
|
|
38
|
+
this.itemTextField = null;
|
|
39
|
+
this.itemDataField = null;
|
|
40
|
+
this.itemTemplate = "{{item[itemTextField]}}";
|
|
41
|
+
this.infiniteScrollPageNo = 0;
|
|
42
|
+
this.isLoading = true;
|
|
43
|
+
this.componentProperties = new ZComponentProperties();
|
|
44
|
+
this.allowCustomValue = false;
|
|
45
|
+
this.autoClose = true;
|
|
46
|
+
this.dataInfo = {
|
|
47
|
+
"itemsResourceURL": "",
|
|
48
|
+
"optionFilters": "",
|
|
49
|
+
"totalCount": 0
|
|
50
|
+
};
|
|
51
|
+
this.virtual = {
|
|
52
|
+
itemHeight: 28,
|
|
53
|
+
pageSize: 15
|
|
54
|
+
};
|
|
55
|
+
// Common function
|
|
56
|
+
this.setEnable = (status) => {
|
|
57
|
+
const fc = this.group.form.controls[this.data.Value];
|
|
58
|
+
status ? fc.enable() : fc.disable();
|
|
59
|
+
this.componentProperties.isReadOnly = !status;
|
|
60
|
+
};
|
|
61
|
+
this.setVisible = (status) => {
|
|
62
|
+
this.componentProperties.isVisible = status;
|
|
63
|
+
this.data.Visible = status;
|
|
64
|
+
};
|
|
65
|
+
this.setRequire = (status) => {
|
|
66
|
+
this.componentProperties.isRequired = status;
|
|
67
|
+
ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
ngOnDestroy() {
|
|
71
|
+
// if (this.subscription) {
|
|
72
|
+
// this.subscription.unsubscribe();
|
|
73
|
+
// }
|
|
74
|
+
if (this.debounceSub) {
|
|
75
|
+
this.debounceSub.unsubscribe();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
ngOnInit() {
|
|
79
|
+
this.isLoading = true;
|
|
80
|
+
ZComponentHelper.setComponentProperties(this);
|
|
81
|
+
ZComponentHelper.registerComponent(this);
|
|
82
|
+
ZComponentHelper.setSelectMultipleTextValue(this.data.SelectOptions, this);
|
|
83
|
+
this.tooltipsInfo = this.data.TooltipsInfo;
|
|
84
|
+
if (this.tooltipsInfo) {
|
|
85
|
+
if ((this.tooltipsInfo.Icon != null || this.tooltipsInfo.Icon != undefined) && !this.isMobileScreen()) {
|
|
86
|
+
this.showTooltipsInfoIcon = true;
|
|
87
|
+
this.setTooltipsInfoIcon();
|
|
88
|
+
}
|
|
89
|
+
if (this.tooltipsInfo.SideBySide) {
|
|
90
|
+
this.showTooltipsInfoBySide = true;
|
|
91
|
+
}
|
|
92
|
+
this.setTooltipsDisplayText();
|
|
93
|
+
}
|
|
94
|
+
// [Dropdownlist Multiple] - auto close menu when lose focus.
|
|
95
|
+
if (this.data.AutoClose === false)
|
|
96
|
+
this.autoClose = this.data.AutoClose;
|
|
97
|
+
// Handle Clickable Icons
|
|
98
|
+
this.iconList = this.data.ClickableIcons;
|
|
99
|
+
if (this.iconList) {
|
|
100
|
+
if (this.iconList.length > 0) {
|
|
101
|
+
this.iconList.forEach((i) => {
|
|
102
|
+
if (i.Tooltip === undefined) {
|
|
103
|
+
i.Tooltip = "";
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
i.Tooltip = ZComponentHelper.getGroupEvalValue.call(this, i.Tooltip);
|
|
107
|
+
}
|
|
108
|
+
// Default position top. right | bottom | top | left
|
|
109
|
+
if (i.Position === undefined) {
|
|
110
|
+
i.Position = "top";
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Handle Button beside dropdown
|
|
116
|
+
this.buttonList = this.data.ButtonList;
|
|
117
|
+
if (this.buttonList) {
|
|
118
|
+
this.buttonList.forEach(button => {
|
|
119
|
+
if (button.tooltip) {
|
|
120
|
+
button.tooltip = ZComponentHelper.getGroupEvalValue.call(this, button.tooltip);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// dropdown configuration
|
|
125
|
+
this.allowCustomValue = this.data.AllowCustomValue || false; // Allow enter text in dropdownbox
|
|
126
|
+
const fieldValue = this.data.Value;
|
|
127
|
+
const data = this.data;
|
|
128
|
+
const zModel = this.group.zModel;
|
|
129
|
+
/*
|
|
130
|
+
* 4 Styles of declare the component�s option list data source.
|
|
131
|
+
* Style #1 - Field.SelectOptions defined as an array of object that contain text and value.
|
|
132
|
+
* Style #2 - Field.SelectOptions defined as a phase like �item.Id as item.Name for item in group.zData.ProjectOptions�.
|
|
133
|
+
* Style #3 - Field.OptionResourceURL defined the name of resource server api.
|
|
134
|
+
* Style #4 - Field.InfiniteScroll$ defined the method name as �group.getMoreDataAsScroll�.
|
|
135
|
+
*/
|
|
136
|
+
if (data.HasInfiniteScroll && data.InfiniteScroll$) {
|
|
137
|
+
// when infinitie scroll
|
|
138
|
+
let recordId = null;
|
|
139
|
+
if (zModel && zModel[fieldValue]) {
|
|
140
|
+
// get zModel Value
|
|
141
|
+
recordId = zModel[fieldValue].toString();
|
|
142
|
+
}
|
|
143
|
+
let getzDataForzModel$ = ZComponentHelper.getInfiniteData(null, '', this, recordId);
|
|
144
|
+
if (getzDataForzModel$) {
|
|
145
|
+
getzDataForzModel$.subscribe((zdata) => {
|
|
146
|
+
console.log(data.Name, ' - initial zData load: ', zdata);
|
|
147
|
+
if (this.group) {
|
|
148
|
+
if (this.group.afterLoadzDataOptions) {
|
|
149
|
+
this.group.afterLoadzDataOptions(this.group);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
this.isLoading = false;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.isLoading = false;
|
|
157
|
+
}
|
|
158
|
+
if (!ZComponentHelper.isMobileScreen()) {
|
|
159
|
+
this.handleFilter(null, true);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// Style #1, #2, #3
|
|
164
|
+
const isRequired = ZComponentHelper.getGroupEvalValue.call(this, data.IsRequired);
|
|
165
|
+
if (this.data.OptionResourceURL) {
|
|
166
|
+
this.lazyLoadDataOptions().subscribe(res => {
|
|
167
|
+
const optionData = res.dataSet ? res.dataSet : res;
|
|
168
|
+
if (optionData && optionData.length === 1 && !this.data.DisableAutoFirstSelection) {
|
|
169
|
+
this.autoSelectFirstOption(isRequired, optionData[0], fieldValue, zModel.Id);
|
|
170
|
+
}
|
|
171
|
+
if (this.group) {
|
|
172
|
+
if (this.group.afterLoadzDataOptions) {
|
|
173
|
+
this.group.afterLoadzDataOptions(this.group);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
this.isLoading = false;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
if (Array.isArray(this.data.SelectOptions) && this.data.SelectOptions) {
|
|
181
|
+
//skip eval if selectoptions is exist
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
const optionData = ZComponentHelper.getGroupEvalValue.call(this, this.itemDataField);
|
|
185
|
+
// append data via timeout after data is loaded.
|
|
186
|
+
if (optionData && optionData.length === 1 && !this.data.DisableAutoFirstSelection) {
|
|
187
|
+
const thisComponent = this;
|
|
188
|
+
setTimeout(function () {
|
|
189
|
+
thisComponent.autoSelectFirstOption(isRequired, optionData[0], fieldValue, thisComponent.group.zModel.Id);
|
|
190
|
+
if (this.group) {
|
|
191
|
+
if (this.group.afterLoadzDataOptions) {
|
|
192
|
+
this.group.afterLoadzDataOptions(this.group);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}, 100);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
this.isLoading = false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Auto select first option (if required & only 1 option)
|
|
203
|
+
autoSelectFirstOption(required, data, zModelPropertyName, id) {
|
|
204
|
+
if (ZComponentHelper.isNullUndefinedEmpty(id) && required) {
|
|
205
|
+
var optionId = data.Id;
|
|
206
|
+
if (this.data.Multiple) {
|
|
207
|
+
optionId = [optionId];
|
|
208
|
+
}
|
|
209
|
+
ZComponentHelper.setModelValue(zModelPropertyName, optionId, this.group);
|
|
210
|
+
this.group.subject.next({
|
|
211
|
+
type: "onChange",
|
|
212
|
+
target: this.data.OnChange,
|
|
213
|
+
event,
|
|
214
|
+
data: { ['value']: optionId, field: this.data }
|
|
215
|
+
});
|
|
216
|
+
this.form.markAsPristine();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Style #3
|
|
220
|
+
lazyLoadDataOptions() {
|
|
221
|
+
const resourceUrl = this.resourceApiService.getURL(this.data.OptionResourceURL);
|
|
222
|
+
const filterParam = new ZSelectPostApiParams();
|
|
223
|
+
filterParam.sorts = this.data.OptionSort;
|
|
224
|
+
filterParam.columns = this.data.OptionColumns;
|
|
225
|
+
filterParam.filters = this.data.OptionFilter;
|
|
226
|
+
return ZComponentHelper.getDataOptions(this.data.OptionName, filterParam, this.group, resourceUrl, this.cacheService, this.webApiService, this.data['DisableCache']);
|
|
227
|
+
}
|
|
228
|
+
// Style #4, used in ionic-selectable
|
|
229
|
+
getInfiniteData(event) {
|
|
230
|
+
ZComponentHelper.getInfiniteData(event.component, event.text, this);
|
|
231
|
+
}
|
|
232
|
+
getItemsData() {
|
|
233
|
+
if (this.data.HasInfiniteScroll) {
|
|
234
|
+
return this.infinitezData;
|
|
235
|
+
}
|
|
236
|
+
const optionName = this.data.OptionName || this.itemDataField || 'group.zData.' + this.data.Name;
|
|
237
|
+
if (Array.isArray(this.data.SelectOptions) && !this.group.zData[optionName.slice(12)]) {
|
|
238
|
+
// return selectionOptions;
|
|
239
|
+
// return this.data.SelectOptions;
|
|
240
|
+
this.group.zData[optionName.slice(12)] = this.data.SelectOptions;
|
|
241
|
+
this.itemDataField = optionName;
|
|
242
|
+
}
|
|
243
|
+
if (optionName.startsWith('zData.')) {
|
|
244
|
+
return this.group.zData[optionName.slice(6)] || [];
|
|
245
|
+
}
|
|
246
|
+
if (optionName.startsWith('group.zData.')) {
|
|
247
|
+
return this.group.zData[optionName.slice(12)] || [];
|
|
248
|
+
}
|
|
249
|
+
if (optionName.startsWith('group.')) {
|
|
250
|
+
return this.group[optionName.slice(6)] || [];
|
|
251
|
+
}
|
|
252
|
+
if (optionName) {
|
|
253
|
+
return this.group[optionName] || [];
|
|
254
|
+
}
|
|
255
|
+
console.warn(this.data.Name, ' - Invalid setting for OptionName: ', optionName);
|
|
256
|
+
}
|
|
257
|
+
onSearch(event) {
|
|
258
|
+
// console.log("At zselectmultiple.component (onSearch): ", event);
|
|
259
|
+
// event.component is for mobile only
|
|
260
|
+
const component = event.component;
|
|
261
|
+
if (component) {
|
|
262
|
+
component.startSearch();
|
|
263
|
+
component.enableInfiniteScroll();
|
|
264
|
+
}
|
|
265
|
+
if (this.data.HasInfiniteScroll) {
|
|
266
|
+
// If search text, reset page to 0. Get infinite data
|
|
267
|
+
if (event.text !== null && event.text !== this.infiniteSearchText) {
|
|
268
|
+
this.infiniteScrollPageNo = 0;
|
|
269
|
+
this.modelzData = [];
|
|
270
|
+
}
|
|
271
|
+
this.getInfiniteData(event);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// Reset scroll page, empty items
|
|
275
|
+
this.infiniteScrollPageNo = 0;
|
|
276
|
+
if (component) {
|
|
277
|
+
component.items = [];
|
|
278
|
+
}
|
|
279
|
+
// Filter zData and push to items
|
|
280
|
+
const params = {
|
|
281
|
+
referId: null,
|
|
282
|
+
pageNo: 0,
|
|
283
|
+
pageSize: 20,
|
|
284
|
+
sortColumnName: "",
|
|
285
|
+
sortOrder: "",
|
|
286
|
+
sortColumnNames: [],
|
|
287
|
+
sortOrders: [],
|
|
288
|
+
filterParams: [],
|
|
289
|
+
parameters: ""
|
|
290
|
+
};
|
|
291
|
+
const searchFields = this.data.SearchFields ? this.data.SearchFields : this.itemTextField;
|
|
292
|
+
const filteritems = ZComponentHelper.filterSearchItems(this.getItemsData(), event.text, searchFields, params.pageNo, params.pageSize);
|
|
293
|
+
if (component) {
|
|
294
|
+
const items = component.items.concat(filteritems);
|
|
295
|
+
component.items = items;
|
|
296
|
+
component.endInfiniteScroll();
|
|
297
|
+
component.endSearch();
|
|
298
|
+
this.isLoading = false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
handleFilter(value, justOneTime) {
|
|
303
|
+
if (this.debounceSub) {
|
|
304
|
+
this.debounceSub.unsubscribe();
|
|
305
|
+
}
|
|
306
|
+
this.debounceSub = of([]).pipe(delay(500)).subscribe(() => {
|
|
307
|
+
this.isLoading = true;
|
|
308
|
+
this.onSearch({ component: null, text: value });
|
|
309
|
+
if (this.group) {
|
|
310
|
+
if (this.group.afterLoadzDataOptions) {
|
|
311
|
+
this.group.afterLoadzDataOptions(this.group);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// if (this.loadInfiniteDataSub) {
|
|
315
|
+
// this.loadInfiniteDataSub.unsubscribe();
|
|
316
|
+
// }
|
|
317
|
+
// this.loadInfiniteDataSub = new Subject(false);
|
|
318
|
+
// this.handleFilter(null);
|
|
319
|
+
// interval(2000).pipe(takeUntil(this.loadInfiniteDataSub)).subscribe(() => {
|
|
320
|
+
// this.onSearch({ component: null, text: value });
|
|
321
|
+
// if (justOneTime) {
|
|
322
|
+
// this.handleClose();
|
|
323
|
+
// }
|
|
324
|
+
// });
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
handleOpen() {
|
|
328
|
+
if (this.data.HasInfiniteScroll) {
|
|
329
|
+
this.handleFilter(null);
|
|
330
|
+
// // if (this.loadInfiniteDataSub) {
|
|
331
|
+
// // this.loadInfiniteDataSub.unsubscribe();
|
|
332
|
+
// // }
|
|
333
|
+
// // this.loadInfiniteDataSub = new Subject();
|
|
334
|
+
// // // this.handleFilter(null);
|
|
335
|
+
// // interval(3000).pipe(takeUntil(this.loadInfiniteDataSub)).subscribe(() => {
|
|
336
|
+
// // this.handleFilter(null);
|
|
337
|
+
// // });
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
handleClose() {
|
|
341
|
+
// if (this.data.HasInfiniteScroll) {
|
|
342
|
+
// if (this.loadInfiniteDataSub) {
|
|
343
|
+
// this.loadInfiniteDataSub.next(true);
|
|
344
|
+
// // this.loadInfiniteDataSub.complete();
|
|
345
|
+
// }
|
|
346
|
+
// }
|
|
347
|
+
}
|
|
348
|
+
handleBlur() {
|
|
349
|
+
// this.handleClose();
|
|
350
|
+
}
|
|
351
|
+
getItemTemplate(item, data, group, itemValueField, itemTextField) {
|
|
352
|
+
// ToDO: itemValueField and itemTextField
|
|
353
|
+
if (this.data.ItemTemplate) {
|
|
354
|
+
const getTemplateFunc = ZComponentHelper.getGroupEvalValue.call(this, this.data.ItemTemplate);
|
|
355
|
+
return getTemplateFunc({
|
|
356
|
+
item,
|
|
357
|
+
data,
|
|
358
|
+
group,
|
|
359
|
+
itemValueField,
|
|
360
|
+
itemTextField
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
else if (itemTextField) {
|
|
364
|
+
return item[itemTextField];
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
// return item[itemTextField];
|
|
368
|
+
return Object.values(item).join(", ");
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
getReadOnlyValue() {
|
|
372
|
+
const readOnlyValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.ReadOnly);
|
|
373
|
+
if (typeof readOnlyValue === 'function') {
|
|
374
|
+
const callFunc = readOnlyValue.bind(this.group.ctrlScope);
|
|
375
|
+
return callFunc(this.group);
|
|
376
|
+
}
|
|
377
|
+
return readOnlyValue;
|
|
378
|
+
}
|
|
379
|
+
getIsRequiredValue() {
|
|
380
|
+
const IsRequiredValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.IsRequired);
|
|
381
|
+
if (typeof IsRequiredValue === 'function') {
|
|
382
|
+
const callFunc = IsRequiredValue.bind(this.group.ctrlScope);
|
|
383
|
+
return callFunc(this.group);
|
|
384
|
+
}
|
|
385
|
+
return IsRequiredValue;
|
|
386
|
+
}
|
|
387
|
+
getGroupValue(value, group) {
|
|
388
|
+
return ZComponentHelper.getGroupValue(value, group);
|
|
389
|
+
}
|
|
390
|
+
getClass(form, data) {
|
|
391
|
+
const ionInvalidClass = this.getIon_InvalidClass(form, data);
|
|
392
|
+
return `${ionInvalidClass ? ionInvalidClass : ''} ${this.data.Class}`;
|
|
393
|
+
}
|
|
394
|
+
getIon_InvalidClass(form, data) {
|
|
395
|
+
if (!form) {
|
|
396
|
+
//debugger;
|
|
397
|
+
}
|
|
398
|
+
return ZComponentHelper.getIon_InvalidClass(form, data);
|
|
399
|
+
}
|
|
400
|
+
onAddItem(event) {
|
|
401
|
+
const f = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnAddItem);
|
|
402
|
+
if (typeof f === 'function') {
|
|
403
|
+
const callFunc = f.bind(this.group.ctrlScope);
|
|
404
|
+
return callFunc();
|
|
405
|
+
}
|
|
406
|
+
console.warn('Invalid declaration of OnAddItem: ', f);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// Component basic function
|
|
410
|
+
clearData() {
|
|
411
|
+
ZComponentHelper.setModelValue(this.data.Value, "", this.group);
|
|
412
|
+
}
|
|
413
|
+
clearItems() {
|
|
414
|
+
this.selectComponent.clear();
|
|
415
|
+
this.selectComponent.close();
|
|
416
|
+
}
|
|
417
|
+
confirmItems() {
|
|
418
|
+
this.selectComponent.confirm();
|
|
419
|
+
this.selectComponent.close();
|
|
420
|
+
}
|
|
421
|
+
toggleItems() {
|
|
422
|
+
this.selectComponent.toggleItems(this.toggleSelectable);
|
|
423
|
+
this.toggleSelectable = !this.toggleSelectable;
|
|
424
|
+
// Confirm items and close Select page
|
|
425
|
+
// without having the user to click Confirm button.
|
|
426
|
+
// this.confirm();
|
|
427
|
+
}
|
|
428
|
+
// Extra icon beside dropdown. Mainly for popup
|
|
429
|
+
onIconClick(clickAction) {
|
|
430
|
+
this.onNavigateTo(clickAction);
|
|
431
|
+
}
|
|
432
|
+
onNavigateTo(clickAction) {
|
|
433
|
+
const n = ZComponentHelper.getGroupEvalValue.call(this, clickAction);
|
|
434
|
+
if (n) {
|
|
435
|
+
this.group.subject.next({
|
|
436
|
+
type: 'ztext-onNavigateTo',
|
|
437
|
+
target: clickAction,
|
|
438
|
+
data: this.group.zModel[this.data.Value]
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// Disable Open On Focus
|
|
443
|
+
disableOpenOnFocus(comboboxComponent) {
|
|
444
|
+
if (this.data.DisableOpenOnFocus) {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
return comboboxComponent;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// OnChange
|
|
452
|
+
onChangeEvent(value) {
|
|
453
|
+
if (this.data.HasInfiniteScroll && !!this.data.InfiniteScroll$) {
|
|
454
|
+
const textField = this.itemTextField.toString();
|
|
455
|
+
const valueField = this.itemValueField.toString();
|
|
456
|
+
let zdataModel = [];
|
|
457
|
+
if (value) {
|
|
458
|
+
zdataModel = this.infinitezData.filter(x => x[valueField] === value);
|
|
459
|
+
this.modelzData = zdataModel.slice();
|
|
460
|
+
}
|
|
461
|
+
if (this.itemDataField.startsWith('group.zData.')) {
|
|
462
|
+
this.group.zData[this.itemDataField.slice(12)] = zdataModel;
|
|
463
|
+
}
|
|
464
|
+
else if (this.itemDataField.startsWith('group.')) {
|
|
465
|
+
this.group[this.itemDataField.slice(6)] = zdataModel;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
this.group.subject.next({
|
|
469
|
+
type: "onChange",
|
|
470
|
+
target: this.data.OnChange,
|
|
471
|
+
event,
|
|
472
|
+
data: { value, field: this.data }
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
onValueChange(value) {
|
|
476
|
+
// console.log("zselectmultiple (onValueChange): ", value);
|
|
477
|
+
ZComponentHelper.setModelValue(this.data.Value, value, this.group);
|
|
478
|
+
this.onChangeEvent(value);
|
|
479
|
+
}
|
|
480
|
+
onChange(event) {
|
|
481
|
+
console.log("zselectmultiple (onChange): ", event.value);
|
|
482
|
+
ZComponentHelper.setModelValue(this.data.Value, event.value, this.group);
|
|
483
|
+
const fc = this.form.controls[this.data.Value];
|
|
484
|
+
this.handleClose();
|
|
485
|
+
if (
|
|
486
|
+
// this.data.IsRequired &&
|
|
487
|
+
this.getIsRequiredValue() &&
|
|
488
|
+
(event.value === null || event.value.length === 0)) {
|
|
489
|
+
fc.setErrors({ required: true });
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
fc.setErrors(null);
|
|
493
|
+
}
|
|
494
|
+
this.onChangeEvent(event.value);
|
|
495
|
+
}
|
|
496
|
+
setLabelText(newText) {
|
|
497
|
+
this.data.Label = newText;
|
|
498
|
+
}
|
|
499
|
+
isMobileScreen() {
|
|
500
|
+
const v = ZComponentHelper.isMobileScreen();
|
|
501
|
+
return v;
|
|
502
|
+
}
|
|
503
|
+
/********** TooltipsInfo **********/
|
|
504
|
+
setTooltipsInfoClass() {
|
|
505
|
+
if (this.tooltipsInfo && !this.showTooltipsInfoIcon && this.showTooltipsInfoBySide) {
|
|
506
|
+
return 'tooltipsinfo-text';
|
|
507
|
+
}
|
|
508
|
+
return 'tooltipsinfo-text-wide';
|
|
509
|
+
}
|
|
510
|
+
setTooltipsInfoColor() {
|
|
511
|
+
if (this.tooltipsInfo) {
|
|
512
|
+
if (this.tooltipsInfo.TextColor) {
|
|
513
|
+
return this.tooltipsInfo.TextColor;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return "#acacac"; // default grey
|
|
517
|
+
}
|
|
518
|
+
setTooltipsInfoIcon(displayIcon) {
|
|
519
|
+
if (this.showTooltipsInfoIcon) {
|
|
520
|
+
if (this.tooltipsInfo.Icon != '') {
|
|
521
|
+
if (displayIcon) {
|
|
522
|
+
this.tooltipsDisplayIcon = displayIcon;
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
this.tooltipsDisplayIcon = this.tooltipsInfo.Icon;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
this.tooltipsDisplayIcon = 'question-circle';
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
setTooltipsDisplayText(displayText) {
|
|
534
|
+
if (this.tooltipsInfo) {
|
|
535
|
+
if (displayText) {
|
|
536
|
+
this.tooltipsDisplayText = displayText;
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
this.tooltipsDisplayText = this.tooltipsInfo.DisplayText;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
this.tooltipsDisplayText = '<Display text error>';
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
setTooltipsInfoSideBySide() {
|
|
547
|
+
if (this.tooltipsInfo) {
|
|
548
|
+
if (this.showTooltipsInfoBySide && !this.showTooltipsInfoIcon) {
|
|
549
|
+
return 'ion-row divselectmultiple tooltipsinfo-right';
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return 'ion-row divselectmultiple';
|
|
553
|
+
}
|
|
554
|
+
getFontAwesome(iconName) {
|
|
555
|
+
return ZComponentHelper.getFontAwesome(iconName);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
ZselectmultipleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZselectmultipleComponent, deps: [{ token: i1.ResourceApiService }, { token: i1.WebApiService }, { token: i1.CacheService }], target: i0.ɵɵFactoryTarget.Component });
|
|
559
|
+
ZselectmultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: ZselectmultipleComponent, selector: "app-zselectmultiple", inputs: { data: "data", group: "group", form: "form", iconList: "iconList", buttonList: "buttonList" }, viewQueries: [{ propertyName: "selectComponent", first: true, predicate: ["selectComponent"], descendants: true }], ngImport: i0, template: "<ion-item [ngClass]=\"getClass(form, data)\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && isMobileScreen()\">\r\n\r\n <ion-label *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n\r\n <kendo-label *ngIf=\"data.TooltipsInfo && !showTooltipsInfoIcon && !showTooltipsInfoBySide\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n <div [class]=\"setTooltipsInfoSideBySide()\" *ngIf=\"!isLoading\">\r\n <div style=\"flex-grow: 1;\">\r\n <ionic-selectable #selectComponent item-content\r\n searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\"\r\n clearButtonText=\"Clear\"\r\n [(ngModel)]=\"group.zModel[data.Value]\"\r\n [id]=\"data.Value\"\r\n [items]=\"getItemsData()\"\r\n [itemValueField]=\"itemValueField\"\r\n [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\"\r\n [canClear]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\"\r\n [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\"\r\n [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\"\r\n (onSearch)=\"onSearch($event)\"\r\n (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\"\r\n (onChange)=\"onChange($event)\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate\r\n let-item=\"item\"\r\n let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\"\r\n class=\"isItemSelected\"\r\n size=\"sm\"\r\n [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n {{data.Label}}\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n {{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}\r\n <!-- <ng-template zselectitemelement [item]=\"item\"></ng-template> -->\r\n </ng-template>\r\n\r\n <!--<ng-template ionicSelectableFooterTemplate>\r\n <ion-toolbar>\r\n <ion-row>\r\n <ion-col>\r\n <ion-button expand=\"full\" ng-reflect-disabled=\"false\" ng-reflect-expand=\"full\" class=\"button button-full button-solid ion-activatable ion-focusable hydrated\" (click)=\"clearItems()\">\r\n Clear\r\n </ion-button>\r\n </ion-col>\r\n <ion-col>\r\n <ion-button expand=\"full\" ng-reflect-disabled=\"false\" ng-reflect-expand=\"full\" class=\"button button-full button-solid ion-activatable ion-focusable hydrated\" (click)=\"confirmItems()\">\r\n OK\r\n </ion-button>\r\n </ion-col>\r\n </ion-row>\r\n </ion-toolbar>\r\n </ng-template>-->\r\n </ionic-selectable>\r\n </div>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n <!-- side by side and desktop tooltipsinfo -->\r\n <kendo-label *ngIf=\"tooltipsInfo && !showTooltipsInfoIcon && showTooltipsInfoBySide\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n </div>\r\n</ion-item>\r\n\r\n\r\n\r\n<ion-item [ngClass]=\"getClass(form, data)\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && !isMobileScreen()\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n <span kendoTooltip\r\n *ngIf=\"data.TooltipsInfo && showTooltipsInfoIcon\"\r\n [title]=\"tooltipsDisplayText\">\r\n <fa-icon [icon]=\"tooltipsDisplayIcon\"\r\n class=\"tooltipsinfo-icon\">\r\n </fa-icon>\r\n </span>\r\n </ion-label>\r\n <!-- mobile tooltipsinfo below label-->\r\n <div [class]=\"setTooltipsInfoSideBySide()\">\r\n <div style=\"flex: 1;\">\r\n <kendo-combobox *ngIf=\"!data.Multiple\"\r\n #comboboxComponent\r\n [data]=\"getItemsData()\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [suggest]=\"true\"\r\n [filterable]=\"!!data.HasInfiniteScroll\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"virtual\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n style=\"margin-top: 7px; width: 100%;\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n <ng-template kendoTextBoxSuffixTemplate>\r\n\r\n <!-- For Validation feature -->\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"\r\n class=\"validation-icon\"></app-uivalidationmessage>\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"data.Multiple\"\r\n [data]=\"getItemsData()\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"!!data.HasInfiniteScroll\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n style=\"margin-top: 7px; width: 100%;\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-multiselect>\r\n </div>\r\n\r\n <div *ngFor=\"let item of iconList\">\r\n <div kendoTooltip style=\"text-align: center; padding-top: 10px;\"\r\n showOn=\"hover\"\r\n [tooltipWidth]=\"item.Width\"\r\n [position]=\"item.Position\">\r\n <span *ngIf=\"!!item && item.Color\"\r\n (click)=\"onIconClick(item.Click)\"\r\n [title]=\"item.Tooltip\"\r\n style=\"margin-top: 10px;\">\r\n <fa-icon [icon]=\"item.Icon\"\r\n [ngStyle]=\"{'padding': '4px 6px', 'color': (item.Color ? item.Color : 'black')}\"></fa-icon>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ion-button *ngFor=\"let button of buttonList; let i = button\"\r\n fill=\"outline\"\r\n color=\"dark\"\r\n size=\"small\"\r\n strong=\"false\"\r\n class=\"button-container\"\r\n style=\"margin-top: 7px;\"\r\n (click)=\"onIconClick(button.click)\"\r\n [hidden]=\"!button.visible\"\r\n [disabled]=\"group.isTriggered || button.disabled\">\r\n <fa-icon *ngIf=\"button.icon\" [icon]=\"getFontAwesome(button.icon)\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">{{ button.text }}</span>\r\n </ion-button>\r\n\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n\r\n <!-- side by side and desktop tooltipsinfo -->\r\n <kendo-label *ngIf=\"tooltipsInfo && !showTooltipsInfoIcon && ((showTooltipsInfoBySide && isMobileScreen()) || !isMobileScreen())\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n\r\n </div>\r\n</ion-item>\r\n", styles: ["fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.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)}.divselectmultiple{justify-content:space-between;width:100%;color:#000}.tooltipsinfo-text{text-align:justify;text-justify:inter-word;word-wrap:break-word;font-size:10px;margin-top:6px;margin-left:5px}.tooltipsinfo-text-wide{text-align:justify;text-justify:inter-word;word-wrap:break-word;font-size:10px;margin-top:6px;width:100%;padding-bottom:5px}.tooltipsinfo-right{display:grid;grid-template-columns:1.2fr .05fr 1fr;grid-gap:0px}.tooltipsinfo-icon{padding-left:10px;color:#3880ff}\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.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional"], exportAs: ["kendoLabel"] }, { type: i4.IonicSelectableComponent, selector: "ionic-selectable", inputs: ["items", "modalCssClass", "modalEnterAnimation", "modalLeaveAnimation", "isConfirmButtonEnabled", "itemValueField", "itemTextField", "groupValueField", "groupTextField", "canSearch", "hasInfiniteScroll", "hasVirtualScroll", "virtualScrollApproxItemHeight", "searchPlaceholder", "placeholder", "searchFailText", "clearButtonText", "addButtonText", "confirmButtonText", "closeButtonText", "shouldFocusSearchbar", "headerColor", "groupColor", "closeButtonSlot", "itemIconSlot", "searchDebounce", "disabledItems", "shouldStoreItemValue", "canSaveItem", "canDeleteItem", "virtualScrollHeaderFn", "isEnabled", "shouldBackdropClose", "hasConfirmButton", "isOnSearchEnabled", "canClear", "isMultiple", "canAddItem"], outputs: ["itemsChange", "onChange", "onSearch", "onSearchFail", "onSearchSuccess", "onInfiniteScroll", "onOpen", "onClose", "onSelect", "onClear", "onSaveItem", "onDeleteItem", "onAddItem"] }, { 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.UivalidationmessageComponent, selector: "app-uivalidationmessage", inputs: ["group", "data", "form"] }, { type: i7.ComboBoxComponent, selector: "kendo-combobox", inputs: ["focusableId", "allowCustom", "valueNormalizer", "placeholder", "listHeight", "suggest", "clearButton", "disabled", "readonly", "tabindex", "filterable", "data", "value", "valuePrimitive", "popupSettings", "itemDisabled", "tabIndex", "virtual", "size", "rounded", "fillMode", "loading", "textField", "valueField", "iconClass"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoComboBox"] }, { type: i7.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["focusableId", "autoClose", "tabindex", "disabled", "readonly", "filterable", "listHeight", "clearButton", "tagMapper", "allowCustom", "valueNormalizer", "data", "value", "tabIndex", "size", "rounded", "fillMode", "placeholder", "itemDisabled", "checkboxes", "virtual", "popupSettings", "valuePrimitive", "loading", "valueField", "textField"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i4.IonicSelectableItemIconTemplateDirective, selector: "[ionicSelectableItemIconTemplate]" }, { type: i4.IonicSelectableCloseButtonTemplateDirective, selector: "[ionicSelectableCloseButtonTemplate]" }, { type: i4.IonicSelectableTitleTemplateDirective, selector: "[ionicSelectableTitleTemplate]" }, { type: i4.IonicSelectableItemTemplateDirective, selector: "[ionicSelectableItemTemplate]" }, { type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i10.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "showAfter", "callout", "closable", "offset", "tooltipTemplate", "showOn", "titleTemplate", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle"], exportAs: ["kendoTooltip"] }, { type: i11.OpenOnFocusDirective, selector: "kendo-combobox[openOnFocus]", inputs: ["openOnFocus"] }, { type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i7.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { type: i12.TextBoxSuffixTemplateDirective, selector: "[kendoTextBoxSuffixTemplate]" }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
560
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZselectmultipleComponent, decorators: [{
|
|
561
|
+
type: Component,
|
|
562
|
+
args: [{ selector: "app-zselectmultiple", template: "<ion-item [ngClass]=\"getClass(form, data)\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && isMobileScreen()\">\r\n\r\n <ion-label *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n\r\n <kendo-label *ngIf=\"data.TooltipsInfo && !showTooltipsInfoIcon && !showTooltipsInfoBySide\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n <div [class]=\"setTooltipsInfoSideBySide()\" *ngIf=\"!isLoading\">\r\n <div style=\"flex-grow: 1;\">\r\n <ionic-selectable #selectComponent item-content\r\n searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\"\r\n clearButtonText=\"Clear\"\r\n [(ngModel)]=\"group.zModel[data.Value]\"\r\n [id]=\"data.Value\"\r\n [items]=\"getItemsData()\"\r\n [itemValueField]=\"itemValueField\"\r\n [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\"\r\n [canClear]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\"\r\n [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\"\r\n [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\"\r\n (onSearch)=\"onSearch($event)\"\r\n (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\"\r\n (onChange)=\"onChange($event)\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate\r\n let-item=\"item\"\r\n let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\"\r\n class=\"isItemSelected\"\r\n size=\"sm\"\r\n [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n {{data.Label}}\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n {{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}\r\n <!-- <ng-template zselectitemelement [item]=\"item\"></ng-template> -->\r\n </ng-template>\r\n\r\n <!--<ng-template ionicSelectableFooterTemplate>\r\n <ion-toolbar>\r\n <ion-row>\r\n <ion-col>\r\n <ion-button expand=\"full\" ng-reflect-disabled=\"false\" ng-reflect-expand=\"full\" class=\"button button-full button-solid ion-activatable ion-focusable hydrated\" (click)=\"clearItems()\">\r\n Clear\r\n </ion-button>\r\n </ion-col>\r\n <ion-col>\r\n <ion-button expand=\"full\" ng-reflect-disabled=\"false\" ng-reflect-expand=\"full\" class=\"button button-full button-solid ion-activatable ion-focusable hydrated\" (click)=\"confirmItems()\">\r\n OK\r\n </ion-button>\r\n </ion-col>\r\n </ion-row>\r\n </ion-toolbar>\r\n </ng-template>-->\r\n </ionic-selectable>\r\n </div>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n <!-- side by side and desktop tooltipsinfo -->\r\n <kendo-label *ngIf=\"tooltipsInfo && !showTooltipsInfoIcon && showTooltipsInfoBySide\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n </div>\r\n</ion-item>\r\n\r\n\r\n\r\n<ion-item [ngClass]=\"getClass(form, data)\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && !isMobileScreen()\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n <span kendoTooltip\r\n *ngIf=\"data.TooltipsInfo && showTooltipsInfoIcon\"\r\n [title]=\"tooltipsDisplayText\">\r\n <fa-icon [icon]=\"tooltipsDisplayIcon\"\r\n class=\"tooltipsinfo-icon\">\r\n </fa-icon>\r\n </span>\r\n </ion-label>\r\n <!-- mobile tooltipsinfo below label-->\r\n <div [class]=\"setTooltipsInfoSideBySide()\">\r\n <div style=\"flex: 1;\">\r\n <kendo-combobox *ngIf=\"!data.Multiple\"\r\n #comboboxComponent\r\n [data]=\"getItemsData()\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [suggest]=\"true\"\r\n [filterable]=\"!!data.HasInfiniteScroll\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"virtual\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n style=\"margin-top: 7px; width: 100%;\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n <ng-template kendoTextBoxSuffixTemplate>\r\n\r\n <!-- For Validation feature -->\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"\r\n class=\"validation-icon\"></app-uivalidationmessage>\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"data.Multiple\"\r\n [data]=\"getItemsData()\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"!!data.HasInfiniteScroll\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n style=\"margin-top: 7px; width: 100%;\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-multiselect>\r\n </div>\r\n\r\n <div *ngFor=\"let item of iconList\">\r\n <div kendoTooltip style=\"text-align: center; padding-top: 10px;\"\r\n showOn=\"hover\"\r\n [tooltipWidth]=\"item.Width\"\r\n [position]=\"item.Position\">\r\n <span *ngIf=\"!!item && item.Color\"\r\n (click)=\"onIconClick(item.Click)\"\r\n [title]=\"item.Tooltip\"\r\n style=\"margin-top: 10px;\">\r\n <fa-icon [icon]=\"item.Icon\"\r\n [ngStyle]=\"{'padding': '4px 6px', 'color': (item.Color ? item.Color : 'black')}\"></fa-icon>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ion-button *ngFor=\"let button of buttonList; let i = button\"\r\n fill=\"outline\"\r\n color=\"dark\"\r\n size=\"small\"\r\n strong=\"false\"\r\n class=\"button-container\"\r\n style=\"margin-top: 7px;\"\r\n (click)=\"onIconClick(button.click)\"\r\n [hidden]=\"!button.visible\"\r\n [disabled]=\"group.isTriggered || button.disabled\">\r\n <fa-icon *ngIf=\"button.icon\" [icon]=\"getFontAwesome(button.icon)\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">{{ button.text }}</span>\r\n </ion-button>\r\n\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n\r\n <!-- side by side and desktop tooltipsinfo -->\r\n <kendo-label *ngIf=\"tooltipsInfo && !showTooltipsInfoIcon && ((showTooltipsInfoBySide && isMobileScreen()) || !isMobileScreen())\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n\r\n </div>\r\n</ion-item>\r\n", styles: ["fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background: transparent}.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)}.divselectmultiple{justify-content:space-between;width:100%;color:#000}.tooltipsinfo-text{text-align:justify;text-justify:inter-word;word-wrap:break-word;font-size:10px;margin-top:6px;margin-left:5px}.tooltipsinfo-text-wide{text-align:justify;text-justify:inter-word;word-wrap:break-word;font-size:10px;margin-top:6px;width:100%;padding-bottom:5px}.tooltipsinfo-right{display:grid;grid-template-columns:1.2fr .05fr 1fr;grid-gap:0px}.tooltipsinfo-icon{padding-left:10px;color:#3880ff}\n"] }]
|
|
563
|
+
}], ctorParameters: function () { return [{ type: i1.ResourceApiService }, { type: i1.WebApiService }, { type: i1.CacheService }]; }, propDecorators: { data: [{
|
|
564
|
+
type: Input
|
|
565
|
+
}], group: [{
|
|
566
|
+
type: Input
|
|
567
|
+
}], form: [{
|
|
568
|
+
type: Input
|
|
569
|
+
}], iconList: [{
|
|
570
|
+
type: Input
|
|
571
|
+
}], buttonList: [{
|
|
572
|
+
type: Input
|
|
573
|
+
}], selectComponent: [{
|
|
574
|
+
type: ViewChild,
|
|
575
|
+
args: ["selectComponent"]
|
|
576
|
+
}] } });
|
|
577
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNlbGVjdG11bHRpcGxlL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLdkQsOEJBQThCO0FBQzlCLE9BQU8sRUFBa0QsRUFBRSxFQUFrQixNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEVBQWlDLEtBQUssRUFBMkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRiwyQ0FBMkM7QUFDM0MsT0FBTyxFQUVPLGdCQUFnQixFQUNHLG9CQUFvQixFQUNuQyxvQkFBb0IsRUFDckMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLHdCQUF3QjtJQW1DbkMsMEVBQTBFO0lBRTFFLFlBQ1Usa0JBQXNDLEVBQ3RDLGFBQTRCLEVBQzVCLFlBQTBCO1FBRjFCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFoQzdCLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUN0QywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsaUJBQVksR0FBMkIsSUFBSSxDQUFDO1FBQzVDLHdCQUFtQixHQUFXLElBQUksQ0FBQztR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MkZEdExhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxxQkFBcUI7Z0tBS3RCLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDd0IsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJb25pY1NlbGVjdGFibGVDb21wb25lbnQgfSBmcm9tIFwiaW9uaWMtc2VsZWN0YWJsZVwiO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IGludGVydmFsLCB0aHJvd0Vycm9yLCBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aW1lciB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCwgZGVib3VuY2VUaW1lLCBkZWxheSwgdGltZUludGVydmFsLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBSZXNvdXJjZUFwaVNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIENhY2hlU2VydmljZSwgQ2xpY2thYmxlSWNvbnMsIEJ1dHRvbkxpc3QsXHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gIFpTZWxlY3RNdWx0aXBsZVRlbXBsYXRlUGFyYW1zLCBaU2VsZWN0UG9zdEFwaVBhcmFtcywgelNlbGVjdE11bHRpcGxlUGFyYW1zLFxyXG4gIFpHcm91cCwgWkZpZWxkLCBaQ29tcG9uZW50UHJvcGVydGllcywgVG9vbHRpcHNJbmZvUHJvcGVydGllcyAgIFxyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtenNlbGVjdG11bHRpcGxlXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4venNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBac2VsZWN0bXVsdGlwbGVDb21wb25lbnQgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZGF0YTogWkZpZWxkO1xyXG4gIEBJbnB1dCgpIGdyb3VwOiBaR3JvdXA7XHJcbiAgQElucHV0KCkgZm9ybTogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIGljb25MaXN0OiBDbGlja2FibGVJY29uc1tdO1xyXG4gIEBJbnB1dCgpIGJ1dHRvbkxpc3Q6IEJ1dHRvbkxpc3RbXTtcclxuICBAVmlld0NoaWxkKFwic2VsZWN0Q29tcG9uZW50XCIpIHNlbGVjdENvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50O1xyXG5cclxuICBwdWJsaWMgc2hvd1Rvb2x0aXBzSW5mb0ljb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd1Rvb2x0aXBzSW5mb0J5U2lkZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0b29sdGlwc0luZm86IFRvb2x0aXBzSW5mb1Byb3BlcnRpZXMgPSBudWxsO1xyXG4gIHB1YmxpYyB0b29sdGlwc0Rpc3BsYXlUZXh0OiBzdHJpbmcgPSBudWxsO1xyXG4gIHB1YmxpYyB0b29sdGlwc0Rpc3BsYXlJY29uOiBhbnk7XHJcbiAgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBtb2RlbHpEYXRhOiBBcnJheTxhbnk+O1xyXG4gIGluZmluaXRlekRhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICBpbmZpbml0ZVNlYXJjaFRleHQgPSBudWxsO1xyXG4gIC8vIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHRvZ2dsZVNlbGVjdGFibGUgPSB0cnVlO1xyXG4gIGl0ZW1WYWx1ZUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1UZXh0RmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbURhdGFGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtVGVtcGxhdGUgPSBcInt7aXRlbVtpdGVtVGV4dEZpZWxkXX19XCI7XHJcbiAgaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgY29tcG9uZW50UHJvcGVydGllcyA9IG5ldyBaQ29tcG9uZW50UHJvcGVydGllcygpO1xyXG4gIHByaXZhdGUgZGVib3VuY2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBhbGxvd0N1c3RvbVZhbHVlID0gZmFsc2U7XHJcbiAgYXV0b0Nsb3NlOiBib29sZWFuID0gdHJ1ZTtcclxuICBkYXRhSW5mbzoge30gPSB7XHJcbiAgICBcIml0ZW1zUmVzb3VyY2VVUkxcIjogXCJcIixcclxuICAgIFwib3B0aW9uRmlsdGVyc1wiOiBcIlwiLFxyXG4gICAgXCJ0b3RhbENvdW50XCI6IDBcclxuICB9O1xyXG5cclxuICAvLyBwcml2YXRlIGxvYWRJbmZpbml0ZURhdGFTdWI6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAvLyBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgIC8vICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB2aXJ0dWFsOiBhbnkgPSB7XHJcbiAgICBpdGVtSGVpZ2h0OiAyOCxcclxuICAgIHBhZ2VTaXplOiAxNVxyXG4gIH07XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50UHJvcGVydGllcyh0aGlzKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVnaXN0ZXJDb21wb25lbnQodGhpcyk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldFNlbGVjdE11bHRpcGxlVGV4dFZhbHVlKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLnRvb2x0aXBzSW5mbyA9IHRoaXMuZGF0YS5Ub29sdGlwc0luZm87XHJcbiAgICBpZiAodGhpcy50b29sdGlwc0luZm8pIHtcclxuICAgICAgaWYgKCh0aGlzLnRvb2x0aXBzSW5mby5JY29uICE9IG51bGwgfHwgdGhpcy50b29sdGlwc0luZm8uSWNvbiAhPSB1bmRlZmluZWQpICYmICF0aGlzLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICB0aGlzLnNob3dUb29sdGlwc0luZm9JY29uID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldFRvb2x0aXBzSW5mb0ljb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy50b29sdGlwc0luZm8uU2lkZUJ5U2lkZSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2x0aXBzSW5mb0J5U2lkZSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0VG9vbHRpcHNEaXNwbGF5VGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFtEcm9wZG93bmxpc3QgTXVsdGlwbGVdIC0gYXV0byBjbG9zZSBtZW51IHdoZW4gbG9zZSBmb2N1cy5cclxuICAgIGlmICh0aGlzLmRhdGEuQXV0b0Nsb3NlID09PSBmYWxzZSkgdGhpcy5hdXRvQ2xvc2UgPSB0aGlzLmRhdGEuQXV0b0Nsb3NlO1xyXG5cclxuICAgIC8vIEhhbmRsZSBDbGlja2FibGUgSWNvbnNcclxuICAgIHRoaXMuaWNvbkxpc3QgPSB0aGlzLmRhdGEuQ2xpY2thYmxlSWNvbnM7XHJcbiAgICBpZiAodGhpcy5pY29uTGlzdCkge1xyXG4gICAgICBpZiAodGhpcy5pY29uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5pY29uTGlzdC5mb3JFYWNoKChpOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpLlRvb2x0aXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpLlRvb2x0aXAgPSBcIlwiO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaS5Ub29sdGlwID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGkuVG9vbHRpcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uIHRvcC4gcmlnaHQgfCBib3R0b20gfCB0b3AgfCBsZWZ0XHJcbiAgICAgICAgICBpZiAoaS5Qb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGkuUG9zaXRpb24gPSBcInRvcFwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIEJ1dHRvbiBiZXNpZGUgZHJvcGRvd25cclxuICAgIHRoaXMuYnV0dG9uTGlzdCA9IHRoaXMuZGF0YS5CdXR0b25MaXN0O1xyXG4gICAgaWYgKHRoaXMuYnV0dG9uTGlzdCkge1xyXG4gICAgICB0aGlzLmJ1dHRvbkxpc3QuZm9yRWFjaChidXR0b24gPT4ge1xyXG4gICAgICAgIGlmIChidXR0b24udG9vbHRpcCkge1xyXG4gICAgICAgICAgYnV0dG9uLnRvb2x0aXAgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgYnV0dG9uLnRvb2x0aXApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRyb3Bkb3duIGNvbmZpZ3VyYXRpb25cclxuICAgIHRoaXMuYWxsb3dDdXN0b21WYWx1ZSA9IHRoaXMuZGF0YS5BbGxvd0N1c3RvbVZhbHVlIHx8IGZhbHNlOyAvLyBBbGxvdyBlbnRlciB0ZXh0IGluIGRyb3Bkb3duYm94XHJcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5kYXRhLlZhbHVlO1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgIGNvbnN0IHpNb2RlbCA9IHRoaXMuZ3JvdXAuek1vZGVsO1xyXG5cclxuICAgIC8qXHJcbiAgICAgKiA0IFN0eWxlcyBvZiBkZWNsYXJlIHRoZSBjb21wb25lbnTvv71zIG9wdGlvbiBsaXN0IGRhdGEgc291cmNlLlxyXG4gICAgICogU3R5bGUgIzEgLSBGaWVsZC5TZWxlY3RPcHRpb25zIGRlZmluZWQgYXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHRoYXQgY29udGFpbiB0ZXh0IGFuZCB2YWx1ZS5cclxuICAgICAqIFN0eWxlICMyIC0gRmllbGQuU2VsZWN0T3B0aW9ucyBkZWZpbmVkIGFzIGEgcGhhc2UgbGlrZSDvv71pdGVtLklkIGFzIGl0ZW0uTmFtZSBmb3IgaXRlbSBpbiBncm91cC56RGF0YS5Qcm9qZWN0T3B0aW9uc++/vS5cclxuICAgICAqIFN0eWxlICMzIC0gRmllbGQuT3B0aW9uUmVzb3VyY2VVUkwgZGVmaW5lZCB0aGUgbmFtZSBvZiByZXNvdXJjZSBzZXJ2ZXIgYXBpLlxyXG4gICAgICogU3R5bGUgIzQgLSBGaWVsZC5JbmZpbml0ZVNjcm9sbCQgZGVmaW5lZCB0aGUgbWV0aG9kIG5hbWUgYXMg77+9Z3JvdXAuZ2V0TW9yZURhdGFBc1Njcm9sbO+/vS5cclxuICAgICAqL1xyXG5cclxuICAgIGlmIChkYXRhLkhhc0luZmluaXRlU2Nyb2xsICYmIGRhdGEuSW5maW5pdGVTY3JvbGwkKSB7XHJcbiAgICAgIC8vIHdoZW4gaW5maW5pdGllIHNjcm9sbFxyXG4gICAgICBsZXQgcmVjb3JkSWQgPSBudWxsO1xyXG4gICAgICBpZiAoek1vZGVsICYmIHpNb2RlbFtmaWVsZFZhbHVlXSkge1xyXG4gICAgICAgIC8vIGdldCB6TW9kZWwgVmFsdWVcclxuICAgICAgICByZWNvcmRJZCA9IHpNb2RlbFtmaWVsZFZhbHVlXS50b1N0cmluZygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ2V0ekRhdGFGb3J6TW9kZWwkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEluZmluaXRlRGF0YShudWxsLCAnJywgdGhpcywgcmVjb3JkSWQpO1xyXG4gICAgICBpZiAoZ2V0ekRhdGFGb3J6TW9kZWwkKSB7XHJcbiAgICAgICAgZ2V0ekRhdGFGb3J6TW9kZWwkLnN1YnNjcmliZSgoemRhdGEpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEuTmFtZSwgJyAtIGluaXRpYWwgekRhdGEgbG9hZDogJywgemRhdGEpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIVpDb21wb25lbnRIZWxwZXIuaXNNb2JpbGVTY3JlZW4oKSkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gU3R5bGUgIzEsICMyLCAjM1xyXG4gICAgICBjb25zdCBpc1JlcXVpcmVkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGRhdGEuSXNSZXF1aXJlZCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kYXRhLk9wdGlvblJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5sYXp5TG9hZERhdGFPcHRpb25zKCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25EYXRhID0gcmVzLmRhdGFTZXQgPyByZXMuZGF0YVNldCA6IHJlcztcclxuXHJcbiAgICAgICAgICBpZiAob3B0aW9uRGF0YSAmJiBvcHRpb25EYXRhLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5kYXRhLkRpc2FibGVBdXRvRmlyc3RTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RPcHRpb24oaXNSZXF1aXJlZCwgb3B0aW9uRGF0YVswXSwgZmllbGRWYWx1ZSwgek1vZGVsLklkKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpICYmIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSB7XHJcbiAgICAgICAgICAvL3NraXAgZXZhbCBpZiBzZWxlY3RvcHRpb25zIGlzIGV4aXN0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGF0YSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLml0ZW1EYXRhRmllbGQpO1xyXG4gICAgICAgICAgLy8gYXBwZW5kIGRhdGEgdmlhIHRpbWVvdXQgYWZ0ZXIgZGF0YSBpcyBsb2FkZWQuXHJcbiAgICAgICAgICBpZiAob3B0aW9uRGF0YSAmJiBvcHRpb25EYXRhLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5kYXRhLkRpc2FibGVBdXRvRmlyc3RTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgdGhpc0NvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHRoaXNDb21wb25lbnQuYXV0b1NlbGVjdEZpcnN0T3B0aW9uKGlzUmVxdWlyZWQsIG9wdGlvbkRhdGFbMF0sIGZpZWxkVmFsdWUsIHRoaXNDb21wb25lbnQuZ3JvdXAuek1vZGVsLklkKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEF1dG8gc2VsZWN0IGZpcnN0IG9wdGlvbiAoaWYgcmVxdWlyZWQgJiBvbmx5IDEgb3B0aW9uKVxyXG4gIHByaXZhdGUgYXV0b1NlbGVjdEZpcnN0T3B0aW9uKHJlcXVpcmVkOiBib29sZWFuLCBkYXRhOiBhbnksIHpNb2RlbFByb3BlcnR5TmFtZTogc3RyaW5nLCBpZDogYW55KSB7XHJcbiAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eShpZCkgJiYgcmVxdWlyZWQpIHtcclxuICAgICAgdmFyIG9wdGlvbklkID0gZGF0YS5JZDtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5NdWx0aXBsZSkge1xyXG4gICAgICAgIG9wdGlvbklkID0gW29wdGlvbklkXTtcclxuICAgICAgfVxyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoek1vZGVsUHJvcGVydHlOYW1lLCBvcHRpb25JZCwgdGhpcy5ncm91cCk7XHJcblxyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJvbkNoYW5nZVwiLFxyXG4gICAgICAgIHRhcmdldDogdGhpcy5kYXRhLk9uQ2hhbmdlLFxyXG4gICAgICAgIGV2ZW50LFxyXG4gICAgICAgIGRhdGE6IHsgWyd2YWx1ZSddOiBvcHRpb25JZCwgZmllbGQ6IHRoaXMuZGF0YSB9XHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU3R5bGUgIzNcclxuICBsYXp5TG9hZERhdGFPcHRpb25zKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZXNvdXJjZVVybCA9IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChcclxuICAgICAgdGhpcy5kYXRhLk9wdGlvblJlc291cmNlVVJMXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlclBhcmFtID0gbmV3IFpTZWxlY3RQb3N0QXBpUGFyYW1zKCk7XHJcbiAgICBmaWx0ZXJQYXJhbS5zb3J0cyA9IHRoaXMuZGF0YS5PcHRpb25Tb3J0O1xyXG4gICAgZmlsdGVyUGFyYW0uY29sdW1ucyA9IHRoaXMuZGF0YS5PcHRpb25Db2x1bW5zO1xyXG4gICAgZmlsdGVyUGFyYW0uZmlsdGVycyA9IHRoaXMuZGF0YS5PcHRpb25GaWx0ZXI7XHJcblxyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0RGF0YU9wdGlvbnMoXHJcbiAgICAgIHRoaXMuZGF0YS5PcHRpb25OYW1lLFxyXG4gICAgICBmaWx0ZXJQYXJhbSxcclxuICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgcmVzb3VyY2VVcmwsXHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLFxyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2UsXHJcbiAgICAgIHRoaXMuZGF0YVsnRGlzYWJsZUNhY2hlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBTdHlsZSAjNCwgdXNlZCBpbiBpb25pYy1zZWxlY3RhYmxlXHJcbiAgZ2V0SW5maW5pdGVEYXRhKGV2ZW50OiB7XHJcbiAgICBjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDtcclxuICAgIHRleHQ6IHN0cmluZztcclxuICB9KSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmdldEluZmluaXRlRGF0YShldmVudC5jb21wb25lbnQsIGV2ZW50LnRleHQsIHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXNEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbmZpbml0ZXpEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbk5hbWUgPSB0aGlzLmRhdGEuT3B0aW9uTmFtZSB8fCB0aGlzLml0ZW1EYXRhRmllbGQgfHwgJ2dyb3VwLnpEYXRhLicgKyB0aGlzLmRhdGEuTmFtZTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSAmJiAhdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0pIHtcclxuICAgICAgLy8gcmV0dXJuIHNlbGVjdGlvbk9wdGlvbnM7XHJcbiAgICAgIC8vIHJldHVybiB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDEyKV0gPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgdGhpcy5pdGVtRGF0YUZpZWxkID0gb3B0aW9uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9uTmFtZS5zdGFydHNXaXRoKCd6RGF0YS4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cC56RGF0YVtvcHRpb25OYW1lLnNsaWNlKDYpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLnpEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwW29wdGlvbk5hbWUuc2xpY2UoNildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBbb3B0aW9uTmFtZV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLndhcm4odGhpcy5kYXRhLk5hbWUsICcgLSBJbnZhbGlkIHNldHRpbmcgZm9yIE9wdGlvbk5hbWU6ICcsIG9wdGlvbk5hbWUpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goZXZlbnQ6IHsgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7IHRleHQ6IHN0cmluZyB9KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkF0IHpzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQgKG9uU2VhcmNoKTogXCIsIGV2ZW50KTtcclxuICAgIC8vIGV2ZW50LmNvbXBvbmVudCBpcyBmb3IgbW9iaWxlIG9ubHlcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGV2ZW50LmNvbXBvbmVudDtcclxuICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgY29tcG9uZW50LnN0YXJ0U2VhcmNoKCk7XHJcbiAgICAgIGNvbXBvbmVudC5lbmFibGVJbmZpbml0ZVNjcm9sbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgLy8gSWYgc2VhcmNoIHRleHQsIHJlc2V0IHBhZ2UgdG8gMC4gR2V0IGluZmluaXRlIGRhdGFcclxuICAgICAgaWYgKGV2ZW50LnRleHQgIT09IG51bGwgJiYgZXZlbnQudGV4dCAhPT0gdGhpcy5pbmZpbml0ZVNlYXJjaFRleHQpIHtcclxuICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsUGFnZU5vID0gMDtcclxuICAgICAgICB0aGlzLm1vZGVsekRhdGEgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldEluZmluaXRlRGF0YShldmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gUmVzZXQgc2Nyb2xsIHBhZ2UsIGVtcHR5IGl0ZW1zXHJcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpbHRlciB6RGF0YSBhbmQgcHVzaCB0byBpdGVtc1xyXG4gICAgICBjb25zdCBwYXJhbXM6IHpTZWxlY3RNdWx0aXBsZVBhcmFtcyA9IHtcclxuICAgICAgICByZWZlcklkOiBudWxsLFxyXG4gICAgICAgIHBhZ2VObzogMCxcclxuICAgICAgICBwYWdlU2l6ZTogMjAsXHJcbiAgICAgICAgc29ydENvbHVtbk5hbWU6IFwiXCIsXHJcbiAgICAgICAgc29ydE9yZGVyOiBcIlwiLFxyXG4gICAgICAgIHNvcnRDb2x1bW5OYW1lczogW10sXHJcbiAgICAgICAgc29ydE9yZGVyczogW10sXHJcbiAgICAgICAgZmlsdGVyUGFyYW1zOiBbXSxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBcIlwiXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBzZWFyY2hGaWVsZHMgPSB0aGlzLmRhdGEuU2VhcmNoRmllbGRzID8gdGhpcy5kYXRhLlNlYXJjaEZpZWxkcyA6IHRoaXMuaXRlbVRleHRGaWVsZDtcclxuICAgICAgY29uc3QgZmlsdGVyaXRlbXMgPSBaQ29tcG9uZW50SGVscGVyLmZpbHRlclNlYXJjaEl0ZW1zKFxyXG4gICAgICAgIHRoaXMuZ2V0SXRlbXNEYXRhKCksXHJcbiAgICAgICAgZXZlbnQudGV4dCxcclxuICAgICAgICBzZWFyY2hGaWVsZHMsXHJcbiAgICAgICAgcGFyYW1zLnBhZ2VObyxcclxuICAgICAgICBwYXJhbXMucGFnZVNpemVcclxuICAgICAgKTtcclxuICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50Lml0ZW1zLmNvbmNhdChmaWx0ZXJpdGVtcyk7XHJcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XHJcbiAgICAgICAgY29tcG9uZW50LmVuZEluZmluaXRlU2Nyb2xsKCk7XHJcbiAgICAgICAgY29tcG9uZW50LmVuZFNlYXJjaCgpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUZpbHRlcih2YWx1ZTogYW55LCBqdXN0T25lVGltZT86IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmRlYm91bmNlU3ViKSB7XHJcbiAgICAgIHRoaXMuZGVib3VuY2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGVib3VuY2VTdWIgPSBvZihbXSkucGlwZShkZWxheSg1MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMub25TZWFyY2goeyBjb21wb25lbnQ6IG51bGwsIHRleHQ6IHZhbHVlIH0pO1xyXG5cclxuICAgICAgaWYodGhpcy5ncm91cCl7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucyh0aGlzLmdyb3VwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmICh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpIHtcclxuICAgICAgLy8gICB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgLy8gfVxyXG4gICAgICAvLyB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIgPSBuZXcgU3ViamVjdChmYWxzZSk7XHJcbiAgICAgIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyBpbnRlcnZhbCgyMDAwKS5waXBlKHRha2VVbnRpbCh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyAgIHRoaXMub25TZWFyY2goeyBjb21wb25lbnQ6IG51bGwsIHRleHQ6IHZhbHVlIH0pO1xyXG4gICAgICAvLyAgIGlmIChqdXN0T25lVGltZSkge1xyXG4gICAgICAvLyAgICAgdGhpcy5oYW5kbGVDbG9zZSgpO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU9wZW4oKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyAgIC8vIGlmICh0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIpIHtcclxuICAgICAgLy8gICAvLyAgIHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAvLyAgIC8vIH1cclxuICAgICAgLy8gICAvLyB0aGlzLmxvYWRJbmZpbml0ZURhdGFTdWIgPSBuZXcgU3ViamVjdCgpO1xyXG4gICAgICAvLyAgIC8vIC8vIHRoaXMuaGFuZGxlRmlsdGVyKG51bGwpO1xyXG4gICAgICAvLyAgIC8vIGludGVydmFsKDMwMDApLnBpcGUodGFrZVVudGlsKHRoaXMubG9hZEluZmluaXRlRGF0YVN1YikpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIC8vICAgLy8gdGhpcy5oYW5kbGVGaWx0ZXIobnVsbCk7XHJcbiAgICAgIC8vICAgLy8gfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDbG9zZSgpIHtcclxuICAgIC8vIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgIC8vICAgaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgLy8gICAgIHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yi5uZXh0KHRydWUpO1xyXG4gICAgLy8gICAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yi5jb21wbGV0ZSgpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCbHVyKCkge1xyXG4gICAgLy8gdGhpcy5oYW5kbGVDbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbVRlbXBsYXRlKFxyXG4gICAgaXRlbTogYW55LFxyXG4gICAgZGF0YTogYW55LFxyXG4gICAgZ3JvdXA6IGFueSxcclxuICAgIGl0ZW1WYWx1ZUZpZWxkOiBzdHJpbmcsXHJcbiAgICBpdGVtVGV4dEZpZWxkOiBzdHJpbmdcclxuICApIHtcclxuICAgIC8vIFRvRE86IGl0ZW1WYWx1ZUZpZWxkIGFuZCBpdGVtVGV4dEZpZWxkXHJcbiAgICBpZiAodGhpcy5kYXRhLkl0ZW1UZW1wbGF0ZSkge1xyXG4gICAgICBjb25zdCBnZXRUZW1wbGF0ZUZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLkl0ZW1UZW1wbGF0ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZ2V0VGVtcGxhdGVGdW5jKHtcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgaXRlbVZhbHVlRmllbGQsXHJcbiAgICAgICAgaXRlbVRleHRGaWVsZFxyXG4gICAgICB9IGFzIFpTZWxlY3RNdWx0aXBsZVRlbXBsYXRlUGFyYW1zKTtcclxuICAgIH0gZWxzZSBpZiAoaXRlbVRleHRGaWVsZCkge1xyXG4gICAgICByZXR1cm4gaXRlbVtpdGVtVGV4dEZpZWxkXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpdGVtKS5qb2luKFwiLCBcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWFkT25seVZhbHVlKCkge1xyXG4gICAgY29uc3QgcmVhZE9ubHlWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuUmVhZE9ubHkpO1xyXG4gICAgaWYgKHR5cGVvZiByZWFkT25seVZhbHVlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxGdW5jID0gcmVhZE9ubHlWYWx1ZS5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlYWRPbmx5VmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXRJc1JlcXVpcmVkVmFsdWUoKSB7XHJcbiAgICBjb25zdCBJc1JlcXVpcmVkVmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLklzUmVxdWlyZWQpO1xyXG4gICAgaWYgKHR5cGVvZiBJc1JlcXVpcmVkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgY2FsbEZ1bmMgPSBJc1JlcXVpcmVkVmFsdWUuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgIHJldHVybiBjYWxsRnVuYyh0aGlzLmdyb3VwKTtcclxuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gSXNSZXF1aXJlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBWYWx1ZSh2YWx1ZTogc3RyaW5nLCBncm91cDogWkdyb3VwKSB7XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHZhbHVlLCBncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGFzcyhmb3JtOiBGb3JtR3JvdXAsIGRhdGE6IFpGaWVsZCkge1xyXG4gICAgY29uc3QgaW9uSW52YWxpZENsYXNzID0gdGhpcy5nZXRJb25fSW52YWxpZENsYXNzKGZvcm0sIGRhdGEpO1xyXG4gICAgcmV0dXJuIGAke2lvbkludmFsaWRDbGFzcyA/IGlvbkludmFsaWRDbGFzcyA6ICcnfSAke3RoaXMuZGF0YS5DbGFzc31gO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW9uX0ludmFsaWRDbGFzcyhmb3JtOiBGb3JtR3JvdXAsIGRhdGE6IFpGaWVsZCkge1xyXG4gICAgaWYgKCFmb3JtKSB7XHJcbiAgICAgIC8vZGVidWdnZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRJb25fSW52YWxpZENsYXNzKGZvcm0sIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgb25BZGRJdGVtKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGYgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9uQWRkSXRlbSk7XHJcbiAgICBpZiAodHlwZW9mIGYgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgY2FsbEZ1bmMgPSBmLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICByZXR1cm4gY2FsbEZ1bmMoKTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUud2FybignSW52YWxpZCBkZWNsYXJhdGlvbiBvZiBPbkFkZEl0ZW06ICcsIGYpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29tcG9uZW50IGJhc2ljIGZ1bmN0aW9uXHJcbiAgY2xlYXJEYXRhKCkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKHRoaXMuZGF0YS5WYWx1ZSwgXCJcIiwgdGhpcy5ncm91cCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xlYXIoKTtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtSXRlbXMoKSB7XHJcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jb25maXJtKCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSXRlbXMoKSB7XHJcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC50b2dnbGVJdGVtcyh0aGlzLnRvZ2dsZVNlbGVjdGFibGUpO1xyXG4gICAgdGhpcy50b2dnbGVTZWxlY3RhYmxlID0gIXRoaXMudG9nZ2xlU2VsZWN0YWJsZTtcclxuXHJcbiAgICAvLyBDb25maXJtIGl0ZW1zIGFuZCBjbG9zZSBTZWxlY3QgcGFnZVxyXG4gICAgLy8gd2l0aG91dCBoYXZpbmcgdGhlIHVzZXIgdG8gY2xpY2sgQ29uZmlybSBidXR0b24uXHJcbiAgICAvLyB0aGlzLmNvbmZpcm0oKTtcclxuICB9XHJcblxyXG4gIC8vIEV4dHJhIGljb24gYmVzaWRlIGRyb3Bkb3duLiBNYWlubHkgZm9yIHBvcHVwXHJcbiAgb25JY29uQ2xpY2soY2xpY2tBY3Rpb246IHN0cmluZykge1xyXG4gICAgdGhpcy5vbk5hdmlnYXRlVG8oY2xpY2tBY3Rpb24pOyBcclxuICB9XHJcblxyXG4gIG9uTmF2aWdhdGVUbyhjbGlja0FjdGlvbjogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBuID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGNsaWNrQWN0aW9uKTtcclxuICAgIGlmIChuKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiAnenRleHQtb25OYXZpZ2F0ZVRvJyxcclxuICAgICAgICB0YXJnZXQ6IGNsaWNrQWN0aW9uLFxyXG4gICAgICAgIGRhdGE6IHRoaXMuZ3JvdXAuek1vZGVsW3RoaXMuZGF0YS5WYWx1ZV1cclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRGlzYWJsZSBPcGVuIE9uIEZvY3VzXHJcbiAgZGlzYWJsZU9wZW5PbkZvY3VzKGNvbWJvYm94Q29tcG9uZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuRGlzYWJsZU9wZW5PbkZvY3VzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBjb21ib2JveENvbXBvbmVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIE9uQ2hhbmdlXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUV2ZW50KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwgJiYgISF0aGlzLmRhdGEuSW5maW5pdGVTY3JvbGwkKSB7XHJcbiAgICAgIGNvbnN0IHRleHRGaWVsZCA9IHRoaXMuaXRlbVRleHRGaWVsZC50b1N0cmluZygpO1xyXG4gICAgICBjb25zdCB2YWx1ZUZpZWxkID0gdGhpcy5pdGVtVmFsdWVGaWVsZC50b1N0cmluZygpO1xyXG4gICAgICBsZXQgemRhdGFNb2RlbCA9IFtdO1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICB6ZGF0YU1vZGVsID0gdGhpcy5pbmZpbml0ZXpEYXRhLmZpbHRlcih4ID0+IHhbdmFsdWVGaWVsZF0gPT09IHZhbHVlKTtcclxuICAgICAgICB0aGlzLm1vZGVsekRhdGEgPSB6ZGF0YU1vZGVsLnNsaWNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXRlbURhdGFGaWVsZC5zdGFydHNXaXRoKCdncm91cC56RGF0YS4nKSkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXAuekRhdGFbdGhpcy5pdGVtRGF0YUZpZWxkLnNsaWNlKDEyKV0gPSB6ZGF0YU1vZGVsO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbURhdGFGaWVsZC5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBbdGhpcy5pdGVtRGF0YUZpZWxkLnNsaWNlKDYpXSA9IHpkYXRhTW9kZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgIHR5cGU6IFwib25DaGFuZ2VcIixcclxuICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuT25DaGFuZ2UsXHJcbiAgICAgIGV2ZW50LFxyXG4gICAgICBkYXRhOiB7IHZhbHVlLCBmaWVsZDogdGhpcy5kYXRhIH1cclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UodmFsdWU6IGFueSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJ6c2VsZWN0bXVsdGlwbGUgKG9uVmFsdWVDaGFuZ2UpOiBcIiwgdmFsdWUpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKHRoaXMuZGF0YS5WYWx1ZSwgdmFsdWUsIHRoaXMuZ3JvdXApO1xyXG4gICAgdGhpcy5vbkNoYW5nZUV2ZW50KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGV2ZW50OiB7IGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50OyB2YWx1ZTogYW55IH0pIHtcclxuICAgIGNvbnNvbGUubG9nKFwienNlbGVjdG11bHRpcGxlIChvbkNoYW5nZSk6IFwiLCBldmVudC52YWx1ZSk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCBldmVudC52YWx1ZSwgdGhpcy5ncm91cCk7XHJcbiAgICBjb25zdCBmYyA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgdGhpcy5oYW5kbGVDbG9zZSgpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgLy8gdGhpcy5kYXRhLklzUmVxdWlyZWQgJiZcclxuICAgICAgdGhpcy5nZXRJc1JlcXVpcmVkVmFsdWUoKSAmJlxyXG4gICAgICAoZXZlbnQudmFsdWUgPT09IG51bGwgfHwgZXZlbnQudmFsdWUubGVuZ3RoID09PSAwKVxyXG4gICAgKSB7XHJcbiAgICAgIGZjLnNldEVycm9ycyh7IHJlcXVpcmVkOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmMuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25DaGFuZ2VFdmVudChldmVudC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBDb21tb24gZnVuY3Rpb25cclxuICBwdWJsaWMgc2V0RW5hYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgZmMgPSB0aGlzLmdyb3VwLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIHN0YXR1cyA/IGZjLmVuYWJsZSgpIDogZmMuZGlzYWJsZSgpO1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkgPSAhc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlID0gc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhLlZpc2libGUgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkID0gc3RhdHVzO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TGFiZWxUZXh0KG5ld1RleHQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5kYXRhLkxhYmVsID0gbmV3VGV4dDtcclxuICB9XHJcblxyXG4gIGlzTW9iaWxlU2NyZWVuKCkge1xyXG4gICAgY29uc3QgdiA9IFpDb21wb25lbnRIZWxwZXIuaXNNb2JpbGVTY3JlZW4oKTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgLyoqKioqKioqKiogVG9vbHRpcHNJbmZvICoqKioqKioqKiovXHJcbiAgcHVibGljIHNldFRvb2x0aXBzSW5mb0NsYXNzKCkge1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcHNJbmZvICYmICF0aGlzLnNob3dUb29sdGlwc0luZm9JY29uICYmIHRoaXMuc2hvd1Rvb2x0aXBzSW5mb0J5U2lkZSkge1xyXG4gICAgICByZXR1cm4gJ3Rvb2x0aXBzaW5mby10ZXh0JztcclxuICAgIH1cclxuICAgIHJldHVybiAndG9vbHRpcHNpbmZvLXRleHQtd2lkZSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VG9vbHRpcHNJbmZvQ29sb3IoKSB7XHJcbiAgICBpZiAodGhpcy50b29sdGlwc0luZm8pIHtcclxuICAgICAgaWYgKHRoaXMudG9vbHRpcHNJbmZvLlRleHRDb2xvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvb2x0aXBzSW5mby5UZXh0Q29sb3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gXCIjYWNhY2FjXCI7IC8vIGRlZmF1bHQgZ3JleVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRvb2x0aXBzSW5mb0ljb24oZGlzcGxheUljb24/OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNob3dUb29sdGlwc0luZm9JY29uKSB7XHJcbiAgICAgIGlmICh0aGlzLnRvb2x0aXBzSW5mby5JY29uICE9ICcnKSB7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlJY29uKSB7XHJcbiAgICAgICAgICB0aGlzLnRvb2x0aXBzRGlzcGxheUljb24gPSBkaXNwbGF5SWNvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvb2x0aXBzRGlzcGxheUljb24gPSB0aGlzLnRvb2x0aXBzSW5mby5JY29uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBzRGlzcGxheUljb24gPSAncXVlc3Rpb24tY2lyY2xlJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VG9vbHRpcHNEaXNwbGF5VGV4dChkaXNwbGF5VGV4dD86IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcHNJbmZvKSB7XHJcbiAgICAgIGlmIChkaXNwbGF5VGV4dCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcHNEaXNwbGF5VGV4dCA9IGRpc3BsYXlUZXh0O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcHNEaXNwbGF5VGV4dCA9IHRoaXMudG9vbHRpcHNJbmZvLkRpc3BsYXlUZXh0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50b29sdGlwc0Rpc3BsYXlUZXh0ID0gJzxEaXNwbGF5IHRleHQgZXJyb3I+JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUb29sdGlwc0luZm9TaWRlQnlTaWRlKCkge1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcHNJbmZvKSB7XHJcbiAgICAgIGlmICh0aGlzLnNob3dUb29sdGlwc0luZm9CeVNpZGUgJiYgIXRoaXMuc2hvd1Rvb2x0aXBzSW5mb0ljb24gKSB7XHJcbiAgICAgICAgcmV0dXJuICdpb24tcm93IGRpdnNlbGVjdG11bHRpcGxlIHRvb2x0aXBzaW5mby1yaWdodCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnaW9uLXJvdyBkaXZzZWxlY3RtdWx0aXBsZSc7XHJcbiAgfVxyXG4gICBcclxuICBwdWJsaWMgZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWUpO1xyXG4gIH1cclxufVxyXG4iLCI8aW9uLWl0ZW0gW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoZm9ybSwgZGF0YSlcIiAqbmdJZj1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKSAmJiBpc01vYmlsZVNjcmVlbigpXCI+XHJcblxyXG4gIDxpb24tbGFiZWwgKm5nSWY9XCJkYXRhLlNob3dMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGRhdGEuU2hvd0xhYmVsXCIgcG9zaXRpb249XCJzdGFja2VkXCI+XHJcbiAgICB7e2RhdGEuTGFiZWx9fVxyXG4gICAgPGlvbi10ZXh0ICpuZ0lmPVwiY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICA8L2lvbi1sYWJlbD5cclxuXHJcbiAgPGtlbmRvLWxhYmVsICpuZ0lmPVwiZGF0YS5Ub29sdGlwc0luZm8gJiYgIXNob3dUb29sdGlwc0luZm9JY29uICYmICFzaG93VG9vbHRpcHNJbmZvQnlTaWRlXCJcclxuICAgICAgICAgICAgICAgW3RleHRdPVwidG9vbHRpcHNEaXNwbGF5VGV4dFwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzc109XCJzZXRUb29sdGlwc0luZm9DbGFzcygpXCJcclxuICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNldFRvb2x0aXBzSW5mb0NvbG9yKClcIj48L2tlbmRvLWxhYmVsPlxyXG4gIDxkaXYgW2NsYXNzXT1cInNldFRvb2x0aXBzSW5mb1NpZGVCeVNpZGUoKVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gICAgPGRpdiBzdHlsZT1cImZsZXgtZ3JvdzogMTtcIj5cclxuICAgICAgPGlvbmljLXNlbGVjdGFibGUgI3NlbGVjdENvbXBvbmVudCBpdGVtLWNvbnRlbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmFpbFRleHQ9XCJOb3RoaW5nIGZvdW5kIDooXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQ29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJCdXR0b25UZXh0PVwiQ2xlYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwLnpNb2RlbFtkYXRhLlZhbHVlXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImdldEl0ZW1zRGF0YSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1WYWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1UZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5BZGRJdGVtXT1cIiEhZGF0YS5PbkFkZEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuQ2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NhblNlYXJjaF09XCIhZGF0YVsnZGlzYWJsZS1zZWFyY2gnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG91bGRGb2N1c1NlYXJjaGJhcl09XCIhZGF0YVsnZGlzYWJsZS1zZWFyY2gnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNJbmZpbml0ZVNjcm9sbF09XCIhIWRhdGEuSGFzSW5maW5pdGVTY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNNdWx0aXBsZV09XCJkYXRhLk11bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRW5hYmxlZF09XCIhKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3VsZFN0b3JlSXRlbVZhbHVlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkluZmluaXRlU2Nyb2xsKT1cImdldEluZmluaXRlRGF0YSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uQWRkSXRlbSk9XCJvbkFkZEl0ZW0oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpb25pY1NlbGVjdGFibGVJdGVtSWNvblRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgIGxldC1pdGVtPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGxldC1pc0l0ZW1TZWxlY3RlZD1cImlzSXRlbVNlbGVjdGVkXCI+XHJcbiAgICAgICAgICA8ZmEtaWNvbiBzbG90PVwic3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpc0l0ZW1TZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgICAgW2ljb25dPVwiWydmYXInLCBpc0l0ZW1TZWxlY3RlZCA/ICdjaGVjay1jaXJjbGUnOiAnY2lyY2xlJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlc109XCJ7J2NvbG9yJzogaXNJdGVtU2VsZWN0ZWQgPyAnZG9kZ2VyQmx1ZScgOiAnbGlnaHRHcmF5J31cIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUNsb3NlQnV0dG9uVGVtcGxhdGU+XHJcbiAgICAgICAgICA8IS0tIDxpb24taWNvbiBuYW1lPVwiY2xvc2UtY2lyY2xlXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCIndGltZXMtY2lyY2xlJ1wiIHNpemU9XCJtZFwiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgaW9uaWNTZWxlY3RhYmxlVGl0bGVUZW1wbGF0ZT5cclxuICAgICAgICAgIHt7ZGF0YS5MYWJlbH19XHJcbiAgICAgICAgICA8aW9uLXRleHQgKm5nSWY9XCJnZXRJc1JlcXVpcmVkVmFsdWUoKVwiIGNvbG9yPVwiZGFuZ2VyXCI+KjwvaW9uLXRleHQ+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGlvbmljU2VsZWN0YWJsZUl0ZW1UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgIHt7IGdldEl0ZW1UZW1wbGF0ZShpdGVtLCBkYXRhLCBncm91cCwgaXRlbVZhbHVlRmllbGQsIGl0ZW1UZXh0RmllbGQpIH19XHJcbiAgICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSB6c2VsZWN0aXRlbWVsZW1lbnQgW2l0ZW1dPVwiaXRlbVwiPjwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS08bmctdGVtcGxhdGUgaW9uaWNTZWxlY3RhYmxlRm9vdGVyVGVtcGxhdGU+XHJcbiAgICAgICAgICA8aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICAgIDxpb24tcm93PlxyXG4gICAgICAgICAgICAgIDxpb24tY29sPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiZnVsbFwiIG5nLXJlZmxlY3QtZGlzYWJsZWQ9XCJmYWxzZVwiIG5nLXJlZmxlY3QtZXhwYW5kPVwiZnVsbFwiIGNsYXNzPVwiYnV0dG9uIGJ1dHRvbi1mdWxsIGJ1dHRvbi1zb2xpZCBpb24tYWN0aXZhdGFibGUgaW9uLWZvY3VzYWJsZSBoeWRyYXRlZFwiIChjbGljayk9XCJjbGVhckl0ZW1zKClcIj5cclxuICAgICAgICAgICAgICAgICAgQ2xlYXJcclxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XHJcbiAgICAgICAgICAgICAgPGlvbi1jb2w+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJmdWxsXCIgbmctcmVmbGVjdC1kaXNhYmxlZD1cImZhbHNlXCIgbmctcmVmbGVjdC1leHBhbmQ9XCJmdWxsXCIgY2xhc3M9XCJidXR0b24gYnV0dG9uLWZ1bGwgYnV0dG9uLXNvbGlkIGlvbi1hY3RpdmF0YWJsZSBpb24tZm9jdXNhYmxlIGh5ZHJhdGVkXCIgKGNsaWNrKT1cImNvbmZpcm1JdGVtcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIE9LXHJcbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9pb24tY29sPlxyXG4gICAgICAgICAgICA8L2lvbi1yb3c+XHJcbiAgICAgICAgICA8L2lvbi10b29sYmFyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+LS0+XHJcbiAgICAgIDwvaW9uaWMtc2VsZWN0YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGFwcC11aXZhbGlkYXRpb25tZXNzYWdlIFtncm91cF09XCJncm91cFwiIFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCI+PC9hcHAtdWl2YWxpZGF0aW9ubWVzc2FnZT5cclxuICAgIDwhLS0gc2lkZSBieSBzaWRlIGFuZCBkZXNrdG9wIHRvb2x0aXBzaW5mbyAtLT5cclxuICAgIDxrZW5kby1sYWJlbCAqbmdJZj1cInRvb2x0aXBzSW5mbyAmJiAhc2hvd1Rvb2x0aXBzSW5mb0ljb24gJiYgc2hvd1Rvb2x0aXBzSW5mb0J5U2lkZVwiXHJcbiAgICAgICAgICAgICAgICAgW3RleHRdPVwidG9vbHRpcHNEaXNwbGF5VGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInNldFRvb2x0aXBzSW5mb0NsYXNzKClcIlxyXG4gICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZXRUb29sdGlwc0luZm9Db2xvcigpXCI+PC9rZW5kby1sYWJlbD5cclxuICA8L2Rpdj5cclxuPC9pb24taXRlbT5cclxuXHJcblxyXG5cclxuPGlvbi1pdGVtIFtuZ0NsYXNzXT1cImdldENsYXNzKGZvcm0sIGRhdGEpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKm5nSWY9XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSkgJiYgIWlzTW9iaWxlU2NyZWVuKClcIj5cclxuICA8aW9uLWxhYmVsIFthdHRyLmZvcl09XCJkYXRhLlZhbHVlXCIgKm5nSWY9XCJkYXRhLlNob3dMYWJlbCA9PT0gdW5kZWZpbmVkIHx8IGRhdGEuU2hvd0xhYmVsXCIgcG9zaXRpb249XCJzdGFja2VkXCI+XHJcbiAgICB7e2RhdGEuTGFiZWx9fVxyXG4gICAgPGlvbi10ZXh0ICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWRGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICAgIDxzcGFuIGtlbmRvVG9vbHRpcFxyXG4gICAgICAgICAgKm5nSWY9XCJkYXRhLlRvb2x0aXBzSW5mbyAmJiBzaG93VG9vbHRpcHNJbmZvSWNvblwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwidG9vbHRpcHNEaXNwbGF5VGV4dFwiPlxyXG4gICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ0b29sdGlwc0Rpc3BsYXlJY29uXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sdGlwc2luZm8taWNvblwiPlxyXG4gICAgICA8L2ZhLWljb24+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9pb24tbGFiZWw+XHJcbiAgPCEtLSBtb2JpbGUgdG9vbHRpcHNpbmZvIGJlbG93IGxhYmVsLS0+XHJcbiAgPGRpdiBbY2xhc3NdPVwic2V0VG9vbHRpcHNJbmZvU2lkZUJ5U2lkZSgpXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cclxuICAgICAgPGtlbmRvLWNvbWJvYm94ICpuZ0lmPVwiIWRhdGEuTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgI2NvbWJvYm94Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJnZXRJdGVtc0RhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJpdGVtVmFsdWVGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIml0ZW1UZXh0RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbV09XCJhbGxvd0N1c3RvbVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdWdnZXN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiISFkYXRhLkhhc0luZmluaXRlU2Nyb2xsXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtvcGVuT25Gb2N1c109XCJkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCcgOiAoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwiaGFuZGxlRmlsdGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxdPVwidmlydHVhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAob3Blbik9XCJoYW5kbGVPcGVuKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsb3NlKT1cImhhbmRsZUNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogN3B4OyB3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9Db21ib0JveEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgICAgICB7eyBnZXRJdGVtVGVtcGxhdGUoZGF0YUl0ZW0sIGRhdGEsIGdyb3VwLCBpdGVtVmFsdWVGaWVsZCwgaXRlbVRleHRGaWVsZCkgfX1cclxuICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZVwiPnt7IGRhdGFJdGVtLnZhbHVlIH19PC9zcGFuPiB7eyBkYXRhSXRlbS50ZXh0IH19IC0tPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvVGV4dEJveFN1ZmZpeFRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgIDwhLS0gRm9yIFZhbGlkYXRpb24gZmVhdHVyZSAtLT5cclxuICAgICAgICAgIDxhcHAtdWl2YWxpZGF0aW9ubWVzc2FnZSBbZ3JvdXBdPVwiZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmFsaWRhdGlvbi1pY29uXCI+PC9hcHAtdWl2YWxpZGF0aW9ubWVzc2FnZT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2tlbmRvLWNvbWJvYm94PlxyXG4gICAgICA8a2VuZG8tbXVsdGlzZWxlY3QgKm5nSWY9XCJkYXRhLk11bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImdldEl0ZW1zRGF0YSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cIml0ZW1WYWx1ZUZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmllbGRdPVwiaXRlbVRleHRGaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlUHJpbWl0aXZlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRhdGEuUGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tXT1cImFsbG93Q3VzdG9tVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiISFkYXRhLkhhc0luZmluaXRlU2Nyb2xsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2JveGVzXT1cImRhdGEuRW5hYmxlQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiYXV0b0Nsb3NlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCcgOiAoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAob3Blbik9XCJoYW5kbGVPcGVuKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlKT1cImhhbmRsZUNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1cigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogN3B4OyB3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdEl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgICAgICB7eyBnZXRJdGVtVGVtcGxhdGUoZGF0YUl0ZW0sIGRhdGEsIGdyb3VwLCBpdGVtVmFsdWVGaWVsZCwgaXRlbVRleHRGaWVsZCkgfX1cclxuICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZVwiPnt7IGRhdGFJdGVtLnZhbHVlIH19PC9zcGFuPiB7eyBkYXRhSXRlbS50ZXh0IH19IC0tPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwva2VuZG8tbXVsdGlzZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGljb25MaXN0XCI+XHJcbiAgICAgIDxkaXYga2VuZG9Ub29sdGlwIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nLXRvcDogMTBweDtcIlxyXG4gICAgICAgICAgIHNob3dPbj1cImhvdmVyXCJcclxuICAgICAgICAgICBbdG9vbHRpcFdpZHRoXT1cIml0ZW0uV2lkdGhcIlxyXG4gICAgICAgICAgIFtwb3NpdGlvbl09XCJpdGVtLlBvc2l0aW9uXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhIWl0ZW0gJiYgaXRlbS5Db2xvclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSWNvbkNsaWNrKGl0ZW0uQ2xpY2spXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5Ub29sdGlwXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCI+XHJcbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJpdGVtLkljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydwYWRkaW5nJzogJzRweCA2cHgnLCAnY29sb3InOiAoaXRlbS5Db2xvciA/IGl0ZW0uQ29sb3IgOiAnYmxhY2snKX1cIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxpb24tYnV0dG9uICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYnV0dG9uTGlzdDsgbGV0IGkgPSBidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgZmlsbD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcclxuICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICBzdHJvbmc9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiA3cHg7XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkljb25DbGljayhidXR0b24uY2xpY2spXCJcclxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIWJ1dHRvbi52aXNpYmxlXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5pc1RyaWdnZXJlZCB8fCBidXR0b24uZGlzYWJsZWRcIj5cclxuICAgICAgPGZhLWljb24gKm5nSWY9XCJidXR0b24uaWNvblwiIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKGJ1dHRvbi5pY29uKVwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4O1wiPjwvZmEtaWNvbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpb24tdGV4dC1jYXBpdGFsaXplXCI+e3sgYnV0dG9uLnRleHQgfX08L3NwYW4+XHJcbiAgICA8L2lvbi1idXR0b24+XHJcblxyXG4gICAgPGFwcC11aXZhbGlkYXRpb25tZXNzYWdlIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXVpdmFsaWRhdGlvbm1lc3NhZ2U+XHJcblxyXG4gICAgPCEtLSBzaWRlIGJ5IHNpZGUgYW5kIGRlc2t0b3AgdG9vbHRpcHNpbmZvIC0tPlxyXG4gICAgPGtlbmRvLWxhYmVsICpuZ0lmPVwidG9vbHRpcHNJbmZvICYmICFzaG93VG9vbHRpcHNJbmZvSWNvbiAmJiAoKHNob3dUb29sdGlwc0luZm9CeVNpZGUgJiYgaXNNb2JpbGVTY3JlZW4oKSkgfHwgIWlzTW9iaWxlU2NyZWVuKCkpXCJcclxuICAgICAgICAgICAgICAgICBbdGV4dF09XCJ0b29sdGlwc0Rpc3BsYXlUZXh0XCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3NdPVwic2V0VG9vbHRpcHNJbmZvQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNldFRvb2x0aXBzSW5mb0NvbG9yKClcIj48L2tlbmRvLWxhYmVsPlxyXG5cclxuICA8L2Rpdj5cclxuPC9pb24taXRlbT5cclxuIl19
|