@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.
- package/README.md +168 -0
- package/esm2022/lib/components/one-grid/one-grid.component.mjs +388 -0
- package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +570 -0
- package/esm2022/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.mjs +90 -0
- package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +31 -0
- package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +67 -0
- package/esm2022/lib/components/one-grid-checkbox/one-grid-checkbox.component.mjs +47 -0
- package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +62 -0
- package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +140 -0
- package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +76 -0
- package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +193 -0
- package/esm2022/lib/components/one-grid-status/one-grid-status.component.mjs +35 -0
- package/esm2022/lib/core/directives/one-cell-input-validator.directive.mjs +71 -0
- package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +77 -0
- package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +82 -0
- package/esm2022/lib/core/instants/one-grid-api.class.mjs +591 -0
- package/esm2022/lib/core/instants/one-row-node.class.mjs +90 -0
- package/esm2022/lib/core/models/constants/one-pagination.constant.mjs +2 -0
- package/esm2022/lib/core/models/one-column-def-types.model.mjs +2 -0
- package/esm2022/lib/core/models/one-event-types.model.mjs +2 -0
- package/esm2022/lib/core/models/one-filter.model.mjs +2 -0
- package/esm2022/lib/core/models/one-grid-types.model.mjs +2 -0
- package/esm2022/lib/core/models/one-master-detail.model.mjs +2 -0
- package/esm2022/lib/core/models/one-pagination-types.model.mjs +2 -0
- package/esm2022/lib/core/models/one-row.model.mjs +13 -0
- package/esm2022/lib/core/models/one-tree-data.model.mjs +2 -0
- package/esm2022/lib/core/models/one-validation.model.mjs +2 -0
- package/esm2022/lib/core/pipes/cell-action-button-enable.pipe.mjs +21 -0
- package/esm2022/lib/core/pipes/cell-action-button-visible.pipe.mjs +17 -0
- package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +26 -0
- package/esm2022/lib/core/pipes/cell-editable.pipe.mjs +30 -0
- package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +21 -0
- package/esm2022/lib/core/pipes/cell-field-value.pipe.mjs +25 -0
- package/esm2022/lib/core/pipes/cell-field.pipe.mjs +20 -0
- package/esm2022/lib/core/pipes/cell-invalid.pipe.mjs +21 -0
- package/esm2022/lib/core/pipes/cell-key.pipe.mjs +21 -0
- package/esm2022/lib/core/pipes/cell-level-padding.pipe.mjs +18 -0
- package/esm2022/lib/core/pipes/cell-number-value.pipe.mjs +19 -0
- package/esm2022/lib/core/pipes/cell-selected.pipe.mjs +20 -0
- package/esm2022/lib/core/pipes/cell-state-group-renderer.pipe.mjs +21 -0
- package/esm2022/lib/core/pipes/cell-state-renderer.pipe.mjs +24 -0
- package/esm2022/lib/core/pipes/cell-value-getter.pipe.mjs +23 -0
- package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +19 -0
- package/esm2022/lib/core/pipes/header-checkbox-checked.pipe.mjs +17 -0
- package/esm2022/lib/core/pipes/header-checkbox-disabled.pipe.mjs +17 -0
- package/esm2022/lib/core/pipes/header-checkbox-indeterminate.pipe.mjs +17 -0
- package/esm2022/lib/core/services/og-column.service.mjs +81 -0
- package/esm2022/lib/core/services/one-grid-cell.service.mjs +88 -0
- package/esm2022/lib/core/services/one-grid-event.service.mjs +42 -0
- package/esm2022/lib/core/services/one-grid-expansion.service.mjs +40 -0
- package/esm2022/lib/core/services/one-grid-row.service.mjs +29 -0
- package/esm2022/lib/core/services/one-grid-selection.service.mjs +54 -0
- package/esm2022/lib/core/services/one-grid-tree-data.service.mjs +59 -0
- package/esm2022/lib/helpers/one-cell.helper.mjs +42 -0
- package/esm2022/lib/helpers/one-column-def.helper.mjs +28 -0
- package/esm2022/lib/helpers/one-filter.helper.mjs +52 -0
- package/esm2022/lib/helpers/one-validation.helper.mjs +95 -0
- package/esm2022/lib/index.mjs +19 -0
- package/esm2022/lib/one-grid.module.mjs +142 -0
- package/esm2022/one-grid-core-angular.mjs +5 -0
- package/esm2022/public-api.mjs +5 -0
- package/fesm2022/one-grid-core-angular.mjs +3573 -0
- package/fesm2022/one-grid-core-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/one-grid/one-grid.component.d.ts +139 -0
- package/lib/components/one-grid-body/one-grid-body.component.d.ts +176 -0
- package/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.d.ts +27 -0
- package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +16 -0
- package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +21 -0
- package/lib/components/one-grid-checkbox/one-grid-checkbox.component.d.ts +19 -0
- package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +24 -0
- package/lib/components/one-grid-header/one-grid-header.component.d.ts +41 -0
- package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +21 -0
- package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +59 -0
- package/lib/components/one-grid-status/one-grid-status.component.d.ts +15 -0
- package/lib/core/directives/one-cell-input-validator.directive.d.ts +15 -0
- package/lib/core/directives/one-cell-renderer-component.directive.d.ts +20 -0
- package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -0
- package/lib/core/instants/one-grid-api.class.d.ts +161 -0
- package/lib/core/instants/one-row-node.class.d.ts +49 -0
- package/lib/core/models/constants/one-pagination.constant.d.ts +1 -0
- package/lib/core/models/one-column-def-types.model.d.ts +139 -0
- package/lib/core/models/one-event-types.model.d.ts +78 -0
- package/lib/core/models/one-filter.model.d.ts +15 -0
- package/lib/core/models/one-grid-types.model.d.ts +48 -0
- package/lib/core/models/one-master-detail.model.d.ts +18 -0
- package/lib/core/models/one-pagination-types.model.d.ts +9 -0
- package/lib/core/models/one-row.model.d.ts +38 -0
- package/lib/core/models/one-tree-data.model.d.ts +9 -0
- package/lib/core/models/one-validation.model.d.ts +9 -0
- package/lib/core/pipes/cell-action-button-enable.pipe.d.ts +8 -0
- package/lib/core/pipes/cell-action-button-visible.pipe.d.ts +9 -0
- package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +9 -0
- package/lib/core/pipes/cell-editable.pipe.d.ts +9 -0
- package/lib/core/pipes/cell-field-value-empty.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-field-value.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-field.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-invalid.pipe.d.ts +9 -0
- package/lib/core/pipes/cell-key.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-level-padding.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-number-value.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-selected.pipe.d.ts +7 -0
- package/lib/core/pipes/cell-state-group-renderer.pipe.d.ts +9 -0
- package/lib/core/pipes/cell-state-renderer.pipe.d.ts +8 -0
- package/lib/core/pipes/cell-value-getter.pipe.d.ts +9 -0
- package/lib/core/pipes/column-sort-state.pipe.d.ts +8 -0
- package/lib/core/pipes/header-checkbox-checked.pipe.d.ts +9 -0
- package/lib/core/pipes/header-checkbox-disabled.pipe.d.ts +9 -0
- package/lib/core/pipes/header-checkbox-indeterminate.pipe.d.ts +9 -0
- package/lib/core/services/og-column.service.d.ts +22 -0
- package/lib/core/services/one-grid-cell.service.d.ts +29 -0
- package/lib/core/services/one-grid-event.service.d.ts +17 -0
- package/lib/core/services/one-grid-expansion.service.d.ts +13 -0
- package/lib/core/services/one-grid-row.service.d.ts +15 -0
- package/lib/core/services/one-grid-selection.service.d.ts +17 -0
- package/lib/core/services/one-grid-tree-data.service.d.ts +10 -0
- package/lib/helpers/one-cell.helper.d.ts +26 -0
- package/lib/helpers/one-column-def.helper.d.ts +17 -0
- package/lib/helpers/one-filter.helper.d.ts +20 -0
- package/lib/helpers/one-validation.helper.d.ts +21 -0
- package/lib/index.d.ts +18 -0
- package/lib/one-grid.module.d.ts +45 -0
- package/package.json +48 -0
- package/public-api.d.ts +1 -0
- 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==
|