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.
Files changed (198) hide show
  1. package/README.md +14 -2
  2. package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
  3. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
  4. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
  5. package/esm2020/lib/services/main.service.mjs +752 -0
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
  7. package/esm2020/lib/services/zcomponent.service.mjs +81 -0
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
  9. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
  10. package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
  11. package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
  12. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
  13. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
  14. package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
  15. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
  16. package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
  17. package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
  18. package/esm2020/lib/zcard/zcard.component.mjs +72 -0
  19. package/esm2020/lib/zchart/zchart.component.mjs +201 -0
  20. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
  21. package/esm2020/lib/zchip/zchip.component.mjs +121 -0
  22. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
  23. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
  24. package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
  25. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
  26. package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
  27. package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
  28. package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
  29. package/esm2020/lib/zform/zform.component.mjs +147 -0
  30. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
  31. package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
  32. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
  33. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
  34. package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
  35. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
  36. package/esm2020/lib/zimg/zimg.component.mjs +121 -0
  37. package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
  38. package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
  39. package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
  40. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
  41. package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
  42. package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
  43. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
  44. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
  45. package/esm2020/lib/zreport/zreport.component.mjs +105 -0
  46. package/esm2020/lib/zreport/zreport.config.mjs +117 -0
  47. package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
  48. package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
  49. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
  51. package/esm2020/lib/ztab/ztab.component.mjs +187 -0
  52. package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
  53. package/esm2020/lib/ztext/ztext.component.mjs +297 -0
  54. package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
  55. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
  56. package/esm2020/lib/ztree/ztree.component.mjs +380 -0
  57. package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
  58. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
  59. package/esm2020/lib/zudf/zudf.component.mjs +205 -0
  60. package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
  61. package/esm2020/lib/zupload/zupload.component.mjs +359 -0
  62. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
  63. package/esm2020/mmhglobal-dynamicform.mjs +5 -0
  64. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  65. package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
  66. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
  67. package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
  68. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
  69. package/lib/directives/fieldelement.directive.d.ts +3 -0
  70. package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
  71. package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
  72. package/lib/services/main.service.d.ts +3 -0
  73. package/lib/services/zcomponent.debug.service.d.ts +8 -5
  74. package/lib/services/zcomponent.service.d.ts +7 -2
  75. package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
  76. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
  77. package/lib/uicontent/uicontent.component.d.ts +3 -0
  78. package/lib/uiheader/uiheader.component.d.ts +3 -0
  79. package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
  80. package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
  81. package/lib/uipage/uipage.component.d.ts +3 -0
  82. package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
  83. package/lib/zbullet/zbullet.component.d.ts +3 -0
  84. package/lib/zbuttons/zbuttons.component.d.ts +3 -0
  85. package/lib/zcard/zcard.component.d.ts +3 -0
  86. package/lib/zchart/zchart.component.d.ts +3 -0
  87. package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
  88. package/lib/zchip/zchip.component.d.ts +3 -0
  89. package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
  90. package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
  91. package/lib/zdaterange/zdaterange.component.d.ts +3 -0
  92. package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
  93. package/lib/zdatetime/zdatetime.component.d.ts +3 -0
  94. package/lib/zdiv/zdiv.component.d.ts +3 -0
  95. package/lib/zdiv/zdiv.pipe.d.ts +3 -0
  96. package/lib/zform/zform.component.d.ts +3 -0
  97. package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
  98. package/lib/zgauge/zgauge.component.d.ts +3 -0
  99. package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
  100. package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
  101. package/lib/zgrid/zgrid.component.d.ts +4 -1
  102. package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
  103. package/lib/zimg/zimg.component.d.ts +3 -0
  104. package/lib/zkcard/zkcard.component.d.ts +3 -0
  105. package/lib/zlabel/zlabel.component.d.ts +3 -0
  106. package/lib/zmfb/zmfb.component.d.ts +3 -0
  107. package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
  108. package/lib/zmodal/zmodal.component.d.ts +3 -0
  109. package/lib/znumeric/znumeric.component.d.ts +3 -0
  110. package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
  111. package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
  112. package/lib/zreport/zreport.component.d.ts +3 -0
  113. package/lib/zreport/zreport.config.d.ts +3 -0
  114. package/lib/zscheduler/zscheduler.component.d.ts +3 -0
  115. package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
  116. package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
  117. package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
  118. package/lib/ztab/ztab.component.d.ts +3 -0
  119. package/lib/ztab/ztab.pipe.d.ts +3 -0
  120. package/lib/ztext/ztext.component.d.ts +3 -0
  121. package/lib/ztextarea/ztextarea.component.d.ts +3 -0
  122. package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
  123. package/lib/ztree/ztree.component.d.ts +3 -0
  124. package/lib/ztreelist/ztreelist.component.d.ts +3 -0
  125. package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
  126. package/lib/zudf/zudf.component.d.ts +3 -0
  127. package/lib/zunknown/zunknown.component.d.ts +3 -0
  128. package/lib/zupload/zupload.component.d.ts +3 -0
  129. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
  130. package/mmhglobal-dynamicform.d.ts +1 -2
  131. package/package.json +20 -11
  132. package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
  133. package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
  134. package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
  135. package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
  136. package/esm2015/lib/directives/fieldelement.directive.js +0 -15
  137. package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
  138. package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
  139. package/esm2015/lib/services/main.service.js +0 -766
  140. package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
  141. package/esm2015/lib/services/zcomponent.service.js +0 -167
  142. package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
  143. package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
  144. package/esm2015/lib/uicontent/uicontent.component.js +0 -41
  145. package/esm2015/lib/uiheader/uiheader.component.js +0 -65
  146. package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
  147. package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
  148. package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
  149. package/esm2015/lib/zbullet/zbullet.component.js +0 -71
  150. package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
  151. package/esm2015/lib/zcard/zcard.component.js +0 -68
  152. package/esm2015/lib/zchart/zchart.component.js +0 -199
  153. package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
  154. package/esm2015/lib/zchip/zchip.component.js +0 -117
  155. package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
  156. package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
  157. package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
  158. package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
  159. package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
  160. package/esm2015/lib/zdiv/zdiv.component.js +0 -48
  161. package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
  162. package/esm2015/lib/zform/zform.component.js +0 -148
  163. package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
  164. package/esm2015/lib/zgauge/zgauge.component.js +0 -146
  165. package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
  166. package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
  167. package/esm2015/lib/zgrid/zgrid.component.js +0 -834
  168. package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
  169. package/esm2015/lib/zimg/zimg.component.js +0 -123
  170. package/esm2015/lib/zkcard/zkcard.component.js +0 -372
  171. package/esm2015/lib/zlabel/zlabel.component.js +0 -59
  172. package/esm2015/lib/zmfb/zmfb.component.js +0 -215
  173. package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
  174. package/esm2015/lib/zmodal/zmodal.component.js +0 -130
  175. package/esm2015/lib/znumeric/znumeric.component.js +0 -114
  176. package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
  177. package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
  178. package/esm2015/lib/zreport/zreport.component.js +0 -104
  179. package/esm2015/lib/zreport/zreport.config.js +0 -115
  180. package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
  181. package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
  182. package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
  183. package/esm2015/lib/ztab/ztab.component.js +0 -180
  184. package/esm2015/lib/ztab/ztab.pipe.js +0 -22
  185. package/esm2015/lib/ztext/ztext.component.js +0 -286
  186. package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
  187. package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
  188. package/esm2015/lib/ztree/ztree.component.js +0 -374
  189. package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
  190. package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
  191. package/esm2015/lib/zudf/zudf.component.js +0 -206
  192. package/esm2015/lib/zunknown/zunknown.component.js +0 -20
  193. package/esm2015/lib/zupload/zupload.component.js +0 -358
  194. package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
  195. package/esm2015/mmhglobal-dynamicform.js +0 -7
  196. package/fesm2015/mmhglobal-dynamicform.js +0 -10729
  197. package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
  198. package/mmhglobal-dynamicform.metadata.json +0 -1
