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