@firestitch/list 15.0.0 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/app/components/body/body.component.d.ts +1 -1
  2. package/app/components/body/row/actions/actions.component.d.ts +1 -1
  3. package/app/components/body/row/cell/cell.component.d.ts +1 -1
  4. package/app/components/body/row/inline-action/inline-action.component.d.ts +1 -1
  5. package/app/components/body/row/menu-action/menu-action.component.d.ts +1 -1
  6. package/app/components/body/row/row.component.d.ts +1 -1
  7. package/app/components/footer/footer-row/footer-row.component.d.ts +1 -7
  8. package/app/components/footer/footer.component.d.ts +1 -1
  9. package/app/components/head/head.component.d.ts +1 -1
  10. package/app/components/list/list.component.d.ts +1 -1
  11. package/app/components/loader/loader.component.d.ts +1 -1
  12. package/app/components/pagination/pagination.component.d.ts +1 -1
  13. package/app/components/status/status.component.d.ts +1 -1
  14. package/app/directives/cell/cell.directive.d.ts +1 -1
  15. package/app/directives/column/column.directive.d.ts +1 -1
  16. package/app/directives/content-init/content-init.directive.d.ts +1 -1
  17. package/app/directives/draggable-list/draggable-list.directive.d.ts +1 -1
  18. package/app/directives/draggable-row/draggable-row.directive.d.ts +1 -1
  19. package/app/directives/footer/footer.directive.d.ts +1 -1
  20. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +1 -1
  21. package/app/directives/header/header.directive.d.ts +1 -1
  22. package/app/models/column.model.d.ts +1 -1
  23. package/esm2022/app/classes/actions-controller.mjs +57 -0
  24. package/esm2022/app/classes/columns-controller.mjs +211 -0
  25. package/esm2022/app/classes/data-controller.mjs +348 -0
  26. package/esm2022/app/classes/external-params-controller.mjs +153 -0
  27. package/esm2022/app/classes/list-controller.mjs +712 -0
  28. package/esm2022/app/classes/pagination-controller.mjs +491 -0
  29. package/esm2022/app/classes/persistance-controller.mjs +19 -0
  30. package/esm2022/app/classes/reorder-controller.mjs +191 -0
  31. package/esm2022/app/classes/selection-controller.mjs +473 -0
  32. package/esm2022/app/classes/sorting-controller.mjs +207 -0
  33. package/esm2022/app/components/body/body.component.mjs +73 -0
  34. package/esm2022/app/components/body/row/actions/actions.component.mjs +102 -0
  35. package/esm2022/app/components/body/row/cell/cell.component.mjs +109 -0
  36. package/esm2022/app/components/body/row/inline-action/inline-action.component.mjs +32 -0
  37. package/esm2022/app/components/body/row/menu-action/menu-action.component.mjs +51 -0
  38. package/esm2022/app/components/body/row/row.component.mjs +341 -0
  39. package/esm2022/app/components/customize-cols/customize-cols.component.mjs +70 -0
  40. package/{esm2020 → esm2022}/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +4 -4
  41. package/esm2022/app/components/footer/footer-row/footer-row.component.mjs +17 -0
  42. package/esm2022/app/components/footer/footer.component.mjs +35 -0
  43. package/esm2022/app/components/head/head-cell/head-cell.component.mjs +32 -0
  44. package/esm2022/app/components/head/head.component.mjs +113 -0
  45. package/esm2022/app/components/list/list.component.mjs +406 -0
  46. package/esm2022/app/components/loader/loader.component.mjs +40 -0
  47. package/esm2022/app/components/manage-saved-filters/manage-saved-filters.component.mjs +78 -0
  48. package/esm2022/app/components/pagination/pagination.component.mjs +40 -0
  49. package/esm2022/app/components/saved-filters/saved-filters.component.mjs +32 -0
  50. package/esm2022/app/components/status/status.component.mjs +69 -0
  51. package/esm2022/app/directives/cell/cell.directive.mjs +21 -0
  52. package/esm2022/app/directives/column/column.directive.mjs +137 -0
  53. package/{esm2020 → esm2022}/app/directives/content/content.directive.mjs +4 -4
  54. package/esm2022/app/directives/content-init/content-init.directive.mjs +23 -0
  55. package/esm2022/app/directives/draggable-list/draggable-list.directive.mjs +344 -0
  56. package/esm2022/app/directives/draggable-row/draggable-row.directive.mjs +83 -0
  57. package/{esm2020 → esm2022}/app/directives/empty-state/empty-state.directive.mjs +4 -4
  58. package/esm2022/app/directives/footer/footer.directive.mjs +21 -0
  59. package/esm2022/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs +28 -0
  60. package/{esm2020 → esm2022}/app/directives/group-footer/group-footer.directive.mjs +4 -4
  61. package/{esm2020 → esm2022}/app/directives/group-header/group-header.directive.mjs +4 -4
  62. package/esm2022/app/directives/header/header.directive.mjs +21 -0
  63. package/{esm2020 → esm2022}/app/directives/heading/heading.directive.mjs +4 -4
  64. package/{esm2020 → esm2022}/app/directives/heading-container/heading-container.directive.mjs +4 -4
  65. package/{esm2020 → esm2022}/app/directives/subheading/subheading.directive.mjs +4 -4
  66. package/{esm2020 → esm2022}/app/fs-list.module.mjs +89 -89
  67. package/esm2022/app/models/column-attributes.mjs +139 -0
  68. package/esm2022/app/models/column.model.mjs +173 -0
  69. package/esm2022/app/models/row/base-row.mjs +25 -0
  70. package/esm2022/app/models/row/child-row.mjs +29 -0
  71. package/esm2022/app/models/row/group-footer-row.mjs +22 -0
  72. package/{esm2020 → esm2022}/app/models/row/group-row.mjs +3 -3
  73. package/esm2022/app/models/row-action.model.mjs +102 -0
  74. package/esm2022/app/models/row.mjs +90 -0
  75. package/esm2022/app/models/styleConfig.model.mjs +78 -0
  76. package/{esm2020 → esm2022}/app/pipes/action-label.mjs +4 -4
  77. package/esm2022/app/services/group-expand-notifier.service.mjs +24 -0
  78. package/{fesm2020 → fesm2022}/firestitch-list.mjs +675 -442
  79. package/fesm2022/firestitch-list.mjs.map +1 -0
  80. package/package.json +5 -11
  81. package/esm2020/app/classes/actions-controller.mjs +0 -55
  82. package/esm2020/app/classes/columns-controller.mjs +0 -206
  83. package/esm2020/app/classes/data-controller.mjs +0 -345
  84. package/esm2020/app/classes/external-params-controller.mjs +0 -147
  85. package/esm2020/app/classes/list-controller.mjs +0 -674
  86. package/esm2020/app/classes/pagination-controller.mjs +0 -491
  87. package/esm2020/app/classes/persistance-controller.mjs +0 -19
  88. package/esm2020/app/classes/reorder-controller.mjs +0 -182
  89. package/esm2020/app/classes/selection-controller.mjs +0 -466
  90. package/esm2020/app/classes/sorting-controller.mjs +0 -206
  91. package/esm2020/app/components/body/body.component.mjs +0 -64
  92. package/esm2020/app/components/body/row/actions/actions.component.mjs +0 -97
  93. package/esm2020/app/components/body/row/cell/cell.component.mjs +0 -107
  94. package/esm2020/app/components/body/row/inline-action/inline-action.component.mjs +0 -33
  95. package/esm2020/app/components/body/row/menu-action/menu-action.component.mjs +0 -46
  96. package/esm2020/app/components/body/row/row.component.mjs +0 -322
  97. package/esm2020/app/components/customize-cols/customize-cols.component.mjs +0 -68
  98. package/esm2020/app/components/footer/footer-row/footer-row.component.mjs +0 -28
  99. package/esm2020/app/components/footer/footer.component.mjs +0 -31
  100. package/esm2020/app/components/head/head-cell/head-cell.component.mjs +0 -29
  101. package/esm2020/app/components/head/head.component.mjs +0 -103
  102. package/esm2020/app/components/list/list.component.mjs +0 -385
  103. package/esm2020/app/components/loader/loader.component.mjs +0 -40
  104. package/esm2020/app/components/manage-saved-filters/manage-saved-filters.component.mjs +0 -76
  105. package/esm2020/app/components/pagination/pagination.component.mjs +0 -37
  106. package/esm2020/app/components/saved-filters/saved-filters.component.mjs +0 -29
  107. package/esm2020/app/components/status/status.component.mjs +0 -64
  108. package/esm2020/app/directives/cell/cell.directive.mjs +0 -18
  109. package/esm2020/app/directives/column/column.directive.mjs +0 -121
  110. package/esm2020/app/directives/content-init/content-init.directive.mjs +0 -22
  111. package/esm2020/app/directives/draggable-list/draggable-list.directive.mjs +0 -330
  112. package/esm2020/app/directives/draggable-row/draggable-row.directive.mjs +0 -78
  113. package/esm2020/app/directives/footer/footer.directive.mjs +0 -18
  114. package/esm2020/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs +0 -26
  115. package/esm2020/app/directives/header/header.directive.mjs +0 -18
  116. package/esm2020/app/models/column-attributes.mjs +0 -132
  117. package/esm2020/app/models/column.model.mjs +0 -164
  118. package/esm2020/app/models/row/base-row.mjs +0 -23
  119. package/esm2020/app/models/row/child-row.mjs +0 -28
  120. package/esm2020/app/models/row/group-footer-row.mjs +0 -21
  121. package/esm2020/app/models/row-action.model.mjs +0 -90
  122. package/esm2020/app/models/row.mjs +0 -89
  123. package/esm2020/app/models/styleConfig.model.mjs +0 -76
  124. package/esm2020/app/services/group-expand-notifier.service.mjs +0 -26
  125. package/fesm2015/firestitch-list.mjs +0 -5802
  126. package/fesm2015/firestitch-list.mjs.map +0 -1
  127. package/fesm2020/firestitch-list.mjs.map +0 -1
  128. /package/{esm2020 → esm2022}/app/classes/index.mjs +0 -0
  129. /package/{esm2020 → esm2022}/app/directives/index.mjs +0 -0
  130. /package/{esm2020 → esm2022}/app/enums/action-type.enum.mjs +0 -0
  131. /package/{esm2020 → esm2022}/app/enums/page-change-type.enum.mjs +0 -0
  132. /package/{esm2020 → esm2022}/app/enums/pagination-strategy.enum.mjs +0 -0
  133. /package/{esm2020 → esm2022}/app/enums/row-type.enum.mjs +0 -0
  134. /package/{esm2020 → esm2022}/app/enums/state.enum.mjs +0 -0
  135. /package/{esm2020 → esm2022}/app/fs-list.providers.mjs +0 -0
  136. /package/{esm2020 → esm2022}/app/interfaces/cellconfig.interface.mjs +0 -0
  137. /package/{esm2020 → esm2022}/app/interfaces/column-config.interface.mjs +0 -0
  138. /package/{esm2020 → esm2022}/app/interfaces/draggable-list.interface.mjs +0 -0
  139. /package/{esm2020 → esm2022}/app/interfaces/external-params.interface.mjs +0 -0
  140. /package/{esm2020 → esm2022}/app/interfaces/index.mjs +0 -0
  141. /package/{esm2020 → esm2022}/app/interfaces/listconfig.interface.mjs +0 -0
  142. /package/{esm2020 → esm2022}/app/interfaces/pagination-state.interface.mjs +0 -0
  143. /package/{esm2020 → esm2022}/app/interfaces/pagination.interface.mjs +0 -0
  144. /package/{esm2020 → esm2022}/app/interfaces/sorting-change-event.interface.mjs +0 -0
  145. /package/{esm2020 → esm2022}/app/models/column-async-attribute.mjs +0 -0
  146. /package/{esm2020 → esm2022}/app/models/row/simple-row.mjs +0 -0
  147. /package/{esm2020 → esm2022}/app/pipes/index.mjs +0 -0
  148. /package/{esm2020 → esm2022}/firestitch-list.mjs +0 -0
  149. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