@@ -0,0 +1,490 @@
1
+ /********** Angular **********/
2
+ import { Directive, Input, Inject } from "@angular/core";
3
+ import { Subject, of } from "rxjs";
4
+ import { tap, switchMap } from "rxjs/operators";
5
+ import { DataBindingDirective, GridComponent, } from "@progress/kendo-angular-grid";
6
+ /********** Component & Service **********/
7
+ import { ZComponentHelper } from "mmhglobal-zcore";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "mmhglobal-zcore";
10
+ import * as i2 from "@angular/router";
11
+ export class ZGridBindingDirective extends DataBindingDirective {
12
+ constructor(grid, webapiService, authService, storageService, router, zGridStatePersistingService) {
13
+ super(grid);
14
+ this.webapiService = webapiService;
15
+ this.authService = authService;
16
+ this.storageService = storageService;
17
+ this.router = router;
18
+ this.zGridStatePersistingService = zGridStatePersistingService;
19
+ this.state = {
20
+ skip: 0,
21
+ take: 10,
22
+ };
23
+ this.gridColumns = [];
24
+ this.usableColumns = [];
25
+ this.resourceURL = null;
26
+ this.paginationApiPostUrl = null;
27
+ this.dataSource = null;
28
+ }
29
+ get field() {
30
+ return this.zgridbinding.data;
31
+ }
32
+ get grp() {
33
+ return this.zgridbinding.group;
34
+ }
35
+ get gridSubject() {
36
+ return this.zgridbinding.gridSubject;
37
+ }
38
+ get params() {
39
+ return this.zgridbinding.params;
40
+ }
41
+ get getData() {
42
+ return this.grid.data;
43
+ }
44
+ ngOnInit() {
45
+ if (this.field.SkipDirective) {
46
+ return;
47
+ }
48
+ super.ngOnInit();
49
+ this.grid.loading = true;
50
+ this.state.take = this.field.PageSize || 20;
51
+ this.pageSize = this.state.take;
52
+ this.dataSource = this.field.DataSource ? this.field.DataSource : null;
53
+ if (!this.dataSource) {
54
+ this.resourceURL = ZComponentHelper.getGroupValue(this.field.ResourceURL, this.grp);
55
+ // console.log("At zgrid.component (OnInit) resourceURL: ", resourceURL);
56
+ if (!this.resourceURL) {
57
+ this.grid.loading = false;
58
+ if (this.zgridbinding.data.Name !== "ActivityLogGrid") {
59
+ console.warn("No initialise for Field.ResourceURL: ", this.field.ResourceURL);
60
+ }
61
+ return;
62
+ }
63
+ const array = this.resourceURL.split("/api/");
64
+ if (!!array[1]) {
65
+ array[1] = "Page" + array[1];
66
+ this.paginationApiPostUrl = array.join("/api/");
67
+ }
68
+ else {
69
+ const arr = this.resourceURL.split("/");
70
+ arr[arr.length - 2] = "Page" + arr[arr.length - 2];
71
+ this.paginationApiPostUrl = arr.join("/");
72
+ }
73
+ this.setFilterParamsByParentRefId();
74
+ }
75
+ this.gridSubject.next(this);
76
+ this.generateGridColumns();
77
+ }
78
+ setFilterParamsByParentRefId() {
79
+ // Use field own referenceId if available
80
+ const refId = this.getFieldReferenceId() || this.grp.referenceId;
81
+ const refField = this.field.ReferenceField || this.grp.parentReferenceField;
82
+ if (refId && refField) {
83
+ const filterValue = {
84
+ key: refField,
85
+ ops: "=",
86
+ value: refId,
87
+ };
88
+ // if (this.params.filterParams.find(x => x.key === filterValue.key) === undefined) {
89
+ this.params.filterParams.push(filterValue);
90
+ // }
91
+ }
92
+ }
93
+ getFieldReferenceId() {
94
+ let fieldReferenceId = null;
95
+ if (this.field.ReferenceId) {
96
+ fieldReferenceId = ZComponentHelper.getGroupValue(this.field.ReferenceId, this.grp);
97
+ }
98
+ return fieldReferenceId;
99
+ }
100
+ ngOnDestroy() {
101
+ if (this.serviceSubscription) {
102
+ this.serviceSubscription.unsubscribe();
103
+ }
104
+ super.ngOnDestroy();
105
+ }
106
+ generateGridColumns() {
107
+ const columnFields$ = ZComponentHelper.getGroupValue(this.field.ColumnFields, this.grp);
108
+ columnFields$
109
+ .pipe(tap((data) => {
110
+ const gridSetting = this.getGridSettings();
111
+ const fieldName = this.field["FieldElementName"];
112
+ ZComponentHelper.getGridColumns(data, this.gridColumns, this.zgridbinding.group, this.authService, fieldName, gridSetting, this.usableColumns);
113
+ this.getFilterParamsColumns();
114
+ this.getFilter();
115
+ this.getFilterParams();
116
+ this.getSorting();
117
+ this.getGrantType();
118
+ this.setHiddenColumn(gridSetting);
119
+ this.params.referId = this.getFieldReferenceId() || this.grp.referenceId || null;
120
+ //}),
121
+ //switchMap(() => {
122
+ // //Get Session
123
+ // return this.getGridSessionFilter(this.grp, this);
124
+ //}),
125
+ //switchMap(() => {
126
+ // //Before get grid data
127
+ // return this.beforeGridGetData(this.grp, this);
128
+ //}),
129
+ //switchMap(() => {
130
+ // //Set grid data
131
+ // return this.setGridSessionFilter(this.grp, this);
132
+ }))
133
+ .subscribe(() => {
134
+ this.getDataBinding();
135
+ });
136
+ }
137
+ getFilterParamsColumns() {
138
+ const colFields = [];
139
+ this.gridColumns.forEach((field) => {
140
+ if (field.valueExpr) {
141
+ colFields.push(field.valueExpr + " as " + field.field);
142
+ }
143
+ else {
144
+ colFields.push(field.field);
145
+ }
146
+ });
147
+ if (colFields.length > 0) {
148
+ if (colFields.indexOf("Id") === -1) {
149
+ colFields.push("Id");
150
+ }
151
+ }
152
+ let tmpGridColumn = [];
153
+ tmpGridColumn.push(colFields.join(","));
154
+ if (this.usableColumns.length > 0) {
155
+ tmpGridColumn.push(this.usableColumns.join(","));
156
+ }
157
+ this.params.columns = tmpGridColumn.join(",");
158
+ }
159
+ getFilter() {
160
+ if (this.params.filters && this.field.Filters) {
161
+ this.params.filters = this.params.filters + " && " + this.field.Filters;
162
+ }
163
+ else if (!this.params.filters && this.field.Filters) {
164
+ this.params.filters = this.field.Filters;
165
+ }
166
+ if (this.field.Filters && this.field.Filters.indexOf("group.") !== -1) {
167
+ const filterKeyValPairs = this.field.Filters.split(" ");
168
+ const grpValues = filterKeyValPairs.filter((element) => element.trim().indexOf("group.") !== -1);
169
+ grpValues.forEach((val) => {
170
+ const actualVal = ZComponentHelper.getGroupValue(val, this.grp);
171
+ this.params.filters = this.params.filters.replace(val, actualVal);
172
+ });
173
+ }
174
+ }
175
+ getFilterParams() {
176
+ if (this.field['FilterParams']) {
177
+ if (this.field['FilterParams'].indexOf("group.") !== -1) {
178
+ this.params.filterParams = ZComponentHelper.getGroupValue(this.field['FilterParams'], this.grp);
179
+ }
180
+ else {
181
+ this.params.filterParams = this.field['FilterParams'];
182
+ }
183
+ }
184
+ }
185
+ getSorting() {
186
+ if (this.field.SortOrder) {
187
+ if (this.field.SortOrder.indexOf("group.") !== -1) {
188
+ this.params.sortOrder = ZComponentHelper.getGroupValue(this.field.SortOrder, this.grp);
189
+ }
190
+ else {
191
+ this.params.sortOrder = this.field.SortOrder;
192
+ }
193
+ }
194
+ }
195
+ getGrantType() {
196
+ if (this.field.GrantType) {
197
+ this.params.grantType = ZComponentHelper.getGroupValue(this.field.GrantType.toString(), this.grp);
198
+ }
199
+ }
200
+ setHiddenColumn(gridSetting) {
201
+ if (this.gridColumns && gridSetting) {
202
+ // filter out hidden == false array.
203
+ const gridSettingHiddenCol = gridSetting.filter(function (item) {
204
+ return item['hidden'] == true;
205
+ });
206
+ // find and set the hidden to current column setting.
207
+ Object.values(gridSettingHiddenCol).forEach(value => {
208
+ if (this.gridColumns.find((c) => c.field === value.field)) {
209
+ this.gridColumns.find((c) => c.field === value.field)['hidden'] = value['hidden'];
210
+ }
211
+ });
212
+ }
213
+ }
214
+ getDataBinding() {
215
+ this.grid.loading = true;
216
+ if (!this.dataSource) {
217
+ this.params.pageSize = this.state.take;
218
+ if (this.field.ExternalPagination) {
219
+ // For POST method Page WebAPI
220
+ this.webapiService
221
+ .postApi(this.paginationApiPostUrl, this.params, null, null, null, null, true)
222
+ .subscribe((data) => {
223
+ this.aggregateHandling(data.dataSet);
224
+ this.grid.data = { data: data.dataSet, total: data.totalCount };
225
+ this.grid.loading = false;
226
+ this.gridSubject.next(this);
227
+ this.notifyDataChange();
228
+ });
229
+ }
230
+ else {
231
+ // For GET method
232
+ this.webapiService
233
+ .getApi(this.resourceURL, null, null, null, null, null, true)
234
+ .subscribe((data) => {
235
+ let _data = null;
236
+ let _totalCount = 0;
237
+ if (data.dataSet) {
238
+ _data = data.dataSet;
239
+ _totalCount = data.totalCount;
240
+ }
241
+ else {
242
+ _data = data;
243
+ _totalCount = data.length;
244
+ }
245
+ this.aggregateHandling(_data);
246
+ this.grid.data = { data: _data, total: _totalCount };
247
+ this.grid.pageSize = _totalCount;
248
+ this.grid.loading = false;
249
+ this.gridSubject.next(this);
250
+ this.notifyDataChange();
251
+ });
252
+ }
253
+ }
254
+ else {
255
+ const ds = ZComponentHelper.getGroupValue(this.field.DataSource, this.grp);
256
+ if (ds) {
257
+ this.grid.data = {
258
+ data: ds,
259
+ total: ds.length,
260
+ };
261
+ this.grid.pageSize = ds.length;
262
+ }
263
+ this.gridSubject.next(this);
264
+ this.grid.loading = false;
265
+ }
266
+ }
267
+ clearData() {
268
+ this.grid.data = { data: [], total: 0 };
269
+ }
270
+ aggregateHandling(data) {
271
+ const aggregateColumns = this.gridColumns.filter(x => x.aggregateType);
272
+ aggregateColumns.forEach(col => {
273
+ const field = col.field;
274
+ let _aggregateValue = null;
275
+ switch (col.aggregateType.slice(0, -1).toLowerCase()) {
276
+ case "total": {
277
+ _aggregateValue = data.reduce((total, next) => total + next[field], 0);
278
+ break;
279
+ }
280
+ case "sum": {
281
+ _aggregateValue = data.reduce((total, next) => total + next[field], 0);
282
+ break;
283
+ }
284
+ case "average": {
285
+ _aggregateValue = data.reduce((total, next) => total + next[field], 0) / data.length;
286
+ break;
287
+ }
288
+ case "count": {
289
+ _aggregateValue = data.length;
290
+ break;
291
+ }
292
+ case "max": {
293
+ _aggregateValue = data.reduce((p, c) => p[field] > c[field] ? p : c)[field];
294
+ break;
295
+ }
296
+ case "min": {
297
+ _aggregateValue = data.reduce((p, c) => p[field] < c[field] ? p : c)[field];
298
+ break;
299
+ }
300
+ }
301
+ col.aggregateValue = _aggregateValue;
302
+ });
303
+ }
304
+ aggregateResetValue() {
305
+ const aggregateColumns = this.gridColumns.filter(x => x.aggregateType);
306
+ aggregateColumns.forEach(col => {
307
+ col.aggregateValue = 0;
308
+ });
309
+ }
310
+ pageChange(event) {
311
+ this.params.pageNo = event.skip / this.params.pageSize;
312
+ this.state.skip = event.skip;
313
+ this.getDataBinding();
314
+ }
315
+ sortChange(sort) {
316
+ this.sort = sort;
317
+ this.params.sortColumnNames = [];
318
+ this.params.sortOrders = [];
319
+ sort.forEach((f) => {
320
+ if (f.dir) {
321
+ this.params.sortOrders.push(f.dir);
322
+ const field = this.gridColumns.find((c) => c.field === f.field);
323
+ if (field.valueExpr !== undefined) {
324
+ this.params.sortColumnNames.push(field.valueExpr);
325
+ }
326
+ else {
327
+ this.params.sortColumnNames.push(f.field);
328
+ }
329
+ }
330
+ });
331
+ this.getDataBinding();
332
+ }
333
+ filterChange(event) {
334
+ this.params.pageNo = 0;
335
+ this.params.filterParams = [];
336
+ this.setFilterParamsByParentRefId();
337
+ console.log(event);
338
+ if (event) {
339
+ if (event.filters.length > 0) {
340
+ event.filters.forEach((item) => {
341
+ const field = this.gridColumns.find((c) => c.field === item.field);
342
+ if (item.filters) {
343
+ item.filters.forEach((f) => {
344
+ if (f.value === null) {
345
+ f.value = ""; // convert null to ""
346
+ }
347
+ this.params.filterParams.push({
348
+ key: f.field,
349
+ ops: this.mapFilterOperator(f.operator),
350
+ value: f.value,
351
+ });
352
+ });
353
+ }
354
+ else {
355
+ if (item.value === null) {
356
+ item.value = ""; // convert null to ""
357
+ }
358
+ this.params.filterParams.push({
359
+ key: field.valueExpr !== undefined
360
+ ? `(${field.valueExpr})`
361
+ : item.field,
362
+ ops: this.mapFilterOperator(item.operator),
363
+ value: item.value,
364
+ });
365
+ }
366
+ });
367
+ }
368
+ }
369
+ this.setGridSessionFilter(this.grp, this);
370
+ this.getDataBinding();
371
+ }
372
+ dataStateChange(state) {
373
+ // this.state = state;
374
+ this.skip = state.skip;
375
+ this.pageSize = state.take;
376
+ this.state.skip = state.skip;
377
+ this.state.take = state.take;
378
+ this.grid.loading = true;
379
+ this.aggregateResetValue();
380
+ }
381
+ mapFilterOperator(operator) {
382
+ switch (operator) {
383
+ case "eq":
384
+ return "eq";
385
+ case "neq":
386
+ return "neq";
387
+ case "lt":
388
+ return "lt";
389
+ case "lte":
390
+ return "lte";
391
+ case "gt":
392
+ return "gt";
393
+ case "gte":
394
+ return "gte";
395
+ case "startswith":
396
+ return "startswith";
397
+ case "endswith":
398
+ return "endswith";
399
+ case "isnull":
400
+ return "isnull";
401
+ case "isnotnull":
402
+ return "isnotnull";
403
+ case "contains": {
404
+ if (!this.field['FilterContainsUsingEqual']) {
405
+ return "contains";
406
+ }
407
+ }
408
+ default:
409
+ return "==";
410
+ // eq, neq, isnull, isnotnull, endswith, startswith
411
+ }
412
+ }
413
+ getGridSettings() {
414
+ const _storageKey = 'ionic-field::' + this.authService.e1Token.userName + '::' + this.field.Name + '::' + this.router.url;
415
+ // Find any setting from localstorage..
416
+ let _arrGridCaching = this.zGridStatePersistingService.get(_storageKey);
417
+ if (_arrGridCaching) {
418
+ const _gridCaching = JSON.parse(_arrGridCaching['Value']);
419
+ if (_gridCaching) {
420
+ return _gridCaching.gridSettings.columnsConfig.sort((a, b) => a.orderIndex - b.orderIndex);
421
+ }
422
+ }
423
+ }
424
+ beforeGridGetData(group, me) {
425
+ console.warn("beforeDataBinding triggered");
426
+ if (!group.beforeGridGetData) {
427
+ console.warn("group.beforeDataBinding is undefined");
428
+ return of(true);
429
+ }
430
+ return group.beforeGridGetData(group, me);
431
+ }
432
+ getGridSessionFilter(group, me) {
433
+ if (!group["GridStorageKey"]) {
434
+ return of([]);
435
+ }
436
+ const StorageKey = group["GridStorageKey"];
437
+ if (this.storageService) {
438
+ const subject = new Subject();
439
+ of(true)
440
+ .pipe(switchMap(() => {
441
+ return this.storageService.get(StorageKey);
442
+ }), tap(data => {
443
+ if (!data || !data.value || data.value === "null") {
444
+ subject.next();
445
+ }
446
+ else {
447
+ const result = JSON.parse(data.value);
448
+ this.state.filter = JSON.parse(result["StateFilter"]);
449
+ this.params.filterParams = JSON.parse(result["FilterParams"]);
450
+ this.state.filter.filters.forEach((d) => {
451
+ if (d.field.includes('UTC')) {
452
+ d.value = new Date(d.value);
453
+ }
454
+ });
455
+ subject.next();
456
+ }
457
+ })).subscribe();
458
+ return subject.asObservable();
459
+ }
460
+ else {
461
+ return of([]);
462
+ }
463
+ }
464
+ setGridSessionFilter(group, me) {
465
+ if (!group["GridStorageKey"]) {
466
+ return null;
467
+ }
468
+ const StorageKey = group["GridStorageKey"];
469
+ if (me.state.filter && this.storageService && this.field['SaveFilter']) {
470
+ //list of data for StateFilter and FilterParams
471
+ const lstGridFilter = { "StateFilter": JSON.stringify(me.state.filter), "FilterParams": JSON.stringify(me.params.filterParams) };
472
+ //create session storage
473
+ this.storageService.set(StorageKey, JSON.stringify(lstGridFilter));
474
+ }
475
+ }
476
+ }
477
+ ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.AuthService }, { token: i1.StorageSessionService }, { token: i2.Router }, { token: i1.ZGridStatePersistingService }], target: i0.ɵɵFactoryTarget.Directive });
478
+ ZGridBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.4", type: ZGridBindingDirective, selector: "[zgridbinding]", inputs: { zgridbinding: "zgridbinding" }, usesInheritance: true, ngImport: i0 });
479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZGridBindingDirective, decorators: [{
480
+ type: Directive,
481
+ args: [{
482
+ selector: "[zgridbinding]",
483
+ }]
484
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
485
+ type: Inject,
486
+ args: [GridComponent]
487
+ }] }, { type: i1.WebApiService }, { type: i1.AuthService }, { type: i1.StorageSessionService }, { type: i2.Router }, { type: i1.ZGridStatePersistingService }]; }, propDecorators: { zgridbinding: [{
488
+ type: Input
489
+ }] } });
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU01RSxPQUFPLEVBQTRCLE9BQU8sRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQVMsU0FBUyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixhQUFhLEdBR2QsTUFBTSw4QkFBOEIsQ0FBQztBQU90QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUVqQixNQUFNLGlCQUFpQixDQUFDOzs7O0FBTXpCLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxvQkFBb0I7SUE0QzdELFlBQ3lCLElBQUksRUFDbkIsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsTUFBYyxFQUNkLDJCQUF3RDtRQUVoRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFOSixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUF6Q2xFLFVBQUssR0FBVTtZQUNiLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFDO1FBRUYsZ0JBQVcsR0FBVSxFQUFFLENBQUM7UUFFeEIsa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFFMUIsZ0JBQVcs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bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YsIEFzeW5jU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHRhcCwgZGVsYXksIHN3aXRjaE1hcCwgY29uY2F0TWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7XHJcbiAgRGF0YUJpbmRpbmdEaXJlY3RpdmUsXHJcbiAgR3JpZENvbXBvbmVudCxcclxuICBEYXRhU3RhdGVDaGFuZ2VFdmVudCxcclxuICBQYWdlQ2hhbmdlRXZlbnQsXHJcbn0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuaW1wb3J0IHtcclxuICBTb3J0RGVzY3JpcHRvcixcclxuICBTdGF0ZSxcclxuICBGaWx0ZXJEZXNjcmlwdG9yLFxyXG59IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQge1xyXG4gIEF1dGhTZXJ2aWNlLCBHcmlkQ2FjaGluZywgV2ViQXBpU2VydmljZSxcclxuICBaQ29tcG9uZW50SGVscGVyLCBaRmllbGQsIFpHcmlkUG9zdEFwaVBhcmFtcywgWkdyaWRDb2x1bW5TZXR0aW5ncyxcclxuICBaR3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UsIFpHcm91cCwgU3RvcmFnZVNlc3Npb25TZXJ2aWNlXHJcbn0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt6Z3JpZGJpbmRpbmddXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgZXh0ZW5kcyBEYXRhQmluZGluZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHNlcnZpY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBASW5wdXQoKSB6Z3JpZGJpbmRpbmc6IHtcclxuICAgIGRhdGE6IFpGaWVsZDtcclxuICAgIGdyb3VwOiBaR3JvdXA7XHJcbiAgICBwYXJhbXM6IFpHcmlkUG9zdEFwaVBhcmFtcztcclxuICAgIGdyaWRTdWJqZWN0OiBTdWJqZWN0PGFueT47XHJcbiAgfTtcclxuXHJcbiAgc3RhdGU6IFN0YXRlID0ge1xyXG4gICAgc2tpcDogMCxcclxuICAgIHRha2U6IDEwLFxyXG4gIH07XHJcblxyXG4gIGdyaWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICB1c2FibGVDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICByZXNvdXJjZVVSTCA9IG51bGw7XHJcblxyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsID0gbnVsbDtcclxuXHJcbiAgZGF0YVNvdXJjZSA9IG51bGw7XHJcblxyXG4gIGdldCBmaWVsZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdycCgpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncm91cDtcclxuICB9XHJcblxyXG4gIGdldCBncmlkU3ViamVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncmlkU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldCBwYXJhbXMoKTogWkdyaWRQb3N0QXBpUGFyYW1zIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5wYXJhbXM7XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0RGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmdyaWQuZGF0YTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChHcmlkQ29tcG9uZW50KSBncmlkLFxyXG4gICAgcHJpdmF0ZSB3ZWJhcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSB6R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2U6IFpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoZ3JpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5Ta2lwRGlyZWN0aXZlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0ZS50YWtlID0gdGhpcy5maWVsZC5QYWdlU2l6ZSB8fCAyMDtcclxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnN0YXRlLnRha2U7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmZpZWxkLkRhdGFTb3VyY2UgPyB0aGlzLmZpZWxkLkRhdGFTb3VyY2UgOiBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VVUkwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkF0IHpncmlkLmNvbXBvbmVudCAoT25Jbml0KSByZXNvdXJjZVVSTDogXCIsIHJlc291cmNlVVJMKTtcclxuICAgICAgaWYgKCF0aGlzLnJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5OYW1lICE9PSBcIkFjdGl2aXR5TG9nR3JpZFwiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiTm8gaW5pdGlhbGlzZSBmb3IgRmllbGQuUmVzb3VyY2VVUkw6IFwiLFxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGFycmF5ID0gdGhpcy5yZXNvdXJjZVVSTC5zcGxpdChcIi9hcGkvXCIpO1xyXG4gICAgICBpZiAoISFhcnJheVsxXSkge1xyXG4gICAgICAgIGFycmF5WzFdID0gXCJQYWdlXCIgKyBhcnJheVsxXTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyYXkuam9pbihcIi9hcGkvXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGFyciA9IHRoaXMucmVzb3VyY2VVUkwuc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgIGFyclthcnIubGVuZ3RoIC0gMl0gPSBcIlBhZ2VcIiArIGFyclthcnIubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCA9IGFyci5qb2luKFwiL1wiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKSB7XHJcbiAgICAvLyBVc2UgZmllbGQgb3duIHJlZmVyZW5jZUlkIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZDtcclxuICAgIGNvbnN0IHJlZkZpZWxkID0gdGhpcy5maWVsZC5SZWZlcmVuY2VGaWVsZCB8fCB0aGlzLmdycC5wYXJlbnRSZWZlcmVuY2VGaWVsZDtcclxuICAgIGlmIChyZWZJZCAmJiByZWZGaWVsZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHtcclxuICAgICAgICBrZXk6IHJlZkZpZWxkLFxyXG4gICAgICAgIG9wczogXCI9XCIsXHJcbiAgICAgICAgdmFsdWU6IHJlZklkLFxyXG4gICAgICB9O1xyXG4gICAgICAvLyBpZiAodGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLmZpbmQoeCA9PiB4LmtleSA9PT0gZmlsdGVyVmFsdWUua2V5KSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclZhbHVlKTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZFJlZmVyZW5jZUlkKCkge1xyXG4gICAgbGV0IGZpZWxkUmVmZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuUmVmZXJlbmNlSWQpIHtcclxuICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlZmVyZW5jZUlkLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRSZWZlcmVuY2VJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zZXJ2aWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlR3JpZENvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBjb2x1bW5GaWVsZHMkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLFxyXG4gICAgICB0aGlzLmdycFxyXG4gICAgKTtcclxuICAgIGNvbHVtbkZpZWxkcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBncmlkU2V0dGluZyA9IHRoaXMuZ2V0R3JpZFNldHRpbmdzKCk7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmZpZWxkW1wiRmllbGRFbGVtZW50TmFtZVwiXTtcclxuXHJcbiAgICAgICAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRDb2x1bW5zLFxyXG4gICAgICAgICAgICB0aGlzLnpncmlkYmluZGluZy5ncm91cCxcclxuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZSxcclxuICAgICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgICBncmlkU2V0dGluZyxcclxuICAgICAgICAgICAgdGhpcy51c2FibGVDb2x1bW5zXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U29ydGluZygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHcmFudFR5cGUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0SGlkZGVuQ29sdW1uKGdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5yZWZlcklkID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZUlkKCkgfHwgdGhpcy5ncnAucmVmZXJlbmNlSWQgfHwgbnVsbDtcclxuICAgICAgICAvL30pLFxyXG4gICAgICAgIC8vc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAvLyAgLy9HZXQgU2Vzc2lvblxyXG4gICAgICAgIC8vICByZXR1cm4gdGhpcy5nZXRHcmlkU2Vzc2lvbkZpbHRlcih0aGlzLmdycCwgdGhpcyk7XHJcbiAgICAgICAgLy99KSxcclxuICAgICAgICAvL3N3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAvL0JlZm9yZSBnZXQgZ3JpZCBkYXRhXHJcbiAgICAgICAgLy8gIHJldHVybiB0aGlzLmJlZm9yZUdyaWRHZXREYXRhKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgICAvL30pLFxyXG4gICAgICAgIC8vc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAvLyAgLy9TZXQgZ3JpZCBkYXRhXHJcbiAgICAgICAgLy8gIHJldHVybiB0aGlzLnNldEdyaWRTZXNzaW9uRmlsdGVyKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbHRlclBhcmFtc0NvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBjb2xGaWVsZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgIHRoaXMuZ3JpZENvbHVtbnMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKGZpZWxkLnZhbHVlRXhwcikge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGZpZWxkLnZhbHVlRXhwciArIFwiIGFzIFwiICsgZmllbGQuZmllbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGZpZWxkLmZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGNvbEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChjb2xGaWVsZHMuaW5kZXhPZihcIklkXCIpID09PSAtMSkge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKFwiSWRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG1wR3JpZENvbHVtbjogYW55W10gPSBbXTtcclxuICAgIHRtcEdyaWRDb2x1bW4ucHVzaChjb2xGaWVsZHMuam9pbihcIixcIikpO1xyXG4gICAgaWYgKHRoaXMudXNhYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRtcEdyaWRDb2x1bW4ucHVzaCh0aGlzLnVzYWJsZUNvbHVtbnMuam9pbihcIixcIikpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXJhbXMuY29sdW1ucyA9IHRtcEdyaWRDb2x1bW4uam9pbihcIixcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbHRlcigpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gdGhpcy5wYXJhbXMuZmlsdGVycyArIFwiICYmIFwiICsgdGhpcy5maWVsZC5GaWx0ZXJzO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMuZmllbGQuRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5GaWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycy5pbmRleE9mKFwiZ3JvdXAuXCIpICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJLZXlWYWxQYWlycyA9IHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIik7XHJcbiAgICAgIGNvbnN0IGdycFZhbHVlcyA9IGZpbHRlcktleVZhbFBhaXJzLmZpbHRlcihcclxuICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuaW5kZXhPZihcImdyb3VwLlwiKSAhPT0gLTFcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGdycFZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxWYWwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodmFsLCB0aGlzLmdycCk7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMucGFyYW1zLmZpbHRlcnMucmVwbGFjZSh2YWwsIGFjdHVhbFZhbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXMoKSB7XHJcbiAgICBpZiAodGhpcy5maWVsZFsnRmlsdGVyUGFyYW1zJ10pIHtcclxuICAgICAgaWYgKHRoaXMuZmllbGRbJ0ZpbHRlclBhcmFtcyddLmluZGV4T2YoXCJncm91cC5cIikgIT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGRbJ0ZpbHRlclBhcmFtcyddLCB0aGlzLmdycCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gdGhpcy5maWVsZFsnRmlsdGVyUGFyYW1zJ107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U29ydGluZygpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLlNvcnRPcmRlcikge1xyXG4gICAgICBpZiAodGhpcy5maWVsZC5Tb3J0T3JkZXIuaW5kZXhPZihcImdyb3VwLlwiKSAhPT0gLTEpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5maWVsZC5Tb3J0T3JkZXIsIHRoaXMuZ3JwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSB0aGlzLmZpZWxkLlNvcnRPcmRlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRHcmFudFR5cGUoKSB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5HcmFudFR5cGUpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZ3JhbnRUeXBlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGQuR3JhbnRUeXBlLnRvU3RyaW5nKCksIHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SGlkZGVuQ29sdW1uKGdyaWRTZXR0aW5nOiBaR3JpZENvbHVtblNldHRpbmdzW10pIHtcclxuICAgIGlmICh0aGlzLmdyaWRDb2x1bW5zICYmIGdyaWRTZXR0aW5nKSB7XHJcbiAgICAgIC8vIGZpbHRlciBvdXQgaGlkZGVuID09IGZhbHNlIGFycmF5LlxyXG4gICAgICBjb25zdCBncmlkU2V0dGluZ0hpZGRlbkNvbCA9IGdyaWRTZXR0aW5nLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtWydoaWRkZW4nXSA9PSB0cnVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGZpbmQgYW5kIHNldCB0aGUgaGlkZGVuIHRvIGN1cnJlbnQgY29sdW1uIHNldHRpbmcuXHJcbiAgICAgIE9iamVjdC52YWx1ZXMoZ3JpZFNldHRpbmdIaWRkZW5Db2wpLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRDb2x1bW5zLmZpbmQoKGMpID0+IGMuZmllbGQgPT09IHZhbHVlLmZpZWxkKSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkQ29sdW1ucy5maW5kKChjKSA9PiBjLmZpZWxkID09PSB2YWx1ZS5maWVsZClbJ2hpZGRlbiddID0gdmFsdWVbJ2hpZGRlbiddO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGdldERhdGFCaW5kaW5nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VTaXplID0gdGhpcy5zdGF0ZS50YWtlO1xyXG4gICAgICBpZiAodGhpcy5maWVsZC5FeHRlcm5hbFBhZ2luYXRpb24pIHtcclxuICAgICAgICAvLyBGb3IgUE9TVCBtZXRob2QgUGFnZSBXZWJBUElcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5wb3N0QXBpKFxyXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcyxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGEuZGF0YVNldCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBkYXRhLmRhdGFTZXQsIHRvdGFsOiBkYXRhLnRvdGFsQ291bnQgfTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeURhdGFDaGFuZ2UoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEZvciBHRVQgbWV0aG9kXHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QXBpKHRoaXMucmVzb3VyY2VVUkwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBfZGF0YSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBfdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YS5kYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgX2RhdGEgPSBkYXRhLmRhdGFTZXQ7XHJcbiAgICAgICAgICAgICAgX3RvdGFsQ291bnQgPSBkYXRhLnRvdGFsQ291bnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICAgIF90b3RhbENvdW50ID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWdncmVnYXRlSGFuZGxpbmcoX2RhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQuZGF0YSA9IHsgZGF0YTogX2RhdGEsIHRvdGFsOiBfdG90YWxDb3VudCB9O1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQucGFnZVNpemUgPSBfdG90YWxDb3VudDtcclxuICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeURhdGFDaGFuZ2UoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLkRhdGFTb3VyY2UsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChkcykge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5kYXRhID0ge1xyXG4gICAgICAgICAgZGF0YTogZHMsXHJcbiAgICAgICAgICB0b3RhbDogZHMubGVuZ3RoLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5ncmlkLnBhZ2VTaXplID0gZHMubGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckRhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQuZGF0YSA9IHsgZGF0YTogW10sIHRvdGFsOiAwIH07XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVIYW5kbGluZyhkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRDb2x1bW5zLmZpbHRlcih4ID0+IHguYWdncmVnYXRlVHlwZSk7XHJcblxyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gY29sLmZpZWxkO1xyXG5cclxuICAgICAgbGV0IF9hZ2dyZWdhdGVWYWx1ZSA9IG51bGw7XHJcbiAgICAgIHN3aXRjaCAoY29sLmFnZ3JlZ2F0ZVR5cGUuc2xpY2UoMCwgLTEpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICBjYXNlIFwidG90YWxcIjoge1xyXG4gICAgICAgICAgX2FnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwic3VtXCI6IHtcclxuICAgICAgICAgIF9hZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcImF2ZXJhZ2VcIjoge1xyXG4gICAgICAgICAgX2FnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKSAvIGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJjb3VudFwiOiB7XHJcbiAgICAgICAgICBfYWdncmVnYXRlVmFsdWUgPSBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwibWF4XCI6IHtcclxuICAgICAgICAgIF9hZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA+IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwibWluXCI6IHtcclxuICAgICAgICAgIF9hZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA8IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gX2FnZ3JlZ2F0ZVZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZVJlc2V0VmFsdWUoKSB7XHJcbiAgICBjb25zdCBhZ2dyZWdhdGVDb2x1bW5zID0gdGhpcy5ncmlkQ29sdW1ucy5maWx0ZXIoeCA9PiB4LmFnZ3JlZ2F0ZVR5cGUpO1xyXG4gICAgYWdncmVnYXRlQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgcGFnZUNoYW5nZShldmVudDogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSBldmVudC5za2lwIC8gdGhpcy5wYXJhbXMucGFnZVNpemU7XHJcbiAgICB0aGlzLnN0YXRlLnNraXAgPSBldmVudC5za2lwO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gc29ydDtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG5cclxuICAgIHNvcnQuZm9yRWFjaCgoZikgPT4ge1xyXG4gICAgICBpZiAoZi5kaXIpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZi5kaXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZENvbHVtbnMuZmluZCgoYykgPT4gYy5maWVsZCA9PT0gZi5maWVsZCk7XHJcbiAgICAgICAgaWYgKGZpZWxkLnZhbHVlRXhwciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChmaWVsZC52YWx1ZUV4cHIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChmLmZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSAwO1xyXG4gICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW107XHJcbiAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgaWYgKGV2ZW50LmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGV2ZW50LmZpbHRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRDb2x1bW5zLmZpbmQoKGMpID0+IGMuZmllbGQgPT09IGl0ZW0uZmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChpdGVtLmZpbHRlcnMpIHtcclxuICAgICAgICAgICAgaXRlbS5maWx0ZXJzLmZvckVhY2goKGY6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoZi52YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZi52YWx1ZSA9IFwiXCI7IC8vIGNvbnZlcnQgbnVsbCB0byBcIlwiXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGtleTogZi5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZi5vcGVyYXRvciksXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZi52YWx1ZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBcIlwiOyAvLyBjb252ZXJ0IG51bGwgdG8gXCJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKHtcclxuICAgICAgICAgICAgICBrZXk6XHJcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICA/IGAoJHtmaWVsZC52YWx1ZUV4cHJ9KWBcclxuICAgICAgICAgICAgICAgICAgOiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihpdGVtLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEdyaWRTZXNzaW9uRmlsdGVyKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuc3RhdGUgPSBzdGF0ZTtcclxuICAgIHRoaXMuc2tpcCA9IHN0YXRlLnNraXA7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gc3RhdGUudGFrZTtcclxuICAgIHRoaXMuc3RhdGUuc2tpcCA9IHN0YXRlLnNraXA7XHJcbiAgICB0aGlzLnN0YXRlLnRha2UgPSBzdGF0ZS50YWtlO1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVSZXNldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlck9wZXJhdG9yKG9wZXJhdG9yOiBhbnkpIHtcclxuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuICAgICAgY2FzZSBcImVxXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiZXFcIjtcclxuICAgICAgY2FzZSBcIm5lcVwiOlxyXG4gICAgICAgIHJldHVybiBcIm5lcVwiO1xyXG4gICAgICBjYXNlIFwibHRcIjpcclxuICAgICAgICByZXR1cm4gXCJsdFwiO1xyXG4gICAgICBjYXNlIFwibHRlXCI6XHJcbiAgICAgICAgcmV0dXJuIFwibHRlXCI7XHJcbiAgICAgIGNhc2UgXCJndFwiOlxyXG4gICAgICAgIHJldHVybiBcImd0XCI7XHJcbiAgICAgIGNhc2UgXCJndGVcIjpcclxuICAgICAgICByZXR1cm4gXCJndGVcIjtcclxuICAgICAgY2FzZSBcInN0YXJ0c3dpdGhcIjpcclxuICAgICAgICByZXR1cm4gXCJzdGFydHN3aXRoXCI7XHJcbiAgICAgIGNhc2UgXCJlbmRzd2l0aFwiOlxyXG4gICAgICAgIHJldHVybiBcImVuZHN3aXRoXCI7XHJcbiAgICAgIGNhc2UgXCJpc251bGxcIjpcclxuICAgICAgICByZXR1cm4gXCJpc251bGxcIjtcclxuICAgICAgY2FzZSBcImlzbm90bnVsbFwiOlxyXG4gICAgICAgIHJldHVybiBcImlzbm90bnVsbFwiO1xyXG4gICAgICBjYXNlIFwiY29udGFpbnNcIjoge1xyXG4gICAgICAgIGlmICghdGhpcy5maWVsZFsnRmlsdGVyQ29udGFpbnNVc2luZ0VxdWFsJ10pIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbnRhaW5zXCI7XHJcbiAgICAgICAgfSBcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIj09XCI7XHJcbiAgICAgIC8vIGVxLCBuZXEsIGlzbnVsbCwgaXNub3RudWxsLCBlbmRzd2l0aCwgc3RhcnRzd2l0aFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRHcmlkU2V0dGluZ3MoKTogWkdyaWRDb2x1bW5TZXR0aW5nc1tdIHtcclxuICAgIGNvbnN0IF9zdG9yYWdlS2V5ID0gJ2lvbmljLWZpZWxkOjonICsgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLnVzZXJOYW1lICsgJzo6JyArIHRoaXMuZmllbGQuTmFtZSArICc6OicgKyB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgLy8gRmluZCBhbnkgc2V0dGluZyBmcm9tIGxvY2Fsc3RvcmFnZS4uXHJcbiAgICBsZXQgX2FyckdyaWRDYWNoaW5nOiBHcmlkQ2FjaGluZ1tdID0gdGhpcy56R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UuZ2V0KF9zdG9yYWdlS2V5KTtcclxuICAgIGlmIChfYXJyR3JpZENhY2hpbmcpIHtcclxuICAgICAgY29uc3QgX2dyaWRDYWNoaW5nOiBHcmlkQ2FjaGluZyA9IEpTT04ucGFyc2UoX2FyckdyaWRDYWNoaW5nWydWYWx1ZSddKTtcclxuICAgICAgaWYgKF9ncmlkQ2FjaGluZykge1xyXG4gICAgICAgIHJldHVybiBfZ3JpZENhY2hpbmcuZ3JpZFNldHRpbmdzLmNvbHVtbnNDb25maWcuc29ydCgoYSwgYikgPT4gYS5vcmRlckluZGV4IC0gYi5vcmRlckluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJlZm9yZUdyaWRHZXREYXRhKGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGNvbnNvbGUud2FybihcImJlZm9yZURhdGFCaW5kaW5nIHRyaWdnZXJlZFwiKTtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlR3JpZEdldERhdGEpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlRGF0YUJpbmRpbmcgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlR3JpZEdldERhdGEoZ3JvdXAsIG1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JpZFNlc3Npb25GaWx0ZXIoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdKSB7XHJcbiAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgU3RvcmFnZUtleSA9IGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl07XHJcblxyXG4gICAgaWYgKHRoaXMuc3RvcmFnZVNlcnZpY2UpIHtcclxuICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgICBvZih0cnVlKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFN0b3JhZ2VLZXkpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS52YWx1ZSB8fCBkYXRhLnZhbHVlID09PSBcIm51bGxcIikge1xyXG4gICAgICAgICAgICAgIHN1YmplY3QubmV4dCgpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGRhdGEudmFsdWUpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUuZmlsdGVyID0gSlNPTi5wYXJzZShyZXN1bHRbXCJTdGF0ZUZpbHRlclwiXSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gSlNPTi5wYXJzZShyZXN1bHRbXCJGaWx0ZXJQYXJhbXNcIl0pO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZpbHRlci5maWx0ZXJzLmZvckVhY2goKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGQuZmllbGQuaW5jbHVkZXMoJ1VUQycpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGQudmFsdWUgPSBuZXcgRGF0ZShkLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgc3ViamVjdC5uZXh0KCk7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRHcmlkU2Vzc2lvbkZpbHRlcihncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgU3RvcmFnZUtleSA9IGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl07IFxyXG5cclxuICAgIGlmIChtZS5zdGF0ZS5maWx0ZXIgJiYgdGhpcy5zdG9yYWdlU2VydmljZSAmJiB0aGlzLmZpZWxkWydTYXZlRmlsdGVyJ10pIHtcclxuICAgICAgLy9saXN0IG9mIGRhdGEgZm9yIFN0YXRlRmlsdGVyIGFuZCBGaWx0ZXJQYXJhbXNcclxuICAgICAgY29uc3QgbHN0R3JpZEZpbHRlciA9IHsgXCJTdGF0ZUZpbHRlclwiOiBKU09OLnN0cmluZ2lmeShtZS5zdGF0ZS5maWx0ZXIpLCBcIkZpbHRlclBhcmFtc1wiOiBKU09OLnN0cmluZ2lmeShtZS5wYXJhbXMuZmlsdGVyUGFyYW1zKSB9XHJcbiAgICAgIC8vY3JlYXRlIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShsc3RHcmlkRmlsdGVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=