@acorex/data-grid 3.0.21 → 3.0.25
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/acorex-data-grid.d.ts +4 -0
- package/acorex-data-grid.metadata.json +1 -0
- package/bundles/acorex-data-grid.umd.js +2224 -0
- package/bundles/acorex-data-grid.umd.js.map +1 -0
- package/bundles/acorex-data-grid.umd.min.js +16 -0
- package/bundles/acorex-data-grid.umd.min.js.map +1 -0
- package/esm2015/acorex-data-grid.js +5 -0
- package/esm2015/lib/data-grid/columns/check-column.component.js +104 -0
- package/esm2015/lib/data-grid/columns/column.component.js +204 -0
- package/esm2015/lib/data-grid/columns/command-column.component.js +103 -0
- package/esm2015/lib/data-grid/columns/date-column.component.js +114 -0
- package/esm2015/lib/data-grid/columns/row-number-column.component.js +39 -0
- package/esm2015/lib/data-grid/columns/selection-column.component.js +42 -0
- package/esm2015/lib/data-grid/columns/text-column.component.js +81 -0
- package/esm2015/lib/data-grid/datagrid.component.js +709 -0
- package/esm2015/lib/data-grid/datagrid.events.js +1 -0
- package/esm2015/lib/data-grid/datagrid.module.js +98 -0
- package/esm2015/lib/data-grid/filters/filter.component.js +25 -0
- package/esm2015/lib/data-grid/templates/cell-template.component.js +47 -0
- package/esm2015/lib/data-grid/templates/detail-template.component.js +45 -0
- package/esm2015/lib/data-grid/templates/row-template.component.js +40 -0
- package/esm2015/lib/data-lov/data-lov-popup/data-lov-popup.component.js +121 -0
- package/esm2015/lib/data-lov/data-lov.component.js +206 -0
- package/esm2015/lib/data-lov/data-lov.module.js +21 -0
- package/esm2015/public-api.js +17 -0
- package/esm5/acorex-data-grid.js +5 -0
- package/esm5/lib/data-grid/columns/check-column.component.js +102 -0
- package/esm5/lib/data-grid/columns/column.component.js +206 -0
- package/esm5/lib/data-grid/columns/command-column.component.js +98 -0
- package/esm5/lib/data-grid/columns/date-column.component.js +119 -0
- package/esm5/lib/data-grid/columns/row-number-column.component.js +42 -0
- package/esm5/lib/data-grid/columns/selection-column.component.js +46 -0
- package/esm5/lib/data-grid/columns/text-column.component.js +81 -0
- package/esm5/lib/data-grid/datagrid.component.js +767 -0
- package/esm5/lib/data-grid/datagrid.events.js +1 -0
- package/esm5/lib/data-grid/datagrid.module.js +101 -0
- package/esm5/lib/data-grid/filters/filter.component.js +16 -0
- package/esm5/lib/data-grid/templates/cell-template.component.js +46 -0
- package/esm5/lib/data-grid/templates/detail-template.component.js +49 -0
- package/esm5/lib/data-grid/templates/row-template.component.js +44 -0
- package/esm5/lib/data-lov/data-lov-popup/data-lov-popup.component.js +127 -0
- package/esm5/lib/data-lov/data-lov.component.js +216 -0
- package/esm5/lib/data-lov/data-lov.module.js +24 -0
- package/esm5/public-api.js +17 -0
- package/fesm2015/acorex-data-grid.js +1901 -0
- package/fesm2015/acorex-data-grid.js.map +1 -0
- package/fesm5/acorex-data-grid.js +1980 -0
- package/fesm5/acorex-data-grid.js.map +1 -0
- package/lib/data-grid/columns/check-column.component.d.ts +30 -0
- package/lib/data-grid/columns/column.component.d.ts +29 -0
- package/lib/data-grid/columns/command-column.component.d.ts +22 -0
- package/lib/data-grid/columns/date-column.component.d.ts +27 -0
- package/lib/data-grid/columns/row-number-column.component.d.ts +7 -0
- package/lib/data-grid/columns/selection-column.component.d.ts +8 -0
- package/lib/data-grid/columns/text-column.component.d.ts +20 -0
- package/lib/data-grid/datagrid.component.d.ts +129 -0
- package/{src/lib/data-grid/datagrid.events.ts → lib/data-grid/datagrid.events.d.ts} +1 -4
- package/lib/data-grid/datagrid.module.d.ts +3 -0
- package/lib/data-grid/filters/filter.component.d.ts +2 -0
- package/lib/data-grid/templates/cell-template.component.d.ts +17 -0
- package/lib/data-grid/templates/detail-template.component.d.ts +16 -0
- package/lib/data-grid/templates/row-template.component.d.ts +15 -0
- package/lib/data-lov/data-lov-popup/data-lov-popup.component.d.ts +29 -0
- package/lib/data-lov/data-lov.component.d.ts +39 -0
- package/lib/data-lov/data-lov.module.d.ts +2 -0
- package/package.json +27 -17
- package/{src/public-api.ts → public-api.d.ts} +0 -3
- package/karma.conf.js +0 -32
- package/ng-package.json +0 -12
- package/src/lib/data-grid/columns/check-column.component.ts +0 -113
- package/src/lib/data-grid/columns/column.component.ts +0 -181
- package/src/lib/data-grid/columns/command-column.component.ts +0 -102
- package/src/lib/data-grid/columns/date-column.component.ts +0 -119
- package/src/lib/data-grid/columns/row-number-column.component.ts +0 -36
- package/src/lib/data-grid/columns/selection-column.component.ts +0 -37
- package/src/lib/data-grid/columns/text-column.component.ts +0 -92
- package/src/lib/data-grid/datagrid.component.html +0 -26
- package/src/lib/data-grid/datagrid.component.ts +0 -724
- package/src/lib/data-grid/datagrid.module.ts +0 -93
- package/src/lib/data-grid/filters/filter.component.ts +0 -21
- package/src/lib/data-grid/templates/cell-template.component.ts +0 -47
- package/src/lib/data-grid/templates/detail-template.component.ts +0 -43
- package/src/lib/data-grid/templates/row-template.component.ts +0 -41
- package/src/lib/data-lov/data-lov-popup/data-lov-popup.component.html +0 -16
- package/src/lib/data-lov/data-lov-popup/data-lov-popup.component.ts +0 -135
- package/src/lib/data-lov/data-lov.component.html +0 -61
- package/src/lib/data-lov/data-lov.component.ts +0 -177
- package/src/lib/data-lov/data-lov.module.ts +0 -17
- package/src/test.ts +0 -26
- package/tsconfig.lib.json +0 -23
- package/tsconfig.lib.prod.json +0 -6
- package/tsconfig.spec.json +0 -17
- package/tslint.json +0 -17
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Component, ContentChild, Input, ContentChildren, QueryList, EventEmitter, Output, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';
|
|
3
|
+
import { AXDataSourceComponent } from '@acorex/components';
|
|
4
|
+
import { AXGridDataColumn } from './columns/column.component';
|
|
5
|
+
import { LicenseManager } from 'ag-grid-enterprise';
|
|
6
|
+
import { ViewEncapsulation } from '@angular/core';
|
|
7
|
+
import { AXDataGridRowTemplateComponent } from './templates/row-template.component';
|
|
8
|
+
import { AXToolbarSearchComponent, AXToolbarComponent, AXDataEvent, AXValueEvent } from '@acorex/components';
|
|
9
|
+
import { AXDataGridDetailTemplateComponent } from './templates/detail-template.component';
|
|
10
|
+
import { AXTranslator } from '@acorex/core';
|
|
11
|
+
import { AXDatePickerFilterComponent } from './columns/date-column.component';
|
|
12
|
+
import { AXConfig } from '@acorex/core';
|
|
13
|
+
LicenseManager.prototype.validateLicense = function () {
|
|
14
|
+
//console.info('Cracked by Arash Oshnoudi!');
|
|
15
|
+
};
|
|
16
|
+
// WatermarkComp.prototype.shouldDisplayWatermark = function () {
|
|
17
|
+
// return false;
|
|
18
|
+
// }
|
|
19
|
+
export class AXDataGridColumnsChangeEvent extends AXValueEvent {
|
|
20
|
+
}
|
|
21
|
+
export class AXDataGridCellEvent extends AXDataEvent {
|
|
22
|
+
}
|
|
23
|
+
export class AXDaagridRowClickEvent extends AXDataEvent {
|
|
24
|
+
}
|
|
25
|
+
export class AXDataGridSelectionChangeEvent extends AXDataEvent {
|
|
26
|
+
}
|
|
27
|
+
export class AXDataGridRowSelectionChangeEvent extends AXDataEvent {
|
|
28
|
+
}
|
|
29
|
+
let AXDataGridComponent = class AXDataGridComponent {
|
|
30
|
+
constructor(ref, cdr) {
|
|
31
|
+
this.ref = ref;
|
|
32
|
+
this.cdr = cdr;
|
|
33
|
+
this.columnDefs = [];
|
|
34
|
+
this.rowModelType = 'clientSide';
|
|
35
|
+
this.frameworkComponents = {};
|
|
36
|
+
this.internalHeight = '100%';
|
|
37
|
+
this.masterDetail = false;
|
|
38
|
+
this.treeData = false;
|
|
39
|
+
this.enabelSelect = false;
|
|
40
|
+
this.gridView = false;
|
|
41
|
+
this.groupSelectsChildren = false;
|
|
42
|
+
this.oldSelectionNodes = [];
|
|
43
|
+
// @Input()
|
|
44
|
+
// showRowNumber: boolean = true;
|
|
45
|
+
this.remoteOperation = false;
|
|
46
|
+
this.rowMultiSelectWithClick = true;
|
|
47
|
+
this.suppressRowClickSelection = true;
|
|
48
|
+
this.suppressCellSelection = false;
|
|
49
|
+
this.sizeColumnsToFit = true;
|
|
50
|
+
this.showCheckBox = true;
|
|
51
|
+
this.floatingFilter = false;
|
|
52
|
+
this.autoGroupColumnDef = {};
|
|
53
|
+
this.selectionMode = 'single';
|
|
54
|
+
// @Input()
|
|
55
|
+
// allowFiltering: boolean = false;
|
|
56
|
+
this.selectRow = [];
|
|
57
|
+
this.rowGroupPanelShow = 'never';
|
|
58
|
+
this.loadOnInit = true;
|
|
59
|
+
// @Input()
|
|
60
|
+
// groupDefaultExpanded: number = 0;
|
|
61
|
+
this.keyField = 'null';
|
|
62
|
+
this.hasChildField = 'null';
|
|
63
|
+
this.columnsChange = new EventEmitter();
|
|
64
|
+
this._columns = [];
|
|
65
|
+
this.defaultColDef = {
|
|
66
|
+
filter: true,
|
|
67
|
+
floatingFilter: true
|
|
68
|
+
};
|
|
69
|
+
this.groupHideOpenParents = false;
|
|
70
|
+
this.cellClick = new EventEmitter();
|
|
71
|
+
this.cellDbClick = new EventEmitter();
|
|
72
|
+
this.cellFocuse = new EventEmitter();
|
|
73
|
+
this.rowClick = new EventEmitter();
|
|
74
|
+
this.rowDbClick = new EventEmitter();
|
|
75
|
+
this.selectionChanged = new EventEmitter();
|
|
76
|
+
this.rowSelectionChange = new EventEmitter();
|
|
77
|
+
this.onRowSelectionChanged = new EventEmitter();
|
|
78
|
+
this.rtl = AXConfig.get('layout.rtl');
|
|
79
|
+
this.isServerSideGroup = (e) => {
|
|
80
|
+
return e[this.hasChildField];
|
|
81
|
+
};
|
|
82
|
+
this.getServerSideGroupKey = (e) => {
|
|
83
|
+
return e[this.keyField];
|
|
84
|
+
};
|
|
85
|
+
this.internalGetRowClass = (p) => {
|
|
86
|
+
if (this.rowClass) {
|
|
87
|
+
if (this.rowClass instanceof Function) {
|
|
88
|
+
return this.rowClass({
|
|
89
|
+
rowIndex: p.node.rowIndex,
|
|
90
|
+
rowLevel: p.node.level,
|
|
91
|
+
data: p.data
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return this.rowClass;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
this.localeText = AXTranslator.get('dataGrid');
|
|
100
|
+
}
|
|
101
|
+
get searchText() {
|
|
102
|
+
return this._searchText;
|
|
103
|
+
}
|
|
104
|
+
set searchText(v) {
|
|
105
|
+
if (v !== this._searchText) {
|
|
106
|
+
this._searchText = v;
|
|
107
|
+
if (this.gridApi) {
|
|
108
|
+
this.refresh();
|
|
109
|
+
this.gridApi.setQuickFilter(this.searchText);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
get filter() {
|
|
114
|
+
return this._filter;
|
|
115
|
+
}
|
|
116
|
+
set filter(v) {
|
|
117
|
+
if (v !== this._filter) {
|
|
118
|
+
this._filter = v;
|
|
119
|
+
this._filter.forEach((f) => {
|
|
120
|
+
const fc = this.gridApi.getFilterInstance(f.field);
|
|
121
|
+
if (fc) {
|
|
122
|
+
const ff = fc.getFrameworkComponentInstance();
|
|
123
|
+
ff.setModel(f);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
get columns() {
|
|
129
|
+
return this._inlineColumns ? [...this._columns, ...this._inlineColumns.toArray()] : this._columns;
|
|
130
|
+
}
|
|
131
|
+
set columns(val) {
|
|
132
|
+
if (val && val.length) {
|
|
133
|
+
let old = this._columns;
|
|
134
|
+
this._columns = val;
|
|
135
|
+
this.columnsChange.emit({ component: this, value: val, oldValue: old, htmlElement: this.ref.nativeElement });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
get dataSource() {
|
|
139
|
+
return this._dataSource ? this._dataSource : this._contentDataSource;
|
|
140
|
+
}
|
|
141
|
+
set dataSource(v) {
|
|
142
|
+
this._dataSource = v;
|
|
143
|
+
}
|
|
144
|
+
getRowHeight(param) {
|
|
145
|
+
if (param.data && param.data.rowHeight && param.node.level == 0) {
|
|
146
|
+
return param.data.rowHeight;
|
|
147
|
+
}
|
|
148
|
+
else if (this.masterDetail == true && param.node.level == 1) {
|
|
149
|
+
return this.detailRowHeight;
|
|
150
|
+
}
|
|
151
|
+
else if (this.masterDetail == false && param.data && param.data.rowHeight) {
|
|
152
|
+
return param.data.rowHeight;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
calcHeight() {
|
|
159
|
+
if (this.toolbar) {
|
|
160
|
+
this.internalHeight = `calc(100% - ${40}px)`;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.internalHeight = '100%';
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
get intenalGridDataSource() {
|
|
167
|
+
const that = this;
|
|
168
|
+
return {
|
|
169
|
+
rowCount: null,
|
|
170
|
+
getRows: (params) => {
|
|
171
|
+
// that.gridApi.gridOptionsWrapper.setProperty('cacheBlockSize', this.takeCount ? this.takeCount : params.api.paginationGetPageSize());
|
|
172
|
+
that.dataSourceSuccessCallback = params.successCallback;
|
|
173
|
+
const loadParams = {};
|
|
174
|
+
loadParams.searchText = that.searchText;
|
|
175
|
+
loadParams.skip = params.request.startRow;
|
|
176
|
+
// loadParams.take = params.request.endRow - params.request.startRow;
|
|
177
|
+
loadParams.take = that.takeCount ? that.takeCount : params.api.paginationGetPageSize() * 2;
|
|
178
|
+
loadParams.sort = params.request.sortModel.map((c) => {
|
|
179
|
+
return {
|
|
180
|
+
field: c.colId,
|
|
181
|
+
dir: c.sort
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
// loadParams.groups = params.request.rowGroupCols.map(r => r.field);
|
|
185
|
+
// loadParams.groupKeys = params.request.groupKeys;
|
|
186
|
+
// loadParams.data = params.parentNode.data;
|
|
187
|
+
loadParams.group = {
|
|
188
|
+
fields: params.request.rowGroupCols.map((r) => r.field),
|
|
189
|
+
keys: params.request.groupKeys,
|
|
190
|
+
parentData: params.parentNode.data
|
|
191
|
+
};
|
|
192
|
+
loadParams.filter = params.request.filterModel;
|
|
193
|
+
that.dataSource.fetch(loadParams);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
getMainMenuItems(e) {
|
|
198
|
+
return ['pinSubMenu', 'separator'];
|
|
199
|
+
}
|
|
200
|
+
ngOnDestroy() {
|
|
201
|
+
this.gridApi.destroy();
|
|
202
|
+
}
|
|
203
|
+
// todo gridOptions: GridOptions
|
|
204
|
+
internalGridReady(gridOptions) {
|
|
205
|
+
gridOptions.api.checkGridSize();
|
|
206
|
+
this.takeCount = this.takeCount ? this.takeCount : gridOptions.api.paginationGetPageSize() * 2;
|
|
207
|
+
this.takeCount = this.takeCount < 20 ? 20 : this.takeCount;
|
|
208
|
+
gridOptions.api.gridOptionsWrapper.setProperty('cacheBlockSize', this.takeCount);
|
|
209
|
+
this.gridApi = gridOptions.api;
|
|
210
|
+
this.mapColumns();
|
|
211
|
+
this.calcHeight();
|
|
212
|
+
if (!this.loadOnInit) {
|
|
213
|
+
this.loadOnInit = true;
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (this.remoteOperation) {
|
|
217
|
+
this.gridApi.setServerSideDatasource(this.intenalGridDataSource);
|
|
218
|
+
}
|
|
219
|
+
if (!this.remoteOperation) {
|
|
220
|
+
this.refresh();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
ngAfterContentInit() {
|
|
224
|
+
const that = this;
|
|
225
|
+
if (this.rowTemplate) {
|
|
226
|
+
this.fullWidthCellRendererFramework = this.rowTemplate.renderer;
|
|
227
|
+
this.fullWidthCellRendererParams = this.rowTemplate.params;
|
|
228
|
+
}
|
|
229
|
+
this.frameworkComponents.agDateInput = AXDatePickerFilterComponent;
|
|
230
|
+
if (this.gridDetailTemplate) {
|
|
231
|
+
this.masterDetail = true;
|
|
232
|
+
this.detailCellRendererParams = this.gridDetailTemplate.params;
|
|
233
|
+
this.detailCellRenderer = 'detailRendererFramework';
|
|
234
|
+
this.frameworkComponents.detailRendererFramework = this.gridDetailTemplate.renderer;
|
|
235
|
+
this.detailRowHeight = this.gridDetailTemplate.height;
|
|
236
|
+
}
|
|
237
|
+
this.isFullWidthCell = () => {
|
|
238
|
+
return that.rowTemplate != null;
|
|
239
|
+
};
|
|
240
|
+
//this.cdr
|
|
241
|
+
}
|
|
242
|
+
ngOnInit() {
|
|
243
|
+
if (this.selectionMode === 'single') {
|
|
244
|
+
this.groupSelectsChildren = false;
|
|
245
|
+
}
|
|
246
|
+
if (this.keyField !== 'null' && this.hasChildField !== 'null') {
|
|
247
|
+
this.rowGroupPanelShow = 'never';
|
|
248
|
+
this.treeData = true;
|
|
249
|
+
}
|
|
250
|
+
if (this.remoteOperation) {
|
|
251
|
+
this.rowModelType = 'serverSide';
|
|
252
|
+
}
|
|
253
|
+
//
|
|
254
|
+
if (this.rtl == null) {
|
|
255
|
+
this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
|
|
256
|
+
}
|
|
257
|
+
//
|
|
258
|
+
}
|
|
259
|
+
gridSelectRow() {
|
|
260
|
+
if (this.gridApi) {
|
|
261
|
+
if (this.selectRow && this.selectRow.length > 0 && this.gridApi !== undefined && typeof this.selectRow[0] != 'object') {
|
|
262
|
+
this.gridApi.forEachNode((node) => {
|
|
263
|
+
if (node.data !== undefined) {
|
|
264
|
+
let select = false;
|
|
265
|
+
this.selectRow.forEach((id) => {
|
|
266
|
+
if (node.data[this.keyField] === id) {
|
|
267
|
+
select = true;
|
|
268
|
+
node.setSelected(select);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
this.gridApi.forEachNode((node) => {
|
|
276
|
+
if (node.data !== undefined) {
|
|
277
|
+
let select = false;
|
|
278
|
+
this.selectRow.forEach((item) => {
|
|
279
|
+
if (item.rowIndex != undefined && item.rowLevel != undefined) {
|
|
280
|
+
if (node.data[this.keyField] === item.data[this.keyField]) {
|
|
281
|
+
select = true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
if (node.data[this.keyField] === item[this.keyField]) {
|
|
286
|
+
select = true;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
node.setSelected(select);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ngAfterViewChecked(): void {
|
|
297
|
+
// //Called after every check of the component's view. Applies to components only.
|
|
298
|
+
// //Add 'implements AfterViewChecked' to the class.
|
|
299
|
+
// // this.selectByValues();
|
|
300
|
+
// this.enabelSelect = false;
|
|
301
|
+
// }
|
|
302
|
+
rebuildGrid() {
|
|
303
|
+
this.mapColumns();
|
|
304
|
+
setTimeout(() => {
|
|
305
|
+
if (this.sizeColumnsToFit) {
|
|
306
|
+
this.gridApi.sizeColumnsToFit();
|
|
307
|
+
}
|
|
308
|
+
}, 10);
|
|
309
|
+
}
|
|
310
|
+
ngAfterViewInit() {
|
|
311
|
+
if (this.treeData === true) {
|
|
312
|
+
this.columnDefs = this.columns.map((c) => c.render());
|
|
313
|
+
const groupColumn = this.columnDefs.find((c) => c.rowGroupIndex == '0' && c.field !== '');
|
|
314
|
+
this.autoGroupColumnDef = {
|
|
315
|
+
headerName: groupColumn.headerName,
|
|
316
|
+
width: groupColumn.width,
|
|
317
|
+
cellRendererParams: { checkbox: this.showCheckBox },
|
|
318
|
+
field: groupColumn.field
|
|
319
|
+
};
|
|
320
|
+
this.columnDefs.forEach((elm) => {
|
|
321
|
+
if (elm.rowGroupIndex > -1) {
|
|
322
|
+
elm.hide = true;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
//setTimeout(() => {
|
|
327
|
+
this.gridView = true;
|
|
328
|
+
//});
|
|
329
|
+
this.enabelSelect = true;
|
|
330
|
+
this.dataSource.onDataReceived.subscribe((_data) => {
|
|
331
|
+
const result = _data.data.result;
|
|
332
|
+
this.hideLoading();
|
|
333
|
+
let items;
|
|
334
|
+
let totalCount;
|
|
335
|
+
if (Array.isArray(result)) {
|
|
336
|
+
items = result;
|
|
337
|
+
totalCount = result.length;
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
items = result.items;
|
|
341
|
+
totalCount = result.totalCount;
|
|
342
|
+
}
|
|
343
|
+
if (this.dataSourceSuccessCallback) {
|
|
344
|
+
if (!this.loadOnInit) {
|
|
345
|
+
this.dataSourceSuccessCallback([], 0);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.dataSourceSuccessCallback(items, totalCount);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
if (!this.loadOnInit && this.gridApi !== undefined) {
|
|
353
|
+
this.gridApi.setRowData([]);
|
|
354
|
+
}
|
|
355
|
+
else if (this.gridApi !== undefined) {
|
|
356
|
+
this.gridApi.setRowData(items);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
this.gridSelectRow();
|
|
360
|
+
});
|
|
361
|
+
this.dataSource.onFetchStart.subscribe(() => {
|
|
362
|
+
this.showLoading();
|
|
363
|
+
});
|
|
364
|
+
if (this.searchInput) {
|
|
365
|
+
this.searchInput.onValueChanged.subscribe((c) => {
|
|
366
|
+
this.searchText = c.value;
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
//
|
|
370
|
+
this.cdr.detectChanges();
|
|
371
|
+
}
|
|
372
|
+
mapColumns() {
|
|
373
|
+
this.columnDefs = this.columns.map((c) => c.render());
|
|
374
|
+
// if (this.showRowNumber) {
|
|
375
|
+
// this.columnDefs.push({
|
|
376
|
+
// headerName: AXConfig.get('layout.rtl') ? 'ردیف' : 'Row',
|
|
377
|
+
// valueGetter: 'node.rowIndex + 1',
|
|
378
|
+
// pinned: AXConfig.get('layout.rtl') ? 'right' : 'left'
|
|
379
|
+
// });
|
|
380
|
+
// }
|
|
381
|
+
if (this.gridDetailTemplate) {
|
|
382
|
+
if (this.columnDefs[0].checkboxSelection === true && this.columnDefs[0].field === '') {
|
|
383
|
+
this.columnDefs[1].cellRenderer = 'agGroupCellRenderer';
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
this.columnDefs[0].cellRenderer = 'agGroupCellRenderer';
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (this.hasChildField === 'null') {
|
|
390
|
+
const groupColumn = this.columnDefs.find((c) => c.rowGroupIndex === undefined && c.field !== '');
|
|
391
|
+
if (groupColumn && this.groupHideOpenParents == false) {
|
|
392
|
+
this.autoGroupColumnDef = {
|
|
393
|
+
headerName: groupColumn.headerName,
|
|
394
|
+
width: groupColumn.width,
|
|
395
|
+
cellRendererParams: { checkbox: this.showCheckBox },
|
|
396
|
+
field: groupColumn.field
|
|
397
|
+
};
|
|
398
|
+
// groupColumn.hide = true;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
this.columnDefs.forEach((elm) => {
|
|
402
|
+
if (elm.rowGroupIndex > -1) {
|
|
403
|
+
elm.hide = true;
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
displayedColumnsChanged(e) {
|
|
408
|
+
if (this.hasChildField === 'null') {
|
|
409
|
+
const ee = e.columnApi.getAllDisplayedColumnGroups();
|
|
410
|
+
const eee = ee.find((c) => c.colId !== 'ag-Grid-AutoColumn' && c.colId !== '0');
|
|
411
|
+
if (eee && eee.colId) {
|
|
412
|
+
this.autoGroupColumnDef = {
|
|
413
|
+
headerName: eee.colDef.headerName,
|
|
414
|
+
width: eee.colDef.width,
|
|
415
|
+
cellRendererParams: { checkbox: this.showCheckBox },
|
|
416
|
+
field: eee.colDef.field
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
// eee.hide = true;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
refresh(route = []) {
|
|
423
|
+
if (this.remoteOperation && this.gridApi !== undefined) {
|
|
424
|
+
// this.gridApi.purgeServerSideCache(route);
|
|
425
|
+
this.gridApi.setServerSideDatasource(this.intenalGridDataSource);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
// TODO : check fetch param
|
|
429
|
+
this.dataSource.fetch(null);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
internalGridCellClicked(e) {
|
|
433
|
+
this.cellClick.emit({ data: this.mapCellEvent(e), component: this, htmlElement: this.ref.nativeElement });
|
|
434
|
+
}
|
|
435
|
+
internalGridCellDoubleClicked(e) {
|
|
436
|
+
this.cellDbClick.emit({ data: this.mapCellEvent(e), component: this, htmlElement: this.ref.nativeElement });
|
|
437
|
+
}
|
|
438
|
+
internalGridCellFocused(e) {
|
|
439
|
+
this.cellFocuse.emit({ data: this.mapCellEvent(e), htmlElement: this.ref.nativeElement, component: this });
|
|
440
|
+
}
|
|
441
|
+
internalGridRowClicked(e) {
|
|
442
|
+
if (!e.node.group) {
|
|
443
|
+
this.rowClick.emit({ data: this.mapRowEvent(e), component: this, htmlElement: this.ref.nativeElement });
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
internalGridRowDoubleClicked(e) {
|
|
447
|
+
if (!e.node.group) {
|
|
448
|
+
this.rowDbClick.emit({ data: this.mapRowEvent(e), htmlElement: this.ref.nativeElement, component: this });
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
differenceOf2Arrays(array1, array2) {
|
|
452
|
+
const temp = [];
|
|
453
|
+
for (const i in array1) {
|
|
454
|
+
if (array2.indexOf(array1[i]) === -1) {
|
|
455
|
+
temp.push(array1[i]);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
for (const i in array2) {
|
|
459
|
+
if (array1.indexOf(array2[i]) === -1) {
|
|
460
|
+
temp.push(array2[i]);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return temp.sort((a, b) => a - b);
|
|
464
|
+
}
|
|
465
|
+
rowSelectionChanged(e) {
|
|
466
|
+
// debugger;
|
|
467
|
+
// this.gridApi.forEachNode((node) => {
|
|
468
|
+
// if (node.data[this.keyField] == e.node.data[this.keyField]) {
|
|
469
|
+
// node.setSelected(e.node.selected);
|
|
470
|
+
// }
|
|
471
|
+
// });
|
|
472
|
+
if (e.node.selected == true) {
|
|
473
|
+
this.selectRow.push(e.data);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
this.selectRow = this.selectRow.filter((c) => c[this.keyField] != e.data[this.keyField]);
|
|
477
|
+
}
|
|
478
|
+
this.rowSelectionChange.emit({ component: this, data: e, htmlElement: this.ref.nativeElement });
|
|
479
|
+
// console.log('e', e);
|
|
480
|
+
// console.log('select', e.node.selected);
|
|
481
|
+
// console.log('index', e.rowIndex);
|
|
482
|
+
}
|
|
483
|
+
internalGridSelectionChanged(e) {
|
|
484
|
+
const args = { items: [] };
|
|
485
|
+
const oldNodes = this.oldSelectionNodes;
|
|
486
|
+
const nodes = this.gridApi.getSelectedNodes();
|
|
487
|
+
nodes.forEach((i) => {
|
|
488
|
+
args.items.push({
|
|
489
|
+
rowLevel: i.level,
|
|
490
|
+
rowIndex: i.rowIndex,
|
|
491
|
+
data: i.data
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
this.selectionChanged.emit({ data: args, component: this, htmlElement: this.ref.nativeElement });
|
|
495
|
+
let action = nodes.length > oldNodes.length ? true : false;
|
|
496
|
+
const node = this.differenceOf2Arrays(nodes, oldNodes);
|
|
497
|
+
this.onRowSelectionChanged.emit({ component: this, selected: action, data: node, htmlElement: this.ref.nativeElement });
|
|
498
|
+
this.oldSelectionNodes = nodes;
|
|
499
|
+
}
|
|
500
|
+
mapCellEvent(e) {
|
|
501
|
+
return {
|
|
502
|
+
rowLevel: 0,
|
|
503
|
+
column: e.column,
|
|
504
|
+
data: e.data,
|
|
505
|
+
rowIndex: e.rowIndex,
|
|
506
|
+
value: e.value
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
mapRowEvent(e) {
|
|
510
|
+
return {
|
|
511
|
+
rowLevel: 0,
|
|
512
|
+
data: e.data,
|
|
513
|
+
rowIndex: e.rowIndex
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
deselectAll() {
|
|
517
|
+
this.gridApi.deselectAll();
|
|
518
|
+
}
|
|
519
|
+
showLoading() {
|
|
520
|
+
if (this.gridApi) {
|
|
521
|
+
this.gridApi.showLoadingOverlay();
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
hideLoading() {
|
|
525
|
+
if (this.gridApi) {
|
|
526
|
+
this.gridApi.hideOverlay();
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
internalGridSizeChanged(e) {
|
|
530
|
+
if (e.clientWidth > 0 && e.clientHeight > 0) {
|
|
531
|
+
this.performSizeColumnsToFit(e.api);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
internalGridFirstDataRendered(e) {
|
|
535
|
+
this.performSizeColumnsToFit(e.api);
|
|
536
|
+
}
|
|
537
|
+
performSizeColumnsToFit(api) {
|
|
538
|
+
if (this.sizeColumnsToFit) {
|
|
539
|
+
api.sizeColumnsToFit();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
AXDataGridComponent.ctorParameters = () => [
|
|
544
|
+
{ type: ElementRef },
|
|
545
|
+
{ type: ChangeDetectorRef }
|
|
546
|
+
];
|
|
547
|
+
__decorate([
|
|
548
|
+
Input(),
|
|
549
|
+
__metadata("design:type", Boolean)
|
|
550
|
+
], AXDataGridComponent.prototype, "remoteOperation", void 0);
|
|
551
|
+
__decorate([
|
|
552
|
+
Input(),
|
|
553
|
+
__metadata("design:type", Boolean)
|
|
554
|
+
], AXDataGridComponent.prototype, "rowMultiSelectWithClick", void 0);
|
|
555
|
+
__decorate([
|
|
556
|
+
Input(),
|
|
557
|
+
__metadata("design:type", Boolean)
|
|
558
|
+
], AXDataGridComponent.prototype, "suppressRowClickSelection", void 0);
|
|
559
|
+
__decorate([
|
|
560
|
+
Input(),
|
|
561
|
+
__metadata("design:type", Boolean)
|
|
562
|
+
], AXDataGridComponent.prototype, "suppressCellSelection", void 0);
|
|
563
|
+
__decorate([
|
|
564
|
+
Input(),
|
|
565
|
+
__metadata("design:type", Boolean)
|
|
566
|
+
], AXDataGridComponent.prototype, "sizeColumnsToFit", void 0);
|
|
567
|
+
__decorate([
|
|
568
|
+
Input(),
|
|
569
|
+
__metadata("design:type", Boolean)
|
|
570
|
+
], AXDataGridComponent.prototype, "showCheckBox", void 0);
|
|
571
|
+
__decorate([
|
|
572
|
+
Input(),
|
|
573
|
+
__metadata("design:type", Boolean)
|
|
574
|
+
], AXDataGridComponent.prototype, "floatingFilter", void 0);
|
|
575
|
+
__decorate([
|
|
576
|
+
Input(),
|
|
577
|
+
__metadata("design:type", Number)
|
|
578
|
+
], AXDataGridComponent.prototype, "takeCount", void 0);
|
|
579
|
+
__decorate([
|
|
580
|
+
Input(),
|
|
581
|
+
__metadata("design:type", String)
|
|
582
|
+
], AXDataGridComponent.prototype, "selectionMode", void 0);
|
|
583
|
+
__decorate([
|
|
584
|
+
Input(),
|
|
585
|
+
__metadata("design:type", Array)
|
|
586
|
+
], AXDataGridComponent.prototype, "selectRow", void 0);
|
|
587
|
+
__decorate([
|
|
588
|
+
Input(),
|
|
589
|
+
__metadata("design:type", String)
|
|
590
|
+
], AXDataGridComponent.prototype, "rowGroupPanelShow", void 0);
|
|
591
|
+
__decorate([
|
|
592
|
+
Input(),
|
|
593
|
+
__metadata("design:type", Boolean)
|
|
594
|
+
], AXDataGridComponent.prototype, "loadOnInit", void 0);
|
|
595
|
+
__decorate([
|
|
596
|
+
Input(),
|
|
597
|
+
__metadata("design:type", String)
|
|
598
|
+
], AXDataGridComponent.prototype, "keyField", void 0);
|
|
599
|
+
__decorate([
|
|
600
|
+
Input(),
|
|
601
|
+
__metadata("design:type", String)
|
|
602
|
+
], AXDataGridComponent.prototype, "hasChildField", void 0);
|
|
603
|
+
__decorate([
|
|
604
|
+
Input(),
|
|
605
|
+
__metadata("design:type", String),
|
|
606
|
+
__metadata("design:paramtypes", [String])
|
|
607
|
+
], AXDataGridComponent.prototype, "searchText", null);
|
|
608
|
+
__decorate([
|
|
609
|
+
Input(),
|
|
610
|
+
__metadata("design:type", Array),
|
|
611
|
+
__metadata("design:paramtypes", [Array])
|
|
612
|
+
], AXDataGridComponent.prototype, "filter", null);
|
|
613
|
+
__decorate([
|
|
614
|
+
ContentChildren(AXGridDataColumn),
|
|
615
|
+
__metadata("design:type", QueryList)
|
|
616
|
+
], AXDataGridComponent.prototype, "_inlineColumns", void 0);
|
|
617
|
+
__decorate([
|
|
618
|
+
Output(),
|
|
619
|
+
__metadata("design:type", EventEmitter)
|
|
620
|
+
], AXDataGridComponent.prototype, "columnsChange", void 0);
|
|
621
|
+
__decorate([
|
|
622
|
+
Input(),
|
|
623
|
+
__metadata("design:type", Array),
|
|
624
|
+
__metadata("design:paramtypes", [Array])
|
|
625
|
+
], AXDataGridComponent.prototype, "columns", null);
|
|
626
|
+
__decorate([
|
|
627
|
+
Input(),
|
|
628
|
+
__metadata("design:type", Object)
|
|
629
|
+
], AXDataGridComponent.prototype, "rowHeight", void 0);
|
|
630
|
+
__decorate([
|
|
631
|
+
ContentChild(AXToolbarSearchComponent, { static: true }),
|
|
632
|
+
__metadata("design:type", AXToolbarSearchComponent)
|
|
633
|
+
], AXDataGridComponent.prototype, "searchInput", void 0);
|
|
634
|
+
__decorate([
|
|
635
|
+
ContentChild(AXToolbarComponent, { static: true }),
|
|
636
|
+
__metadata("design:type", AXToolbarComponent)
|
|
637
|
+
], AXDataGridComponent.prototype, "toolbar", void 0);
|
|
638
|
+
__decorate([
|
|
639
|
+
ContentChild(AXDataGridRowTemplateComponent, { static: true }),
|
|
640
|
+
__metadata("design:type", AXDataGridRowTemplateComponent)
|
|
641
|
+
], AXDataGridComponent.prototype, "rowTemplate", void 0);
|
|
642
|
+
__decorate([
|
|
643
|
+
ContentChild(AXDataGridDetailTemplateComponent, { static: true }),
|
|
644
|
+
__metadata("design:type", AXDataGridDetailTemplateComponent)
|
|
645
|
+
], AXDataGridComponent.prototype, "gridDetailTemplate", void 0);
|
|
646
|
+
__decorate([
|
|
647
|
+
ContentChild(AXDataSourceComponent, { static: true }),
|
|
648
|
+
__metadata("design:type", AXDataSourceComponent)
|
|
649
|
+
], AXDataGridComponent.prototype, "_contentDataSource", void 0);
|
|
650
|
+
__decorate([
|
|
651
|
+
Input(),
|
|
652
|
+
__metadata("design:type", AXDataSourceComponent),
|
|
653
|
+
__metadata("design:paramtypes", [AXDataSourceComponent])
|
|
654
|
+
], AXDataGridComponent.prototype, "dataSource", null);
|
|
655
|
+
__decorate([
|
|
656
|
+
Input(),
|
|
657
|
+
__metadata("design:type", Boolean)
|
|
658
|
+
], AXDataGridComponent.prototype, "groupHideOpenParents", void 0);
|
|
659
|
+
__decorate([
|
|
660
|
+
Output(),
|
|
661
|
+
__metadata("design:type", EventEmitter)
|
|
662
|
+
], AXDataGridComponent.prototype, "cellClick", void 0);
|
|
663
|
+
__decorate([
|
|
664
|
+
Output(),
|
|
665
|
+
__metadata("design:type", EventEmitter)
|
|
666
|
+
], AXDataGridComponent.prototype, "cellDbClick", void 0);
|
|
667
|
+
__decorate([
|
|
668
|
+
Output(),
|
|
669
|
+
__metadata("design:type", EventEmitter)
|
|
670
|
+
], AXDataGridComponent.prototype, "cellFocuse", void 0);
|
|
671
|
+
__decorate([
|
|
672
|
+
Output(),
|
|
673
|
+
__metadata("design:type", EventEmitter)
|
|
674
|
+
], AXDataGridComponent.prototype, "rowClick", void 0);
|
|
675
|
+
__decorate([
|
|
676
|
+
Output(),
|
|
677
|
+
__metadata("design:type", EventEmitter)
|
|
678
|
+
], AXDataGridComponent.prototype, "rowDbClick", void 0);
|
|
679
|
+
__decorate([
|
|
680
|
+
Output(),
|
|
681
|
+
__metadata("design:type", EventEmitter)
|
|
682
|
+
], AXDataGridComponent.prototype, "selectionChanged", void 0);
|
|
683
|
+
__decorate([
|
|
684
|
+
Output(),
|
|
685
|
+
__metadata("design:type", EventEmitter)
|
|
686
|
+
], AXDataGridComponent.prototype, "rowSelectionChange", void 0);
|
|
687
|
+
__decorate([
|
|
688
|
+
Output(),
|
|
689
|
+
__metadata("design:type", EventEmitter)
|
|
690
|
+
], AXDataGridComponent.prototype, "onRowSelectionChanged", void 0);
|
|
691
|
+
__decorate([
|
|
692
|
+
Input(),
|
|
693
|
+
__metadata("design:type", Function)
|
|
694
|
+
], AXDataGridComponent.prototype, "rowClass", void 0);
|
|
695
|
+
__decorate([
|
|
696
|
+
Input(),
|
|
697
|
+
__metadata("design:type", Boolean)
|
|
698
|
+
], AXDataGridComponent.prototype, "rtl", void 0);
|
|
699
|
+
AXDataGridComponent = __decorate([
|
|
700
|
+
Component({
|
|
701
|
+
selector: 'ax-data-grid',
|
|
702
|
+
template: "<div class=\"ax-grid-toolbar\" *ngIf=\"toolbar\">\r\n <ng-content select=\"ax-toolbar\"></ng-content>\r\n</div>\r\n<!-- [enableSorting]=\"true\" [enableColResize]=\"true\" [enableFilter]=\"allowFiltering\" -->\r\n<ag-grid-angular *ngIf=\"gridView\" class=\"ag-theme-balham\" [getRowClass]=\"internalGetRowClass\"\r\n [style.height]=\"internalHeight\" [columnDefs]=\"columnDefs\" [enableRtl]=\"rtl\" [pagination]=\"true\"\r\n [rowGroupPanelShow]=\"rowGroupPanelShow\" [rowModelType]=\"rowModelType\" [detailRowHeight]=\"detailRowHeight\"\r\n [getRowHeight]=\"getRowHeight\" [paginationAutoPageSize]=\"true\" [suppressMenuHide]=\"true\"\r\n [frameworkComponents]=\"frameworkComponents\" [isFullWidthCell]=\"isFullWidthCell\" [rowSelection]=\"selectionMode\"\r\n [rowMultiSelectWithClick]=\"rowMultiSelectWithClick\" [fullWidthCellRendererFramework]=\"fullWidthCellRendererFramework\"\r\n [fullWidthCellRendererParams]=\"fullWidthCellRendererParams\" (cellClicked)=\"internalGridCellClicked($event)\"\r\n (cellDoubleClicked)=\"internalGridCellDoubleClicked($event)\" (cellFocused)=\"internalGridCellFocused($event)\"\r\n (rowClicked)=\"internalGridRowClicked($event)\" (selectionChanged)=\"internalGridSelectionChanged($event)\"\r\n (rowSelected)=\"rowSelectionChanged($event)\" (rowDoubleClicked)=\"internalGridRowDoubleClicked($event)\"\r\n (gridReady)=\"internalGridReady($event)\" [groupSelectsChildren]=\"groupSelectsChildren\"\r\n [suppressRowClickSelection]=\"suppressRowClickSelection\" [groupSelectsFiltered]=\"true\"\r\n [suppressCellSelection]=\"suppressCellSelection\" [autoGroupColumnDef]=\"autoGroupColumnDef\"\r\n [suppressAggFuncInHeader]=\"true\" [treeData]=\"treeData\" [animateRows]=\"true\" [isServerSideGroup]=\"isServerSideGroup\"\r\n [getServerSideGroupKey]=\"getServerSideGroupKey\" [masterDetail]=\"masterDetail\"\r\n [detailCellRendererParams]=\"detailCellRendererParams\" [detailCellRenderer]=\"detailCellRenderer\"\r\n (gridSizeChanged)=\"internalGridSizeChanged($event)\" (firstDataRendered)=\"internalGridFirstDataRendered($event)\"\r\n [localeText]=\"localeText\" [groupHideOpenParents]=\"groupHideOpenParents\" [enableRangeSelection]=\"true\"\r\n [enableRangeSelection]=\"false\" [allowContextMenuWithControlKey]=\"false\" [getMainMenuItems]=\"getMainMenuItems\">\r\n</ag-grid-angular>\r\n\r\n<!-- (displayedColumnsChanged)=\"displayedColumnsChanged($event)\" -->",
|
|
703
|
+
encapsulation: ViewEncapsulation.None
|
|
704
|
+
// changeDetection: ChangeDetectionStrategy.OnPush
|
|
705
|
+
}),
|
|
706
|
+
__metadata("design:paramtypes", [ElementRef, ChangeDetectorRef])
|
|
707
|
+
], AXDataGridComponent);
|
|
708
|
+
export { AXDataGridComponent };
|
|
709
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFjb3JleC9kYXRhLWdyaWQvIiwic291cmNlcyI6WyJsaWIvZGF0YS1ncmlkL2RhdGFncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLGVBQWUsRUFDZixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWE5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0csT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXhDLGNBQWMsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHO0lBQ3pDLDZDQUE2QztBQUMvQyxDQUFDLENBQUM7QUFFRixpRUFBaUU7QUFDakUsa0JBQWtCO0FBQ2xCLElBQUk7QUFFSixNQUFNLE9BQU8sNEJBQTZCLFNBQVEsWUFBZ0M7Q0FF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REFBc0U7QUFHNUY7SUFEQyxNQUFNLEVBQUU7OEJBQ0csWUFBWTt1REFBc0U7QUFHOUY7SUFEQyxNQUFNLEVBQUU7OEJBQ1MsWUFBWTs2REFBc0Y7QUFHcEg7SUFEQyxNQUFNLEVBQUU7OEJBQ1csWUFBWTsrREFBc0Y7QUFHdEg7SUFEQyxNQUFNLEVBQUU7OEJBQ2MsWUFBWTtrRUFBNEY7QUFlL0g7SUFEQyxLQUFLLEVBQUU7O3FEQUMwRTtBQUdsRjtJQURDLEtBQUssRUFBRTs7Z0RBQ2tDO0FBOU0vQixtQkFBbUI7SUFOL0IsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGNBQWM7UUFDeEIsMDNFQUF3QztRQUN4QyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtRQUNyQyxrREFBa0Q7S0FDbkQsQ0FBQztxQ0FpTnlCLFVBQVUsRUFBZSxpQkFBaUI7R0FoTnhELG1CQUFtQixDQTZvQi9CO1NBN29CWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgSW5wdXQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQVhEYXRhU291cmNlQ29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzJztcclxuaW1wb3J0IHsgQVhHcmlkRGF0YUNvbHVtbiB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhEYXRhU291cmNlUmVhZFBhcmFtcyB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7XHJcbiAgR3JpZE9wdGlvbnMsXHJcbiAgQ2VsbENsaWNrZWRFdmVudCxcclxuICBSb3dDbGlja2VkRXZlbnQsXHJcbiAgQ2VsbEV2ZW50LFxyXG4gIFJvd0V2ZW50LFxyXG4gIEZpcnN0RGF0YVJlbmRlcmVkRXZlbnQsXHJcbiAgR3JpZFNpemVDaGFuZ2VkRXZlbnQsXHJcbiAgR3JpZEFwaVxyXG59IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcclxuXHJcbmltcG9ydCB7IExpY2Vuc2VNYW5hZ2VyIH0gZnJvbSAnYWctZ3JpZC1lbnRlcnByaXNlJztcclxuaW1wb3J0IHsgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQVhHcmlkQ2VsbEV2ZW50LCBBWEdyaWRSb3dFdmVudCwgQVhHcmlkUm93U2VsZWN0aW9uRXZlbnQsIEFYR3JpZFJvd1BhcmFtcyB9IGZyb20gJy4vZGF0YWdyaWQuZXZlbnRzJztcclxuXHJcbmltcG9ydCB7IEFYRGF0YUdyaWRSb3dUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGVzL3Jvdy10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBWFRvb2xiYXJTZWFyY2hDb21wb25lbnQsIEFYVG9vbGJhckNvbXBvbmVudCwgQVhEYXRhRXZlbnQsIEFYVmFsdWVFdmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IEFYRGF0YUdyaWREZXRhaWxUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGVzL2RldGFpbC10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBWFRyYW5zbGF0b3IgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5pbXBvcnQgeyBBWERhdGVQaWNrZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvZGF0ZS1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhDb25maWcgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5cclxuTGljZW5zZU1hbmFnZXIucHJvdG90eXBlLnZhbGlkYXRlTGljZW5zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAvL2NvbnNvbGUuaW5mbygnQ3JhY2tlZCBieSBBcmFzaCBPc2hub3VkaSEnKTtcclxufTtcclxuXHJcbi8vIFdhdGVybWFya0NvbXAucHJvdG90eXBlLnNob3VsZERpc3BsYXlXYXRlcm1hcmsgPSBmdW5jdGlvbiAoKSB7XHJcbi8vICAgcmV0dXJuIGZhbHNlO1xyXG4vLyB9XHJcblxyXG5leHBvcnQgY2xhc3MgQVhEYXRhR3JpZENvbHVtbnNDaGFuZ2VFdmVudCBleHRlbmRzIEFYVmFsdWVFdmVudDxBWEdyaWREYXRhQ29sdW1uW10+IHtcclxuICBjb21wb25lbnQ6IEFYRGF0YUdyaWRDb21wb25lbnQ7XHJcbn1cclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRDZWxsRXZlbnQgZXh0ZW5kcyBBWERhdGFFdmVudDxBWEdyaWRDZWxsRXZlbnQ+IHtcclxuICBjb21wb25lbnQ6IEFYRGF0YUdyaWRDb21wb25lbnQ7XHJcbn1cclxuZXhwb3J0IGNsYXNzIEFYRGFhZ3JpZFJvd0NsaWNrRXZlbnQgZXh0ZW5kcyBBWERhdGFFdmVudDxBWEdyaWRSb3dFdmVudD4ge1xyXG4gIGNvbXBvbmVudDogQVhEYXRhR3JpZENvbXBvbmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRTZWxlY3Rpb25DaGFuZ2VFdmVudCBleHRlbmRzIEFYRGF0YUV2ZW50PEFYR3JpZFJvd1NlbGVjdGlvbkV2ZW50PiB7XHJcbiAgY29tcG9uZW50OiBBWERhdGFHcmlkQ29tcG9uZW50O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQVhEYXRhR3JpZFJvd1NlbGVjdGlvbkNoYW5nZUV2ZW50IGV4dGVuZHMgQVhEYXRhRXZlbnQ8YW55PiB7XHJcbiAgY29tcG9uZW50OiBBWERhdGFHcmlkQ29tcG9uZW50O1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F4LWRhdGEtZ3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbiAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgZ3JpZEFwaTtcclxuICBwcml2YXRlIGRhdGFTb3VyY2VTdWNjZXNzQ2FsbGJhY2s7XHJcbiAgbG9jYWxlVGV4dDogYW55O1xyXG5cclxuICBncmlkT3B0aW9uczogR3JpZE9wdGlvbnM7XHJcbiAgY29sdW1uRGVmczogYW55W10gPSBbXTtcclxuICByb3dNb2RlbFR5cGUgPSAnY2xpZW50U2lkZSc7XHJcbiAgZnVsbFdpZHRoQ2VsbFJlbmRlcmVyRnJhbWV3b3JrOiBhbnk7XHJcbiAgZnVsbFdpZHRoQ2VsbFJlbmRlcmVyUGFyYW1zOiBhbnk7XHJcbiAgZnJhbWV3b3JrQ29tcG9uZW50czogYW55ID0ge307XHJcbiAgaXNGdWxsV2lkdGhDZWxsOiBGdW5jdGlvbjtcclxuICBpbnRlcm5hbEhlaWdodDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIGRldGFpbENlbGxSZW5kZXJlcjogYW55O1xyXG4gIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogYW55O1xyXG4gIGRldGFpbFJvd0hlaWdodDogbnVtYmVyO1xyXG4gIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW5hYmVsU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ3JpZFZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBncm91cFNlbGVjdHNDaGlsZHJlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9sZFNlbGVjdGlvbk5vZGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvLyBASW5wdXQoKVxyXG4gIC8vIHNob3dSb3dOdW1iZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByZW1vdGVPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcm93TXVsdGlTZWxlY3RXaXRoQ2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzdXBwcmVzc1Jvd0NsaWNrU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3VwcHJlc3NDZWxsU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNpemVDb2x1bW5zVG9GaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNob3dDaGVja0JveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZmxvYXRpbmdGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICB0YWtlQ291bnQ6IG51bWJlcjtcclxuXHJcbiAgYXV0b0dyb3VwQ29sdW1uRGVmOiBhbnkgPSB7fTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyB8ICdtdWx0aXBsZScgPSAnc2luZ2xlJztcclxuXHJcbiAgLy8gQElucHV0KClcclxuICAvLyBhbGxvd0ZpbHRlcmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdFJvdzogYW55W10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICByb3dHcm91cFBhbmVsU2hvdzogJ2Fsd2F5cycgfCAnbmV2ZXInID0gJ25ldmVyJztcclxuXHJcbiAgQElucHV0KClcclxuICBsb2FkT25Jbml0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gQElucHV0KClcclxuICAvLyBncm91cERlZmF1bHRFeHBhbmRlZDogbnVtYmVyID0gMDtcclxuXHJcbiAgQElucHV0KClcclxuICBrZXlGaWVsZDogc3RyaW5nID0gJ251bGwnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhhc0NoaWxkRmllbGQ6IHN0cmluZyA9ICdudWxsJztcclxuXHJcbiAgcHJpdmF0ZSBfc2VhcmNoVGV4dDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBzZWFyY2hUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGV4dDtcclxuICB9XHJcbiAgcHVibGljIHNldCBzZWFyY2hUZXh0KHY6IHN0cmluZykge1xyXG4gICAgaWYgKHYgIT09IHRoaXMuX3NlYXJjaFRleHQpIHtcclxuICAgICAgdGhpcy5fc2VhcmNoVGV4dCA9IHY7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB0aGlzLmdyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyOiBhbnlbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZmlsdGVyKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZmlsdGVyKHY6IGFueVtdKSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fZmlsdGVyKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlciA9IHY7XHJcbiAgICAgIHRoaXMuX2ZpbHRlci5mb3JFYWNoKChmKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmMgPSB0aGlzLmdyaWRBcGkuZ2V0RmlsdGVySW5zdGFuY2UoZi5maWVsZCk7XHJcbiAgICAgICAgaWYgKGZjKSB7XHJcbiAgICAgICAgICBjb25zdCBmZiA9IGZjLmdldEZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlKCk7XHJcbiAgICAgICAgICBmZi5zZXRNb2RlbChmKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihBWEdyaWREYXRhQ29sdW1uKVxyXG4gIHByaXZhdGUgX2lubGluZUNvbHVtbnM6IFF1ZXJ5TGlzdDxBWEdyaWREYXRhQ29sdW1uPjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgY29sdW1uc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDb2x1bW5zQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ29sdW1uc0NoYW5nZUV2ZW50PigpO1xyXG5cclxuICBwcml2YXRlIF9jb2x1bW5zOiBBWEdyaWREYXRhQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBWEdyaWREYXRhQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lubGluZUNvbHVtbnMgPyBbLi4udGhpcy5fY29sdW1ucywgLi4udGhpcy5faW5saW5lQ29sdW1ucy50b0FycmF5KCldIDogdGhpcy5fY29sdW1ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY29sdW1ucyh2YWw6IEFYR3JpZERhdGFDb2x1bW5bXSkge1xyXG4gICAgaWYgKHZhbCAmJiB2YWwubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBvbGQgPSB0aGlzLl9jb2x1bW5zO1xyXG4gICAgICB0aGlzLl9jb2x1bW5zID0gdmFsO1xyXG4gICAgICB0aGlzLmNvbHVtbnNDaGFuZ2UuZW1pdCh7IGNvbXBvbmVudDogdGhpcywgdmFsdWU6IHZhbCwgb2xkVmFsdWU6IG9sZCwgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0Q29sRGVmOiBhbnkgPSB7XHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICBmbG9hdGluZ0ZpbHRlcjogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcm93SGVpZ2h0OiBhbnk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQVhUb29sYmFyU2VhcmNoQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHNlYXJjaElucHV0OiBBWFRvb2xiYXJTZWFyY2hDb21wb25lbnQ7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQVhUb29sYmFyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHRvb2xiYXI6IEFYVG9vbGJhckNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWERhdGFHcmlkUm93VGVtcGxhdGVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcm93VGVtcGxhdGU6IEFYRGF0YUdyaWRSb3dUZW1wbGF0ZUNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWERhdGFHcmlkRGV0YWlsVGVtcGxhdGVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZ3JpZERldGFpbFRlbXBsYXRlOiBBWERhdGFHcmlkRGV0YWlsVGVtcGxhdGVDb21wb25lbnQ7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQVhEYXRhU291cmNlQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHByaXZhdGUgX2NvbnRlbnREYXRhU291cmNlOiBBWERhdGFTb3VyY2VDb21wb25lbnQ7XHJcblxyXG4gIHByaXZhdGUgX2RhdGFTb3VyY2U6IEFYRGF0YVNvdXJjZUNvbXBvbmVudDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQVhEYXRhU291cmNlQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlID8gdGhpcy5fZGF0YVNvdXJjZSA6IHRoaXMuX2NvbnRlbnREYXRhU291cmNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkYXRhU291cmNlKHY6IEFYRGF0YVNvdXJjZUNvbXBvbmVudCkge1xyXG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IHY7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdyb3VwSGlkZU9wZW5QYXJlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNlbGxDbGljazogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ2VsbEV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBjZWxsRGJDbGljazogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ2VsbEV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBjZWxsRm9jdXNlOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZENlbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYWFncmlkUm93Q2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGFhZ3JpZFJvd0NsaWNrRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHJvd0RiQ2xpY2s6IEV2ZW50RW1pdHRlcjxBWERhYWdyaWRSb3dDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYWFncmlkUm93Q2xpY2tFdmVudD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRTZWxlY3Rpb25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcm93U2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZFNlbGVjdGlvbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBvblJvd1NlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkUm93U2VsZWN0aW9uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkUm93U2VsZWN0aW9uQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gIGdldFJvd0hlaWdodChwYXJhbSkge1xyXG4gICAgaWYgKHBhcmFtLmRhdGEgJiYgcGFyYW0uZGF0YS5yb3dIZWlnaHQgJiYgcGFyYW0ubm9kZS5sZXZlbCA9PSAwKSB7XHJcbiAgICAgIHJldHVybiBwYXJhbS5kYXRhLnJvd0hlaWdodDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgPT0gdHJ1ZSAmJiBwYXJhbS5ub2RlLmxldmVsID09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGV0YWlsUm93SGVpZ2h0O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlckRldGFpbCA9PSBmYWxzZSAmJiBwYXJhbS5kYXRhICYmIHBhcmFtLmRhdGEucm93SGVpZ2h0KSB7XHJcbiAgICAgIHJldHVybiBwYXJhbS5kYXRhLnJvd0hlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICByb3dDbGFzcz86IChwYXJhbXM6IEFYR3JpZFJvd1BhcmFtcykgPT4gKHN0cmluZyB8IHN0cmluZ1tdKSB8IChzdHJpbmcgfCBzdHJpbmdbXSk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcnRsOiBib29sZWFuID0gQVhDb25maWcuZ2V0KCdsYXlvdXQucnRsJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHRoaXMubG9jYWxlVGV4dCA9IEFYVHJhbnNsYXRvci5nZXQoJ2RhdGFHcmlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGNIZWlnaHQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy50b29sYmFyKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxIZWlnaHQgPSBgY2FsYygxMDAlIC0gJHs0MH1weClgO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbEhlaWdodCA9ICcxMDAlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGludGVuYWxHcmlkRGF0YVNvdXJjZSgpIHtcclxuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcm93Q291bnQ6IG51bGwsXHJcbiAgICAgIGdldFJvd3M6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAvLyB0aGF0LmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLnNldFByb3BlcnR5KCdjYWNoZUJsb2NrU2l6ZScsIHRoaXMudGFrZUNvdW50ID8gdGhpcy50YWtlQ291bnQgOiBwYXJhbXMuYXBpLnBhZ2luYXRpb25HZXRQYWdlU2l6ZSgpKTtcclxuICAgICAgICB0aGF0LmRhdGFTb3VyY2VTdWNjZXNzQ2FsbGJhY2sgPSBwYXJhbXMuc3VjY2Vzc0NhbGxiYWNrO1xyXG4gICAgICAgIGNvbnN0IGxvYWRQYXJhbXM6IEFYRGF0YVNvdXJjZVJlYWRQYXJhbXMgPSB7fTtcclxuICAgICAgICBsb2FkUGFyYW1zLnNlYXJjaFRleHQgPSB0aGF0LnNlYXJjaFRleHQ7XHJcbiAgICAgICAgbG9hZFBhcmFtcy5za2lwID0gcGFyYW1zLnJlcXVlc3Quc3RhcnRSb3c7XHJcbiAgICAgICAgLy8gIGxvYWRQYXJhbXMudGFrZSA9IHBhcmFtcy5yZXF1ZXN0LmVuZFJvdyAtIHBhcmFtcy5yZXF1ZXN0LnN0YXJ0Um93O1xyXG4gICAgICAgIGxvYWRQYXJhbXMudGFrZSA9IHRoYXQudGFrZUNvdW50ID8gdGhhdC50YWtlQ291bnQgOiBwYXJhbXMuYXBpLnBhZ2luYXRpb25HZXRQYWdlU2l6ZSgpICogMjtcclxuICAgICAgICBsb2FkUGFyYW1zLnNvcnQgPSBwYXJhbXMucmVxdWVzdC5zb3J0TW9kZWwubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmaWVsZDogYy5jb2xJZCxcclxuICAgICAgICAgICAgZGlyOiBjLnNvcnRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gbG9hZFBhcmFtcy5ncm91cHMgPSBwYXJhbXMucmVxdWVzdC5yb3dHcm91cENvbHMubWFwKHIgPT4gci5maWVsZCk7XHJcbiAgICAgICAgLy8gbG9hZFBhcmFtcy5ncm91cEtleXMgPSBwYXJhbXMucmVxdWVzdC5ncm91cEtleXM7XHJcbiAgICAgICAgLy8gbG9hZFBhcmFtcy5kYXRhID0gcGFyYW1zLnBhcmVudE5vZGUuZGF0YTtcclxuICAgICAgICBsb2FkUGFyYW1zLmdyb3VwID0ge1xyXG4gICAgICAgICAgZmllbGRzOiBwYXJhbXMucmVxdWVzdC5yb3dHcm91cENvbHMubWFwKChyKSA9PiByLmZpZWxkKSxcclxuICAgICAgICAgIGtleXM6IHBhcmFtcy5yZXF1ZXN0Lmdyb3VwS2V5cyxcclxuICAgICAgICAgIHBhcmVudERhdGE6IHBhcmFtcy5wYXJlbnROb2RlLmRhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxvYWRQYXJhbXMuZmlsdGVyID0gcGFyYW1zLnJlcXVlc3QuZmlsdGVyTW9kZWw7XHJcbiAgICAgICAgdGhhdC5kYXRhU291cmNlLmZldGNoKGxvYWRQYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRNYWluTWVudUl0ZW1zKGUpIHtcclxuICAgIHJldHVybiBbJ3BpblN1Yk1lbnUnLCAnc2VwYXJhdG9yJ107XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBpc1NlcnZlclNpZGVHcm91cCA9IChlKSA9PiB7XHJcbiAgICByZXR1cm4gZVt0aGlzLmhhc0NoaWxkRmllbGRdO1xyXG4gIH07XHJcblxyXG4gIGdldFNlcnZlclNpZGVHcm91cEtleSA9IChlKSA9PiB7XHJcbiAgICByZXR1cm4gZVt0aGlzLmtleUZpZWxkXTtcclxuICB9O1xyXG4gIC8vIHRvZG8gZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zXHJcbiAgaW50ZXJuYWxHcmlkUmVhZHkoZ3JpZE9wdGlvbnMpIHtcclxuICAgIGdyaWRPcHRpb25zLmFwaS5jaGVja0dyaWRTaXplKCk7XHJcbiAgICB0aGlzLnRha2VDb3VudCA9IHRoaXMudGFrZUNvdW50ID8gdGhpcy50YWtlQ291bnQgOiBncmlkT3B0aW9ucy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCkgKiAyO1xyXG4gICAgdGhpcy50YWtlQ291bnQgPSB0aGlzLnRha2VDb3VudCA8IDIwID8gMjAgOiB0aGlzLnRha2VDb3VudDtcclxuICAgIGdyaWRPcHRpb25zLmFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuc2V0UHJvcGVydHkoJ2NhY2hlQmxvY2tTaXplJywgdGhpcy50YWtlQ291bnQpO1xyXG4gICAgdGhpcy5ncmlkQXBpID0gZ3JpZE9wdGlvbnMuYXBpO1xyXG5cclxuICAgIHRoaXMubWFwQ29sdW1ucygpO1xyXG4gICAgdGhpcy5jYWxjSGVpZ2h0KCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmxvYWRPbkluaXQpIHtcclxuICAgICAgdGhpcy5sb2FkT25Jbml0ID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlbW90ZU9wZXJhdGlvbikge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2V0U2VydmVyU2lkZURhdGFzb3VyY2UodGhpcy5pbnRlbmFsR3JpZERhdGFTb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5yZW1vdGVPcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuICAgIGlmICh0aGlzLnJvd1RlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuZnVsbFdpZHRoQ2VsbFJlbmRlcmVyRnJhbWV3b3JrID0gdGhpcy5yb3dUZW1wbGF0ZS5yZW5kZXJlcjtcclxuICAgICAgdGhpcy5mdWxsV2lkdGhDZWxsUmVuZGVyZXJQYXJhbXMgPSB0aGlzLnJvd1RlbXBsYXRlLnBhcmFtcztcclxuICAgIH1cclxuICAgIHRoaXMuZnJhbWV3b3JrQ29tcG9uZW50cy5hZ0RhdGVJbnB1dCA9IEFYRGF0ZVBpY2tlckZpbHRlckNvbXBvbmVudDtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkRGV0YWlsVGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcyA9IHRoaXMuZ3JpZERldGFpbFRlbXBsYXRlLnBhcmFtcztcclxuICAgICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXIgPSAnZGV0YWlsUmVuZGVyZXJGcmFtZXdvcmsnO1xyXG4gICAgICB0aGlzLmZyYW1ld29ya0NvbXBvbmVudHMuZGV0YWlsUmVuZGVyZXJGcmFtZXdvcmsgPSB0aGlzLmdyaWREZXRhaWxUZW1wbGF0ZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgIHRoaXMuZGV0YWlsUm93SGVpZ2h0ID0gdGhpcy5ncmlkRGV0YWlsVGVtcGxhdGUuaGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0Z1bGxXaWR0aENlbGwgPSAoKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGF0LnJvd1RlbXBsYXRlICE9IG51bGw7XHJcbiAgICB9O1xyXG4gICAgLy90aGlzLmNkclxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJykge1xyXG4gICAgICB0aGlzLmdyb3VwU2VsZWN0c0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5rZXlGaWVsZCAhPT0gJ251bGwnICYmIHRoaXMuaGFzQ2hpbGRGaWVsZCAhPT0gJ251bGwnKSB7XHJcbiAgICAgIHRoaXMucm93R3JvdXBQYW5lbFNob3cgPSAnbmV2ZXInO1xyXG4gICAgICB0aGlzLnRyZWVEYXRhID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJlbW90ZU9wZXJhdGlvbikge1xyXG4gICAgICB0aGlzLnJvd01vZGVsVHlwZSA9ICdzZXJ2ZXJTaWRlJztcclxuICAgIH1cclxuICAgIC8vXHJcbiAgICBpZiAodGhpcy5ydGwgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJ0bCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2RpcmVjdGlvbicpID09PSAncnRsJztcclxuICAgIH1cclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICBncmlkU2VsZWN0Um93KCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RSb3cgJiYgdGhpcy5zZWxlY3RSb3cubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRBcGkgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdGhpcy5zZWxlY3RSb3dbMF0gIT0gJ29iamVjdCcpIHtcclxuICAgICAgICB0aGlzLmdyaWRBcGkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgICAgICAgIGlmIChub2RlLmRhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93LmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YVt0aGlzLmtleUZpZWxkXSA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmdyaWRBcGkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgICAgICAgIGlmIChub2RlLmRhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaXRlbS5yb3dJbmRleCAhPSB1bmRlZmluZWQgJiYgaXRlbS5yb3dMZXZlbCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmRhdGFbdGhpcy5rZXlGaWVsZF0gPT09IGl0ZW0uZGF0YVt0aGlzLmtleUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kYXRhW3RoaXMua2V5RmllbGRdID09PSBpdGVtW3RoaXMua2V5RmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcblxyXG4gIC8vICAgLy9DYWxsZWQgYWZ0ZXIgZXZlcnkgY2hlY2sgb2YgdGhlIGNvbXBvbmVudCdzIHZpZXcuIEFwcGxpZXMgdG8gY29tcG9uZW50cyBvbmx5LlxyXG4gIC8vICAgLy9BZGQgJ2ltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCcgdG8gdGhlIGNsYXNzLlxyXG4gIC8vICAgLy8gdGhpcy5zZWxlY3RCeVZhbHVlcygpO1xyXG4gIC8vICAgdGhpcy5lbmFiZWxTZWxlY3QgPSBmYWxzZTtcclxuXHJcbiAgLy8gfVxyXG4gIHJlYnVpbGRHcmlkKCkge1xyXG4gICAgdGhpcy5tYXBDb2x1bW5zKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2l6ZUNvbHVtbnNUb0ZpdCkge1xyXG4gICAgICAgIHRoaXMuZ3JpZEFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRyZWVEYXRhID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uRGVmcyA9IHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMucmVuZGVyKCkpO1xyXG5cclxuICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB0aGlzLmNvbHVtbkRlZnMuZmluZCgoYykgPT4gYy5yb3dHcm91cEluZGV4ID09ICcwJyAmJiBjLmZpZWxkICE9PSAnJyk7XHJcblxyXG4gICAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcclxuICAgICAgICBoZWFkZXJOYW1lOiBncm91cENvbHVtbi5oZWFkZXJOYW1lLFxyXG4gICAgICAgIHdpZHRoOiBncm91cENvbHVtbi53aWR0aCxcclxuICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHsgY2hlY2tib3g6IHRoaXMuc2hvd0NoZWNrQm94IH0sXHJcbiAgICAgICAgZmllbGQ6IGdyb3VwQ29sdW1uLmZpZWxkXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmNvbHVtbkRlZnMuZm9yRWFjaCgoZWxtKSA9PiB7XHJcbiAgICAgICAgaWYgKGVsbS5yb3dHcm91cEluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIGVsbS5oaWRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIHRoaXMuZ3JpZFZpZXcgPSB0cnVlO1xyXG4gICAgLy99KTtcclxuXHJcbiAgICB0aGlzLmVuYWJlbFNlbGVjdCA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2Uub25EYXRhUmVjZWl2ZWQuc3Vic2NyaWJlKChfZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBfZGF0YS5kYXRhLnJlc3VsdDtcclxuICAgICAgdGhpcy5oaWRlTG9hZGluZygpO1xyXG4gICAgICBsZXQgaXRlbXM6IGFueVtdO1xyXG4gICAgICBsZXQgdG90YWxDb3VudDogbnVtYmVyO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XHJcbiAgICAgICAgaXRlbXMgPSByZXN1bHQ7XHJcbiAgICAgICAgdG90YWxDb3VudCA9IHJlc3VsdC5sZW5ndGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbXMgPSByZXN1bHQuaXRlbXM7XHJcbiAgICAgICAgdG90YWxDb3VudCA9IHJlc3VsdC50b3RhbENvdW50O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2VTdWNjZXNzQ2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoIXRoaXMubG9hZE9uSW5pdCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlU3VjY2Vzc0NhbGxiYWNrKFtdLCAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlU3VjY2Vzc0NhbGxiYWNrKGl0ZW1zLCB0b3RhbENvdW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRPbkluaXQgJiYgdGhpcy5ncmlkQXBpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZEFwaS5zZXRSb3dEYXRhKFtdKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZEFwaSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkuc2V0Um93RGF0YShpdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmdyaWRTZWxlY3RSb3coKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGF0YVNvdXJjZS5vbkZldGNoU3RhcnQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQpIHtcclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5vblZhbHVlQ2hhbmdlZC5zdWJzY3JpYmUoKGMpID0+IHtcclxuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBjLnZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBtYXBDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5jb2x1bW5EZWZzID0gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5yZW5kZXIoKSk7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMuc2hvd1Jvd051bWJlcikge1xyXG4gICAgLy8gICB0aGlzLmNvbHVtbkRlZnMucHVzaCh7XHJcbiAgICAvLyAgICAgaGVhZGVyTmFtZTogQVhDb25maWcuZ2V0KCdsYXlvdXQucnRsJykgPyAn2LHYr9uM2YEnIDogJ1JvdycsXHJcbiAgICAvLyAgICAgdmFsdWVHZXR0ZXI6ICdub2RlLnJvd0luZGV4ICsgMScsXHJcbiAgICAvLyAgICAgcGlubmVkOiBBWENvbmZpZy5nZXQoJ2xheW91dC5ydGwnKSA/ICdyaWdodCcgOiAnbGVmdCdcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZERldGFpbFRlbXBsYXRlKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbkRlZnNbMF0uY2hlY2tib3hTZWxlY3Rpb24gPT09IHRydWUgJiYgdGhpcy5jb2x1bW5EZWZzWzBdLmZpZWxkID09PSAnJykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uRGVmc1sxXS5jZWxsUmVuZGVyZXIgPSAnYWdHcm91cENlbGxSZW5kZXJlcic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5EZWZzWzBdLmNlbGxSZW5kZXJlciA9ICdhZ0dyb3VwQ2VsbFJlbmRlcmVyJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0NoaWxkRmllbGQgPT09ICdudWxsJykge1xyXG4gICAgICBjb25zdCBncm91cENvbHVtbiA9IHRoaXMuY29sdW1uRGVmcy5maW5kKChjKSA9PiBjLnJvd0dyb3VwSW5kZXggPT09IHVuZGVmaW5lZCAmJiBjLmZpZWxkICE9PSAnJyk7XHJcbiAgICAgIGlmIChncm91cENvbHVtbiAmJiB0aGlzLmdyb3VwSGlkZU9wZW5QYXJlbnRzID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBncm91cENvbHVtbi5oZWFkZXJOYW1lLFxyXG4gICAgICAgICAgd2lkdGg6IGdyb3VwQ29sdW1uLndpZHRoLFxyXG4gICAgICAgICAgY2VsbFJlbmRlcmVyUGFyYW1zOiB7IGNoZWNrYm94OiB0aGlzLnNob3dDaGVja0JveCB9LFxyXG4gICAgICAgICAgZmllbGQ6IGdyb3VwQ29sdW1uLmZpZWxkXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyAgZ3JvdXBDb2x1bW4uaGlkZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbHVtbkRlZnMuZm9yRWFjaCgoZWxtKSA9PiB7XHJcbiAgICAgIGlmIChlbG0ucm93R3JvdXBJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgZWxtLmhpZGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRpc3BsYXllZENvbHVtbnNDaGFuZ2VkKGUpIHtcclxuICAgIGlmICh0aGlzLmhhc0NoaWxkRmllbGQgPT09ICdudWxsJykge1xyXG4gICAgICBjb25zdCBlZSA9IGUuY29sdW1uQXBpLmdldEFsbERpc3BsYXllZENvbHVtbkdyb3VwcygpO1xyXG4gICAgICBjb25zdCBlZWUgPSBlZS5maW5kKChjKSA9PiBjLmNvbElkICE9PSAnYWctR3JpZC1BdXRvQ29sdW1uJyAmJiBjLmNvbElkICE9PSAnMCcpO1xyXG4gICAgICBpZiAoZWVlICYmIGVlZS5jb2xJZCkge1xyXG4gICAgICAgIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZWVlLmNvbERlZi5oZWFkZXJOYW1lLFxyXG4gICAgICAgICAgd2lkdGg6IGVlZS5jb2xEZWYud2lkdGgsXHJcbiAgICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHsgY2hlY2tib3g6IHRoaXMuc2hvd0NoZWNrQm94IH0sXHJcbiAgICAgICAgICBmaWVsZDogZWVlLmNvbERlZi5maWVsZFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgLy8gZWVlLmhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaChyb3V0ZTogYW55W10gPSBbXSkge1xyXG4gICAgaWYgKHRoaXMucmVtb3RlT3BlcmF0aW9uICYmIHRoaXMuZ3JpZEFwaSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vICB0aGlzLmdyaWRBcGkucHVyZ2VTZXJ2ZXJTaWRlQ2FjaGUocm91dGUpO1xyXG4gICAgICB0aGlzLmdyaWRBcGkuc2V0U2VydmVyU2lkZURhdGFzb3VyY2UodGhpcy5pbnRlbmFsR3JpZERhdGFTb3VyY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETyA6IGNoZWNrIGZldGNoIHBhcmFtXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mZXRjaChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZENlbGxDbGlja2VkKGU6IENlbGxDbGlja2VkRXZlbnQpIHtcclxuICAgIHRoaXMuY2VsbENsaWNrLmVtaXQoeyBkYXRhOiB0aGlzLm1hcENlbGxFdmVudChlKSwgY29tcG9uZW50OiB0aGlzLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZENlbGxEb3VibGVDbGlja2VkKGU6IENlbGxDbGlja2VkRXZlbnQpIHtcclxuICAgIHRoaXMuY2VsbERiQ2xpY2suZW1pdCh7IGRhdGE6IHRoaXMubWFwQ2VsbEV2ZW50KGUpLCBjb21wb25lbnQ6IHRoaXMsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkQ2VsbEZvY3VzZWQoZTogQ2VsbENsaWNrZWRFdmVudCkge1xyXG4gICAgdGhpcy5jZWxsRm9jdXNlLmVtaXQoeyBkYXRhOiB0aGlzLm1hcENlbGxFdmVudChlKSwgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsIGNvbXBvbmVudDogdGhpcyB9KTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZFJvd0NsaWNrZWQoZTogUm93Q2xpY2tlZEV2ZW50KSB7XHJcbiAgICBpZiAoIWUubm9kZS5ncm91cCkge1xyXG4gICAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyBkYXRhOiB0aGlzLm1hcFJvd0V2ZW50KGUpLCBjb21wb25lbnQ6IHRoaXMsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkUm93RG91YmxlQ2xpY2tlZChlOiBDZWxsQ2xpY2tlZEV2ZW50KSB7XHJcbiAgICBpZiAoIWUubm9kZS5ncm91cCkge1xyXG4gICAgICB0aGlzLnJvd0RiQ2xpY2suZW1pdCh7IGRhdGE6IHRoaXMubWFwUm93RXZlbnQoZSksIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LCBjb21wb25lbnQ6IHRoaXMgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaWZmZXJlbmNlT2YyQXJyYXlzKGFycmF5MTogYW55LCBhcnJheTI6IGFueSkge1xyXG4gICAgY29uc3QgdGVtcCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpIGluIGFycmF5MSkge1xyXG4gICAgICBpZiAoYXJyYXkyLmluZGV4T2YoYXJyYXkxW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICB0ZW1wLnB1c2goYXJyYXkxW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBpIGluIGFycmF5Mikge1xyXG4gICAgICBpZiAoYXJyYXkxLmluZGV4T2YoYXJyYXkyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICB0ZW1wLnB1c2goYXJyYXkyW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gIH1cclxuXHJcbiAgcm93U2VsZWN0aW9uQ2hhbmdlZChlKSB7XHJcbiAgICAvLyBkZWJ1Z2dlcjtcclxuICAgIC8vIHRoaXMuZ3JpZEFwaS5mb3JFYWNoTm9kZSgobm9kZSkgPT4ge1xyXG4gICAgLy8gICBpZiAobm9kZS5kYXRhW3RoaXMua2V5RmllbGRdID09IGUubm9kZS5kYXRhW3RoaXMua2V5RmllbGRdKSB7XHJcbiAgICAvLyAgICAgbm9kZS5zZXRTZWxlY3RlZChlLm5vZGUuc2VsZWN0ZWQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KTtcclxuICAgIGlmIChlLm5vZGUuc2VsZWN0ZWQgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdFJvdy5wdXNoKGUuZGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdFJvdyA9IHRoaXMuc2VsZWN0Um93LmZpbHRlcigoYykgPT4gY1t0aGlzLmtleUZpZWxkXSAhPSBlLmRhdGFbdGhpcy5rZXlGaWVsZF0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IGNvbXBvbmVudDogdGhpcywgZGF0YTogZSwgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnZScsIGUpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ3NlbGVjdCcsIGUubm9kZS5zZWxlY3RlZCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnaW5kZXgnLCBlLnJvd0luZGV4KTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZFNlbGVjdGlvbkNoYW5nZWQoZSkge1xyXG4gICAgY29uc3QgYXJnczogQVhHcmlkUm93U2VsZWN0aW9uRXZlbnQgPSB7IGl0ZW1zOiBbXSB9O1xyXG4gICAgY29uc3Qgb2xkTm9kZXMgPSB0aGlzLm9sZFNlbGVjdGlvbk5vZGVzO1xyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLmdyaWRBcGkuZ2V0U2VsZWN0ZWROb2RlcygpO1xyXG4gICAgbm9kZXMuZm9yRWFjaCgoaSkgPT4ge1xyXG4gICAgICBhcmdzLml0ZW1zLnB1c2goe1xyXG4gICAgICAgIHJvd0xldmVsOiBpLmxldmVsLFxyXG4gICAgICAgIHJvd0luZGV4OiBpLnJvd0luZGV4LFxyXG4gICAgICAgIGRhdGE6IGkuZGF0YVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQoeyBkYXRhOiBhcmdzLCBjb21wb25lbnQ6IHRoaXMsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gICAgbGV0IGFjdGlvbiA9IG5vZGVzLmxlbmd0aCA+IG9sZE5vZGVzLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmRpZmZlcmVuY2VPZjJBcnJheXMobm9kZXMsIG9sZE5vZGVzKTtcclxuICAgIHRoaXMub25Sb3dTZWxlY3Rpb25DaGFuZ2VkLmVtaXQoeyBjb21wb25lbnQ6IHRoaXMsIHNlbGVjdGVkOiBhY3Rpb24sIGRhdGE6IG5vZGUsIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IH0pO1xyXG4gICAgdGhpcy5vbGRTZWxlY3Rpb25Ob2RlcyA9IG5vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBDZWxsRXZlbnQoZTogQ2VsbEV2ZW50KTogQVhHcmlkQ2VsbEV2ZW50IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJvd0xldmVsOiAwLFxyXG4gICAgICBjb2x1bW46IGUuY29sdW1uLFxyXG4gICAgICBkYXRhOiBlLmRhdGEsXHJcbiAgICAgIHJvd0luZGV4OiBlLnJvd0luZGV4LFxyXG4gICAgICB2YWx1ZTogZS52YWx1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwUm93RXZlbnQoZTogUm93RXZlbnQpOiBBWEdyaWRSb3dFdmVudCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByb3dMZXZlbDogMCxcclxuICAgICAgZGF0YTogZS5kYXRhLFxyXG4gICAgICByb3dJbmRleDogZS5yb3dJbmRleFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZXNlbGVjdEFsbCgpIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5kZXNlbGVjdEFsbCgpO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHZXRSb3dDbGFzcyA9IChwOiBhbnkpID0+IHtcclxuICAgIGlmICh0aGlzLnJvd0NsYXNzKSB7XHJcbiAgICAgIGlmICh0aGlzLnJvd0NsYXNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dDbGFzcyh7XHJcbiAgICAgICAgICByb3dJbmRleDogcC5ub2RlLnJvd0luZGV4LFxyXG4gICAgICAgICAgcm93TGV2ZWw6IHAubm9kZS5sZXZlbCxcclxuICAgICAgICAgIGRhdGE6IHAuZGF0YVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0NsYXNzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgc2hvd0xvYWRpbmcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5zaG93TG9hZGluZ092ZXJsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZGVMb2FkaW5nKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuaGlkZU92ZXJsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZFNpemVDaGFuZ2VkKGU6IEdyaWRTaXplQ2hhbmdlZEV2ZW50KSB7XHJcbiAgICBpZiAoZS5jbGllbnRXaWR0aCA+IDAgJiYgZS5jbGllbnRIZWlnaHQgPiAwKSB7XHJcbiAgICAgIHRoaXMucGVyZm9ybVNpemVDb2x1bW5zVG9GaXQoZS5hcGkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkRmlyc3REYXRhUmVuZGVyZWQoZTogRmlyc3REYXRhUmVuZGVyZWRFdmVudCkge1xyXG4gICAgdGhpcy5wZXJmb3JtU2l6ZUNvbHVtbnNUb0ZpdChlLmFwaSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmZvcm1TaXplQ29sdW1uc1RvRml0KGFwaTogR3JpZEFwaSkge1xyXG4gICAgaWYgKHRoaXMuc2l6ZUNvbHVtbnNUb0ZpdCkge1xyXG4gICAgICBhcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|