@one-grid-core/angular 0.1.0-beta.5

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 (125) hide show
  1. package/README.md +168 -0
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +388 -0
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +570 -0
  4. package/esm2022/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.mjs +90 -0
  5. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +31 -0
  6. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +67 -0
  7. package/esm2022/lib/components/one-grid-checkbox/one-grid-checkbox.component.mjs +47 -0
  8. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +62 -0
  9. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +140 -0
  10. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +76 -0
  11. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +193 -0
  12. package/esm2022/lib/components/one-grid-status/one-grid-status.component.mjs +35 -0
  13. package/esm2022/lib/core/directives/one-cell-input-validator.directive.mjs +71 -0
  14. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +77 -0
  15. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +82 -0
  16. package/esm2022/lib/core/instants/one-grid-api.class.mjs +591 -0
  17. package/esm2022/lib/core/instants/one-row-node.class.mjs +90 -0
  18. package/esm2022/lib/core/models/constants/one-pagination.constant.mjs +2 -0
  19. package/esm2022/lib/core/models/one-column-def-types.model.mjs +2 -0
  20. package/esm2022/lib/core/models/one-event-types.model.mjs +2 -0
  21. package/esm2022/lib/core/models/one-filter.model.mjs +2 -0
  22. package/esm2022/lib/core/models/one-grid-types.model.mjs +2 -0
  23. package/esm2022/lib/core/models/one-master-detail.model.mjs +2 -0
  24. package/esm2022/lib/core/models/one-pagination-types.model.mjs +2 -0
  25. package/esm2022/lib/core/models/one-row.model.mjs +13 -0
  26. package/esm2022/lib/core/models/one-tree-data.model.mjs +2 -0
  27. package/esm2022/lib/core/models/one-validation.model.mjs +2 -0
  28. package/esm2022/lib/core/pipes/cell-action-button-enable.pipe.mjs +21 -0
  29. package/esm2022/lib/core/pipes/cell-action-button-visible.pipe.mjs +17 -0
  30. package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +26 -0
  31. package/esm2022/lib/core/pipes/cell-editable.pipe.mjs +30 -0
  32. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +21 -0
  33. package/esm2022/lib/core/pipes/cell-field-value.pipe.mjs +25 -0
  34. package/esm2022/lib/core/pipes/cell-field.pipe.mjs +20 -0
  35. package/esm2022/lib/core/pipes/cell-invalid.pipe.mjs +21 -0
  36. package/esm2022/lib/core/pipes/cell-key.pipe.mjs +21 -0
  37. package/esm2022/lib/core/pipes/cell-level-padding.pipe.mjs +18 -0
  38. package/esm2022/lib/core/pipes/cell-number-value.pipe.mjs +19 -0
  39. package/esm2022/lib/core/pipes/cell-selected.pipe.mjs +20 -0
  40. package/esm2022/lib/core/pipes/cell-state-group-renderer.pipe.mjs +21 -0
  41. package/esm2022/lib/core/pipes/cell-state-renderer.pipe.mjs +24 -0
  42. package/esm2022/lib/core/pipes/cell-value-getter.pipe.mjs +23 -0
  43. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +19 -0
  44. package/esm2022/lib/core/pipes/header-checkbox-checked.pipe.mjs +17 -0
  45. package/esm2022/lib/core/pipes/header-checkbox-disabled.pipe.mjs +17 -0
  46. package/esm2022/lib/core/pipes/header-checkbox-indeterminate.pipe.mjs +17 -0
  47. package/esm2022/lib/core/services/og-column.service.mjs +81 -0
  48. package/esm2022/lib/core/services/one-grid-cell.service.mjs +88 -0
  49. package/esm2022/lib/core/services/one-grid-event.service.mjs +42 -0
  50. package/esm2022/lib/core/services/one-grid-expansion.service.mjs +40 -0
  51. package/esm2022/lib/core/services/one-grid-row.service.mjs +29 -0
  52. package/esm2022/lib/core/services/one-grid-selection.service.mjs +54 -0
  53. package/esm2022/lib/core/services/one-grid-tree-data.service.mjs +59 -0
  54. package/esm2022/lib/helpers/one-cell.helper.mjs +42 -0
  55. package/esm2022/lib/helpers/one-column-def.helper.mjs +28 -0
  56. package/esm2022/lib/helpers/one-filter.helper.mjs +52 -0
  57. package/esm2022/lib/helpers/one-validation.helper.mjs +95 -0
  58. package/esm2022/lib/index.mjs +19 -0
  59. package/esm2022/lib/one-grid.module.mjs +142 -0
  60. package/esm2022/one-grid-core-angular.mjs +5 -0
  61. package/esm2022/public-api.mjs +5 -0
  62. package/fesm2022/one-grid-core-angular.mjs +3573 -0
  63. package/fesm2022/one-grid-core-angular.mjs.map +1 -0
  64. package/index.d.ts +5 -0
  65. package/lib/components/one-grid/one-grid.component.d.ts +139 -0
  66. package/lib/components/one-grid-body/one-grid-body.component.d.ts +176 -0
  67. package/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.d.ts +27 -0
  68. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +16 -0
  69. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +21 -0
  70. package/lib/components/one-grid-checkbox/one-grid-checkbox.component.d.ts +19 -0
  71. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +24 -0
  72. package/lib/components/one-grid-header/one-grid-header.component.d.ts +41 -0
  73. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +21 -0
  74. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +59 -0
  75. package/lib/components/one-grid-status/one-grid-status.component.d.ts +15 -0
  76. package/lib/core/directives/one-cell-input-validator.directive.d.ts +15 -0
  77. package/lib/core/directives/one-cell-renderer-component.directive.d.ts +20 -0
  78. package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -0
  79. package/lib/core/instants/one-grid-api.class.d.ts +161 -0
  80. package/lib/core/instants/one-row-node.class.d.ts +49 -0
  81. package/lib/core/models/constants/one-pagination.constant.d.ts +1 -0
  82. package/lib/core/models/one-column-def-types.model.d.ts +139 -0
  83. package/lib/core/models/one-event-types.model.d.ts +78 -0
  84. package/lib/core/models/one-filter.model.d.ts +15 -0
  85. package/lib/core/models/one-grid-types.model.d.ts +48 -0
  86. package/lib/core/models/one-master-detail.model.d.ts +18 -0
  87. package/lib/core/models/one-pagination-types.model.d.ts +9 -0
  88. package/lib/core/models/one-row.model.d.ts +38 -0
  89. package/lib/core/models/one-tree-data.model.d.ts +9 -0
  90. package/lib/core/models/one-validation.model.d.ts +9 -0
  91. package/lib/core/pipes/cell-action-button-enable.pipe.d.ts +8 -0
  92. package/lib/core/pipes/cell-action-button-visible.pipe.d.ts +9 -0
  93. package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +9 -0
  94. package/lib/core/pipes/cell-editable.pipe.d.ts +9 -0
  95. package/lib/core/pipes/cell-field-value-empty.pipe.d.ts +7 -0
  96. package/lib/core/pipes/cell-field-value.pipe.d.ts +7 -0
  97. package/lib/core/pipes/cell-field.pipe.d.ts +7 -0
  98. package/lib/core/pipes/cell-invalid.pipe.d.ts +9 -0
  99. package/lib/core/pipes/cell-key.pipe.d.ts +7 -0
  100. package/lib/core/pipes/cell-level-padding.pipe.d.ts +7 -0
  101. package/lib/core/pipes/cell-number-value.pipe.d.ts +7 -0
  102. package/lib/core/pipes/cell-selected.pipe.d.ts +7 -0
  103. package/lib/core/pipes/cell-state-group-renderer.pipe.d.ts +9 -0
  104. package/lib/core/pipes/cell-state-renderer.pipe.d.ts +8 -0
  105. package/lib/core/pipes/cell-value-getter.pipe.d.ts +9 -0
  106. package/lib/core/pipes/column-sort-state.pipe.d.ts +8 -0
  107. package/lib/core/pipes/header-checkbox-checked.pipe.d.ts +9 -0
  108. package/lib/core/pipes/header-checkbox-disabled.pipe.d.ts +9 -0
  109. package/lib/core/pipes/header-checkbox-indeterminate.pipe.d.ts +9 -0
  110. package/lib/core/services/og-column.service.d.ts +22 -0
  111. package/lib/core/services/one-grid-cell.service.d.ts +29 -0
  112. package/lib/core/services/one-grid-event.service.d.ts +17 -0
  113. package/lib/core/services/one-grid-expansion.service.d.ts +13 -0
  114. package/lib/core/services/one-grid-row.service.d.ts +15 -0
  115. package/lib/core/services/one-grid-selection.service.d.ts +17 -0
  116. package/lib/core/services/one-grid-tree-data.service.d.ts +10 -0
  117. package/lib/helpers/one-cell.helper.d.ts +26 -0
  118. package/lib/helpers/one-column-def.helper.d.ts +17 -0
  119. package/lib/helpers/one-filter.helper.d.ts +20 -0
  120. package/lib/helpers/one-validation.helper.d.ts +21 -0
  121. package/lib/index.d.ts +18 -0
  122. package/lib/one-grid.module.d.ts +45 -0
  123. package/package.json +48 -0
  124. package/public-api.d.ts +1 -0
  125. package/scss/_one-grid.scss +999 -0