@@ -0,0 +1,473 @@
1
+ import { BehaviorSubject, Observable, Subject } from 'rxjs';
2
+ import { take, takeUntil } from 'rxjs/operators';
3
+ import { get as _get } from 'lodash-es';
4
+ export var SelectionChangeType;
5
+ (function (SelectionChangeType) {
6
+ SelectionChangeType["AllVisibleSelectionChange"] = "AllVisibleSelectionChange";
7
+ SelectionChangeType["RowSelectionChange"] = "RowSelectionChange";
8
+ SelectionChangeType["SelectedAll"] = "SelectedAll";
9
+ })(SelectionChangeType || (SelectionChangeType = {}));
10
+ export class SelectionController {
11
+ _trackBy;
12
+ _selectionDialog;
13
+ // Options from passed config
14
+ actions = [];
15
+ selectAll = true;
16
+ selectionChangedFn;
17
+ actionSelectedFn;
18
+ allSelectedFn;
19
+ cancelledFn;
20
+ // Store for selected visible rows
21
+ selectedRows = new Map();
22
+ selectedGroups = new Map();
23
+ // Reference to selection dialog
24
+ _selectionDialogRef = null;
25
+ _getRows;
26
+ _selectionChange = new Subject();
27
+ // Selected only visible rows (ex.: selected only limited 15 rows when we have pagination)
28
+ _selectedAllVisible = false;
29
+ // Selected all rows when was clicked "Select All" in selection dialog
30
+ // or count of visible records is equal to total and all visible rows was selected
31
+ _selectedAll = false;
32
+ _selectedRecords = 0;
33
+ _visibleRecordsCount = 0;
34
+ _totalRecordsCount = 0;
35
+ _destroy$ = new Subject();
36
+ _disabled$ = new BehaviorSubject(false);
37
+ constructor(config = {}, _trackBy, _selectionDialog) {
38
+ this._trackBy = _trackBy;
39
+ this._selectionDialog = _selectionDialog;
40
+ this.actions = config.actions ? [...config.actions] : [];
41
+ this.actionSelectedFn = config.actionSelected;
42
+ this.allSelectedFn = config.allSelected;
43
+ this.cancelledFn = config.cancelled;
44
+ this.selectionChangedFn = config.selectionChanged;
45
+ this.selectAll = config.selectAll;
46
+ this._disabled$.next(!!config.disabled);
47
+ }
48
+ get disabled() {
49
+ return this._disabled$.getValue();
50
+ }
51
+ get disabled$() {
52
+ return this._disabled$.asObservable();
53
+ }
54
+ get selectedAll() {
55
+ return this._selectedAll;
56
+ }
57
+ get selectionChange$() {
58
+ return this._selectionChange.pipe(takeUntil(this._destroy$));
59
+ }
60
+ setRowsCallback(data) {
61
+ this._getRows = data;
62
+ }
63
+ /**
64
+ * Trigger when row was selected
65
+ *
66
+ * @param row
67
+ * @param checked
68
+ */
69
+ rowSelectionChange(row, checked) {
70
+ if (row) {
71
+ if (checked) {
72
+ this._selectRow(row);
73
+ this.openDialog();
74
+ }
75
+ else {
76
+ if (this._selectedAll) {
77
+ this._selectedAll = false;
78
+ }
79
+ this._deselectRow(row);
80
+ }
81
+ }
82
+ this._updateSelectionRefSelected();
83
+ this._updateSelectedVisibleStatus();
84
+ }
85
+ /**
86
+ * Do check or uncheck of visible rows
87
+ *
88
+ * @param checked
89
+ */
90
+ selectAllVisibleRows(checked) {
91
+ this.openDialog();
92
+ this._selectedAllVisible = checked;
93
+ this._selectedRecords = 0;
94
+ const rows = this._getRows();
95
+ if (checked) {
96
+ rows.forEach((row) => {
97
+ const identifier = this._rowIdentifier(row.data);
98
+ if (row.isGroup) {
99
+ this._setNumberOfSelectedChildrenInGroup(identifier, row.children.length);
100
+ }
101
+ else {
102
+ this.selectedRows.set(identifier, row.data);
103
+ this._selectedRecords++;
104
+ }
105
+ });
106
+ }
107
+ else {
108
+ rows.forEach((row) => {
109
+ const identifier = this._rowIdentifier(row.data);
110
+ if (row.isGroup) {
111
+ this._setNumberOfSelectedChildrenInGroup(identifier, 0);
112
+ }
113
+ else {
114
+ this.selectedRows.delete(identifier);
115
+ }
116
+ });
117
+ this._selectedAll = false;
118
+ this._selectedRecords = 0;
119
+ }
120
+ // Fire an event that all visible selection was changed
121
+ this._visibleRowsSelectionChanged();
122
+ this._updateSelectionRefSelected();
123
+ }
124
+ isRowSelected(rowData) {
125
+ return this.selectedRows.has(this._rowIdentifier(rowData))
126
+ || this.selectedGroups.has(this._rowIdentifier(rowData))
127
+ || this.selectedAll;
128
+ }
129
+ isGroupSelected(row) {
130
+ const identifier = this._rowIdentifier(row.data);
131
+ if (this.selectedGroups.has(identifier)
132
+ && row.children?.length > this.selectedGroups.get(identifier)) {
133
+ return 'indeterminate';
134
+ }
135
+ return this.selectedGroups.has(identifier) || this.selectedAll;
136
+ }
137
+ /**
138
+ * Open selection dialog and create reference
139
+ */
140
+ openDialog() {
141
+ if (!this._selectionDialogRef) {
142
+ this._selectionDialogRef = this._selectionDialog.open({
143
+ selectAll: this.selectAll,
144
+ allCount: this._totalRecordsCount,
145
+ actions: [...this.actions],
146
+ // selectAll: this.sele
147
+ });
148
+ this._subscribeToSelection();
149
+ }
150
+ }
151
+ /**
152
+ * Update count of visible elements
153
+ *
154
+ * @param count
155
+ */
156
+ updateVisibleRecordsCount(count) {
157
+ this._visibleRecordsCount = count;
158
+ }
159
+ /**
160
+ * Update count of total available elemenets
161
+ *
162
+ * @param count
163
+ */
164
+ updateTotalRecordsCount(count) {
165
+ this._totalRecordsCount = count;
166
+ if (this._selectionDialogRef) {
167
+ this._selectionDialogRef.updateAllCount(this._totalRecordsCount);
168
+ }
169
+ }
170
+ pageChanged() {
171
+ if (this._selectedAll) {
172
+ this._resetSelection();
173
+ }
174
+ else {
175
+ this._selectedRecords = 0;
176
+ this._getRows()
177
+ .map((row) => row.data)
178
+ .forEach((rowData) => {
179
+ const identified = this._rowIdentifier(rowData);
180
+ if (this.selectedRows.has(identified)) {
181
+ this._selectedRecords++;
182
+ }
183
+ });
184
+ this._updateSelectionRefSelected();
185
+ this._updateSelectedVisibleStatus();
186
+ }
187
+ }
188
+ enableSelection() {
189
+ this._disabled$.next(false);
190
+ }
191
+ disableSelection() {
192
+ this._disabled$.next(true);
193
+ }
194
+ /**
195
+ * Method will be called from List for remove row if it was selected
196
+ *
197
+ * BUT methods for update visible and etc. will be called a bit later
198
+ *
199
+ * @param row
200
+ */
201
+ removeRow(row) {
202
+ this.selectedRows.delete(this._rowIdentifier(row));
203
+ this._updateSelectionRefSelected();
204
+ this._updateSelectionRefSelectedAll();
205
+ }
206
+ /**
207
+ * Intersection of selected and passed rows to remove rows that we dont need more
208
+ *
209
+ * @param rows
210
+ */
211
+ selectedRowsIntersection(rows) {
212
+ const rowsIndentifiers = rows.map((row) => this._rowIdentifier(row));
213
+ this.selectedRows.forEach((selectedRow, identifier) => {
214
+ if (rowsIndentifiers.indexOf(identifier) === -1) {
215
+ this.removeRow(selectedRow);
216
+ }
217
+ });
218
+ }
219
+ updateConfig({ actions, actionSelected, allSelected, cancelled, selectionChanged, selectAll, }) {
220
+ this.actions = actions ? [...actions] : this.actions;
221
+ this.actionSelectedFn = actionSelected ?? this.actionSelectedFn;
222
+ this.allSelectedFn = allSelected ?? this.allSelectedFn;
223
+ this.cancelledFn = cancelled ?? this.cancelledFn;
224
+ this.selectionChangedFn = selectionChanged ?? this.selectionChangedFn;
225
+ this.selectAll = selectAll ?? this.selectAll;
226
+ }
227
+ // Reset actions to default set
228
+ resetActions() {
229
+ this._selectionDialogRef?.resetActions();
230
+ }
231
+ closeSelectionDialog() {
232
+ this._selectionDialogRef?.close();
233
+ }
234
+ destroy() {
235
+ this._resetSelection();
236
+ this.actions = null;
237
+ this.actionSelectedFn = null;
238
+ this.allSelectedFn = null;
239
+ this.cancelledFn = null;
240
+ this.closeSelectionDialog();
241
+ this._selectionDialogRef = null;
242
+ this._destroy$.next();
243
+ this._destroy$.complete();
244
+ this._selectionChange.complete();
245
+ }
246
+ /**
247
+ * Subscribe to selectionRef events
248
+ */
249
+ _subscribeToSelection() {
250
+ this._selectionDialogRef.actionSelected$()
251
+ .pipe(takeUntil(this._destroy$))
252
+ .subscribe((data) => {
253
+ this._onActionActions(data);
254
+ });
255
+ this._selectionDialogRef.cancelled$()
256
+ .pipe(takeUntil(this._destroy$))
257
+ .subscribe(() => this._onCancelActions());
258
+ this._selectionDialogRef.allSelected$()
259
+ .pipe(takeUntil(this._destroy$))
260
+ .subscribe((data) => {
261
+ this._onSelectAllActions(data);
262
+ });
263
+ }
264
+ /**
265
+ * If some action was clicked on selection ref dialog
266
+ *
267
+ * @param data
268
+ */
269
+ _onActionActions(data) {
270
+ if (!this.actionSelectedFn) {
271
+ return;
272
+ }
273
+ // Execute callback
274
+ const result = this.actionSelectedFn({
275
+ selected: Array.from(this.selectedRows.values()).map((row) => {
276
+ return { ...row };
277
+ }),
278
+ ...data,
279
+ });
280
+ // If result is observable
281
+ if (result instanceof Observable) {
282
+ // Subscribe and whait why it resolved
283
+ result.pipe(take(1), takeUntil(this._destroy$)).subscribe({
284
+ next: () => {
285
+ // Close dialog
286
+ this.closeSelectionDialog();
287
+ // Uncheck all visible rows
288
+ this.selectAllVisibleRows(false);
289
+ },
290
+ error: () => { },
291
+ });
292
+ }
293
+ }
294
+ /**
295
+ * If cancel was clicked on selection ref dialog
296
+ */
297
+ _onCancelActions() {
298
+ this.selectAllVisibleRows(false);
299
+ if (this.cancelledFn) {
300
+ this.cancelledFn();
301
+ }
302
+ this._selectionDialogRef = null;
303
+ }
304
+ /**
305
+ * If "Select All" action was clicked on selection ref dialog
306
+ *
307
+ * @param flag
308
+ */
309
+ _onSelectAllActions(flag) {
310
+ this._selectedAll = flag;
311
+ this.selectAllVisibleRows(flag);
312
+ this._selectionDialogRef.updateSelected(this._totalRecordsCount);
313
+ this._selectionChangeEvent(SelectionChangeType.SelectedAll, this._selectedAll);
314
+ this._updateSelectionRefSelectedAll();
315
+ if (!this.allSelectedFn) {
316
+ return;
317
+ }
318
+ this.allSelectedFn(flag);
319
+ }
320
+ _selectionChangedActions() {
321
+ // Remove actions if no rows selected
322
+ // otherwise it will "blink" when user select any action
323
+ if (this.selectedRows.size === 0) {
324
+ this._selectionDialogRef.updateActions([]);
325
+ return;
326
+ }
327
+ if (this.selectionChangedFn) {
328
+ const result = this.selectionChangedFn(Array.from(this.selectedRows.values()), this.selectedAll, this._selectionDialogRef);
329
+ if (result) {
330
+ if (result instanceof Observable) {
331
+ result.pipe(take(1), takeUntil(this._destroy$)).subscribe({
332
+ next: (actions) => {
333
+ this._selectionDialogRef.updateActions(actions);
334
+ },
335
+ });
336
+ }
337
+ else if (Array.isArray(result)) {
338
+ this._selectionDialogRef.updateActions(result);
339
+ }
340
+ }
341
+ }
342
+ }
343
+ /**
344
+ * Update in Dialog Ref how much rows was selected
345
+ */
346
+ _updateSelectionRefSelected() {
347
+ if (this._selectionDialogRef) {
348
+ this._selectionDialogRef.updateSelected(this.selectedRows.size);
349
+ // S-T1268
350
+ if (this.selectedRows.size === 0) {
351
+ this._selectionDialogRef.close();
352
+ }
353
+ this._selectionChangedActions();
354
+ }
355
+ }
356
+ /**
357
+ * Update in Dialog Ref selected all status
358
+ *
359
+ * Ex.: Was clicked "Select All" in Dialog and after that some checkbox was unchecked
360
+ * Dialog Ref must know about it
361
+ *
362
+ */
363
+ _updateSelectionRefSelectedAll() {
364
+ if (this._selectionDialogRef) {
365
+ this._selectionDialogRef.updateSelectedAllStatus(this._selectedAll);
366
+ }
367
+ }
368
+ /**
369
+ * Check if all visible rows was checked and send event to main header checkbox
370
+ */
371
+ _updateSelectedVisibleStatus() {
372
+ this._selectedAllVisible = this._selectedRecords !== 0 && this._selectedRecords === this._visibleRecordsCount;
373
+ this._selectionChangeEvent(SelectionChangeType.RowSelectionChange, this._selectedAllVisible);
374
+ }
375
+ /**
376
+ * If select all checkbox in header was changed
377
+ */
378
+ _visibleRowsSelectionChanged() {
379
+ this._selectionChangeEvent(SelectionChangeType.AllVisibleSelectionChange, this._selectedAllVisible);
380
+ }
381
+ /**
382
+ * Method constructor for events
383
+ *
384
+ * @param type
385
+ * @param payload
386
+ */
387
+ _selectionChangeEvent(type, payload) {
388
+ this._selectionChange.next({
389
+ type,
390
+ payload,
391
+ });
392
+ }
393
+ /**
394
+ * Get row identified by trackBy path
395
+ *
396
+ * @param row
397
+ */
398
+ _rowIdentifier(row) {
399
+ const identifier = _get(row, this._trackBy, undefined);
400
+ if (identifier === undefined) {
401
+ console.warn('Selection can not recognize track by field for row. ' +
402
+ 'Please check if you had configured trackBy function.');
403
+ }
404
+ return identifier;
405
+ }
406
+ _selectRow(row) {
407
+ const identifier = this._rowIdentifier(row.data);
408
+ if (row.isGroup) {
409
+ row.children.forEach((childRow) => {
410
+ this._selectRow(childRow);
411
+ });
412
+ }
413
+ else {
414
+ if (row.isChild) {
415
+ this._selectChildRow(row);
416
+ }
417
+ this.selectedRows.set(identifier, row.data);
418
+ this._selectedRecords++;
419
+ }
420
+ }
421
+ _deselectRow(row) {
422
+ const identifier = this._rowIdentifier(row.data);
423
+ if (row.isGroup) {
424
+ this.selectedGroups.delete(identifier);
425
+ row.children.forEach((childRow) => {
426
+ this._deselectRow(childRow);
427
+ });
428
+ }
429
+ else {
430
+ if (row.isChild && this.selectedRows.has(identifier)) {
431
+ this._deselectChildRow(row);
432
+ }
433
+ this.selectedRows.delete(identifier);
434
+ this._selectedRecords--;
435
+ }
436
+ }
437
+ _selectChildRow(row) {
438
+ const parentIdentifier = this._rowIdentifier(row.parent.data);
439
+ const selectedChildrenNumber = this.selectedGroups.get(parentIdentifier) || 0;
440
+ this._setNumberOfSelectedChildrenInGroup(parentIdentifier, selectedChildrenNumber + 1);
441
+ }
442
+ _deselectChildRow(row) {
443
+ const parentIdentifier = this._rowIdentifier(row.parent.data);
444
+ const selectedChildrenNumber = this.selectedGroups.get(parentIdentifier) || 0;
445
+ if (selectedChildrenNumber > 1) {
446
+ this._setNumberOfSelectedChildrenInGroup(parentIdentifier, selectedChildrenNumber - 1);
447
+ }
448
+ else {
449
+ this._setNumberOfSelectedChildrenInGroup(parentIdentifier, 0);
450
+ }
451
+ }
452
+ _setNumberOfSelectedChildrenInGroup(identifier, n) {
453
+ if (n === 0) {
454
+ this.selectedGroups.delete(identifier);
455
+ return;
456
+ }
457
+ this.selectedGroups.set(identifier, n);
458
+ }
459
+ /**
460
+ * Reset selection
461
+ */
462
+ _resetSelection() {
463
+ this._selectedAll = false;
464
+ this._selectedAllVisible = false;
465
+ this._visibleRecordsCount = 0;
466
+ this._selectedRecords = 0;
467
+ this.selectedRows.clear();
468
+ this._updateSelectionRefSelected();
469
+ this._updateSelectionRefSelectedAll();
470
+ this._visibleRowsSelectionChanged();
471
+ }
472
+ }
473
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2NsYXNzZXMvc2VsZWN0aW9uLWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLeEMsTUFBTSxDQUFOLElBQVksbUJBSVg7QUFKRCxXQUFZLG1CQUFtQjtJQUM3Qiw4RUFBdUQsQ0FBQTtJQUN2RCxnRUFBeUMsQ0FBQTtJQUN6QyxrREFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUk5QjtBQUdELE1BQU0sT0FBTyxtQkFBbUI7SUFxQ3BCO0lBQ0E7SUFwQ1YsNkJBQTZCO0lBQ3RCLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDYixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLGtCQUFrQixDQUFDO0lBQ25CLGdCQUFnQixDQUFDO0lBQ2pCLGFBQWEsQ0FBQztJQUVkLFdBQVcsQ0FBQztJQUVuQixrQ0FBa0M7SUFDM0IsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekIsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFFbEMsZ0NBQWdDO0lBQ3hCLG1CQUFtQixHQUFpQixJQUFJLENBQUM7SUFFekMsUUFBUSxDQUFjO0lBQ3RCLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUErQyxDQUFDO0lBRXRGLDBGQUEwRjtJQUNsRixtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFFcEMsc0VBQXNFO0lBQ3RFLGtGQUFrRjtJQUMxRSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJC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R0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlFLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN4RjthQUFNO1lBQ0wsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVPLG1DQUFtQyxDQUFDLFVBQWtCLEVBQUUsQ0FBUztRQUN2RSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUV2QyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbkRpYWxvZywgU2VsZWN0aW9uUmVmIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGdldCBhcyBfZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNMaXN0U2VsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93JztcblxuZXhwb3J0IGVudW0gU2VsZWN0aW9uQ2hhbmdlVHlwZSB7XG4gIEFsbFZpc2libGVTZWxlY3Rpb25DaGFuZ2UgPSAnQWxsVmlzaWJsZVNlbGVjdGlvbkNoYW5nZScsXG4gIFJvd1NlbGVjdGlvbkNoYW5nZSA9ICdSb3dTZWxlY3Rpb25DaGFuZ2UnLFxuICBTZWxlY3RlZEFsbCA9ICdTZWxlY3RlZEFsbCcsXG59XG5cblxuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIge1xuXG4gIC8vIE9wdGlvbnMgZnJvbSBwYXNzZWQgY29uZmlnXG4gIHB1YmxpYyBhY3Rpb25zID0gW107XG4gIHB1YmxpYyBzZWxlY3RBbGwgPSB0cnVlO1xuICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlZEZuO1xuICBwdWJsaWMgYWN0aW9uU2VsZWN0ZWRGbjtcbiAgcHVibGljIGFsbFNlbGVjdGVkRm47XG5cbiAgcHVibGljIGNhbmNlbGxlZEZuO1xuXG4gIC8vIFN0b3JlIGZvciBzZWxlY3RlZCB2aXNpYmxlIHJvd3NcbiAgcHVibGljIHNlbGVjdGVkUm93cyA9IG5ldyBNYXAoKTtcbiAgcHVibGljIHNlbGVjdGVkR3JvdXBzID0gbmV3IE1hcCgpO1xuXG4gIC8vIFJlZmVyZW5jZSB0byBzZWxlY3Rpb24gZGlhbG9nXG4gIHByaXZhdGUgX3NlbGVjdGlvbkRpYWxvZ1JlZjogU2VsZWN0aW9uUmVmID0gbnVsbDtcblxuICBwcml2YXRlIF9nZXRSb3dzOiAoKSA9PiBhbnlbXTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uQ2hhbmdlID0gbmV3IFN1YmplY3Q8eyB0eXBlOiBTZWxlY3Rpb25DaGFuZ2VUeXBlOyBwYXlsb2FkOiBhbnkgfT4oKTtcblxuICAvLyBTZWxlY3RlZCBvbmx5IHZpc2libGUgcm93cyAoZXguOiBzZWxlY3RlZCBvbmx5IGxpbWl0ZWQgMTUgcm93cyB3aGVuIHdlIGhhdmUgcGFnaW5hdGlvbilcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRBbGxWaXNpYmxlID0gZmFsc2U7XG5cbiAgLy8gU2VsZWN0ZWQgYWxsIHJvd3Mgd2hlbiB3YXMgY2xpY2tlZCBcIlNlbGVjdCBBbGxcIiBpbiBzZWxlY3Rpb24gZGlhbG9nXG4gIC8vIG9yIGNvdW50IG9mIHZpc2libGUgcmVjb3JkcyBpcyBlcXVhbCB0byB0b3RhbCBhbmQgYWxsIHZpc2libGUgcm93cyB3YXMgc2VsZWN0ZWRcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRBbGwgPSBmYWxzZTtcblxuICBwcml2YXRlIF9zZWxlY3RlZFJlY29yZHMgPSAwO1xuICBwcml2YXRlIF92aXNpYmxlUmVjb3Jkc0NvdW50ID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxSZWNvcmRzQ291bnQgPSAwO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnOiBGc0xpc3RTZWxlY3Rpb25Db25maWcgPSB7fSxcbiAgICBwcml2YXRlIF90cmFja0J5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uRGlhbG9nOiBTZWxlY3Rpb25EaWFsb2csXG4gICkge1xuICAgIHRoaXMuYWN0aW9ucyA9IGNvbmZpZy5hY3Rpb25zID8gWy4uLmNvbmZpZy5hY3Rpb25zXSA6IFtdO1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWRGbiA9IGNvbmZpZy5hY3Rpb25TZWxlY3RlZDtcbiAgICB0aGlzLmFsbFNlbGVjdGVkRm4gPSBjb25maWcuYWxsU2VsZWN0ZWQ7XG4gICAgdGhpcy5jYW5jZWxsZWRGbiA9IGNvbmZpZy5jYW5jZWxsZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkRm4gPSBjb25maWcuc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICB0aGlzLnNlbGVjdEFsbCA9IGNvbmZpZy5zZWxlY3RBbGw7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQoISFjb25maWcuZGlzYWJsZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBbGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkNoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIHNldFJvd3NDYWxsYmFjayhkYXRhOiAoKSA9PiBhbnlbXSkge1xuICAgIHRoaXMuX2dldFJvd3MgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgd2hlbiByb3cgd2FzIHNlbGVjdGVkXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIGNoZWNrZWRcbiAgICovXG4gIHB1YmxpYyByb3dTZWxlY3Rpb25DaGFuZ2Uocm93OiBSb3csIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RSb3cocm93KTtcbiAgICAgICAgdGhpcy5vcGVuRGlhbG9nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRBbGwpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEFsbCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVzZWxlY3RSb3cocm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25SZWZTZWxlY3RlZCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmlzaWJsZVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvIGNoZWNrIG9yIHVuY2hlY2sgb2YgdmlzaWJsZSByb3dzXG4gICAqXG4gICAqIEBwYXJhbSBjaGVja2VkXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsVmlzaWJsZVJvd3MoY2hlY2tlZCkge1xuICAgIHRoaXMub3BlbkRpYWxvZygpO1xuXG4gICAgdGhpcy5fc2VsZWN0ZWRBbGxWaXNpYmxlID0gY2hlY2tlZDtcbiAgICB0aGlzLl9zZWxlY3RlZFJlY29yZHMgPSAwO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX2dldFJvd3MoKTtcblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5fcm93SWRlbnRpZmllcihyb3cuZGF0YSk7XG5cbiAgICAgICAgaWYgKHJvdy5pc0dyb3VwKSB7XG4gICAgICAgICAgdGhpcy5fc2V0TnVtYmVyT2ZTZWxlY3RlZENoaWxkcmVuSW5Hcm91cChpZGVudGlmaWVyLCByb3cuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cy5zZXQoaWRlbnRpZmllciwgcm93LmRhdGEpO1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmVjb3JkcysrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuX3Jvd0lkZW50aWZpZXIocm93LmRhdGEpO1xuXG4gICAgICAgIGlmIChyb3cuaXNHcm91cCkge1xuICAgICAgICAgIHRoaXMuX3NldE51bWJlck9mU2VsZWN0ZWRDaGlsZHJlbkluR3JvdXAoaWRlbnRpZmllciwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fc2VsZWN0ZWRBbGwgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVjb3JkcyA9IDA7XG4gICAgfVxuXG4gICAgLy8gRmlyZSBhbiBldmVudCB0aGF0IGFsbCB2aXNpYmxlIHNlbGVjdGlvbiB3YXMgY2hhbmdlZFxuICAgIHRoaXMuX3Zpc2libGVSb3dzU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkKCk7XG4gIH1cblxuICBwdWJsaWMgaXNSb3dTZWxlY3RlZChyb3dEYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3dzLmhhcyh0aGlzLl9yb3dJZGVudGlmaWVyKHJvd0RhdGEpKVxuICAgICAgfHwgdGhpcy5zZWxlY3RlZEdyb3Vwcy5oYXModGhpcy5fcm93SWRlbnRpZmllcihyb3dEYXRhKSlcbiAgICAgIHx8IHRoaXMuc2VsZWN0ZWRBbGw7XG4gIH1cblxuICBwdWJsaWMgaXNHcm91cFNlbGVjdGVkKHJvdyk6IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZScge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLl9yb3dJZGVudGlmaWVyKHJvdy5kYXRhKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMuaGFzKGlkZW50aWZpZXIpXG4gICAgICAmJiByb3cuY2hpbGRyZW4/Lmxlbmd0aCA+IHRoaXMuc2VsZWN0ZWRHcm91cHMuZ2V0KGlkZW50aWZpZXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2luZGV0ZXJtaW5hdGUnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkR3JvdXBzLmhhcyhpZGVudGlmaWVyKSB8fCB0aGlzLnNlbGVjdGVkQWxsO1xuXG4gIH1cblxuICAvKipcbiAgICogT3BlbiBzZWxlY3Rpb24gZGlhbG9nIGFuZCBjcmVhdGUgcmVmZXJlbmNlXG4gICAqL1xuICBwdWJsaWMgb3BlbkRpYWxvZygpIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZikge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmID0gdGhpcy5fc2VsZWN0aW9uRGlhbG9nLm9wZW4oe1xuICAgICAgICBzZWxlY3RBbGw6IHRoaXMuc2VsZWN0QWxsLFxuICAgICAgICBhbGxDb3VudDogdGhpcy5fdG90YWxSZWNvcmRzQ291bnQsXG4gICAgICAgIGFjdGlvbnM6IFsuLi50aGlzLmFjdGlvbnNdLFxuICAgICAgICAvLyBzZWxlY3RBbGw6IHRoaXMuc2VsZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3N1YnNjcmliZVRvU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb3VudCBvZiB2aXNpYmxlIGVsZW1lbnRzXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZpc2libGVSZWNvcmRzQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgIHRoaXMuX3Zpc2libGVSZWNvcmRzQ291bnQgPSBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY291bnQgb2YgdG90YWwgYXZhaWxhYmxlIGVsZW1lbmV0c1xuICAgKlxuICAgKiBAcGFyYW0gY291bnRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUb3RhbFJlY29yZHNDb3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdG90YWxSZWNvcmRzQ291bnQgPSBjb3VudDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi51cGRhdGVBbGxDb3VudCh0aGlzLl90b3RhbFJlY29yZHNDb3VudCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhZ2VDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZEFsbCkge1xuICAgICAgdGhpcy5fcmVzZXRTZWxlY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzID0gMDtcbiAgICAgIHRoaXMuX2dldFJvd3MoKVxuICAgICAgICAubWFwKChyb3cpID0+IHJvdy5kYXRhKVxuICAgICAgICAuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZWQgPSB0aGlzLl9yb3dJZGVudGlmaWVyKHJvd0RhdGEpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzLmhhcyhpZGVudGlmaWVkKSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWQoKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmlzaWJsZVN0YXR1cygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbmFibGVTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZyb20gTGlzdCBmb3IgcmVtb3ZlIHJvdyBpZiBpdCB3YXMgc2VsZWN0ZWRcbiAgICpcbiAgICogQlVUIG1ldGhvZHMgZm9yIHVwZGF0ZSB2aXNpYmxlIGFuZCBldGMuIHdpbGwgYmUgY2FsbGVkIGEgYml0IGxhdGVyXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3cocm93KSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKHRoaXMuX3Jvd0lkZW50aWZpZXIocm93KSk7XG5cbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25SZWZTZWxlY3RlZCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJzZWN0aW9uIG9mIHNlbGVjdGVkIGFuZCBwYXNzZWQgcm93cyB0byByZW1vdmUgcm93cyB0aGF0IHdlIGRvbnQgbmVlZCBtb3JlXG4gICAqXG4gICAqIEBwYXJhbSByb3dzXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRSb3dzSW50ZXJzZWN0aW9uKHJvd3MpIHtcbiAgICBjb25zdCByb3dzSW5kZW50aWZpZXJzID0gcm93cy5tYXAoKHJvdykgPT4gdGhpcy5fcm93SWRlbnRpZmllcihyb3cpKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmZvckVhY2goKHNlbGVjdGVkUm93LCBpZGVudGlmaWVyKSA9PiB7XG4gICAgICBpZiAocm93c0luZGVudGlmaWVycy5pbmRleE9mKGlkZW50aWZpZXIpID09PSAtMSkge1xuICAgICAgICB0aGlzLnJlbW92ZVJvdyhzZWxlY3RlZFJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29uZmlnKHtcbiAgICBhY3Rpb25zLCBhY3Rpb25TZWxlY3RlZCwgYWxsU2VsZWN0ZWQsIGNhbmNlbGxlZCwgc2VsZWN0aW9uQ2hhbmdlZCwgc2VsZWN0QWxsLFxuICB9OiBGc0xpc3RTZWxlY3Rpb25Db25maWcpIHtcbiAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zID8gWy4uLmFjdGlvbnNdIDogdGhpcy5hY3Rpb25zO1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWRGbiA9IGFjdGlvblNlbGVjdGVkID8/IHRoaXMuYWN0aW9uU2VsZWN0ZWRGbjtcbiAgICB0aGlzLmFsbFNlbGVjdGVkRm4gPSBhbGxTZWxlY3RlZCA/PyB0aGlzLmFsbFNlbGVjdGVkRm47XG4gICAgdGhpcy5jYW5jZWxsZWRGbiA9IGNhbmNlbGxlZCA/PyB0aGlzLmNhbmNlbGxlZEZuO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZEZuID0gc2VsZWN0aW9uQ2hhbmdlZCA/PyB0aGlzLnNlbGVjdGlvbkNoYW5nZWRGbjtcbiAgICB0aGlzLnNlbGVjdEFsbCA9IHNlbGVjdEFsbCA/PyB0aGlzLnNlbGVjdEFsbDtcbiAgfVxuXG4gIC8vIFJlc2V0IGFjdGlvbnMgdG8gZGVmYXVsdCBzZXRcbiAgcHVibGljIHJlc2V0QWN0aW9ucygpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWY/LnJlc2V0QWN0aW9ucygpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlU2VsZWN0aW9uRGlhbG9nKCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZj8uY2xvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuX3Jlc2V0U2VsZWN0aW9uKCk7XG5cbiAgICB0aGlzLmFjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWRGbiA9IG51bGw7XG4gICAgdGhpcy5hbGxTZWxlY3RlZEZuID0gbnVsbDtcbiAgICB0aGlzLmNhbmNlbGxlZEZuID0gbnVsbDtcblxuICAgIHRoaXMuY2xvc2VTZWxlY3Rpb25EaWFsb2coKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYgPSBudWxsO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2UuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gc2VsZWN0aW9uUmVmIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9TZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLmFjdGlvblNlbGVjdGVkJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5fb25BY3Rpb25BY3Rpb25zKGRhdGEpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYuY2FuY2VsbGVkJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fb25DYW5jZWxBY3Rpb25zKCkpO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLmFsbFNlbGVjdGVkJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5fb25TZWxlY3RBbGxBY3Rpb25zKGRhdGEpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgc29tZSBhY3Rpb24gd2FzIGNsaWNrZWQgb24gc2VsZWN0aW9uIHJlZiBkaWFsb2dcbiAgICpcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHByaXZhdGUgX29uQWN0aW9uQWN0aW9ucyhkYXRhKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvblNlbGVjdGVkRm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGNhbGxiYWNrXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hY3Rpb25TZWxlY3RlZEZuKHtcbiAgICAgIHNlbGVjdGVkOiBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRSb3dzLnZhbHVlcygpKS5tYXAoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5yb3cgfTtcbiAgICAgIH0pLFxuICAgICAgLi4uZGF0YSxcbiAgICB9KTtcblxuICAgIC8vIElmIHJlc3VsdCBpcyBvYnNlcnZhYmxlXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcblxuICAgICAgLy8gU3Vic2NyaWJlIGFuZCB3aGFpdCB3aHkgaXQgcmVzb2x2ZWRcbiAgICAgIHJlc3VsdC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG5cbiAgICAgICAgICAvLyBDbG9zZSBkaWFsb2dcbiAgICAgICAgICB0aGlzLmNsb3NlU2VsZWN0aW9uRGlhbG9nKCk7XG5cbiAgICAgICAgICAvLyBVbmNoZWNrIGFsbCB2aXNpYmxlIHJvd3NcbiAgICAgICAgICB0aGlzLnNlbGVjdEFsbFZpc2libGVSb3dzKGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHsgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBjYW5jZWwgd2FzIGNsaWNrZWQgb24gc2VsZWN0aW9uIHJlZiBkaWFsb2dcbiAgICovXG4gIHByaXZhdGUgX29uQ2FuY2VsQWN0aW9ucygpIHtcbiAgICB0aGlzLnNlbGVjdEFsbFZpc2libGVSb3dzKGZhbHNlKTtcblxuICAgIGlmICh0aGlzLmNhbmNlbGxlZEZuKSB7XG4gICAgICB0aGlzLmNhbmNlbGxlZEZuKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBcIlNlbGVjdCBBbGxcIiBhY3Rpb24gd2FzIGNsaWNrZWQgb24gc2VsZWN0aW9uIHJlZiBkaWFsb2dcbiAgICpcbiAgICogQHBhcmFtIGZsYWdcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0QWxsQWN0aW9ucyhmbGFnKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRBbGwgPSBmbGFnO1xuXG4gICAgdGhpcy5zZWxlY3RBbGxWaXNpYmxlUm93cyhmbGFnKTtcblxuICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi51cGRhdGVTZWxlY3RlZCh0aGlzLl90b3RhbFJlY29yZHNDb3VudCk7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VFdmVudChTZWxlY3Rpb25DaGFuZ2VUeXBlLlNlbGVjdGVkQWxsLCB0aGlzLl9zZWxlY3RlZEFsbCk7XG4gICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWRBbGwoKTtcblxuICAgIGlmICghdGhpcy5hbGxTZWxlY3RlZEZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hbGxTZWxlY3RlZEZuKGZsYWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0aW9uQ2hhbmdlZEFjdGlvbnMoKSB7XG4gICAgLy8gUmVtb3ZlIGFjdGlvbnMgaWYgbm8gcm93cyBzZWxlY3RlZFxuICAgIC8vIG90aGVyd2lzZSBpdCB3aWxsIFwiYmxpbmtcIiB3aGVuIHVzZXIgc2VsZWN0IGFueSBhY3Rpb25cbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd3Muc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLnVwZGF0ZUFjdGlvbnMoW10pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlZEZuKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWRGbihcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkUm93cy52YWx1ZXMoKSksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBbGwsXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZixcbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICByZXN1bHQucGlwZShcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICAgICkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChhY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi51cGRhdGVBY3Rpb25zKGFjdGlvbnMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYudXBkYXRlQWN0aW9ucyhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBpbiBEaWFsb2cgUmVmIGhvdyBtdWNoIHJvd3Mgd2FzIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVTZWxlY3Rpb25SZWZTZWxlY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYudXBkYXRlU2VsZWN0ZWQodGhpcy5zZWxlY3RlZFJvd3Muc2l6ZSk7XG5cbiAgICAgIC8vIFMtVDEyNjhcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUm93cy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkQWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgaW4gRGlhbG9nIFJlZiBzZWxlY3RlZCBhbGwgc3RhdHVzXG4gICAqXG4gICAqIEV4LjogV2FzIGNsaWNrZWQgXCJTZWxlY3QgQWxsXCIgaW4gRGlhbG9nIGFuZCBhZnRlciB0aGF0IHNvbWUgY2hlY2tib3ggd2FzIHVuY2hlY2tlZFxuICAgKiBEaWFsb2cgUmVmIG11c3Qga25vdyBhYm91dCBpdFxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWRBbGwoKSB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZikge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLnVwZGF0ZVNlbGVjdGVkQWxsU3RhdHVzKHRoaXMuX3NlbGVjdGVkQWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWxsIHZpc2libGUgcm93cyB3YXMgY2hlY2tlZCBhbmQgc2VuZCBldmVudCB0byBtYWluIGhlYWRlciBjaGVja2JveFxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRWaXNpYmxlU3RhdHVzKCkge1xuICAgIHRoaXMuX3NlbGVjdGVkQWxsVmlzaWJsZSA9IHRoaXMuX3NlbGVjdGVkUmVjb3JkcyAhPT0gMCAmJiB0aGlzLl9zZWxlY3RlZFJlY29yZHMgPT09IHRoaXMuX3Zpc2libGVSZWNvcmRzQ291bnQ7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VFdmVudChcbiAgICAgIFNlbGVjdGlvbkNoYW5nZVR5cGUuUm93U2VsZWN0aW9uQ2hhbmdlLFxuICAgICAgdGhpcy5fc2VsZWN0ZWRBbGxWaXNpYmxlLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSWYgc2VsZWN0IGFsbCBjaGVja2JveCBpbiBoZWFkZXIgd2FzIGNoYW5nZWRcbiAgICovXG4gIHByaXZhdGUgX3Zpc2libGVSb3dzU2VsZWN0aW9uQ2hhbmdlZCgpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25DaGFuZ2VFdmVudChcbiAgICAgIFNlbGVjdGlvbkNoYW5nZVR5cGUuQWxsVmlzaWJsZVNlbGVjdGlvbkNoYW5nZSxcbiAgICAgIHRoaXMuX3NlbGVjdGVkQWxsVmlzaWJsZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBjb25zdHJ1Y3RvciBmb3IgZXZlbnRzXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSBwYXlsb2FkXG4gICAqL1xuICBwcml2YXRlIF9zZWxlY3Rpb25DaGFuZ2VFdmVudCh0eXBlOiBTZWxlY3Rpb25DaGFuZ2VUeXBlLCBwYXlsb2FkKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlLm5leHQoe1xuICAgICAgdHlwZSxcbiAgICAgIHBheWxvYWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJvdyBpZGVudGlmaWVkIGJ5IHRyYWNrQnkgcGF0aFxuICAgKlxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIF9yb3dJZGVudGlmaWVyKHJvdykge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBfZ2V0KHJvdywgdGhpcy5fdHJhY2tCeSwgdW5kZWZpbmVkKTtcblxuICAgIGlmIChpZGVudGlmaWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2VsZWN0aW9uIGNhbiBub3QgcmVjb2duaXplIHRyYWNrIGJ5IGZpZWxkIGZvciByb3cuICcgK1xuICAgICAgICAnUGxlYXNlIGNoZWNrIGlmIHlvdSBoYWQgY29uZmlndXJlZCB0cmFja0J5IGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpZGVudGlmaWVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Um93KHJvdykge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLl9yb3dJZGVudGlmaWVyKHJvdy5kYXRhKTtcblxuICAgIGlmIChyb3cuaXNHcm91cCkge1xuICAgICAgcm93LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkUm93KSA9PiB7XG4gICAgICAgIHRoaXMuX3NlbGVjdFJvdyhjaGlsZFJvdyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJvdy5pc0NoaWxkKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdENoaWxkUm93KHJvdyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLnNldChpZGVudGlmaWVyLCByb3cuZGF0YSk7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlY29yZHMrKztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXNlbGVjdFJvdyhyb3cpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5fcm93SWRlbnRpZmllcihyb3cuZGF0YSk7XG5cbiAgICBpZiAocm93LmlzR3JvdXApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMuZGVsZXRlKGlkZW50aWZpZXIpO1xuXG4gICAgICByb3cuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGRSb3cpID0+IHtcbiAgICAgICAgdGhpcy5fZGVzZWxlY3RSb3coY2hpbGRSb3cpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaXNDaGlsZCAmJiB0aGlzLnNlbGVjdGVkUm93cy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgICAgdGhpcy5fZGVzZWxlY3RDaGlsZFJvdyhyb3cpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlY29yZHMtLTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RDaGlsZFJvdyhyb3cpIHtcbiAgICBjb25zdCBwYXJlbnRJZGVudGlmaWVyID0gdGhpcy5fcm93SWRlbnRpZmllcihyb3cucGFyZW50LmRhdGEpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ2hpbGRyZW5OdW1iZXIgPSB0aGlzLnNlbGVjdGVkR3JvdXBzLmdldChwYXJlbnRJZGVudGlmaWVyKSB8fCAwO1xuXG4gICAgdGhpcy5fc2V0TnVtYmVyT2ZTZWxlY3RlZENoaWxkcmVuSW5Hcm91cChwYXJlbnRJZGVudGlmaWVyLCBzZWxlY3RlZENoaWxkcmVuTnVtYmVyICsgMSk7XG4gIH1cblxuICBwcml2YXRlIF9kZXNlbGVjdENoaWxkUm93KHJvdykge1xuICAgIGNvbnN0IHBhcmVudElkZW50aWZpZXIgPSB0aGlzLl9yb3dJZGVudGlmaWVyKHJvdy5wYXJlbnQuZGF0YSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRDaGlsZHJlbk51bWJlciA9IHRoaXMuc2VsZWN0ZWRHcm91cHMuZ2V0KHBhcmVudElkZW50aWZpZXIpIHx8IDA7XG5cbiAgICBpZiAoc2VsZWN0ZWRDaGlsZHJlbk51bWJlciA+IDEpIHtcbiAgICAgIHRoaXMuX3NldE51bWJlck9mU2VsZWN0ZWRDaGlsZHJlbkluR3JvdXAocGFyZW50SWRlbnRpZmllciwgc2VsZWN0ZWRDaGlsZHJlbk51bWJlciAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXROdW1iZXJPZlNlbGVjdGVkQ2hpbGRyZW5Jbkdyb3VwKHBhcmVudElkZW50aWZpZXIsIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldE51bWJlck9mU2VsZWN0ZWRDaGlsZHJlbkluR3JvdXAoaWRlbnRpZmllcjogc3RyaW5nLCBuOiBudW1iZXIpIHtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5kZWxldGUoaWRlbnRpZmllcik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkR3JvdXBzLnNldChpZGVudGlmaWVyLCBuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBzZWxlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0U2VsZWN0aW9uKCkge1xuICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gZmFsc2U7XG4gICAgdGhpcy5fc2VsZWN0ZWRBbGxWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5fdmlzaWJsZVJlY29yZHNDb3VudCA9IDA7XG4gICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzID0gMDtcbiAgICB0aGlzLnNlbGVjdGVkUm93cy5jbGVhcigpO1xuXG4gICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWQoKTtcbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25SZWZTZWxlY3RlZEFsbCgpO1xuICAgIHRoaXMuX3Zpc2libGVSb3dzU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICB9XG59XG4iXX0=