@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,570 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { Subscription } from 'rxjs';
|
|
3
|
+
import { CellEditablePipe } from '../../core/pipes/cell-editable.pipe';
|
|
4
|
+
import { getCellKey, getFieldValue } from '../../helpers/one-cell.helper';
|
|
5
|
+
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../../core/services/og-column.service";
|
|
8
|
+
import * as i2 from "../../core/services/one-grid-cell.service";
|
|
9
|
+
import * as i3 from "../../core/services/one-grid-event.service";
|
|
10
|
+
import * as i4 from "@angular/common";
|
|
11
|
+
import * as i5 from "@angular/cdk/scrolling";
|
|
12
|
+
import * as i6 from "../one-grid-checkbox/one-grid-checkbox.component";
|
|
13
|
+
import * as i7 from "../one-grid-row-action/one-grid-row-action.component";
|
|
14
|
+
import * as i8 from "../one-grid-cell-group-renderer/one-grid-cell-group-renderer.component";
|
|
15
|
+
import * as i9 from "../../core/directives/one-cell-input-validator.directive";
|
|
16
|
+
import * as i10 from "../../core/directives/one-cell-renderer-component.directive";
|
|
17
|
+
import * as i11 from "../../core/directives/one-cell-text-expand.directive";
|
|
18
|
+
import * as i12 from "../one-grid-cell-option-menu/one-grid-cell-option-menu.component";
|
|
19
|
+
import * as i13 from "../../core/pipes/cell-editable.pipe";
|
|
20
|
+
import * as i14 from "../../core/pipes/cell-invalid.pipe";
|
|
21
|
+
import * as i15 from "../../core/pipes/cell-selected.pipe";
|
|
22
|
+
import * as i16 from "../../core/pipes/cell-action-button-enable.pipe";
|
|
23
|
+
import * as i17 from "../../core/pipes/cell-key.pipe";
|
|
24
|
+
import * as i18 from "../../core/pipes/cell-level-padding.pipe";
|
|
25
|
+
import * as i19 from "../../core/pipes/cell-state-renderer.pipe";
|
|
26
|
+
export class OneGridBodyComponent {
|
|
27
|
+
constructor(colService, cellService, eventService, cdr) {
|
|
28
|
+
this.colService = colService;
|
|
29
|
+
this.cellService = cellService;
|
|
30
|
+
this.eventService = eventService;
|
|
31
|
+
this.cdr = cdr;
|
|
32
|
+
this.rowData = [];
|
|
33
|
+
this.pagination = false;
|
|
34
|
+
this.allowedEdit = true;
|
|
35
|
+
this.enableGroupColumnDefs = false;
|
|
36
|
+
this.submitted = false;
|
|
37
|
+
this.context = null;
|
|
38
|
+
this.columnDefs = [];
|
|
39
|
+
this.cellRenderer = false;
|
|
40
|
+
/**
|
|
41
|
+
* Master Detail Properties
|
|
42
|
+
*/
|
|
43
|
+
this.gridType = 'simple';
|
|
44
|
+
this.masterDetail = false;
|
|
45
|
+
this.masterNode = null;
|
|
46
|
+
// @Input() detailRowHeight: number = null;
|
|
47
|
+
// @Input() detailRowAutoHeight: boolean = false;
|
|
48
|
+
this.detailRowMaxHeight = null;
|
|
49
|
+
this.detailGridTemplate = null;
|
|
50
|
+
/**
|
|
51
|
+
* Tree Data Properties
|
|
52
|
+
*/
|
|
53
|
+
this.treeData = false;
|
|
54
|
+
this.groupDefaultExpanded = -1; // It's work with master detail also
|
|
55
|
+
/**
|
|
56
|
+
* Passing Row Action Events to Parent
|
|
57
|
+
*/
|
|
58
|
+
this.onRowGotoDetail = new EventEmitter();
|
|
59
|
+
this.onRowAddNew = new EventEmitter();
|
|
60
|
+
this.onRowView = new EventEmitter();
|
|
61
|
+
this.onRowCopy = new EventEmitter();
|
|
62
|
+
this.onRowLocation = new EventEmitter();
|
|
63
|
+
this.onRowDocument = new EventEmitter();
|
|
64
|
+
this.onRowDelete = new EventEmitter();
|
|
65
|
+
this.onRowGotoList = new EventEmitter();
|
|
66
|
+
this.onRowEdit = new EventEmitter();
|
|
67
|
+
this.onRowPrint = new EventEmitter();
|
|
68
|
+
this.onRowHistory = new EventEmitter();
|
|
69
|
+
this.onRowOption = new EventEmitter();
|
|
70
|
+
this.onRowLanguage = new EventEmitter();
|
|
71
|
+
this.onRowCellOption = new EventEmitter();
|
|
72
|
+
this.onRowSelection = new EventEmitter();
|
|
73
|
+
this.onShiftDoubleClick = new EventEmitter();
|
|
74
|
+
this.rowCountChanged = new EventEmitter();
|
|
75
|
+
this.expansionChanged = new EventEmitter();
|
|
76
|
+
this.bodyScroll = new EventEmitter();
|
|
77
|
+
this.cellOptionSelect = new EventEmitter();
|
|
78
|
+
/**
|
|
79
|
+
* Selection Range Variables
|
|
80
|
+
*/
|
|
81
|
+
this.rowWidth = 0;
|
|
82
|
+
this.nodes = [];
|
|
83
|
+
this.selectedCells = new Set();
|
|
84
|
+
this.isMouseDown = false;
|
|
85
|
+
this.startCell = null;
|
|
86
|
+
this.lastScrollLeft = 0;
|
|
87
|
+
this.cellEditablePipe = new CellEditablePipe();
|
|
88
|
+
this.subscriptions = new Subscription();
|
|
89
|
+
this.cellRendererParams = {
|
|
90
|
+
gotoDetailButtonStatus: 1,
|
|
91
|
+
addNewButtonStatus: 1,
|
|
92
|
+
viewButtonStatus: 1,
|
|
93
|
+
locationButtonStatus: 1,
|
|
94
|
+
documentButtonStatus: 1,
|
|
95
|
+
copyButtonStatus: 1,
|
|
96
|
+
deleteButtonStatus: 1,
|
|
97
|
+
gotoListButtonStatus: 1,
|
|
98
|
+
optionButtonStatus: 1,
|
|
99
|
+
languageButtonStatus: 1,
|
|
100
|
+
editButtonStatus: 1,
|
|
101
|
+
printButtonStatus: 1,
|
|
102
|
+
historyButtonStatus: 1,
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Virtual Scroll Properties
|
|
106
|
+
*/
|
|
107
|
+
this.itemSize = 30;
|
|
108
|
+
this.minBufferPx = 200;
|
|
109
|
+
this.maxBufferPx = 400;
|
|
110
|
+
}
|
|
111
|
+
ngOnInit() {
|
|
112
|
+
/**
|
|
113
|
+
* Listen Grid Copy Event
|
|
114
|
+
*/
|
|
115
|
+
this.subscriptions.add(this.gridCopy$.subscribe((event) => {
|
|
116
|
+
this.onGridCopy(event);
|
|
117
|
+
}));
|
|
118
|
+
/**
|
|
119
|
+
* Listen Column Changed Event
|
|
120
|
+
*/
|
|
121
|
+
this.subscriptions.add(this.eventService.addEventListener('columnChanged', (payload) => {
|
|
122
|
+
this.columnDefs = [...payload.columns];
|
|
123
|
+
this.cellRenderer = this.columnDefs.some(col => col.cellRendererComponent);
|
|
124
|
+
this.rowWidth = this.columnDefs.reduce((sum, col) => sum + (col.width ? col.width > col.maxWidth ? col.maxWidth : col.width < col.minWidth ? col.minWidth : col.width : col.minWidth), 0);
|
|
125
|
+
this.cdr.markForCheck();
|
|
126
|
+
}));
|
|
127
|
+
/**
|
|
128
|
+
* Listen Row Data Changed Event
|
|
129
|
+
*/
|
|
130
|
+
this.subscriptions.add(this.eventService.addEventListener('rowDataChanged', ({ nodes }) => {
|
|
131
|
+
this.rowCountChanged.emit(nodes?.length ?? 0);
|
|
132
|
+
setTimeout(() => {
|
|
133
|
+
this.viewport?.checkViewportSize();
|
|
134
|
+
this.setVirtualScroll(nodes?.length);
|
|
135
|
+
if (this.masterDetail) {
|
|
136
|
+
this.nodes = nodes.map((node) => {
|
|
137
|
+
if (node.leaf && this.detailRendererComponent) {
|
|
138
|
+
node.detailRendererComponent = this.detailRendererComponent;
|
|
139
|
+
}
|
|
140
|
+
if (node.expanded) {
|
|
141
|
+
this.api.setDetailRowData(node, [...node.detailRowData]);
|
|
142
|
+
}
|
|
143
|
+
return node;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.nodes = nodes;
|
|
148
|
+
}
|
|
149
|
+
this.cdr.markForCheck();
|
|
150
|
+
});
|
|
151
|
+
}));
|
|
152
|
+
/**
|
|
153
|
+
* Listen Sort Changed Event
|
|
154
|
+
*/
|
|
155
|
+
this.subscriptions.add(this.eventService.addEventListener('sortChanged', ({ nodes }) => {
|
|
156
|
+
this.nodes = nodes;
|
|
157
|
+
this.cdr.markForCheck();
|
|
158
|
+
}));
|
|
159
|
+
/**
|
|
160
|
+
* Listen Selection Changed Event
|
|
161
|
+
*/
|
|
162
|
+
this.subscriptions.add(this.eventService.addEventListener('selectionChanged', (payload) => {
|
|
163
|
+
if (payload) {
|
|
164
|
+
this.cdr.markForCheck();
|
|
165
|
+
}
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
onGridReady(params) {
|
|
169
|
+
params.api.setRowData(this.masterNode?.detailRowData ?? []);
|
|
170
|
+
}
|
|
171
|
+
onBodyScroll(event) {
|
|
172
|
+
const scrollLeft = event.target.scrollLeft;
|
|
173
|
+
if (scrollLeft !== this.lastScrollLeft) {
|
|
174
|
+
this.lastScrollLeft = scrollLeft;
|
|
175
|
+
this.bodyScroll.emit(scrollLeft);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Track Rendering Row Node By Row ID
|
|
181
|
+
*/
|
|
182
|
+
trackByRowId(index, node) {
|
|
183
|
+
return node.rowId;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Cell Selection Range Feature
|
|
187
|
+
*/
|
|
188
|
+
startSelection(rowId, field) {
|
|
189
|
+
this.isMouseDown = true;
|
|
190
|
+
this.startCell = { rowId, field };
|
|
191
|
+
this.selectedCells.clear();
|
|
192
|
+
this.selectedCells = new Set(this.selectedCells).add(getCellKey(rowId, field));
|
|
193
|
+
}
|
|
194
|
+
extendSelection(rowId, field) {
|
|
195
|
+
if (!this.isMouseDown || !this.startCell)
|
|
196
|
+
return;
|
|
197
|
+
const rows = this.nodes; // already sorted
|
|
198
|
+
const startRowIndex = rows.findIndex(r => r.rowId === this.startCell.rowId);
|
|
199
|
+
const endRowIndex = rows.findIndex(r => r.rowId === rowId);
|
|
200
|
+
if (startRowIndex === -1 || endRowIndex === -1)
|
|
201
|
+
return;
|
|
202
|
+
const colStartIndex = this.columnDefs.findIndex(c => c.field === this.startCell.field);
|
|
203
|
+
const colEndIndex = this.columnDefs.findIndex(c => c.field === field);
|
|
204
|
+
if (colStartIndex === -1 || colEndIndex === -1)
|
|
205
|
+
return;
|
|
206
|
+
const rowStart = Math.min(startRowIndex, endRowIndex);
|
|
207
|
+
const rowEnd = Math.max(startRowIndex, endRowIndex);
|
|
208
|
+
const colStart = Math.min(colStartIndex, colEndIndex);
|
|
209
|
+
const colEnd = Math.max(colStartIndex, colEndIndex);
|
|
210
|
+
const next = new Set();
|
|
211
|
+
for (let r = rowStart; r <= rowEnd; r++) {
|
|
212
|
+
for (let c = colStart; c <= colEnd; c++) {
|
|
213
|
+
next.add(getCellKey(rows[r].rowId, this.columnDefs[c].field));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
this.selectedCells = next;
|
|
217
|
+
}
|
|
218
|
+
endSelection() {
|
|
219
|
+
this.isMouseDown = false;
|
|
220
|
+
this.startCell = null;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Clear Cells Selected
|
|
224
|
+
*/
|
|
225
|
+
onDocumentClick(event) {
|
|
226
|
+
if (this.bodyRef?.nativeElement) {
|
|
227
|
+
const clickedInside = this.bodyRef.nativeElement.contains(event.target);
|
|
228
|
+
if (!clickedInside) {
|
|
229
|
+
this.selectedCells.clear();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Selection Range Event Hold Mouse Click
|
|
235
|
+
*/
|
|
236
|
+
onGlobalMouseUp() {
|
|
237
|
+
this.endSelection();
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Listen Copy Clipboard Event
|
|
241
|
+
*/
|
|
242
|
+
onGridCopy(event) {
|
|
243
|
+
event.preventDefault();
|
|
244
|
+
if (this.selectedCells.size > 0) {
|
|
245
|
+
const text = this.buildClipboardText();
|
|
246
|
+
event.clipboardData?.setData('text/plain', text);
|
|
247
|
+
this.selectedCells.forEach(cellId => {
|
|
248
|
+
const cellElement = document.querySelector(`[data-cell-id="${cellId}"]`);
|
|
249
|
+
if (cellElement) {
|
|
250
|
+
cellElement.classList.add('one-cell-copied');
|
|
251
|
+
setTimeout(() => cellElement.classList.remove('one-cell-copied'), 400);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
copyToClipboard(value) {
|
|
257
|
+
if (navigator.clipboard?.writeText) {
|
|
258
|
+
navigator.clipboard.writeText(value);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// Fallback (Safari / older browsers)
|
|
262
|
+
const textarea = document.createElement('textarea');
|
|
263
|
+
textarea.value = value;
|
|
264
|
+
textarea.style.position = 'fixed';
|
|
265
|
+
textarea.style.opacity = '0';
|
|
266
|
+
document.body.appendChild(textarea);
|
|
267
|
+
textarea.select();
|
|
268
|
+
document.execCommand('copy');
|
|
269
|
+
document.body.removeChild(textarea);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Build Copy Cell Text to Clipboard
|
|
274
|
+
*/
|
|
275
|
+
buildClipboardText() {
|
|
276
|
+
if (!this.selectedCells.size)
|
|
277
|
+
return '';
|
|
278
|
+
// Parse selected cells
|
|
279
|
+
const selected = Array.from(this.selectedCells).map(key => {
|
|
280
|
+
const [rowId, field] = key.split('--');
|
|
281
|
+
return { rowId, field };
|
|
282
|
+
});
|
|
283
|
+
// Resolve visual row indexes from displayedRows
|
|
284
|
+
const rowIndexes = selected
|
|
285
|
+
.map(s => this.nodes.findIndex(r => r.rowId === s.rowId))
|
|
286
|
+
.filter(i => i !== -1);
|
|
287
|
+
const colIndexes = selected
|
|
288
|
+
.map(s => this.columnDefs.findIndex(c => c.field === s.field))
|
|
289
|
+
.filter(i => i !== -1);
|
|
290
|
+
if (!rowIndexes.length || !colIndexes.length)
|
|
291
|
+
return '';
|
|
292
|
+
const rowStart = Math.min(...rowIndexes);
|
|
293
|
+
const rowEnd = Math.max(...rowIndexes);
|
|
294
|
+
const colStart = Math.min(...colIndexes);
|
|
295
|
+
const colEnd = Math.max(...colIndexes);
|
|
296
|
+
const selectedFields = this.columnDefs
|
|
297
|
+
.slice(colStart, colEnd + 1)
|
|
298
|
+
.map(c => c.field);
|
|
299
|
+
const clipboardLines = [];
|
|
300
|
+
for (let r = rowStart; r <= rowEnd; r++) {
|
|
301
|
+
const row = this.nodes[r];
|
|
302
|
+
const line = selectedFields
|
|
303
|
+
.map(field => {
|
|
304
|
+
const key = `${row.rowId}--${field}`;
|
|
305
|
+
if (!this.selectedCells.has(key)) {
|
|
306
|
+
return '';
|
|
307
|
+
}
|
|
308
|
+
const value = getFieldValue(row.data, field);
|
|
309
|
+
return value ?? '';
|
|
310
|
+
}).join('\t');
|
|
311
|
+
clipboardLines.push(line);
|
|
312
|
+
}
|
|
313
|
+
return clipboardLines.join('\n');
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Binding Events Row Action to Parent
|
|
317
|
+
*/
|
|
318
|
+
invokeRowActionGotoDetail(event) {
|
|
319
|
+
this.onRowGotoDetail.emit(event);
|
|
320
|
+
}
|
|
321
|
+
invokeRowActionAddNew(event) {
|
|
322
|
+
this.onRowAddNew.emit(event);
|
|
323
|
+
}
|
|
324
|
+
invokeRowActionView(event) {
|
|
325
|
+
this.onRowView.emit(event);
|
|
326
|
+
}
|
|
327
|
+
invokeRowActionLocation(event) {
|
|
328
|
+
this.onRowLocation.emit(event);
|
|
329
|
+
}
|
|
330
|
+
invokeRowActionDocument(event) {
|
|
331
|
+
this.onRowDocument.emit(event);
|
|
332
|
+
}
|
|
333
|
+
invokeRowActionCopy(event) {
|
|
334
|
+
this.onRowCopy.emit(event);
|
|
335
|
+
}
|
|
336
|
+
invokeRowActionDelete(event) {
|
|
337
|
+
this.onRowDelete.emit(event);
|
|
338
|
+
}
|
|
339
|
+
invokeRowActionGotoList(event) {
|
|
340
|
+
this.onRowGotoList.emit(event);
|
|
341
|
+
}
|
|
342
|
+
invokeRowActionEdit(event) {
|
|
343
|
+
this.onRowEdit.emit(event);
|
|
344
|
+
}
|
|
345
|
+
invokeRowActionPrint(event) {
|
|
346
|
+
this.onRowPrint.emit(event);
|
|
347
|
+
}
|
|
348
|
+
invokeRowActionHistory(event) {
|
|
349
|
+
this.onRowHistory.emit(event);
|
|
350
|
+
}
|
|
351
|
+
invokeRowActionOption(event) {
|
|
352
|
+
this.onRowOption.emit(event);
|
|
353
|
+
}
|
|
354
|
+
invokeRowActionLanguage(event) {
|
|
355
|
+
this.onRowLanguage.emit(event);
|
|
356
|
+
}
|
|
357
|
+
invokeRowActionCellOption(event) {
|
|
358
|
+
this.onRowCellOption.emit(event);
|
|
359
|
+
}
|
|
360
|
+
invokeRowActionSelection(event) {
|
|
361
|
+
this.onRowSelection.emit(event);
|
|
362
|
+
}
|
|
363
|
+
invokeExpansionChangedClick(event) {
|
|
364
|
+
this.expansionChanged.emit(event);
|
|
365
|
+
}
|
|
366
|
+
cellOptionMenuSelected(event) {
|
|
367
|
+
this.cellOptionSelect.emit(event);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Special Events
|
|
371
|
+
*/
|
|
372
|
+
invokeShiftDoubleClick(node, column) {
|
|
373
|
+
let event = { node, column, data: node.data, rowIndex: node.rowIndex, gridType: null };
|
|
374
|
+
if (this.masterDetail) {
|
|
375
|
+
event = { ...event, gridType: this.gridType, masterNode: this.masterNode };
|
|
376
|
+
}
|
|
377
|
+
this.onShiftDoubleClick.emit(event);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Cell Edit Feature
|
|
381
|
+
*/
|
|
382
|
+
startEdit(event, node, column) {
|
|
383
|
+
const target = event.target;
|
|
384
|
+
if (target.tagName.toLowerCase() === 'i') {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (event.shiftKey) {
|
|
388
|
+
this.invokeShiftDoubleClick(node, column);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
if (!this.cellEditablePipe.transform(node.cellStates, column, node, this.cellService.editableFn, this.cellService.updatableFn, this.allowedEdit)) {
|
|
392
|
+
this.selectedCells.clear();
|
|
393
|
+
const cellKey = getCellKey(node.rowId, column.field);
|
|
394
|
+
this.selectedCells.add(cellKey);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
let rowNode = this.api.getRowNodeById(node.rowId);
|
|
398
|
+
if (rowNode) {
|
|
399
|
+
rowNode.editing[column.field] = true;
|
|
400
|
+
setTimeout(() => {
|
|
401
|
+
const input = document.querySelector(`[data-cell-id="${getCellKey(node.rowId, column.field)}"] input`);
|
|
402
|
+
if (input) {
|
|
403
|
+
input.focus();
|
|
404
|
+
const value = input.value;
|
|
405
|
+
if (value && ["text"].includes(input.type)) {
|
|
406
|
+
input.setSelectionRange(value.length, value.length);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}, 10);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Save Cell Edit Mode
|
|
414
|
+
*/
|
|
415
|
+
stopEdit(node, column, event) {
|
|
416
|
+
let rowNode = this.api.getRowNodeById(node.rowId);
|
|
417
|
+
if (rowNode) {
|
|
418
|
+
event.preventDefault();
|
|
419
|
+
event.stopPropagation();
|
|
420
|
+
const value = event.target.value ?? '';
|
|
421
|
+
this.setCellValueByRowId(node.rowId, column, value);
|
|
422
|
+
rowNode.cellStates = this.cellService.generateCellStates(rowNode);
|
|
423
|
+
rowNode.editing[column.field] = false;
|
|
424
|
+
this.eventService.dispatchEvent('cellStateChanged', {
|
|
425
|
+
data: rowNode.data,
|
|
426
|
+
node: rowNode,
|
|
427
|
+
column: column
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Cancel Cell Edit Mode
|
|
433
|
+
*/
|
|
434
|
+
cancelEdit(node, column) {
|
|
435
|
+
let rowNode = this.api.getRowNodeById(node.rowId);
|
|
436
|
+
if (rowNode) {
|
|
437
|
+
rowNode.editing[column.field] = false;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Set Cell Value
|
|
442
|
+
*/
|
|
443
|
+
setCellValueByRowId(rowId, column, value) {
|
|
444
|
+
const node = this.api.getRowNodeById(rowId);
|
|
445
|
+
if (node && column.field) {
|
|
446
|
+
if (column?.cellRendererParams?.inputType !== 'number') {
|
|
447
|
+
node.data[column.field] = value === '' ? null : value;
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
node.data[column.field] = value === '' ? null : Number(value);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Virtual Scroll Properties
|
|
456
|
+
*/
|
|
457
|
+
setVirtualScroll(items = 0) {
|
|
458
|
+
this.minBufferPx = this.itemSize * items * 1.5;
|
|
459
|
+
this.maxBufferPx = this.minBufferPx * 2;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Unsubscribe All Subscriptions
|
|
463
|
+
*/
|
|
464
|
+
ngOnDestroy() {
|
|
465
|
+
this.subscriptions.unsubscribe();
|
|
466
|
+
}
|
|
467
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridBodyComponent, deps: [{ token: i1.OgColumnService }, { token: i2.OneGridCellService }, { token: i3.OneGridEventService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
468
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridBodyComponent, selector: "one-grid-body", inputs: { rowData: "rowData", rowNumber: "rowNumber", api: "api", pagination: "pagination", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", submitted: "submitted", context: "context", getRowId: "getRowId", gridCopy$: "gridCopy$", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailRowMaxHeight: "detailRowMaxHeight", detailCellRendererParams: "detailCellRendererParams", detailGridTemplate: "detailGridTemplate", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded" }, outputs: { onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowCopy: "onRowCopy", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowCellOption: "onRowCellOption", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", expansionChanged: "expansionChanged", bodyScroll: "bodyScroll", cellOptionSelect: "cellOptionSelect" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:mouseup": "onGlobalMouseUp()" } }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["bodyRef"], descendants: true, static: true }, { propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: "<div #bodyRef class=\"one-grid-body\">\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\" [attr.data-row-id]=\"node.rowId\" [class.one-row-selected]=\"node.selected\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n</div>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <div\n class=\"one-column\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellClass\"\n [ngStyle]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellStyle\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n />\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.OneGridCheckboxComponent, selector: "one-grid-checkbox", inputs: ["node", "allowedEdit", "api"], outputs: ["onRowSelection"] }, { kind: "component", type: i7.OneGridRowActionComponent, selector: "one-grid-row-action", inputs: ["column", "node", "allowedEdit", "masterDetail", "masterNode", "cellRendererParams", "gridType", "context"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption"] }, { kind: "component", type: i8.OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: ["node", "masterDetail", "detailCellRendererParams", "detailRendererComponent"], outputs: ["expansionChanged"] }, { kind: "directive", type: i9.OneCellInputValidatorDirective, selector: "[oneCellInputValidator]", inputs: ["validationType", "regex"] }, { kind: "directive", type: i10.OneCellRendererComponentDirective, selector: "[oneCellRendererComponent]", inputs: ["cellRendererComponent", "params"] }, { kind: "directive", type: i11.OneCellTextExpandDirective, selector: "[oneCellTextExpand]" }, { kind: "component", type: i12.OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: ["column", "node", "options"], outputs: ["cellOptionMenuSelect", "cellOptionMenuClose"] }, { kind: "pipe", type: i13.CellEditablePipe, name: "cellEditable" }, { kind: "pipe", type: i14.CellInvalidPipe, name: "cellInvalid" }, { kind: "pipe", type: i15.CellSelectedPipe, name: "cellSelected" }, { kind: "pipe", type: i16.CellActionButtonEnablePipe, name: "cellActionButtonEnable" }, { kind: "pipe", type: i17.CellKeyPipe, name: "cellKey" }, { kind: "pipe", type: i18.CellLevelPaddingPipe, name: "cellLevelPadding" }, { kind: "pipe", type: i19.CellStateRendererPipe, name: "cellStateRenderer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
469
|
+
}
|
|
470
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridBodyComponent, decorators: [{
|
|
471
|
+
type: Component,
|
|
472
|
+
args: [{ standalone: false, selector: 'one-grid-body', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #bodyRef class=\"one-grid-body\">\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\" [attr.data-row-id]=\"node.rowId\" [class.one-row-selected]=\"node.selected\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n</div>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <div\n class=\"one-column\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellClass\"\n [ngStyle]=\"colService.resolveCellPresentation(column, { node, data: node.data, columnDef: column })._resolvedCellStyle\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"{ data: node.data, field: column.field, rowIndex: node.rowIndex, columnDef: column, node: node, context: context }\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n />\n }\n </div>\n }\n </div>\n</ng-template>\n" }]
|
|
473
|
+
}], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridCellService }, { type: i3.OneGridEventService }, { type: i0.ChangeDetectorRef }], propDecorators: { bodyRef: [{
|
|
474
|
+
type: ViewChild,
|
|
475
|
+
args: ['bodyRef', { static: true }]
|
|
476
|
+
}], rowData: [{
|
|
477
|
+
type: Input,
|
|
478
|
+
args: [{ required: true }]
|
|
479
|
+
}], rowNumber: [{
|
|
480
|
+
type: Input
|
|
481
|
+
}], api: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], pagination: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], allowedEdit: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], enableGroupColumnDefs: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], submitted: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], context: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], getRowId: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], gridCopy$: [{
|
|
496
|
+
type: Input,
|
|
497
|
+
args: [{ required: true }]
|
|
498
|
+
}], viewport: [{
|
|
499
|
+
type: ViewChild,
|
|
500
|
+
args: [CdkVirtualScrollViewport]
|
|
501
|
+
}], gridType: [{
|
|
502
|
+
type: Input
|
|
503
|
+
}], masterDetail: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], masterNode: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], detailRowMaxHeight: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}], detailCellRendererParams: [{
|
|
510
|
+
type: Input
|
|
511
|
+
}], detailGridTemplate: [{
|
|
512
|
+
type: Input
|
|
513
|
+
}], detailRendererComponent: [{
|
|
514
|
+
type: Input
|
|
515
|
+
}], treeData: [{
|
|
516
|
+
type: Input
|
|
517
|
+
}], treeDataChildrenField: [{
|
|
518
|
+
type: Input
|
|
519
|
+
}], autoGroupColumnDef: [{
|
|
520
|
+
type: Input
|
|
521
|
+
}], groupDefaultExpanded: [{
|
|
522
|
+
type: Input
|
|
523
|
+
}], onRowGotoDetail: [{
|
|
524
|
+
type: Output
|
|
525
|
+
}], onRowAddNew: [{
|
|
526
|
+
type: Output
|
|
527
|
+
}], onRowView: [{
|
|
528
|
+
type: Output
|
|
529
|
+
}], onRowCopy: [{
|
|
530
|
+
type: Output
|
|
531
|
+
}], onRowLocation: [{
|
|
532
|
+
type: Output
|
|
533
|
+
}], onRowDocument: [{
|
|
534
|
+
type: Output
|
|
535
|
+
}], onRowDelete: [{
|
|
536
|
+
type: Output
|
|
537
|
+
}], onRowGotoList: [{
|
|
538
|
+
type: Output
|
|
539
|
+
}], onRowEdit: [{
|
|
540
|
+
type: Output
|
|
541
|
+
}], onRowPrint: [{
|
|
542
|
+
type: Output
|
|
543
|
+
}], onRowHistory: [{
|
|
544
|
+
type: Output
|
|
545
|
+
}], onRowOption: [{
|
|
546
|
+
type: Output
|
|
547
|
+
}], onRowLanguage: [{
|
|
548
|
+
type: Output
|
|
549
|
+
}], onRowCellOption: [{
|
|
550
|
+
type: Output
|
|
551
|
+
}], onRowSelection: [{
|
|
552
|
+
type: Output
|
|
553
|
+
}], onShiftDoubleClick: [{
|
|
554
|
+
type: Output
|
|
555
|
+
}], rowCountChanged: [{
|
|
556
|
+
type: Output
|
|
557
|
+
}], expansionChanged: [{
|
|
558
|
+
type: Output
|
|
559
|
+
}], bodyScroll: [{
|
|
560
|
+
type: Output
|
|
561
|
+
}], cellOptionSelect: [{
|
|
562
|
+
type: Output
|
|
563
|
+
}], onDocumentClick: [{
|
|
564
|
+
type: HostListener,
|
|
565
|
+
args: ['document:click', ['$event']]
|
|
566
|
+
}], onGlobalMouseUp: [{
|
|
567
|
+
type: HostListener,
|
|
568
|
+
args: ['document:mouseup']
|
|
569
|
+
}] } });
|
|
570
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzlMLE9BQU8sRUFBVyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVWxFLE1BQU0sT0FBTyxvQkFBb0I7SUFzRy9CLFlBQ1ksVUFBMkIsRUFDM0IsV0FBK0IsRUFDakMsWUFBaUMsRUFDakMsR0FBc0I7UUFIcEIsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQ2pDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXBHTCxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBR3BDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsMEJBQXFCLEdBQVksS0FBSyxDQUFD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Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQWlOUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0IxQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2VsbFNlbGVjdGlvbiwgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkQXBpIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPbmVHcmlkR2V0Um93SWRQYXJhbXMsIE9uZUdyaWRSZWFkeUV2ZW50LCBPbmVHcmlkUm93QWN0aW9uRXZlbnQsIE9uZUdyaWRUeXBlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50LCBSb3dEYXRhQ2hhbmdlZEV2ZW50LCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQsIFNvcnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWwnO1xuaW1wb3J0IHsgQ2VsbEVkaXRhYmxlUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1lZGl0YWJsZS5waXBlJztcbmltcG9ydCB7IGdldENlbGxLZXksIGdldEZpZWxkVmFsdWUgfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlcic7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtYm9keScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWJvZHkuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZEJvZHlDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIENvcmUgUHJvcGVydGllc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9keVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIGJvZHlSZWYhOiBFbGVtZW50UmVmO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSByb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuO1xuICBASW5wdXQoKSBhcGkhOiBPbmVHcmlkQXBpPFQ+O1xuICBASW5wdXQoKSBwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBnZXRSb3dJZDogKHBhcmFtczogT25lR3JpZEdldFJvd0lkUGFyYW1zPFQ+KSA9PiBzdHJpbmc7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGdyaWRDb3B5JCE6IFN1YmplY3Q8Q2xpcGJvYXJkRXZlbnQ+O1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgdmlld3BvcnQhOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdID0gW107XG4gIHByb3RlY3RlZCBjZWxsUmVuZGVyZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnc2ltcGxlJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGU8VD4gPSBudWxsO1xuICAvLyBASW5wdXQoKSBkZXRhaWxSb3dIZWlnaHQ6IG51bWJlciA9IG51bGw7XG4gIC8vIEBJbnB1dCgpIGRldGFpbFJvd0F1dG9IZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGV0YWlsUm93TWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFRyZWUgRGF0YSBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZztcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD47XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAtMTsgLy8gSXQncyB3b3JrIHdpdGggbWFzdGVyIGRldGFpbCBhbHNvXG5cbiAgLyoqXG4gICAqIFBhc3NpbmcgUm93IEFjdGlvbiBFdmVudHMgdG8gUGFyZW50XG4gICAqL1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uU2hpZnREb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgcm93Q291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGJvZHlTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIFZhcmlhYmxlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJvd1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRDZWxscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGlzTW91c2VEb3duID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhcnRDZWxsOiBDZWxsU2VsZWN0aW9uID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsTGVmdCA9IDA7XG4gIHByaXZhdGUgY2VsbEVkaXRhYmxlUGlwZSA9IG5ldyBDZWxsRWRpdGFibGVQaXBlKCk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcm90ZWN0ZWQgY2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVDZWxsUmVuZGVyZXJQYXJhbXMgPSB7XG4gICAgICBnb3RvRGV0YWlsQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgYWRkTmV3QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgdmlld0J1dHRvblN0YXR1czogMSxcbiAgICAgIGxvY2F0aW9uQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZG9jdW1lbnRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBjb3B5QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZGVsZXRlQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZ290b0xpc3RCdXR0b25TdGF0dXM6IDEsXG4gICAgICBvcHRpb25CdXR0b25TdGF0dXM6IDEsXG4gICAgICBsYW5ndWFnZUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGVkaXRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBwcmludEJ1dHRvblN0YXR1czogMSxcbiAgICAgIGhpc3RvcnlCdXR0b25TdGF0dXM6IDEsXG4gIH1cblxuICAvKipcbiAgICogVmlydHVhbCBTY3JvbGwgUHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIGl0ZW1TaXplOiBudW1iZXIgPSAzMDtcbiAgcHJvdGVjdGVkIG1pbkJ1ZmZlclB4OiBudW1iZXIgPSAyMDA7XG4gIHByb3RlY3RlZCBtYXhCdWZmZXJQeDogbnVtYmVyID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb2xTZXJ2aWNlOiBPZ0NvbHVtblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNlbGxTZXJ2aWNlOiBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gR3JpZCBDb3B5IEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmdyaWRDb3B5JC5zdWJzY3JpYmUoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuXG4gICAgICB0aGlzLm9uR3JpZENvcHkoZXZlbnQpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gWy4uLnBheWxvYWQuY29sdW1uc10gYXMgT25lQ29sdW1uRGVmW107XG5cbiAgICAgIHRoaXMuY2VsbFJlbmRlcmVyID0gdGhpcy5jb2x1bW5EZWZzLnNvbWUoY29sID0+IGNvbC5jZWxsUmVuZGVyZXJDb21wb25lbnQpO1xuXG4gICAgICB0aGlzLnJvd1dpZHRoID0gdGhpcy5jb2x1bW5EZWZzLnJlZHVjZSgoc3VtLCBjb2wpID0+IHN1bSArIChjb2wud2lkdGggPyBjb2wud2lkdGggPiBjb2wubWF4V2lkdGggPyBjb2wubWF4V2lkdGggOiBjb2wud2lkdGggPCBjb2wubWluV2lkdGggPyBjb2wubWluV2lkdGggOiBjb2wud2lkdGggOiBjb2wubWluV2lkdGgpLCAwKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZXMgfTogUm93RGF0YUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJvd0NvdW50Q2hhbmdlZC5lbWl0KG5vZGVzPy5sZW5ndGggPz8gMCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgIHRoaXMudmlld3BvcnQ/LmNoZWNrVmlld3BvcnRTaXplKCk7XG5cbiAgICAgICAgdGhpcy5zZXRWaXJ0dWFsU2Nyb2xsKG5vZGVzPy5sZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzLm1hcCgobm9kZTogT25lUm93Tm9kZSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmICYmIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICBub2RlLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUuZXhwYW5kZWQpIHtcblxuICAgICAgICAgICAgICB0aGlzLmFwaS5zZXREZXRhaWxSb3dEYXRhKG5vZGUsIFsuLi5ub2RlLmRldGFpbFJvd0RhdGFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH0pKTtcblxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFNvcnQgQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc29ydENoYW5nZWQnLCAoeyBub2RlcyB9OiBTb3J0Q2hhbmdlZEV2ZW50KSA9PiB7XG5cbiAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBTZWxlY3Rpb24gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uQ2hhbmdlZCcsIChwYXlsb2FkOiBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgaWYgKHBheWxvYWQpIHtcblxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBvbkdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIG9uQm9keVNjcm9sbChldmVudDogRXZlbnQpIHtcblxuICAgIGNvbnN0IHNjcm9sbExlZnQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuXG4gICAgaWYgKHNjcm9sbExlZnQgIT09IHRoaXMubGFzdFNjcm9sbExlZnQpIHtcblxuICAgICAgdGhpcy5sYXN0U2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG5cbiAgICAgIHRoaXMuYm9keVNjcm9sbC5lbWl0KHNjcm9sbExlZnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBSZW5kZXJpbmcgUm93IE5vZGUgQnkgUm93IElEXG4gICAqL1xuICB0cmFja0J5Um93SWQoaW5kZXg6IG51bWJlciwgbm9kZTogT25lUm93Tm9kZTxUPik6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIFNlbGVjdGlvbiBSYW5nZSBGZWF0dXJlXG4gICAqL1xuICBzdGFydFNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IHsgcm93SWQsIGZpZWxkIH07XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ2VsbHMpLmFkZChnZXRDZWxsS2V5KHJvd0lkLCBmaWVsZCkpO1xuICB9XG5cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIGlmICghdGhpcy5pc01vdXNlRG93biB8fCAhdGhpcy5zdGFydENlbGwpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLm5vZGVzOyAvLyBhbHJlYWR5IHNvcnRlZFxuICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSByb3dzLmZpbmRJbmRleChyID0+IHIucm93SWQgPT09IHRoaXMuc3RhcnRDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgZW5kUm93SW5kZXggICA9IHJvd3MuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcm93SWQpO1xuXG4gICAgaWYgKHN0YXJ0Um93SW5kZXggPT09IC0xIHx8IGVuZFJvd0luZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sU3RhcnRJbmRleCA9IHRoaXMuY29sdW1uRGVmcy5maW5kSW5kZXgoYyA9PiBjLmZpZWxkID09PSB0aGlzLnN0YXJ0Q2VsbCEuZmllbGQpO1xuICAgIGNvbnN0IGNvbEVuZEluZGV4ICAgPSB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gZmllbGQpO1xuXG4gICAgaWYgKGNvbFN0YXJ0SW5kZXggPT09IC0xIHx8IGNvbEVuZEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heChzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbihjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG4gICAgY29uc3QgY29sRW5kICAgPSBNYXRoLm1heChjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2xTdGFydDsgYyA8PSBjb2xFbmQ7IGMrKykge1xuICAgICAgICBuZXh0LmFkZChnZXRDZWxsS2V5KHJvd3Nbcl0ucm93SWQsIHRoaXMuY29sdW1uRGVmc1tjXS5maWVsZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IG5leHQ7XG4gIH1cblxuXG4gIGVuZFNlbGVjdGlvbigpIHtcblxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgQ2VsbHMgU2VsZWN0ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50KSB7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmJvZHlSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuXG4gICAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIEV2ZW50IEhvbGQgTW91c2UgQ2xpY2tcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnKVxuICBvbkdsb2JhbE1vdXNlVXAoKSB7XG5cbiAgICB0aGlzLmVuZFNlbGVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBDb3B5IENsaXBib2FyZCBFdmVudFxuICAgKi9cbiAgb25HcmlkQ29weShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENlbGxzLnNpemUgPiAwKSB7XG5cbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkQ2xpcGJvYXJkVGV4dCgpO1xuXG4gICAgICBldmVudC5jbGlwYm9hcmREYXRhPy5zZXREYXRhKCd0ZXh0L3BsYWluJywgdGV4dCk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGxJZCA9PiB7XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1jZWxsLWlkPVwiJHtjZWxsSWR9XCJdYCk7XG5cbiAgICAgICAgaWYgKGNlbGxFbGVtZW50KSB7XG5cbiAgICAgICAgICBjZWxsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvbmUtY2VsbC1jb3BpZWQnKTtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2VsbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb25lLWNlbGwtY29waWVkJyksIDQwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlUb0NsaXBib2FyZCh2YWx1ZTogc3RyaW5nKSB7XG5cbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGVUZXh0KSB7XG5cbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbHVlKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIEZhbGxiYWNrIChTYWZhcmkgLyBvbGRlciBicm93c2VycylcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgIHRleHRhcmVhLnZhbHVlID0gdmFsdWU7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7XG4gICAgICB0ZXh0YXJlYS5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRhcmVhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgQ29weSBDZWxsIFRleHQgdG8gQ2xpcGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ2xpcGJvYXJkVGV4dCgpOiBzdHJpbmcge1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2VsbHMuc2l6ZSkgcmV0dXJuICcnO1xuXG4gICAgLy8gUGFyc2Ugc2VsZWN0ZWQgY2VsbHNcbiAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZENlbGxzKS5tYXAoa2V5ID0+IHtcblxuICAgICAgY29uc3QgW3Jvd0lkLCBmaWVsZF0gPSBrZXkuc3BsaXQoJy0tJyk7XG4gICAgICByZXR1cm4geyByb3dJZCwgZmllbGQgfTtcbiAgICB9KTtcblxuICAgIC8vIFJlc29sdmUgdmlzdWFsIHJvdyBpbmRleGVzIGZyb20gZGlzcGxheWVkUm93c1xuICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBzZWxlY3RlZFxuICAgICAgLm1hcChzID0+IHRoaXMubm9kZXMuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcy5yb3dJZCkpXG4gICAgICAuZmlsdGVyKGkgPT4gaSAhPT0gLTEpO1xuXG4gICAgY29uc3QgY29sSW5kZXhlcyA9IHNlbGVjdGVkXG4gICAgICAubWFwKHMgPT4gdGhpcy5jb2x1bW5EZWZzLmZpbmRJbmRleChjID0+IGMuZmllbGQgPT09IHMuZmllbGQpKVxuICAgICAgLmZpbHRlcihpID0+IGkgIT09IC0xKTtcblxuICAgIGlmICghcm93SW5kZXhlcy5sZW5ndGggfHwgIWNvbEluZGV4ZXMubGVuZ3RoKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCByb3dTdGFydCA9IE1hdGgubWluKC4uLnJvd0luZGV4ZXMpO1xuICAgIGNvbnN0IHJvd0VuZCAgID0gTWF0aC5tYXgoLi4ucm93SW5kZXhlcyk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbiguLi5jb2xJbmRleGVzKTtcbiAgICBjb25zdCBjb2xFbmQgICA9IE1hdGgubWF4KC4uLmNvbEluZGV4ZXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSB0aGlzLmNvbHVtbkRlZnNcbiAgICAgIC5zbGljZShjb2xTdGFydCwgY29sRW5kICsgMSlcbiAgICAgIC5tYXAoYyA9PiBjLmZpZWxkKTtcblxuICAgIGNvbnN0IGNsaXBib2FyZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgciA9IHJvd1N0YXJ0OyByIDw9IHJvd0VuZDsgcisrKSB7XG5cbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMubm9kZXNbcl07XG4gICAgICBjb25zdCBsaW5lID0gc2VsZWN0ZWRGaWVsZHNcbiAgICAgICAgLm1hcChmaWVsZCA9PiB7XG5cbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHtyb3cucm93SWR9LS0ke2ZpZWxkfWA7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDZWxscy5oYXMoa2V5KSkge1xuXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShyb3cuZGF0YSwgZmllbGQpO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xuXG4gICAgICAgIH0pLmpvaW4oJ1xcdCcpO1xuXG4gICAgICBjbGlwYm9hcmRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwYm9hcmRMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kaW5nIEV2ZW50cyBSb3cgQWN0aW9uIHRvIFBhcmVudFxuICAgKi9cbiAgaW52b2tlUm93QWN0aW9uR290b0RldGFpbChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93R290b0RldGFpbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkFkZE5ldyhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93QWRkTmV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uVmlldyhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Vmlldy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxvY2F0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMb2NhdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRvY3VtZW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEb2N1bWVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNvcHkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NvcHkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25EZWxldGUoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkdvdG9MaXN0KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvTGlzdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkVkaXQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0VkaXQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25QcmludChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93UHJpbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25IaXN0b3J5KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dIaXN0b3J5LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uT3B0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25MYW5ndWFnZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93TGFuZ3VhZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dDZWxsT3B0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dTZWxlY3Rpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudCk6IHZvaWQge1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgY2VsbE9wdGlvbk1lbnVTZWxlY3RlZChldmVudDogQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lhbCBFdmVudHNcbiAgICovXG4gIHByaXZhdGUgaW52b2tlU2hpZnREb3VibGVDbGljayhub2RlOk9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBsZXQgZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGV2ZW50ID0geyAuLi5ldmVudCwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25TaGlmdERvdWJsZUNsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENlbGwgRWRpdCBGZWF0dXJlXG4gICAqL1xuICBzdGFydEVkaXQoZXZlbnQ6IE1vdXNlRXZlbnQsIG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2knKSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcblxuICAgICAgdGhpcy5pbnZva2VTaGlmdERvdWJsZUNsaWNrKG5vZGUsIGNvbHVtbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNlbGxFZGl0YWJsZVBpcGUudHJhbnNmb3JtKG5vZGUuY2VsbFN0YXRlcywgY29sdW1uLCBub2RlLCB0aGlzLmNlbGxTZXJ2aWNlLmVkaXRhYmxlRm4sIHRoaXMuY2VsbFNlcnZpY2UudXBkYXRhYmxlRm4sIHRoaXMuYWxsb3dlZEVkaXQpKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuXG4gICAgICBjb25zdCBjZWxsS2V5ID0gZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuYWRkKGNlbGxLZXkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gdHJ1ZTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KGBbZGF0YS1jZWxsLWlkPVwiJHsgZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpIH1cIl0gaW5wdXRgKTtcblxuICAgICAgICBpZiAoaW5wdXQpIHtcblxuICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHZhbHVlICYmIFtcInRleHRcIl0uaW5jbHVkZXMoaW5wdXQudHlwZSkpIHtcblxuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UodmFsdWUubGVuZ3RoLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIDEwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBDZWxsIEVkaXQgTW9kZVxuICAgKi9cbiAgc3RvcEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4sIGV2ZW50OiBhbnkpIHtcblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy5zZXRDZWxsVmFsdWVCeVJvd0lkKG5vZGUucm93SWQsIGNvbHVtbiwgdmFsdWUpO1xuXG4gICAgICByb3dOb2RlLmNlbGxTdGF0ZXMgPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhyb3dOb2RlKTtcbiAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NlbGxTdGF0ZUNoYW5nZWQnLCB7XG4gICAgICAgIGRhdGE6IHJvd05vZGUuZGF0YSxcbiAgICAgICAgbm9kZTogcm93Tm9kZSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgQ2VsbCBFZGl0IE1vZGVcbiAgICovXG4gIGNhbmNlbEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgQ2VsbCBWYWx1ZVxuICAgKi9cbiAgc2V0Q2VsbFZhbHVlQnlSb3dJZChyb3dJZDogc3RyaW5nLCBjb2x1bW46IE9uZUNvbHVtbkRlZiwgdmFsdWU6IGFueSkge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmIChub2RlICYmIGNvbHVtbi5maWVsZCkge1xuXG4gICAgICBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSAhPT0gJ251bWJlcicpIHtcblxuICAgICAgICBub2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IHZhbHVlID09PSAnJyA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IHZhbHVlID09PSAnJyA/IG51bGwgOiBOdW1iZXIodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIFNjcm9sbCBQcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRWaXJ0dWFsU2Nyb2xsKGl0ZW1zOiBudW1iZXIgPSAwKTogdm9pZCB7XG5cbiAgICB0aGlzLm1pbkJ1ZmZlclB4ID0gdGhpcy5pdGVtU2l6ZSAqIGl0ZW1zICogMS41O1xuXG4gICAgdGhpcy5tYXhCdWZmZXJQeCA9IHRoaXMubWluQnVmZmVyUHggKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIEFsbCBTdWJzY3JpcHRpb25zXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2ICNib2R5UmVmIGNsYXNzPVwib25lLWdyaWQtYm9keVwiPlxuICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJvbmUtZ3JpZC1ib2R5LXZpZXdwb3J0XCJcbiAgICAgICAgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCJcbiAgICAgICAgW21pbkJ1ZmZlclB4XT1cIm1pbkJ1ZmZlclB4XCJcbiAgICAgICAgW21heEJ1ZmZlclB4XT1cIm1heEJ1ZmZlclB4XCJcbiAgICAgICAgKHNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm9kZSBvZiBub2RlczsgdHJhY2tCeTogdHJhY2tCeVJvd0lkO1wiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvd1wiIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWRcIiBbY2xhc3Mub25lLXJvdy1zZWxlY3RlZF09XCJub2RlLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHVtbkRlZnM7IHRyYWNrIGNvbC5maWVsZDspIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBub2RlLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29sdW1uOiBjb2wgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEN1c3RvbSBEZXRhaWwgQ29tcG9uZW50IC0tPlxuICAgICAgICAgICAgIEBpZihub2RlLmxlYWYgJiYgbm9kZS5kZXRhaWxBY3RpdmUgJiYgbm9kZT8uZGV0YWlsUmVuZGVyZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyQ29tcG9uZW50XT1cIm5vZGU/LmRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW3BhcmFtc109XCJ7IGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIG5vZGU6IG5vZGUsIGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIE1hc3RlciBEZXRhaWwgR3JpZCAodGVtcGxhdGUgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCBvbmUtZ3JpZCB0byBhdm9pZCBhIGNvbXBpbGUtdGltZSBpbXBvcnQgY3ljbGUpIC0tPlxuICAgICAgICAgICAgQGlmIChtYXN0ZXJEZXRhaWwgJiYgbm9kZS5leHBhbmRlZCAmJiBub2RlPy5kZXRhaWxSb3dEYXRhKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3ctZGV0YWlsLWNvbnRhaW5lclwiIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWQgKyAnLWRldGFpbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGV0YWlsR3JpZFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogbm9kZSwgbm9kZTogbm9kZSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgQGlmICghbm9kZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiBtYXgtY29udGVudDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cInJvd1dpZHRoXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgIEBpZiAoIW5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC1lbXB0eS1tZXNzYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiPk5vIFJvd3MgdG8gU2hvdzwvc3Bhbj5cbiAgICB9XG48L2Rpdj5cblxuPCEtLSBNYXN0ZXIgQ29sdW1uIFRlbXBsYXRlICAtLT5cbjxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlIGxldC1ub2RlPVwibm9kZVwiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvbmUtY29sdW1uXCJcbiAgICAgICAgW2F0dHIuZGF0YS1jZWxsLWlkXT1cIm5vZGUucm93SWQgfCBjZWxsS2V5OmNvbHVtbi5maWVsZFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4/LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW4/Lm1pbldpZHRoXCJcbiAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4/Lm1heFdpZHRoXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tYm9yZGVyLXRvcF09XCJtYXN0ZXJEZXRhaWwgJiYgbm9kZXM/Lmxlbmd0aCA+IDAgJiYgbm9kZXNbbm9kZS5yb3dJbmRleCAtIDFdPy5leHBhbmRlZFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY2VsbC1zZWxlY3RlZF09XCJzZWxlY3RlZENlbGxzIHwgY2VsbFNlbGVjdGVkOm5vZGUucm93SWQ6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jZWxsLWludmFsaWRdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbEludmFsaWQ6bm9kZS5kYXRhW2NvbHVtbi5maWVsZF06Y29sdW1uOm5vZGU6YWxsb3dlZEVkaXQ6c3VibWl0dGVkXCJcbiAgICAgICAgKGRibGNsaWNrKT1cInN0YXJ0RWRpdCgkZXZlbnQsIG5vZGUsIGNvbHVtbilcIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0U2VsZWN0aW9uKG5vZGUucm93SWQsIGNvbHVtbi5maWVsZClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJleHRlbmRTZWxlY3Rpb24obm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKVwiXG4gICAgICAgIChtb3VzZXVwKT1cImVuZFNlbGVjdGlvbigpXCI+XG5cbiAgICAgICAgPCEtLSBPbmUgR3JpZCBDZWxsIE9wdGlvbiAtLT5cbiAgICAgICAgQGlmIChub2RlLmNlbGxPcHRpb25zW2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgIDxvbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51XG4gICAgICAgICAgICAgICAgI2NvbnRleHRPcHRpb25NZW51UmVmXG4gICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5jZWxsT3B0aW9uTWVudVwiXG4gICAgICAgICAgICAgICAgKGNlbGxPcHRpb25NZW51U2VsZWN0KT1cImNlbGxPcHRpb25NZW51U2VsZWN0ZWQoJGV2ZW50KVwiLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gR3JpZCBDZWxsIFRlbXBsYXRlIC0tPlxuICAgICAgICBAaWYoY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBvbmVDZWxsUmVuZGVyZXJDb21wb25lbnRcbiAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyQ29tcG9uZW50XT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInsgZGF0YTogbm9kZS5kYXRhLCBmaWVsZDogY29sdW1uLmZpZWxkLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29sdW1uRGVmOiBjb2x1bW4sIG5vZGU6IG5vZGUsIGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKG5vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgICA8IS0tIENlbGwgRWRpdGluZyBJbnB1dCAtLT5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm9uZS1jZWxsLWlucHV0XCJcbiAgICAgICAgICAgICAgICBuYW1lPVwie3sgbm9kZS5yb3dJZCArICcnICsgY29sdW1uLmZpZWxkIH19XCJcbiAgICAgICAgICAgICAgICBvbmVDZWxsSW5wdXRWYWxpZGF0b3JcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblR5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAndGV4dCcgOiBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwibm9kZT8uZGF0YVtjb2x1bW4/LmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyNTBcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFZGl0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic3RvcEVkaXQobm9kZSwgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2MpPVwiY2FuY2VsRWRpdChub2RlLCBjb2x1bW4pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogY29sdW1uLndpZHRoICsgJ3B4JyAsIHBvc2l0aW9uOiAncmVsYXRpdmUnIH1cIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZWRpdGFibGUtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWNlbGxcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LWxlZnRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtY2VudGVyXT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAnY2VudGVyJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtcmlnaHRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbFNlcnZpY2UucmVzb2x2ZUNlbGxQcmVzZW50YXRpb24oY29sdW1uLCB7IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSwgY29sdW1uRGVmOiBjb2x1bW4gfSkuX3Jlc29sdmVkQ2VsbENsYXNzXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2xTZXJ2aWNlLnJlc29sdmVDZWxsUHJlc2VudGF0aW9uKGNvbHVtbiwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uIH0pLl9yZXNvbHZlZENlbGxTdHlsZVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCJjb2x1bW4uYXV0b0dyb3VwRmllbGQgJiYgbm9kZS5sZXZlbCB8IGNlbGxMZXZlbFBhZGRpbmc6MjRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtY2VsbC1hbGxvd2VkLWVkaXQtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQ2hlY2tib3ggU2VsZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uPy5jaGVja2JveFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdGlvbik9XCJpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBFeHBhbmQgJiBDb2xsYXBzZSBJY29uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoKChub2RlPy5ncm91cCB8fCBkZXRhaWxSZW5kZXJlckNvbXBvbmVudCkgJiYgY29sdW1uPy5hdXRvR3JvdXBGaWVsZCkgfHwgKG1hc3RlckRldGFpbCAmJiBub2RlPy5leHBhbmRhYmxlICYmIGdyaWRUeXBlID09PSAnbWFzdGVyJyAmJiBjb2x1bW4/Lm1hc3Rlckdyb3VwRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxSZW5kZXJlckNvbXBvbmVudF09XCJkZXRhaWxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwYW5zaW9uQ2hhbmdlZCk9XCJpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInsgZGF0YTogbm9kZS5kYXRhLCBmaWVsZDogY29sdW1uLmZpZWxkLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29sdW1uRGVmOiBjb2x1bW4sIG5vZGU6IG5vZGUsIGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIENlbGwgVmFsdWUgT1IgUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgb25lQ2VsbFRleHRFeHBhbmQgY2xhc3M9XCJvbmUtY2VsbC10ZXh0XCIgW2NsYXNzLm9uZS1jZWxsLXBsYWNlaG9sZGVyXT1cIm5vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdPy50eXBlID09PSAncGxhY2Vob2xkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAobm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zIHwgY2VsbEFjdGlvbkJ1dHRvbkVuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtcm93LWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFzdGVyTm9kZV09XCJtYXN0ZXJOb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJQYXJhbXNdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93QWRkTmV3KT1cImludm9rZVJvd0FjdGlvbkFkZE5ldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RG9jdW1lbnQpPVwiaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0xpc3QpPVwiaW52b2tlUm93QWN0aW9uR290b0xpc3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0hpc3RvcnkpPVwiaW52b2tlUm93QWN0aW9uSGlzdG9yeSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0NlbGxPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|