@@ -0,0 +1,591 @@
1
+ import { OneRowNode } from "./one-row-node.class";
2
+ import { filterTreeNode } from "../../helpers/one-filter.helper";
3
+ import { getFieldValue } from "../../helpers/one-cell.helper";
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ import { Injectable } from "@angular/core";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../services/og-column.service";
8
+ import * as i2 from "../services/one-grid-row.service";
9
+ import * as i3 from "../services/one-grid-cell.service";
10
+ import * as i4 from "../services/one-grid-event.service";
11
+ import * as i5 from "../services/one-grid-selection.service";
12
+ import * as i6 from "../services/one-grid-expansion.service";
13
+ export class OneGridApi {
14
+ constructor(columnService, rowService, cellService, eventService, selectionService, expansionService) {
15
+ this.columnService = columnService;
16
+ this.rowService = rowService;
17
+ this.cellService = cellService;
18
+ this.eventService = eventService;
19
+ this.selectionService = selectionService;
20
+ this.expansionService = expansionService;
21
+ this.context = null;
22
+ this.rowSelection = null;
23
+ this.apiType = null;
24
+ this.rowNodes = [];
25
+ this.sortModel = [];
26
+ this.rowHeight = 26;
27
+ this.headerRowHeight = 32;
28
+ this._currentIndex = 0;
29
+ this._quickFilterValue = null;
30
+ this._activeFilters = [];
31
+ this._visibleRowNodes = [];
32
+ this._originalRowNodes = new Map();
33
+ this._nodeCleanupMap = new Map(); // Cleanup registry (prevents memory leaks)
34
+ this._destroyed = false;
35
+ // Advanced Features
36
+ this.treeData = false;
37
+ this.treeDataChildrenField = null;
38
+ this.groupDefaultExpanded = 0;
39
+ this.masterDetail = false;
40
+ }
41
+ init(gridApiType, rowSelection, columnDefs, defaultColumnDef, context, masterDetail, detailCellRendererParams, detailRendererComponent, treeData, groupColumnDefs) {
42
+ this.id = uuidv4();
43
+ this.apiType = gridApiType;
44
+ this.rowSelection = rowSelection;
45
+ this.context = context;
46
+ this.masterDetail = masterDetail;
47
+ this.detailCellRendererParams = detailCellRendererParams;
48
+ this.detailRendererComponent = detailRendererComponent;
49
+ this.treeData = treeData;
50
+ this.selectionService.setSelectionMode(this.rowSelection);
51
+ this.rowService.setGetRowIdFn(this.context?.componentParent?.getRowId ?? null);
52
+ this.cellService.applyColumnDefs(columnDefs, context);
53
+ this.columnService.initColumnDefs(defaultColumnDef, columnDefs, groupColumnDefs);
54
+ const columnState = this.columnService.getColumnState();
55
+ setTimeout(() => this.eventService.dispatchEvent('columnChanged', columnState));
56
+ }
57
+ /**
58
+ * Create Row Node & Clear All State IDS
59
+ */
60
+ setRowData(rowData) {
61
+ const validRowIds = new Set();
62
+ // Clear All State IDS
63
+ this.selectionService.deselectAll();
64
+ this.expansionService.clear();
65
+ // Build New Row Nodes
66
+ this.buildRowNodes(rowData, null, 0, validRowIds);
67
+ // Apply Filter
68
+ this.applyFilters();
69
+ // Remove invalid nodes from map
70
+ for (const rowId of this._originalRowNodes.keys()) {
71
+ if (!validRowIds.has(rowId)) {
72
+ this._originalRowNodes.delete(rowId);
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Create Row Nodes & Not Clear State IDS
78
+ */
79
+ updateRowData(rowData) {
80
+ const validRowIds = new Set();
81
+ // Build New Row Nodes
82
+ this.buildRowNodes(rowData, null, 0, validRowIds);
83
+ // Apply Filter
84
+ this.applyFilters();
85
+ // Remove invalid nodes from map
86
+ for (const rowId of this._originalRowNodes.keys()) {
87
+ if (!validRowIds.has(rowId)) {
88
+ this._originalRowNodes.delete(rowId);
89
+ }
90
+ }
91
+ }
92
+ /**
93
+ * Recursive Build Row Nodes (Optimized)
94
+ */
95
+ buildRowNodes(rowData, parent = null, level = 0, validRowIds = new Set(), expandedIds = new Set(this.expansionService.getExpandedIds()), collapsedIds = new Set(this.expansionService.getCollapsedIds()), selectedIds = new Set(this.selectionService.getSelectedIds())) {
96
+ if (parent === null) {
97
+ this.rowNodes = [];
98
+ this._currentIndex = 0;
99
+ }
100
+ if (!rowData?.length)
101
+ return [];
102
+ const nodes = [];
103
+ for (const data of rowData) {
104
+ const rowId = this.rowService.generateRowId(data, this._currentIndex);
105
+ const children = data[this.treeDataChildrenField] || null;
106
+ let node = this._originalRowNodes.get(rowId);
107
+ validRowIds.add(rowId);
108
+ if (node) {
109
+ node.data = data;
110
+ node.setRowIndex(this._currentIndex);
111
+ }
112
+ else {
113
+ node = new OneRowNode(rowId, data, this._currentIndex);
114
+ node.level = level;
115
+ node.parent = parent;
116
+ node.detailRendererComponent = this.detailRendererComponent;
117
+ this._originalRowNodes.set(rowId, node);
118
+ if (this.masterDetail) {
119
+ this.subscribeToDetailChanges(node);
120
+ }
121
+ }
122
+ const childrenExist = children && children.length >= 0;
123
+ node.group = this.masterDetail ? false : childrenExist;
124
+ node.leaf = this.masterDetail ? true : !node.group;
125
+ node.leafGroup = this.masterDetail ? false : (node.group && !childrenExist);
126
+ node.expandable = this.masterDetail ? true : (node.group && !node.leafGroup);
127
+ const defaultExpanded = node.expandable && (level < this.groupDefaultExpanded || this.groupDefaultExpanded === -1);
128
+ node.setExpanded(expandedIds.has(rowId) ? true : collapsedIds.has(rowId) ? false : defaultExpanded);
129
+ node.setSelected(selectedIds.has(rowId));
130
+ node.setCellStates(this.cellService.generateCellStates(node));
131
+ if (this.masterDetail && this.apiType === 'master') {
132
+ this.getDetailRowData({ data, node: node, successCallback: (detailRowData) => node.setDetailRowData(detailRowData) });
133
+ }
134
+ this._currentIndex++;
135
+ this.rowNodes.push(node);
136
+ nodes.push(node);
137
+ node.children = this.treeData && childrenExist ? this.buildRowNodes(children || [], node, level + 1, validRowIds, expandedIds, collapsedIds, selectedIds) : [];
138
+ }
139
+ return nodes;
140
+ }
141
+ /**
142
+ * Filter Feature
143
+ */
144
+ applyFilters() {
145
+ const filters = this._activeFilters;
146
+ const quick = this._quickFilterValue?.toLowerCase() ?? '';
147
+ this.rowNodes.forEach(node => filterTreeNode(node, filters, quick));
148
+ this.refreshVisibleNodes();
149
+ }
150
+ /**
151
+ * Update Row Nodes Display
152
+ */
153
+ refreshVisibleNodes() {
154
+ if (this._destroyed)
155
+ return;
156
+ const visibleNodes = [];
157
+ let rowNumber = 1;
158
+ const visibilityCache = new Map();
159
+ for (const node of this.rowNodes) {
160
+ const parentVisible = node.parent ? visibilityCache.get(node.parent.rowId) : true;
161
+ const isVisible = node.visible && parentVisible && (!node.parent || node.parent.expanded);
162
+ visibilityCache.set(node.rowId, isVisible);
163
+ if (isVisible) {
164
+ node.cellStates['_oneRowNumber'] = { type: 'text', value: rowNumber++ };
165
+ node.cellStates = { ...node.cellStates };
166
+ visibleNodes.push(node);
167
+ }
168
+ else {
169
+ node.cellStates['_oneRowNumber'] = { type: 'none', value: null };
170
+ }
171
+ }
172
+ this._visibleRowNodes = [...visibleNodes];
173
+ this.eventService.dispatchEvent('rowDataChanged', { nodes: visibleNodes });
174
+ }
175
+ getVisibleRowNodes() {
176
+ return this._visibleRowNodes;
177
+ }
178
+ /**
179
+ * Sorting Model Feature
180
+ */
181
+ onSortChanged(sortModel) {
182
+ this.sortModel = sortModel;
183
+ this.applySorting();
184
+ this.eventService.dispatchEvent('sortChanged', { nodes: this.rowNodes });
185
+ }
186
+ applySorting() {
187
+ if (this.sortModel.length === 0) {
188
+ this.rowNodes = [...this._originalRowNodes.values()];
189
+ return;
190
+ }
191
+ this.rowNodes = [...this._originalRowNodes.values()].sort((a, b) => {
192
+ for (const sortItem of this.sortModel) {
193
+ const { colId, sort } = sortItem;
194
+ const valA = getFieldValue(a.data, colId);
195
+ const valB = getFieldValue(b.data, colId);
196
+ const comparisonResult = this.compareValues(valA, valB, sort);
197
+ if (comparisonResult !== 0) {
198
+ return comparisonResult;
199
+ }
200
+ }
201
+ return 0;
202
+ });
203
+ }
204
+ compareValues(valA, valB, sortDirection) {
205
+ if (valA === null && valB === null)
206
+ return 0;
207
+ if (valA === null)
208
+ return sortDirection === 'asc' ? 1 : -1;
209
+ if (valB === null)
210
+ return sortDirection === 'asc' ? -1 : 1;
211
+ if (typeof valA === 'string' && typeof valB === 'string') {
212
+ const comparison = valA.localeCompare(valB, undefined, { numeric: true });
213
+ return sortDirection === 'asc' ? comparison : -comparison;
214
+ }
215
+ if (valA < valB)
216
+ return sortDirection === 'asc' ? -1 : 1;
217
+ if (valA > valB)
218
+ return sortDirection === 'asc' ? 1 : -1;
219
+ return 0;
220
+ }
221
+ /**
222
+ * Row Selection Feature (Optimized)
223
+ */
224
+ selectAll() {
225
+ const rowIds = [];
226
+ this._originalRowNodes.forEach(node => {
227
+ node.setSelected(true);
228
+ node.cellStates = { ...node.cellStates };
229
+ rowIds.push(node.rowId);
230
+ });
231
+ this.selectionService.selectAll(rowIds);
232
+ this.eventService.dispatchEvent('selectionChanged', { allNodesNotSelected: false, allNodesSelected: true, selected: true, node: null });
233
+ }
234
+ /**
235
+ * Deselect all nodes (optimized)
236
+ */
237
+ deselectAll() {
238
+ this._originalRowNodes.forEach(node => {
239
+ node.setSelected(false);
240
+ node.cellStates = { ...node.cellStates };
241
+ });
242
+ this.selectionService.deselectAll();
243
+ if (this.selectionService.getSelectionMode() === 'multiple') {
244
+ this.eventService.dispatchEvent('selectionChanged', {
245
+ allNodesNotSelected: true,
246
+ allNodesSelected: false,
247
+ selected: false,
248
+ node: null
249
+ });
250
+ }
251
+ }
252
+ toggleSelection(rowId, selected) {
253
+ const node = this.getRowNodeById(rowId);
254
+ if (node) {
255
+ node.setSelected(selected);
256
+ this.selectionService.toggleSelection(rowId, selected);
257
+ this.eventService.dispatchEvent('selectionChanged', { node, data: node.data, selected });
258
+ }
259
+ }
260
+ setSelectedById(rowId) {
261
+ const node = this.getRowNodeById(rowId);
262
+ if (node) {
263
+ if (this.selectionService.getSelectionMode() === 'single') {
264
+ this.rowNodes.forEach(rowNode => rowNode.setSelected(rowNode.rowId === node.rowId));
265
+ this._originalRowNodes.forEach(rowNode => rowNode.setSelected(rowNode.rowId === node.rowId));
266
+ }
267
+ else {
268
+ node.setSelected(true);
269
+ }
270
+ this.selectionService.toggleSelection(rowId, true);
271
+ this.eventService.dispatchEvent('selectionChanged', { node, selected: true });
272
+ }
273
+ }
274
+ setSelectedByIds(rowIds, selected = true) {
275
+ rowIds.forEach(rowId => {
276
+ const node = this._originalRowNodes.get(rowId);
277
+ if (node) {
278
+ node.setSelected(selected);
279
+ node.cellStates = { ...node.cellStates };
280
+ this.selectionService.toggleSelection(rowId, selected);
281
+ }
282
+ });
283
+ this.eventService.dispatchEvent('selectionChanged', { node: null });
284
+ }
285
+ /**
286
+ * Get & Set Functions
287
+ */
288
+ getAllRowNodes() {
289
+ return this.rowNodes?.length > 0 ? [...this.rowNodes] : [];
290
+ }
291
+ getRowDataSelected() {
292
+ return this.rowNodes.filter(node => node.selected).map(node => ({ ...node.data }));
293
+ }
294
+ getSelectedRowNodes() {
295
+ const nodes = this.rowNodes.filter(node => node.selected);
296
+ return nodes && nodes.length > 0 ? [...nodes] : [];
297
+ }
298
+ /**
299
+ * Column filters
300
+ */
301
+ getFilterModel() {
302
+ return this._activeFilters;
303
+ }
304
+ setFilterModel(model) {
305
+ this._activeFilters = model;
306
+ this.applyFilters();
307
+ }
308
+ filterActive(field) {
309
+ return this._activeFilters.some(f => f.field === field && f.conditions.length > 0);
310
+ }
311
+ /**
312
+ * Quick filter
313
+ */
314
+ setQuickFilter(value) {
315
+ this._quickFilterValue = (value || '').toLowerCase();
316
+ this.applyFilters();
317
+ }
318
+ /**
319
+ * Validation Feature
320
+ */
321
+ validateRow(row, columns) {
322
+ const errors = {};
323
+ columns.forEach(col => {
324
+ // Only check columns with validationRule
325
+ if (!col.validationRules || col.validationRules.length === 0)
326
+ return;
327
+ const rules = col.validationRules;
328
+ for (const rule of rules) {
329
+ const error = rule(row[col.field], row);
330
+ if (error) {
331
+ errors[col.field] = error;
332
+ break; // stop at first error for this column
333
+ }
334
+ }
335
+ });
336
+ return errors;
337
+ }
338
+ /**
339
+ * Validate all rows and return both errors and a flag indicating if there are any errors
340
+ */
341
+ validateAllRows(rowData, columns) {
342
+ const allErrors = rowData.map(row => {
343
+ const errors = {};
344
+ columns.forEach(col => {
345
+ if (!col.validationRules || col.validationRules.length === 0)
346
+ return;
347
+ for (const rule of col.validationRules) {
348
+ const error = rule(row[col.field], row);
349
+ if (error) {
350
+ errors[col.field] = error;
351
+ break;
352
+ }
353
+ }
354
+ });
355
+ return errors;
356
+ });
357
+ const hasErrors = allErrors.some(err => Object.keys(err).length > 0);
358
+ return { errors: allErrors, valid: !hasErrors, invalid: hasErrors };
359
+ }
360
+ /** Traverse all nodes */
361
+ forEachNode(callback) {
362
+ const visit = (nodes) => {
363
+ nodes.forEach((node, index) => {
364
+ callback(node, index);
365
+ if (node?.children?.length)
366
+ visit(node.children);
367
+ });
368
+ };
369
+ visit(this.rowNodes);
370
+ }
371
+ /** Traverse only leaf nodes */
372
+ forEachLeafNode(callback) {
373
+ let leafIndex = 0;
374
+ const visit = (nodes) => {
375
+ nodes.forEach(node => {
376
+ if (node.leaf) {
377
+ callback(node, leafIndex++);
378
+ }
379
+ else if (node.group && node?.children?.length) {
380
+ visit(node.children);
381
+ }
382
+ });
383
+ };
384
+ visit(this.rowNodes);
385
+ }
386
+ getRowNodeById(rowId) {
387
+ return this._originalRowNodes.get(rowId);
388
+ }
389
+ /**
390
+ * Expand/collapse a node
391
+ */
392
+ setTreeDataChildrenField(field) {
393
+ this.treeDataChildrenField = field;
394
+ }
395
+ setGroupDefaultExpanded(defaultExpanded) {
396
+ this.groupDefaultExpanded = defaultExpanded;
397
+ }
398
+ toggleExpandAll(expanded) {
399
+ this.forEachNode(node => {
400
+ node.setExpanded(expanded);
401
+ this.expansionService.toggleExpanded(node.rowId, expanded);
402
+ });
403
+ this.refreshVisibleNodes();
404
+ }
405
+ setExpandedById(rowId, expanded) {
406
+ const node = this._originalRowNodes.get(rowId);
407
+ if (node) {
408
+ node.setExpanded(expanded);
409
+ this.expansionService.toggleExpanded(rowId, expanded);
410
+ }
411
+ this.refreshVisibleNodes();
412
+ }
413
+ setExpandedByIds(rowIds, expanded) {
414
+ if (rowIds && rowIds.length > 0) {
415
+ for (let rowId of rowIds) {
416
+ const node = this._originalRowNodes.get(rowId);
417
+ if (node) {
418
+ node.setExpanded(expanded);
419
+ this.expansionService.toggleExpanded(rowId, expanded);
420
+ }
421
+ }
422
+ this.refreshVisibleNodes();
423
+ }
424
+ }
425
+ getExpandedByIds() {
426
+ return Array.from(this.expansionService.getExpandedIds());
427
+ }
428
+ /**
429
+ * Master Detail Feature
430
+ */
431
+ setDetailRowData(node, detailData) {
432
+ const rowNode = this.getRowNodeById(node.rowId);
433
+ if (rowNode) {
434
+ rowNode.setDetailRowData(detailData);
435
+ }
436
+ }
437
+ setGetDetailRowData(getDetailRowData) {
438
+ this.getDetailRowData = getDetailRowData;
439
+ }
440
+ /**
441
+ * Columns State
442
+ */
443
+ getColumnState() {
444
+ return this.columnService.getColumnState();
445
+ }
446
+ setColumnDefs(columnDefs) {
447
+ this.columnService.setColumnDefs(columnDefs);
448
+ const columnState = this.columnService.getColumnState();
449
+ this.cellService.applyColumnDefs(columnState.columns, this.context);
450
+ this.eventService.dispatchEvent('columnChanged', columnState);
451
+ }
452
+ updateColumn(id, changes) {
453
+ this.columnService.updateColumnDef(id, changes);
454
+ const columnState = this.columnService.getColumnState();
455
+ this.cellService.applyColumnDefs(columnState.columns, this.context);
456
+ this.eventService.dispatchEvent('columnChanged', columnState);
457
+ }
458
+ reorderColumnDefs(fromIndex, toIndex) {
459
+ this.columnService.reorderColumnDefs(fromIndex, toIndex);
460
+ const columnState = this.columnService.getColumnState();
461
+ this.eventService.dispatchEvent('columnChanged', columnState);
462
+ }
463
+ /**
464
+ * Update checkbox selection features
465
+ */
466
+ setNodeAndChildrenSelected(node, selected) {
467
+ const rowIds = new Set();
468
+ const collect = (n) => {
469
+ rowIds.add(n.rowId);
470
+ if (n.children && n.children.length) {
471
+ n.children.forEach(child => collect(child));
472
+ }
473
+ };
474
+ collect(node);
475
+ this.setSelectedByIds(Array.from(rowIds), selected);
476
+ }
477
+ updateNodeStates(node) {
478
+ const rowNode = this.getRowNodeById(node.rowId);
479
+ if (rowNode) {
480
+ rowNode.cellStates = this.cellService.generateCellStates(rowNode);
481
+ }
482
+ }
483
+ updateCellState(node, column) {
484
+ const rowNode = this.getRowNodeById(node.rowId);
485
+ if (rowNode) {
486
+ rowNode.cellStates[column.field] = this.cellService.generateCellState(rowNode, column);
487
+ }
488
+ }
489
+ updateCellStates(node) {
490
+ const rowNode = this.getRowNodeById(node.rowId);
491
+ if (rowNode) {
492
+ rowNode.cellStates = this.cellService.generateCellStates(rowNode);
493
+ }
494
+ }
495
+ /**
496
+ * Handler that Reacts to Detail Changes
497
+ */
498
+ subscribeToDetailChanges(node) {
499
+ const unsubRowData = node.on('rowDataChanged', ({ node, data, previousData }) => {
500
+ });
501
+ // When detail data arrives
502
+ const unsubDetail = node.on('detailRowDataChanged', ({ node, detailRowData, previousDetailRowData }) => {
503
+ if (this.apiType === 'master') {
504
+ this._resolvedDetailRowHeight(node);
505
+ }
506
+ });
507
+ // When row expands
508
+ const unsubExpand = node.on('expandedChanged', ({ node, expanded }) => {
509
+ // if (!expanded) return;
510
+ // // Only fetch if detail data not already loaded
511
+ // if (!node.detailRowData) {
512
+ // this.getDetailRowData({ data: node.data, node, successCallback: (detailRowData) => node.setDetailRowData(detailRowData) });
513
+ // }
514
+ });
515
+ // // Cleanup when node is removed from grid
516
+ this.registerNodeCleanup(node.rowId, [unsubDetail, unsubExpand]);
517
+ }
518
+ registerNodeCleanup(rowId, unsubs) {
519
+ // Merge with any existing cleanups for this rowId
520
+ const existing = this._nodeCleanupMap.get(rowId) ?? [];
521
+ this._nodeCleanupMap.set(rowId, [...existing, ...unsubs]);
522
+ }
523
+ cleanupNode(rowId) {
524
+ const cleanups = this._nodeCleanupMap.get(rowId);
525
+ cleanups?.forEach(fn => fn());
526
+ this._nodeCleanupMap.delete(rowId);
527
+ }
528
+ // Call this when rows are removed
529
+ pruneRemovedNodes(validRowIds) {
530
+ for (const [rowId, node] of this._originalRowNodes) {
531
+ if (!validRowIds.has(rowId)) {
532
+ this.cleanupNode(rowId); // unsubscribe listeners
533
+ node.destroy(); // clear node's own listener map
534
+ this._originalRowNodes.delete(rowId);
535
+ }
536
+ }
537
+ }
538
+ /**
539
+ * Resolve Detail Row Height
540
+ */
541
+ _resolvedDetailRowHeight(node) {
542
+ const minRows = this.detailCellRendererParams.detailGridOptions.detailRowHeightOptions.minRows;
543
+ const maxRows = this.detailCellRendererParams.detailGridOptions.detailRowHeightOptions.maxRows;
544
+ const minHeight = (this.rowHeight * minRows) + this.headerRowHeight;
545
+ const maxHeight = (this.rowHeight * maxRows) + this.headerRowHeight;
546
+ const rows = node.detailRowData && node.detailRowData.length ? node.detailRowData.length : 0;
547
+ node.detailRowHeight = rows <= minRows ? minHeight : rows >= maxRows ? maxHeight : (this.rowHeight * rows) + this.headerRowHeight;
548
+ }
549
+ /**
550
+ * On Destroy
551
+ */
552
+ destroy() {
553
+ if (this._destroyed)
554
+ return;
555
+ this._destroyed = true;
556
+ this.rowNodes.forEach(node => {
557
+ node.children = [];
558
+ node.parent = null;
559
+ });
560
+ this.rowNodes = [];
561
+ this._originalRowNodes.clear();
562
+ this._currentIndex = null;
563
+ // Clear services
564
+ if (this.selectionService) {
565
+ this.selectionService.deselectAll();
566
+ }
567
+ this.selectionService = null;
568
+ if (this.expansionService) {
569
+ this.expansionService.clear();
570
+ }
571
+ this.expansionService = null;
572
+ this.eventService = null;
573
+ this.rowService = null;
574
+ this.cellService = null;
575
+ // Clear filters, sorting, context
576
+ this._activeFilters = [];
577
+ this._quickFilterValue = null;
578
+ this.sortModel = [];
579
+ // Clear master/detail/treeData
580
+ this.masterDetail = false;
581
+ this.treeData = false;
582
+ this.treeDataChildrenField = '';
583
+ this.groupDefaultExpanded = 0;
584
+ }
585
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi, deps: [{ token: i1.OgColumnService }, { token: i2.OneGridRowService }, { token: i3.OneGridCellService }, { token: i4.OneGridEventService }, { token: i5.OneGridSelectionService }, { token: i6.OneGridExpansionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
586
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi }); }
587
+ }
588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi, decorators: [{
589
+ type: Injectable
590
+ }], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridRowService }, { type: i3.OneGridCellService }, { type: i4.OneGridEventService }, { type: i5.OneGridSelectionService }, { type: i6.OneGridExpansionService }] });
591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQU1qRCxNQUFNLE9BQU8sVUFBVTtJQWtDckIsWUFDVSxhQUE4QixFQUM5QixVQUE2QixFQUM3QixXQUErQixFQUMvQixZQUFpQyxFQUNqQyxnQkFBeUMsRUFDekMsZ0JBQXlDO1FBTHpDLGtCQUFhLEdBQWIsYUFBYSxDQUFpQjtRQUM5QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFDekMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQXBDNUMsWUFBTyxHQUFRLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFxQixJQUFJLENBQUM7UUFDdEMsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsYUFBUSxHQUFvQixFQUFFLENBQUM7UUFDL0IsY0FBUyxHQUFzQixFQUFFLENBQUM7UUFHakMsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUM3QixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUMx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LFdBQVcsRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBVyxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBVyxDQUFDO1FBRXBDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBVyxDQUFDO1FBRS9CLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXBCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQzsrR0FsM0JVLFVBQVU7bUhBQVYsVUFBVTs7NEZBQVYsVUFBVTtrQkFEdEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiB9IGZyb20gJy4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSBcIi4vb25lLXJvdy1ub2RlLmNsYXNzXCI7XG5pbXBvcnQgeyBPbmVHcmlkVHlwZSwgT25lU29ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9vbmUtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBPbmVGaWx0ZXJNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1leHBhbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsIE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkUm93U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZVwiO1xuaW1wb3J0IHsgZmlsdGVyVHJlZU5vZGUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtZmlsdGVyLmhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb2x1bW5DaGFuZ2VkRXZlbnQsIFJvd1NlbGVjdGlvbk1vZGUgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JvdXBDb2x1bW5EZWYgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRBcGk8VCA9IGFueT4ge1xuXG4gIC8vIENvcmUgRmVhdHVyZXNcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyBjb250ZXh0OiBhbnkgPSBudWxsO1xuICBwdWJsaWMgcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcbiAgcHVibGljIGFwaVR5cGU6IE9uZUdyaWRUeXBlID0gbnVsbDtcbiAgcHVibGljIHJvd05vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcbiAgcHVibGljIHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcblxuXG4gIHByaXZhdGUgcm93SGVpZ2h0OiBudW1iZXIgPSAyNjtcbiAgcHJpdmF0ZSBoZWFkZXJSb3dIZWlnaHQ6IG51bWJlciA9IDMyO1xuICBwcml2YXRlIF9jdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3F1aWNrRmlsdGVyVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlcnM6IE9uZUZpbHRlck1vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIF92aXNpYmxlUm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIF9vcmlnaW5hbFJvd05vZGVzOiBNYXA8c3RyaW5nLCBPbmVSb3dOb2RlPFQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfbm9kZUNsZWFudXBNYXAgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8KCkgPT4gdm9pZD4+KCk7IC8vIENsZWFudXAgcmVnaXN0cnkgKHByZXZlbnRzIG1lbW9yeSBsZWFrcylcbiAgcHJpdmF0ZSBfZGVzdHJveWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gQWR2YW5jZWQgRmVhdHVyZXNcbiAgcHJpdmF0ZSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBncm91cERlZmF1bHRFeHBhbmRlZDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBwcml2YXRlIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50PzogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuXG4gIC8vIEhlbHBlciBGdW5jdGlvbnNcbiAgcHVibGljIGdldERldGFpbFJvd0RhdGE6IChwYXJhbXM6IE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb2x1bW5TZXJ2aWNlOiBPZ0NvbHVtblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3dTZXJ2aWNlOiBPbmVHcmlkUm93U2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZXJ2aWNlOiBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlOiBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGV4cGFuc2lvblNlcnZpY2U6IE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlXG4gICkgeyB9XG5cbiAgaW5pdChcbiAgICBncmlkQXBpVHlwZTogT25lR3JpZFR5cGUsXG4gICAgcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlLFxuICAgIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdLFxuICAgIGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZjxUPixcbiAgICBjb250ZXh0OiBhbnksXG4gICAgbWFzdGVyRGV0YWlsOiBib29sZWFuLFxuICAgIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLFxuICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD4sXG4gICAgdHJlZURhdGE6IGJvb2xlYW4sXG4gICAgZ3JvdXBDb2x1bW5EZWZzOiBPbmVHcm91cENvbHVtbkRlZltdXG4gICkge1xuXG4gICAgdGhpcy5pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuYXBpVHlwZSA9IGdyaWRBcGlUeXBlO1xuICAgIHRoaXMucm93U2VsZWN0aW9uID0gcm93U2VsZWN0aW9uO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBtYXN0ZXJEZXRhaWw7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gICAgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgIHRoaXMudHJlZURhdGEgPSB0cmVlRGF0YTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZXRTZWxlY3Rpb25Nb2RlKHRoaXMucm93U2VsZWN0aW9uKTtcbiAgICB0aGlzLnJvd1NlcnZpY2Uuc2V0R2V0Um93SWRGbih0aGlzLmNvbnRleHQ/LmNvbXBvbmVudFBhcmVudD8uZ2V0Um93SWQgPz8gbnVsbCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5EZWZzLCBjb250ZXh0KTtcbiAgICB0aGlzLmNvbHVtblNlcnZpY2UuaW5pdENvbHVtbkRlZnMoZGVmYXVsdENvbHVtbkRlZiwgY29sdW1uRGVmcywgZ3JvdXBDb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSBhcyBDb2x1bW5DaGFuZ2VkRXZlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUm93IE5vZGUgJiBDbGVhciBBbGwgU3RhdGUgSURTXG4gICAqL1xuICBwdWJsaWMgc2V0Um93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIGNvbnN0IHZhbGlkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvLyBDbGVhciBBbGwgU3RhdGUgSURTXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG5cbiAgICAvLyBCdWlsZCBOZXcgUm93IE5vZGVzXG4gICAgdGhpcy5idWlsZFJvd05vZGVzKHJvd0RhdGEsIG51bGwsIDAsIHZhbGlkUm93SWRzKTtcblxuICAgIC8vIEFwcGx5IEZpbHRlclxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG5cbiAgICAvLyBSZW1vdmUgaW52YWxpZCBub2RlcyBmcm9tIG1hcFxuICAgIGZvciAoY29uc3Qgcm93SWQgb2YgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5rZXlzKCkpIHtcblxuICAgICAgaWYgKCF2YWxpZFJvd0lkcy5oYXMocm93SWQpKSB7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5kZWxldGUocm93SWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUm93IE5vZGVzICYgTm90IENsZWFyIFN0YXRlIElEU1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICBjb25zdCB2YWxpZFJvd0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gQnVpbGQgTmV3IFJvdyBOb2Rlc1xuICAgIHRoaXMuYnVpbGRSb3dOb2Rlcyhyb3dEYXRhLCBudWxsLCAwLCB2YWxpZFJvd0lkcyk7XG5cbiAgICAvLyBBcHBseSBGaWx0ZXJcbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuXG4gICAgLy8gUmVtb3ZlIGludmFsaWQgbm9kZXMgZnJvbSBtYXBcbiAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMua2V5cygpKSB7XG5cbiAgICAgIGlmICghdmFsaWRSb3dJZHMuaGFzKHJvd0lkKSkge1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIEJ1aWxkIFJvdyBOb2RlcyAoT3B0aW1pemVkKVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd05vZGVzPFQ+KFxuICAgIHJvd0RhdGE6IFRbXSxcbiAgICBwYXJlbnQ6IE9uZVJvd05vZGU8VD4gfCBudWxsID0gbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyID0gMCxcbiAgICB2YWxpZFJvd0lkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCksXG4gICAgZXhwYW5kZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmV4cGFuc2lvblNlcnZpY2UuZ2V0RXhwYW5kZWRJZHMoKSksXG4gICAgY29sbGFwc2VkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldENvbGxhcHNlZElkcygpKSxcbiAgICBzZWxlY3RlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RlZElkcygpKVxuICApOiBPbmVSb3dOb2RlW10ge1xuXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXG4gICAgICB0aGlzLnJvd05vZGVzID0gW107XG4gICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuICAgIH1cblxuICAgIGlmICghcm93RGF0YT8ubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBub2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygcm93RGF0YSkge1xuXG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93U2VydmljZS5nZW5lcmF0ZVJvd0lkKGRhdGEsIHRoaXMuX2N1cnJlbnRJbmRleCk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IChkYXRhIGFzIGFueSlbdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGRdIHx8IG51bGw7XG5cbiAgICAgIGxldCBub2RlOiBPbmVSb3dOb2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgICB2YWxpZFJvd0lkcy5hZGQocm93SWQpO1xuXG4gICAgICBpZiAobm9kZSkge1xuXG4gICAgICAgIG5vZGUuZGF0YSA9IGRhdGE7XG4gICAgICAgIG5vZGUuc2V0Um93SW5kZXgodGhpcy5fY3VycmVudEluZGV4KTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlID0gbmV3IE9uZVJvd05vZGU8VD4ocm93SWQsIGRhdGEsIHRoaXMuX2N1cnJlbnRJbmRleCk7XG4gICAgICAgIG5vZGUubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIG5vZGUuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuc2V0KHJvd0lkLCBub2RlKTtcblxuICAgICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuRXhpc3QgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPj0gMDtcblxuICAgICAgbm9kZS5ncm91cCA9IHRoaXMubWFzdGVyRGV0YWlsID8gZmFsc2UgOiBjaGlsZHJlbkV4aXN0O1xuICAgICAgbm9kZS5sZWFmID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogIW5vZGUuZ3JvdXA7XG4gICAgICBub2RlLmxlYWZHcm91cCA9IHRoaXMubWFzdGVyRGV0YWlsID8gZmFsc2UgOiAobm9kZS5ncm91cCAmJiAhY2hpbGRyZW5FeGlzdCk7XG4gICAgICBub2RlLmV4cGFuZGFibGUgPSB0aGlzLm1hc3RlckRldGFpbCA/IHRydWUgOiAobm9kZS5ncm91cCAmJiAhbm9kZS5sZWFmR3JvdXApO1xuXG4gICAgICBjb25zdCBkZWZhdWx0RXhwYW5kZWQgPSBub2RlLmV4cGFuZGFibGUgJiYgKGxldmVsIDwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCB8fCB0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkID09PSAtMSk7XG5cbiAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWRJZHMuaGFzKHJvd0lkKSA/IHRydWUgOiBjb2xsYXBzZWRJZHMuaGFzKHJvd0lkKSA/IGZhbHNlIDogZGVmYXVsdEV4cGFuZGVkKTtcbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0ZWRJZHMuaGFzKHJvd0lkKSk7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgJiYgdGhpcy5hcGlUeXBlID09PSAnbWFzdGVyJykge1xuXG4gICAgICAgIHRoaXMuZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLnJvd05vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIG5vZGUuY2hpbGRyZW4gPSB0aGlzLnRyZWVEYXRhICYmIGNoaWxkcmVuRXhpc3QgPyB0aGlzLmJ1aWxkUm93Tm9kZXMoY2hpbGRyZW4gfHwgW10sIG5vZGUsIGxldmVsICsgMSwgdmFsaWRSb3dJZHMsIGV4cGFuZGVkSWRzLCBjb2xsYXBzZWRJZHMsIHNlbGVjdGVkSWRzKSA6IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgRmVhdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnMoKTogdm9pZCB7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fYWN0aXZlRmlsdGVycztcblxuICAgIGNvbnN0IHF1aWNrID0gdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZT8udG9Mb3dlckNhc2UoKSA/PyAnJztcblxuICAgIHRoaXMucm93Tm9kZXMuZm9yRWFjaChub2RlID0+IGZpbHRlclRyZWVOb2RlKG5vZGUsIGZpbHRlcnMsIHF1aWNrKSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgUm93IE5vZGVzIERpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaFZpc2libGVOb2RlcygpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHZpc2libGVOb2RlczogT25lUm93Tm9kZVtdID0gW107XG5cbiAgICBsZXQgcm93TnVtYmVyID0gMTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMucm93Tm9kZXMpIHtcblxuICAgICAgY29uc3QgcGFyZW50VmlzaWJsZSA9IG5vZGUucGFyZW50ID8gdmlzaWJpbGl0eUNhY2hlLmdldChub2RlLnBhcmVudC5yb3dJZCkgOiB0cnVlO1xuXG4gICAgICBjb25zdCBpc1Zpc2libGUgPSBub2RlLnZpc2libGUgJiYgcGFyZW50VmlzaWJsZSAmJiAoIW5vZGUucGFyZW50IHx8IG5vZGUucGFyZW50LmV4cGFuZGVkKTtcblxuICAgICAgdmlzaWJpbGl0eUNhY2hlLnNldChub2RlLnJvd0lkLCBpc1Zpc2libGUpO1xuXG4gICAgICBpZiAoaXNWaXNpYmxlKSB7XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzWydfb25lUm93TnVtYmVyJ10gPSB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHJvd051bWJlcisrIH07XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgICB2aXNpYmxlTm9kZXMucHVzaChub2RlKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXNbJ19vbmVSb3dOdW1iZXInXSA9IHsgdHlwZTogJ25vbmUnLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3Zpc2libGVSb3dOb2RlcyA9IFsuLi52aXNpYmxlTm9kZXNdO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncm93RGF0YUNoYW5nZWQnLCB7IG5vZGVzOiB2aXNpYmxlTm9kZXMgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzaWJsZVJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRpbmcgTW9kZWwgRmVhdHVyZVxuICAgKi9cbiAgcHVibGljIG9uU29ydENoYW5nZWQoc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSkge1xuXG4gICAgdGhpcy5zb3J0TW9kZWwgPSBzb3J0TW9kZWw7XG5cbiAgICB0aGlzLmFwcGx5U29ydGluZygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc29ydENoYW5nZWQnLCB7IG5vZGVzOiB0aGlzLnJvd05vZGVzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5zb3J0TW9kZWwubGVuZ3RoID09PSAwKSB7XG5cbiAgICAgIHRoaXMucm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJvd05vZGVzID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IHtcblxuICAgICAgZm9yIChjb25zdCBzb3J0SXRlbSBvZiB0aGlzLnNvcnRNb2RlbCkge1xuXG4gICAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQgfSA9IHNvcnRJdGVtO1xuICAgICAgICBjb25zdCB2YWxBID0gZ2V0RmllbGRWYWx1ZShhLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHZhbEIgPSBnZXRGaWVsZFZhbHVlKGIuZGF0YSwgY29sSWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvblJlc3VsdCA9IHRoaXMuY29tcGFyZVZhbHVlcyh2YWxBLCB2YWxCLCBzb3J0KTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvblJlc3VsdCAhPT0gMCkge1xuXG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25SZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKHZhbEE6IGFueSwgdmFsQjogYW55LCBzb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyk6IG51bWJlciB7XG5cbiAgICBpZiAodmFsQSA9PT0gbnVsbCAmJiB2YWxCID09PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodmFsQSA9PT0gbnVsbCkgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIGlmICh2YWxCID09PSBudWxsKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG5cbiAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykge1xuXG4gICAgICBjb25zdCBjb21wYXJpc29uID0gdmFsQS5sb2NhbGVDb21wYXJlKHZhbEIsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gY29tcGFyaXNvbiA6IC1jb21wYXJpc29uO1xuICAgIH1cblxuICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxO1xuICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyBTZWxlY3Rpb24gRmVhdHVyZSAoT3B0aW1pemVkKVxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd0lkczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcblxuICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgICAgcm93SWRzLnB1c2gobm9kZS5yb3dJZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsKHJvd0lkcyk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBhbGxOb2Rlc05vdFNlbGVjdGVkOiBmYWxzZSwgYWxsTm9kZXNTZWxlY3RlZDogdHJ1ZSwgc2VsZWN0ZWQ6IHRydWUsIG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3QgYWxsIG5vZGVzIChvcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG5cbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGlvbk1vZGUoKSA9PT0gJ211bHRpcGxlJykge1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywge1xuICAgICAgICBhbGxOb2Rlc05vdFNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBhbGxOb2Rlc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBub2RlOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWQocm93SWQ6IHN0cmluZykge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdzaW5nbGUnKSB7XG5cbiAgICAgICAgdGhpcy5yb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChyb3dOb2RlLnJvd0lkID09PSBub2RlLnJvd0lkKSk7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChyb3dOb2RlLnJvd0lkID09PSBub2RlLnJvd0lkKSk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGUsIHNlbGVjdGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWRzKHJvd0lkczogc3RyaW5nW10sIHNlbGVjdGVkOiBib29sZWFuID0gdHJ1ZSkge1xuXG4gICAgcm93SWRzLmZvckVhY2gocm93SWQgPT4ge1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgICBpZiAobm9kZSkge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpO1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgbm9kZTogbnVsbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgJiBTZXQgRnVuY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsUm93Tm9kZXMoKTogT25lUm93Tm9kZTxUPltdIHtcblxuICAgIHJldHVybiB0aGlzLnJvd05vZGVzPy5sZW5ndGggPiAwID8gWy4uLnRoaXMucm93Tm9kZXNdIDogW107XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGF0YVNlbGVjdGVkKCk6IFRbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLnNlbGVjdGVkKS5tYXAobm9kZSA9PiAoeyAuLi5ub2RlLmRhdGEgfSkpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkUm93Tm9kZXMoKTogT25lUm93Tm9kZTxUPltdIHtcblxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLnNlbGVjdGVkKTtcblxuICAgIHJldHVybiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPiAwID8gWy4uLm5vZGVzXSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbHVtbiBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyTW9kZWwoKTogT25lRmlsdGVyTW9kZWxbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWx0ZXJNb2RlbChtb2RlbDogT25lRmlsdGVyTW9kZWxbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IG1vZGVsO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJBY3RpdmUoZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlcnMuc29tZShmID0+IGYuZmllbGQgPT09IGZpZWxkICYmIGYuY29uZGl0aW9ucy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWljayBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBzZXRRdWlja0ZpbHRlcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICB0aGlzLl9xdWlja0ZpbHRlclZhbHVlID0gKHZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZVJvdzxUPihyb3c6IFQsIGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG5cbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuXG4gICAgICAvLyBPbmx5IGNoZWNrIGNvbHVtbnMgd2l0aCB2YWxpZGF0aW9uUnVsZVxuICAgICAgaWYgKCFjb2wudmFsaWRhdGlvblJ1bGVzIHx8IGNvbC52YWxpZGF0aW9uUnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJ1bGVzID0gY29sLnZhbGlkYXRpb25SdWxlcztcblxuICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG5cbiAgICAgICAgY29uc3QgZXJyb3IgPSBydWxlKHJvd1tjb2wuZmllbGRdLCByb3cpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuXG4gICAgICAgICAgZXJyb3JzW2NvbC5maWVsZCBhcyBzdHJpbmddID0gZXJyb3I7XG5cbiAgICAgICAgICBicmVhazsgLy8gc3RvcCBhdCBmaXJzdCBlcnJvciBmb3IgdGhpcyBjb2x1bW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbGwgcm93cyBhbmQgcmV0dXJuIGJvdGggZXJyb3JzIGFuZCBhIGZsYWcgaW5kaWNhdGluZyBpZiB0aGVyZSBhcmUgYW55IGVycm9yc1xuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlQWxsUm93czxUPihyb3dEYXRhOiBUW10sIGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogT25lVmFsaWRhdGlvblJlc3VsdDxUPiB7XG5cbiAgICBjb25zdCBhbGxFcnJvcnMgPSByb3dEYXRhLm1hcChyb3cgPT4ge1xuXG4gICAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG5cbiAgICAgICAgaWYgKCFjb2wudmFsaWRhdGlvblJ1bGVzIHx8IGNvbC52YWxpZGF0aW9uUnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNvbC52YWxpZGF0aW9uUnVsZXMpIHtcblxuICAgICAgICAgIGNvbnN0IGVycm9yID0gcnVsZShyb3dbY29sLmZpZWxkXSwgcm93KTtcblxuICAgICAgICAgIGlmIChlcnJvcikge1xuXG4gICAgICAgICAgICBlcnJvcnNbY29sLmZpZWxkIGFzIHN0cmluZ10gPSBlcnJvcjtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9KTtcblxuICAgIGNvbnN0IGhhc0Vycm9ycyA9IGFsbEVycm9ycy5zb21lKGVyciA9PiBPYmplY3Qua2V5cyhlcnIpLmxlbmd0aCA+IDApO1xuXG4gICAgcmV0dXJuIHsgZXJyb3JzOiBhbGxFcnJvcnMsIHZhbGlkOiAhaGFzRXJyb3JzLCBpbnZhbGlkOiBoYXNFcnJvcnMgfTtcbiAgfVxuXG4gIC8qKiBUcmF2ZXJzZSBhbGwgbm9kZXMgKi9cbiAgcHVibGljIGZvckVhY2hOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgY29uc3QgdmlzaXQgPSAobm9kZXM6IE9uZVJvd05vZGU8VD5bXSkgPT4ge1xuXG4gICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuXG4gICAgICAgIGNhbGxiYWNrKG5vZGUsIGluZGV4KTtcblxuICAgICAgICBpZiAobm9kZT8uY2hpbGRyZW4/Lmxlbmd0aCkgdmlzaXQobm9kZS5jaGlsZHJlbik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmlzaXQodGhpcy5yb3dOb2Rlcyk7XG4gIH1cblxuICAvKiogVHJhdmVyc2Ugb25seSBsZWFmIG5vZGVzICovXG4gIHB1YmxpYyBmb3JFYWNoTGVhZk5vZGUoY2FsbGJhY2s6IChub2RlOiBPbmVSb3dOb2RlPFQ+LCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKSB7XG5cbiAgICBsZXQgbGVhZkluZGV4ID0gMDtcblxuICAgIGNvbnN0IHZpc2l0ID0gKG5vZGVzOiBPbmVSb3dOb2RlPFQ+W10pID0+IHtcblxuICAgICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgICBpZiAobm9kZS5sZWFmKSB7XG5cbiAgICAgICAgICBjYWxsYmFjayhub2RlLCBsZWFmSW5kZXgrKyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmdyb3VwICYmIG5vZGU/LmNoaWxkcmVuPy5sZW5ndGgpIHtcblxuICAgICAgICAgIHZpc2l0KG5vZGUuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmlzaXQodGhpcy5yb3dOb2Rlcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93Tm9kZUJ5SWQocm93SWQ6IHN0cmluZyk6IE9uZVJvd05vZGU8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvY29sbGFwc2UgYSBub2RlXG4gICAqL1xuICBwdWJsaWMgc2V0VHJlZURhdGFDaGlsZHJlbkZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZmllbGQ7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQoZGVmYXVsdEV4cGFuZGVkOiBudW1iZXIpIHtcblxuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSBkZWZhdWx0RXhwYW5kZWQ7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRXhwYW5kQWxsKGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICB0aGlzLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKG5vZGUucm93SWQsIGV4cGFuZGVkKVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkKHJvd0lkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGlmIChyb3dJZHMgJiYgcm93SWRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgZm9yIChsZXQgcm93SWQgb2Ygcm93SWRzKSB7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgICBpZiAobm9kZSkge1xuXG4gICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwYW5kZWRCeUlkcygpOiBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmV4cGFuc2lvblNlcnZpY2UuZ2V0RXhwYW5kZWRJZHMoKSk7XG4gIH1cblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBGZWF0dXJlXG4gICAqL1xuICBwdWJsaWMgc2V0RGV0YWlsUm93RGF0YShub2RlOiBPbmVSb3dOb2RlPFQ+LCBkZXRhaWxEYXRhOiBhbnlbXSkge1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICByb3dOb2RlLnNldERldGFpbFJvd0RhdGEoZGV0YWlsRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEdldERldGFpbFJvd0RhdGEoZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5nZXREZXRhaWxSb3dEYXRhID0gZ2V0RGV0YWlsUm93RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIFN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdKTogdm9pZCB7XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2Uuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLmNvbnRleHQpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW4oaWQ6IHN0cmluZywgY2hhbmdlczogUGFydGlhbDxPbmVDb2x1bW5EZWY8VD4+KTogdm9pZCB7XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2UudXBkYXRlQ29sdW1uRGVmKGlkLCBjaGFuZ2VzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLmNvbnRleHQpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIHB1YmxpYyByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2UucmVvcmRlckNvbHVtbkRlZnMoZnJvbUluZGV4LCB0b0luZGV4KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGVja2JveCBzZWxlY3Rpb24gZmVhdHVyZXNcbiAgICovXG4gIHB1YmxpYyBzZXROb2RlQW5kQ2hpbGRyZW5TZWxlY3RlZChub2RlOiBPbmVSb3dOb2RlLCBzZWxlY3RlZDogYm9vbGVhbikge1xuXG4gICAgY29uc3Qgcm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjb2xsZWN0ID0gKG46IE9uZVJvd05vZGUpID0+IHtcblxuICAgICAgcm93SWRzLmFkZChuLnJvd0lkKTtcblxuICAgICAgaWYgKG4uY2hpbGRyZW4gJiYgbi5jaGlsZHJlbi5sZW5ndGgpIHtcblxuICAgICAgICBuLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gY29sbGVjdChjaGlsZCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb2xsZWN0KG5vZGUpO1xuXG4gICAgdGhpcy5zZXRTZWxlY3RlZEJ5SWRzKEFycmF5LmZyb20ocm93SWRzKSwgc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZU5vZGVTdGF0ZXMobm9kZTogT25lUm93Tm9kZSkge1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICByb3dOb2RlLmNlbGxTdGF0ZXMgPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhyb3dOb2RlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZShyb3dOb2RlLCBjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDZWxsU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd05vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgcm93Tm9kZS5jZWxsU3RhdGVzID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMocm93Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgdGhhdCBSZWFjdHMgdG8gRGV0YWlsIENoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IHVuc3ViUm93RGF0YSA9IG5vZGUub24oJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZSwgZGF0YSwgcHJldmlvdXNEYXRhIH0pID0+IHtcblxuXG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIGRldGFpbCBkYXRhIGFycml2ZXNcbiAgICBjb25zdCB1bnN1YkRldGFpbCA9IG5vZGUub24oJ2RldGFpbFJvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZSwgZGV0YWlsUm93RGF0YSwgcHJldmlvdXNEZXRhaWxSb3dEYXRhIH0pID0+IHtcblxuICAgICAgaWYgKHRoaXMuYXBpVHlwZSA9PT0gJ21hc3RlcicpIHtcblxuICAgICAgICB0aGlzLl9yZXNvbHZlZERldGFpbFJvd0hlaWdodChub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdoZW4gcm93IGV4cGFuZHNcbiAgICBjb25zdCB1bnN1YkV4cGFuZCA9IG5vZGUub24oJ2V4cGFuZGVkQ2hhbmdlZCcsICh7IG5vZGUsIGV4cGFuZGVkIH0pID0+IHtcblxuICAgICAgLy8gaWYgKCFleHBhbmRlZCkgcmV0dXJuO1xuXG4gICAgICAvLyAvLyBPbmx5IGZldGNoIGlmIGRldGFpbCBkYXRhIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgICAgLy8gaWYgKCFub2RlLmRldGFpbFJvd0RhdGEpIHtcblxuICAgICAgLy8gICB0aGlzLmdldERldGFpbFJvd0RhdGEoeyBkYXRhOiBub2RlLmRhdGEsIG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIC8vIH1cbiAgICB9KTtcblxuICAgIC8vIC8vIENsZWFudXAgd2hlbiBub2RlIGlzIHJlbW92ZWQgZnJvbSBncmlkXG4gICAgdGhpcy5yZWdpc3Rlck5vZGVDbGVhbnVwKG5vZGUucm93SWQsIFt1bnN1YkRldGFpbCwgdW5zdWJFeHBhbmRdKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJOb2RlQ2xlYW51cChyb3dJZDogc3RyaW5nLCB1bnN1YnM6IEFycmF5PCgpID0+IHZvaWQ+KTogdm9pZCB7XG5cbiAgICAvLyBNZXJnZSB3aXRoIGFueSBleGlzdGluZyBjbGVhbnVwcyBmb3IgdGhpcyByb3dJZFxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fbm9kZUNsZWFudXBNYXAuZ2V0KHJvd0lkKSA/PyBbXTtcblxuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLnNldChyb3dJZCwgWy4uLmV4aXN0aW5nLCAuLi51bnN1YnNdKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cE5vZGUocm93SWQ6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgY29uc3QgY2xlYW51cHMgPSB0aGlzLl9ub2RlQ2xlYW51cE1hcC5nZXQocm93SWQpO1xuXG4gICAgY2xlYW51cHM/LmZvckVhY2goZm4gPT4gZm4oKSk7XG5cbiAgICB0aGlzLl9ub2RlQ2xlYW51cE1hcC5kZWxldGUocm93SWQpO1xuICB9XG5cbiAgLy8gQ2FsbCB0aGlzIHdoZW4gcm93cyBhcmUgcmVtb3ZlZFxuICBwcml2YXRlIHBydW5lUmVtb3ZlZE5vZGVzKHZhbGlkUm93SWRzOiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuXG4gICAgZm9yIChjb25zdCBbcm93SWQsIG5vZGVdIG9mIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMpIHtcblxuICAgICAgaWYgKCF2YWxpZFJvd0lkcy5oYXMocm93SWQpKSB7XG5cbiAgICAgICAgdGhpcy5jbGVhbnVwTm9kZShyb3dJZCk7ICAvLyB1bnN1YnNjcmliZSBsaXN0ZW5lcnNcblxuICAgICAgICBub2RlLmRlc3Ryb3koKTsgICAgICAgICAgIC8vIGNsZWFyIG5vZGUncyBvd24gbGlzdGVuZXIgbWFwXG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5kZWxldGUocm93SWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIERldGFpbCBSb3cgSGVpZ2h0XG4gICAqL1xuICBwcml2YXRlIF9yZXNvbHZlZERldGFpbFJvd0hlaWdodChub2RlOiBPbmVSb3dOb2RlKTogdm9pZCB7XG5cbiAgICBjb25zdCBtaW5Sb3dzID0gdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMuZGV0YWlsR3JpZE9wdGlvbnMuZGV0YWlsUm93SGVpZ2h0T3B0aW9ucy5taW5Sb3dzO1xuICAgIGNvbnN0IG1heFJvd3MgPSB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcy5kZXRhaWxHcmlkT3B0aW9ucy5kZXRhaWxSb3dIZWlnaHRPcHRpb25zLm1heFJvd3M7XG5cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtaW5Sb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuICAgIGNvbnN0IG1heEhlaWdodCA9ICh0aGlzLnJvd0hlaWdodCAqIG1heFJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG5cbiAgICBjb25zdCByb3dzID0gbm9kZS5kZXRhaWxSb3dEYXRhICYmIG5vZGUuZGV0YWlsUm93RGF0YS5sZW5ndGggPyBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoIDogMDtcblxuICAgIG5vZGUuZGV0YWlsUm93SGVpZ2h0ID0gcm93cyA8PSBtaW5Sb3dzID8gbWluSGVpZ2h0IDogcm93cyA+PSBtYXhSb3dzID8gbWF4SGVpZ2h0IDogKHRoaXMucm93SGVpZ2h0ICogcm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBEZXN0cm95XG4gICAqL1xuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICB0aGlzLnJvd05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBub2RlLmNoaWxkcmVuID0gW107XG4gICAgICBub2RlLnBhcmVudCA9IG51bGw7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvd05vZGVzID0gW107XG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5jbGVhcigpO1xuICAgIHRoaXMuX2N1cnJlbnRJbmRleCA9IG51bGw7XG5cbiAgICAvLyBDbGVhciBzZXJ2aWNlc1xuICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UgPSBudWxsIGFzIGFueTtcblxuICAgIGlmICh0aGlzLmV4cGFuc2lvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UgPSBudWxsIGFzIGFueTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlID0gbnVsbCBhcyBhbnk7XG4gICAgdGhpcy5yb3dTZXJ2aWNlID0gbnVsbCBhcyBhbnk7XG4gICAgdGhpcy5jZWxsU2VydmljZSA9IG51bGwgYXMgYW55O1xuXG4gICAgLy8gQ2xlYXIgZmlsdGVycywgc29ydGluZywgY29udGV4dFxuICAgIHRoaXMuX2FjdGl2ZUZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLl9xdWlja0ZpbHRlclZhbHVlID0gbnVsbDtcbiAgICB0aGlzLnNvcnRNb2RlbCA9IFtdO1xuXG4gICAgLy8gQ2xlYXIgbWFzdGVyL2RldGFpbC90cmVlRGF0YVxuICAgIHRoaXMubWFzdGVyRGV0YWlsID0gZmFsc2U7XG4gICAgdGhpcy50cmVlRGF0YSA9IGZhbHNlO1xuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gJyc7XG4gICAgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9IDA7XG4gIH1cbn1cbiJdfQ==