@porscheinformatik/material-addons 10.3.2 → 10.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/bundles/porscheinformatik-material-addons.umd.js +511 -200
  2. package/bundles/porscheinformatik-material-addons.umd.js.map +1 -1
  3. package/bundles/porscheinformatik-material-addons.umd.min.js +2 -2
  4. package/bundles/porscheinformatik-material-addons.umd.min.js.map +1 -1
  5. package/esm2015/lib/button/button.module.js +2 -2
  6. package/esm2015/lib/button/danger-button/danger-button.component.js +1 -1
  7. package/esm2015/lib/button/flat-button/link-button.component.js +1 -1
  8. package/esm2015/lib/button/icon-button/icon-button.component.js +1 -1
  9. package/esm2015/lib/button/mad-basic-button.js +8 -8
  10. package/esm2015/lib/button/outline-button/outline-button.component.js +1 -1
  11. package/esm2015/lib/button/primary-button/primary-button.component.js +1 -1
  12. package/esm2015/lib/card/card.component.js +13 -7
  13. package/esm2015/lib/card/card.module.js +3 -3
  14. package/esm2015/lib/content-panel/content-header/content-header.component.js +1 -5
  15. package/esm2015/lib/content-panel/content-panel-container/content-panel-container.component.js +1 -5
  16. package/esm2015/lib/content-panel/content-panel-container-content/content-panel-container-content.component.js +1 -5
  17. package/esm2015/lib/content-panel/content-panel-container-footer/content-panel-container-footer.component.js +1 -5
  18. package/esm2015/lib/content-panel/main-container/main-container.component.js +1 -5
  19. package/esm2015/lib/data-table/data-table-action-type.js +4 -4
  20. package/esm2015/lib/data-table/data-table-action.js +1 -1
  21. package/esm2015/lib/data-table/data-table-column-definition.js +1 -0
  22. package/esm2015/lib/data-table/data-table-column.js +1 -0
  23. package/esm2015/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.js +93 -0
  24. package/esm2015/lib/data-table/data-table.component.js +248 -66
  25. package/esm2015/lib/data-table/data-table.js +1 -1
  26. package/esm2015/lib/data-table/data-table.module.js +25 -20
  27. package/esm2015/lib/flowbar/flowbar.component.js +14 -22
  28. package/esm2015/lib/flowbar/flowbar.module.js +1 -1
  29. package/esm2015/lib/material-addons.module.js +1 -1
  30. package/esm2015/lib/quick-list/base-quick-list.component.js +1 -1
  31. package/esm2015/lib/quick-list/quick-list-compact/quick-list-compact.component.js +2 -2
  32. package/esm2015/lib/readonly/readonly-form-field/readonly-form-field.component.js +1 -1
  33. package/esm2015/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.js +12 -12
  34. package/esm2015/lib/readonly/readonly-form-field.module.js +1 -1
  35. package/esm2015/lib/stepper/step-header/step-header.component.js +3 -3
  36. package/esm2015/lib/stepper/stepper.component.js +2 -2
  37. package/esm2015/lib/stepper/stepper.module.js +1 -1
  38. package/esm2015/lib/table/column-header.js +1 -1
  39. package/esm2015/lib/table/table.component.js +7 -7
  40. package/esm2015/lib/throttle-click/throttle-click.directive.js +6 -7
  41. package/esm2015/lib/toolbar/toolbar-action.interface.js +1 -1
  42. package/esm2015/lib/toolbar/toolbar.component.js +7 -4
  43. package/esm2015/lib/toolbar/toolbar.module.js +2 -2
  44. package/esm2015/lib/toolbar/toolbar.service.js +7 -7
  45. package/esm2015/porscheinformatik-material-addons.js +15 -14
  46. package/fesm2015/porscheinformatik-material-addons.js +407 -153
  47. package/fesm2015/porscheinformatik-material-addons.js.map +1 -1
  48. package/lib/button/mad-basic-button.d.ts +4 -4
  49. package/lib/content-panel/content-header/content-header.component.d.ts +1 -4
  50. package/lib/content-panel/content-panel-container/content-panel-container.component.d.ts +1 -4
  51. package/lib/content-panel/content-panel-container-content/content-panel-container-content.component.d.ts +1 -4
  52. package/lib/content-panel/content-panel-container-footer/content-panel-container-footer.component.d.ts +1 -4
  53. package/lib/content-panel/main-container/main-container.component.d.ts +1 -4
  54. package/lib/data-table/data-table-action.d.ts +1 -1
  55. package/lib/data-table/data-table-column-definition.d.ts +26 -0
  56. package/lib/data-table/{data-table-column-header.d.ts → data-table-column.d.ts} +3 -1
  57. package/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.d.ts +23 -0
  58. package/lib/data-table/data-table.component.d.ts +68 -20
  59. package/lib/data-table/data-table.d.ts +2 -1
  60. package/lib/flowbar/flowbar.component.d.ts +3 -3
  61. package/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.d.ts +11 -11
  62. package/lib/stepper/step-header/step-header.component.d.ts +2 -2
  63. package/lib/table/column-header.d.ts +1 -0
  64. package/lib/table/table.component.d.ts +4 -4
  65. package/lib/throttle-click/throttle-click.directive.d.ts +1 -2
  66. package/lib/toolbar/toolbar-action.interface.d.ts +2 -1
  67. package/lib/toolbar/toolbar.component.d.ts +1 -0
  68. package/lib/toolbar/toolbar.service.d.ts +2 -2
  69. package/package.json +1 -1
  70. package/porscheinformatik-material-addons.d.ts +15 -13
  71. package/porscheinformatik-material-addons.metadata.json +1 -1
  72. package/themes/common/styles.scss +6 -0
  73. package/esm2015/lib/data-table/data-table-column-header.js +0 -1
@@ -1,38 +1,72 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
2
- import { MatTableDataSource } from "@angular/material/table";
3
- import { MatPaginator } from "@angular/material/paginator";
4
- import { MatSort } from "@angular/material/sort";
5
- import { DataTableActionType } from "./data-table-action-type";
6
- import { SelectionModel } from "@angular/cdk/collections";
7
- import { v4 as uuidV4 } from "uuid";
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { MatTableDataSource } from '@angular/material/table';
3
+ import { MatPaginator, PageEvent } from '@angular/material/paginator';
4
+ import { MatSort } from '@angular/material/sort';
5
+ import { DataTableActionType } from './data-table-action-type';
6
+ import { SelectionModel } from '@angular/cdk/collections';
7
+ import { v4 as uuidV4 } from 'uuid';
8
+ import { MatDialog } from '@angular/material/dialog';
9
+ import { DataTableColumnsModalComponent } from './data-table-columns-modal/data-table-columns-modal.component';
8
10
  export class DataTableComponent {
9
- constructor() {
10
- var _a;
11
- this.ACTION_COLUMN_NAME = "__action__";
12
- this.SINGLE = DataTableActionType.SINGLE;
13
- this.BATCH = DataTableActionType.BATCH;
14
- this.NONE = DataTableActionType.NONE;
15
- this.columns = [];
16
- this.filterLabel = "Filter";
17
- this.filterPlaceholder = "";
18
- this.noDataText = "No matching data found";
11
+ constructor(matDialog) {
12
+ this.matDialog = matDialog;
13
+ // Translations
14
+ this.filterLabel = 'Filter';
15
+ this.filterPlaceholder = '';
16
+ this.filterColumnsLabel = 'Filter';
17
+ this.filterColumnsPlaceHolder = 'Filter available columns';
18
+ this.noDataText = 'No matching data found';
19
+ this.columnSettingsModalTitleLabel = 'Column settings';
20
+ this.selectedLabel = 'Selected columns';
21
+ this.availableLabel = 'Available columns';
22
+ this.saveLabel = 'Save';
23
+ this.deleteLabel = 'Delete';
24
+ this.cancelLabel = 'Cancel';
25
+ this.infoTextLabel = 'Drag and drop a column to select or reorder it.';
19
26
  this.pageSizeOptions = [5, 10, 15];
20
- this.defaultPageSize = ((_a = this.pageSizeOptions) === null || _a === void 0 ? void 0 : _a[0]) || 10;
21
27
  this.actions = [];
28
+ this.deleteDefinitionAllowed = false;
29
+ this.useAsync = false;
22
30
  this.sortEvent = new EventEmitter();
23
31
  this.actionEvent = new EventEmitter();
24
- this.pagingEvent = new EventEmitter();
32
+ this.pageEvent = new EventEmitter();
33
+ this.allColumnsEvent = new EventEmitter();
34
+ this.columnDefinitionChangeEvent = new EventEmitter();
35
+ this.viewDefinitionChangeEvent = new EventEmitter();
36
+ this.ACTION_COLUMN_NAME = '__action__';
37
+ this.SINGLE = DataTableActionType.SINGLE;
38
+ this.BATCH = DataTableActionType.BATCH;
39
+ this.NONE = DataTableActionType.NONE;
25
40
  this.tableActions = [];
26
41
  this.rowActions = [];
42
+ this.columns = [];
27
43
  this.allSelected = false;
28
44
  this.displayedDataMap = new Map();
29
45
  this.actualDataMap = new Map();
30
46
  this.selectionModel = new SelectionModel(true);
47
+ this.allColumnDefinitions = [];
31
48
  this.isFilterEnabled = false;
32
49
  this.isPaginationEnabled = false;
33
50
  this.mode = this.NONE;
34
51
  this.isRowClickable = false;
52
+ this.showColumnModal = false;
35
53
  this.isLoading = false;
54
+ this.paginatorLength = 0;
55
+ this.paginatorPageIndex = 0;
56
+ this.paginatorPageSize = 50;
57
+ }
58
+ set displayedColumns(cols) {
59
+ if (!this.displayedColumnDefinition) {
60
+ this.columns = cols ? [...cols] : [];
61
+ this.columnIds = this.columns.map(column => column.id);
62
+ this.columnIds.unshift(this.ACTION_COLUMN_NAME);
63
+ }
64
+ }
65
+ set displayedColumnDefinition(def) {
66
+ this.selectedColumnDefinion = def;
67
+ this.columns = def.displayedColumns;
68
+ this.columnIds = this.columns.map(column => column.id);
69
+ this.columnIds.unshift(this.ACTION_COLUMN_NAME);
36
70
  }
37
71
  set tableData(data) {
38
72
  if (!this.dataSource) {
@@ -40,19 +74,46 @@ export class DataTableComponent {
40
74
  }
41
75
  this.createDataMapsAndSetDisplayedDataSourceData(data);
42
76
  }
77
+ set page(page) {
78
+ this.paginatorPageIndex = page.pageIndex;
79
+ this.paginatorPageSize = page.pageSize;
80
+ this.paginatorLength = page.length;
81
+ }
82
+ set columnDefinitions(definitions) {
83
+ var _a;
84
+ this.editableColumnDefinitions = [];
85
+ this.viewableColumnDefinitions = [];
86
+ this.allColumnDefinitions = [...definitions];
87
+ for (const definition of definitions) {
88
+ if (definition.editable) {
89
+ this.editableColumnDefinitions.push(definition);
90
+ }
91
+ if (((_a = definition.displayedColumns) === null || _a === void 0 ? void 0 : _a.length) > 0) {
92
+ this.viewableColumnDefinitions.push(definition);
93
+ }
94
+ }
95
+ }
43
96
  set loading(isLoading) {
44
97
  this.isLoading = isLoading;
45
98
  }
99
+ set defaultPageSize(defaultSize) {
100
+ this.paginatorPageSize = defaultSize;
101
+ }
102
+ set externalPaginator(paginator) {
103
+ this.extPaginator = paginator;
104
+ }
46
105
  set paginationEnabled(isPaginationEnabled) {
47
106
  this.isPaginationEnabled = isPaginationEnabled;
48
- // eslint-disable-next-line
49
- const pageSize = this.isPaginationEnabled ? this.defaultPageSize : Number.MAX_VALUE;
50
- if (this.dataSource.paginator) {
51
- this.dataSource.paginator._changePageSize(pageSize);
107
+ this.unsetPageSizeIfNecessary();
108
+ }
109
+ set allColumns(allColumns) {
110
+ this.allAvailableColumns = allColumns;
111
+ if (allColumns && this.showColumnModal) {
112
+ this.openColumnModal();
52
113
  }
53
114
  }
54
115
  set filterEnabled(isFilterEnabled) {
55
- this.isFilterEnabled = isFilterEnabled;
116
+ this.isFilterEnabled = !this.useAsync ? isFilterEnabled : false;
56
117
  this.setFilterValue(undefined);
57
118
  }
58
119
  set forceMode(mode) {
@@ -62,39 +123,106 @@ export class DataTableComponent {
62
123
  this.setActions();
63
124
  }
64
125
  }
126
+ static compare(a, b, sort) {
127
+ const x = a[sort.active];
128
+ const y = b[sort.active];
129
+ const ascending = sort.direction === 'asc';
130
+ switch (typeof x) {
131
+ case 'number':
132
+ return DataTableComponent.compareNumber(x, y, ascending);
133
+ case 'string':
134
+ return DataTableComponent.compareString(x, y, ascending);
135
+ case 'boolean':
136
+ return DataTableComponent.compareBoolean(x, y, ascending);
137
+ default:
138
+ // cannot compare -> return equal
139
+ return 0;
140
+ }
141
+ }
142
+ static compareNumber(x, y, ascending) {
143
+ return ascending ? x - y : y - x;
144
+ }
145
+ static compareString(x, y, ascending) {
146
+ return ascending ? x.localeCompare(y) : y.localeCompare(x);
147
+ }
148
+ static compareBoolean(x, y, ascending) {
149
+ if (x === y) {
150
+ return 0;
151
+ }
152
+ if (ascending) {
153
+ // true first
154
+ return x ? -1 : 1;
155
+ }
156
+ else {
157
+ // false first
158
+ return x ? 1 : -1;
159
+ }
160
+ }
161
+ static transformData(value, transformer, transformerParams) {
162
+ if (!transformer || !(transformer instanceof Function)) {
163
+ return value;
164
+ }
165
+ return transformer(value, transformerParams);
166
+ }
167
+ static generateRowId() {
168
+ return uuidV4();
169
+ }
170
+ static isClickOnRowMenuIcon(event) {
171
+ var _a;
172
+ return (_a = event === null || event === void 0 ? void 0 : event.target) === null || _a === void 0 ? void 0 : _a.classList.contains('mat-icon');
173
+ }
65
174
  ngOnInit() {
66
- this.columnNames = this.columns.map(column => column.label);
67
175
  this.mode = this.getTableMode();
68
176
  this.setActions();
69
177
  if (this.mode !== this.NONE) {
70
178
  this.isRowClickable = true;
71
179
  this.defaultAction = this.rowActions[0];
72
180
  }
73
- this.columnNames.unshift(this.ACTION_COLUMN_NAME);
74
181
  }
75
182
  ngAfterViewInit() {
76
183
  this.dataSource.paginator = this.paginator;
77
184
  this.dataSource.sort = this.sort;
78
185
  }
186
+ onColumnSettings(definition) {
187
+ this.showColumnModal = true;
188
+ this.selectedDefinition = definition ? definition : this.allColumnDefinitions[0];
189
+ if (this.allAvailableColumns) {
190
+ this.openColumnModal();
191
+ }
192
+ else {
193
+ // if no complete definitions have been loaded yet send an event so the app can load it
194
+ this.allColumnsEvent.emit();
195
+ }
196
+ }
197
+ onViewDefinition(definition) {
198
+ this.selectedDefinition = definition;
199
+ this.viewDefinitionChangeEvent.emit(definition);
200
+ }
201
+ isCurrentDefinition(definition) {
202
+ return this.selectedDefinition && this.selectedDefinition.id === definition.id;
203
+ }
79
204
  get selectedCount() {
80
205
  var _a;
81
206
  return ((_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.selected) ? this.selectionModel.selected.length : 0;
82
207
  }
83
208
  get rowCount() {
209
+ return this.getAllDataSourceRowsOfCurrentPage() ? this.getAllDataSourceRowsOfCurrentPage().length : 0;
210
+ }
211
+ getAllDataSourceRowsOfCurrentPage() {
84
212
  var _a;
85
- return ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a._pageData(this.dataSource.data)) ? this.dataSource._pageData(this.dataSource.data).length : 0;
213
+ return (_a = this.dataSource) === null || _a === void 0 ? void 0 : _a._pageData(this.dataSource.data);
86
214
  }
87
215
  getSelectedCount(actionType) {
88
216
  const count = this.selectedCount;
89
- if (actionType != this.BATCH || count < 2) {
90
- return "";
217
+ if (actionType !== this.BATCH || count < 2) {
218
+ return '';
91
219
  }
92
- return " (" + count + ")";
220
+ return ' (' + count + ')';
93
221
  }
94
222
  isDisabled(actionType) {
95
223
  switch (actionType) {
96
224
  case this.SINGLE:
97
- return this.selectedCount != 1;
225
+ return this.selectedCount !== 1;
98
226
  case this.BATCH:
99
227
  return this.selectedCount < 1;
100
228
  default:
@@ -108,10 +236,8 @@ export class DataTableComponent {
108
236
  this.allSelected = !this.allSelected;
109
237
  if (this.allSelected) {
110
238
  // select all rows of the current page
111
- this.dataSource._pageData(this.dataSource.data).forEach((row) => {
112
- const dataRow = row;
113
- const rowId = "" + dataRow.rowId;
114
- this.selectionModel.select(rowId);
239
+ this.getAllDataSourceRowsOfCurrentPage().forEach(row => {
240
+ this.selectionModel.select('' + row.rowId);
115
241
  });
116
242
  }
117
243
  }
@@ -144,11 +270,18 @@ export class DataTableComponent {
144
270
  return;
145
271
  }
146
272
  }
147
- onSortingEvent(sortingParams) {
148
- this.sortEvent.emit(sortingParams);
273
+ onSortingEvent(sort) {
274
+ if (this.useAsync) {
275
+ this.sortEvent.emit(sort);
276
+ }
277
+ else {
278
+ this.internalSort(sort);
279
+ }
149
280
  }
150
- onPaginationEvent(event) {
151
- this.pagingEvent.emit(event);
281
+ onPageEvent(event) {
282
+ if (this.useAsync) {
283
+ this.pageEvent.emit(event);
284
+ }
152
285
  }
153
286
  onTableAction(tableAction) {
154
287
  if (!!tableAction) {
@@ -160,19 +293,6 @@ export class DataTableComponent {
160
293
  this.actionEvent.emit(tableAction);
161
294
  }
162
295
  }
163
- static transformData(value, transformer, transformerParams) {
164
- if (!transformer || !(transformer instanceof Function)) {
165
- return value;
166
- }
167
- return transformer(value, transformerParams);
168
- }
169
- static generateRowId() {
170
- return uuidV4();
171
- }
172
- static isClickOnRowMenuIcon(event) {
173
- var _a;
174
- return (_a = event === null || event === void 0 ? void 0 : event.target) === null || _a === void 0 ? void 0 : _a.classList.contains("mat-icon");
175
- }
176
296
  emitTableAction(action, selected) {
177
297
  const emitAction = Object.assign({}, action);
178
298
  if (action.type !== this.NONE) {
@@ -182,13 +302,17 @@ export class DataTableComponent {
182
302
  }
183
303
  generateDisplayedDataElement(rowId, actualDataElement) {
184
304
  const displayedDataElement = {};
185
- displayedDataElement["rowId"] = rowId;
305
+ displayedDataElement.rowId = rowId;
186
306
  for (const column of this.columns) {
187
307
  const actualValue = actualDataElement[column.dataPropertyName];
188
308
  displayedDataElement[column.dataPropertyName] = DataTableComponent.transformData(actualValue, column.transformer, column.transformerParams);
189
309
  }
190
310
  return displayedDataElement;
191
311
  }
312
+ internalSort(sort) {
313
+ const sortedData = [...this.dataSource.data].sort((a, b) => DataTableComponent.compare(a, b, sort));
314
+ this.dataSource.data = [...sortedData];
315
+ }
192
316
  setActions() {
193
317
  this.rowActions = [];
194
318
  this.tableActions = [];
@@ -218,14 +342,41 @@ export class DataTableComponent {
218
342
  const displayedDataList = [];
219
343
  this.actualDataMap.clear();
220
344
  this.displayedDataMap.clear();
221
- for (const dataEntry of data) {
222
- const rowId = (this.idGenerator) ? this.idGenerator(dataEntry) : DataTableComponent.generateRowId();
223
- this.actualDataMap.set(rowId, dataEntry);
224
- const displayedDataElement = this.generateDisplayedDataElement(rowId, dataEntry);
225
- this.displayedDataMap.set(rowId, displayedDataElement);
226
- displayedDataList.push(displayedDataElement);
345
+ if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
346
+ for (const dataEntry of data) {
347
+ const rowId = this.idGenerator ? this.idGenerator(dataEntry) : DataTableComponent.generateRowId();
348
+ this.actualDataMap.set(rowId, dataEntry);
349
+ const displayedDataElement = this.generateDisplayedDataElement(rowId, dataEntry);
350
+ this.displayedDataMap.set(rowId, displayedDataElement);
351
+ displayedDataList.push(displayedDataElement);
352
+ }
227
353
  }
228
354
  this.dataSource.data = displayedDataList;
355
+ this.unsetPageSizeIfNecessary();
356
+ }
357
+ openColumnModal() {
358
+ const dialogData = {
359
+ allColumns: this.allAvailableColumns,
360
+ definition: this.selectedDefinition,
361
+ deleteDefinitionAllowed: this.deleteDefinitionAllowed,
362
+ filterColumnsLabel: this.filterColumnsLabel,
363
+ filterColumnsPlaceHolder: this.filterColumnsPlaceHolder,
364
+ noDataText: this.noDataText,
365
+ titleLabel: this.columnSettingsModalTitleLabel,
366
+ selectedLabel: this.selectedLabel,
367
+ availableLabel: this.availableLabel,
368
+ saveLabel: this.saveLabel,
369
+ deleteLabel: this.deleteLabel,
370
+ cancelLabel: this.cancelLabel,
371
+ infoTextLabel: this.infoTextLabel,
372
+ };
373
+ const dialog = this.matDialog.open(DataTableColumnsModalComponent, { data: dialogData });
374
+ dialog.afterClosed().subscribe(result => {
375
+ // no event on CANCEL
376
+ if (result) {
377
+ this.columnDefinitionChangeEvent.emit(result);
378
+ }
379
+ });
229
380
  }
230
381
  getTableMode() {
231
382
  if (this._forceMode) {
@@ -246,32 +397,63 @@ export class DataTableComponent {
246
397
  }
247
398
  return this.NONE;
248
399
  }
400
+ unsetPageSizeIfNecessary() {
401
+ if (!this.useAsync && !this.isPaginationEnabled) {
402
+ const dataCount = this.dataSource.data ? this.dataSource.data.length : 0;
403
+ this.paginatorPageSize = dataCount;
404
+ this.paginatorLength = dataCount;
405
+ }
406
+ }
249
407
  }
250
408
  DataTableComponent.decorators = [
251
409
  { type: Component, args: [{
252
- selector: "mad-data-table",
253
- template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ tableAction.label | translate }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ filterLabel | translate }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ rowAction.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"mad-table\">\n <div class=\"datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.label\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.label | translate}}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ column.label }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnNames\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnNames\"\n ></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPaginationEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n",
254
- styles: [".text-right{padding-right:24px!important;text-align:right!important}.table-action{margin-bottom:.5em;margin-right:.5em}.row-action-button{width:10px}.noDataText{text-align:center}.mad-table,.noDataText{position:relative;width:100%}.mad-table{overflow-x:auto}.mad-datatable-action-bar{align-items:baseline;display:flex;justify-content:space-between}.mad-datatable-checkbox-container{margin-right:16px}.datatable-spinner-wrapper{align-items:center;background-color:#fff;display:flex;height:100%;justify-content:center;left:0;opacity:.8;pointer-events:unset;position:absolute;top:0;width:100%;z-index:99999}"]
410
+ selector: 'mad-data-table',
411
+ template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ tableAction.label | translate }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ filterLabel | translate }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ rowAction.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ column.label | translate }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ column.label | translate }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n",
412
+ styles: [":host{background-color:#fff;display:flex;flex:1 1 auto;flex-direction:column;min-height:112px}.datatable-vertical-stretch-to-parent{display:flex;flex:1;flex-direction:column;max-height:100%;width:100%}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-300,.datatable-max-height-500{display:flex;flex:1;flex-direction:column;width:100%}.datatable{flex:1 1 auto;height:100%;overflow:auto;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable td,.datatable th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}.text-right{padding-right:24px!important;text-align:right!important}.table-action{margin-bottom:.5em;margin-right:.5em}.row-action-button{width:10px}.noDataText{position:relative;text-align:center;width:100%}.mad-datatable-action-bar{align-items:baseline;display:flex;justify-content:space-between}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{align-items:center;background-color:#fff;display:flex;height:100%;justify-content:center;left:0;opacity:.8;pointer-events:unset;position:absolute;top:0;width:100%;z-index:99999}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{background-color:#fff;position:-webkit-sticky;position:sticky;top:0;z-index:1}.active-column-definition{background-color:#f5f5f5;color:#000}"]
255
413
  },] }
256
414
  ];
415
+ DataTableComponent.ctorParameters = () => [
416
+ { type: MatDialog }
417
+ ];
257
418
  DataTableComponent.propDecorators = {
258
- columns: [{ type: Input }],
259
419
  filterLabel: [{ type: Input }],
260
420
  filterPlaceholder: [{ type: Input }],
421
+ filterColumnsLabel: [{ type: Input }],
422
+ filterColumnsPlaceHolder: [{ type: Input }],
261
423
  noDataText: [{ type: Input }],
424
+ columnSettingsModalTitleLabel: [{ type: Input }],
425
+ selectedLabel: [{ type: Input }],
426
+ availableLabel: [{ type: Input }],
427
+ saveLabel: [{ type: Input }],
428
+ deleteLabel: [{ type: Input }],
429
+ cancelLabel: [{ type: Input }],
430
+ infoTextLabel: [{ type: Input }],
431
+ tableClass: [{ type: Input }],
262
432
  pageSizeOptions: [{ type: Input }],
263
- defaultPageSize: [{ type: Input }],
433
+ externalFilter: [{ type: Input }],
264
434
  actions: [{ type: Input }],
265
435
  idGenerator: [{ type: Input }],
436
+ deleteDefinitionAllowed: [{ type: Input }],
437
+ useAsync: [{ type: Input }],
438
+ displayedColumns: [{ type: Input }],
439
+ displayedColumnDefinition: [{ type: Input }],
266
440
  tableData: [{ type: Input }],
441
+ page: [{ type: Input }],
442
+ columnDefinitions: [{ type: Input }],
267
443
  loading: [{ type: Input }],
444
+ defaultPageSize: [{ type: Input }],
445
+ externalPaginator: [{ type: Input }],
268
446
  paginationEnabled: [{ type: Input }],
447
+ allColumns: [{ type: Input }],
269
448
  filterEnabled: [{ type: Input }],
270
449
  forceMode: [{ type: Input }],
271
450
  sortEvent: [{ type: Output }],
272
451
  actionEvent: [{ type: Output }],
273
- pagingEvent: [{ type: Output }],
452
+ pageEvent: [{ type: Output }],
453
+ allColumnsEvent: [{ type: Output }],
454
+ columnDefinitionChangeEvent: [{ type: Output }],
455
+ viewDefinitionChangeEvent: [{ type: Output }],
274
456
  paginator: [{ type: ViewChild, args: [MatPaginator, { static: false },] }],
275
457
  sort: [{ type: ViewChild, args: [MatSort, { static: true },] }]
276
458
  };
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbWF0ZXJpYWwtYWRkb25zL21hdGVyaWFsLWFkZG9ucy9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjLyIsInNvdXJjZXMiOlsibGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFRLE1BQU0sd0JBQXdCLENBQUM7QUFHdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3BDLE1BQU0sT0FBTyxrQkFBa0I7SUFML0I7O1FBTVcsdUJBQWtCLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLFdBQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7UUFDcEMsVUFBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUNsQyxTQUFJLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBRWhDLFlBQU8sR0FBNEIsRUFBRSxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUN2QixlQUFVLEdBQUcsd0JBQXdCLENBQUM7UUFDdEMsb0JBQWUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFD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QUcsRUFBVSxDQUFDO1FBQzlDLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNuQjtRQUNELElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDcEI7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQzs7O1lBMVJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQiwwOUlBQTBDOzthQUUzQzs7O3NCQU9FLEtBQUs7MEJBQ0wsS0FBSztnQ0FDTCxLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsS0FBSzs4QkFDTCxLQUFLO3NCQUNMLEtBQUs7MEJBQ0wsS0FBSzt3QkFFTCxLQUFLO3NCQU9MLEtBQUs7Z0NBSUwsS0FBSzs0QkFTTCxLQUFLO3dCQU1MLEtBQUs7d0JBU0wsTUFBTTswQkFDTixNQUFNOzBCQUNOLE1BQU07d0JBRU4sU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7bUJBQ3pDLFNBQVMsU0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvclwiO1xuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5IZWFkZXIgfSBmcm9tIFwiLi9kYXRhLXRhYmxlLWNvbHVtbi1oZWFkZXJcIjtcbmltcG9ydCB7IERhdGFUYWJsZUFjdGlvbiB9IGZyb20gXCIuL2RhdGEtdGFibGUtYWN0aW9uXCI7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb25UeXBlIH0gZnJvbSBcIi4vZGF0YS10YWJsZS1hY3Rpb24tdHlwZVwiO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkVjQgfSBmcm9tIFwidXVpZFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwibWFkLWRhdGEtdGFibGVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJlYWRvbmx5IEFDVElPTl9DT0xVTU5fTkFNRSA9IFwiX19hY3Rpb25fX1wiO1xuICByZWFkb25seSBTSU5HTEUgPSBEYXRhVGFibGVBY3Rpb25UeXBlLlNJTkdMRTtcbiAgcmVhZG9ubHkgQkFUQ0ggPSBEYXRhVGFibGVBY3Rpb25UeXBlLkJBVENIO1xuICByZWFkb25seSBOT05FID0gRGF0YVRhYmxlQWN0aW9uVHlwZS5OT05FO1xuXG4gIEBJbnB1dCgpIGNvbHVtbnM6IERhdGFUYWJsZUNvbHVtbkhlYWRlcltdID0gW107XG4gIEBJbnB1dCgpIGZpbHRlckxhYmVsID0gXCJGaWx0ZXJcIjtcbiAgQElucHV0KCkgZmlsdGVyUGxhY2Vob2xkZXIgPSBcIlwiO1xuICBASW5wdXQoKSBub0RhdGFUZXh0ID0gXCJObyBtYXRjaGluZyBkYXRhIGZvdW5kXCI7XG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9ucyA9IFs1LCAxMCwgMTVdO1xuICBASW5wdXQoKSBkZWZhdWx0UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplT3B0aW9ucz8uWzBdIHx8IDEwO1xuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBpZEdlbmVyYXRvcjogYW55O1xuXG4gIEBJbnB1dCgpIHNldCB0YWJsZURhdGEoZGF0YTogYW55W10pIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KGRhdGEpO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZURhdGFNYXBzQW5kU2V0RGlzcGxheWVkRGF0YVNvdXJjZURhdGEoZGF0YSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGlzTG9hZGluZztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmF0aW9uRW5hYmxlZChpc1BhZ2luYXRpb25FbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1BhZ2luYXRpb25FbmFibGVkID0gaXNQYWdpbmF0aW9uRW5hYmxlZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuaXNQYWdpbmF0aW9uRW5hYmxlZCA/IHRoaXMuZGVmYXVsdFBhZ2VTaXplIDogTnVtYmVyLk1BWF9WQUxVRTtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvci5fY2hhbmdlUGFnZVNpemUocGFnZVNpemUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBmaWx0ZXJFbmFibGVkKGlzRmlsdGVyRW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNGaWx0ZXJFbmFibGVkID0gaXNGaWx0ZXJFbmFibGVkO1xuICAgIHRoaXMuc2V0RmlsdGVyVmFsdWUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBmb3JjZU1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKG1vZGUgPT09IHRoaXMuU0lOR0xFIHx8IG1vZGUgPT09IHRoaXMuQkFUQ0ggfHwgbW9kZSA9PT0gdGhpcy5OT05FKSB7XG4gICAgICB0aGlzLl9mb3JjZU1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgIHRoaXMuc2V0QWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgcGFnaW5nRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvciwgeyBzdGF0aWM6IGZhbHNlIH0pIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQsIHsgc3RhdGljOiB0cnVlIH0pIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgdGFibGVBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICByb3dBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBhbGxTZWxlY3RlZCA9IGZhbHNlO1xuICBzZWxlY3RlZDogW107XG4gIF9mb3JjZU1vZGU6IHN0cmluZztcbiAgZGlzcGxheWVkRGF0YU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIGFjdHVhbERhdGFNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55W10+O1xuICBzZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxzdHJpbmc+KHRydWUpO1xuICBjb2x1bW5OYW1lczogc3RyaW5nW107XG4gIGRlZmF1bHRBY3Rpb246IERhdGFUYWJsZUFjdGlvbjtcbiAgaXNGaWx0ZXJFbmFibGVkID0gZmFsc2U7XG4gIGlzUGFnaW5hdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgbW9kZSA9IHRoaXMuTk9ORTtcbiAgaXNSb3dDbGlja2FibGUgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5OYW1lcyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5sYWJlbCk7XG4gICAgdGhpcy5tb2RlID0gdGhpcy5nZXRUYWJsZU1vZGUoKTtcbiAgICB0aGlzLnNldEFjdGlvbnMoKTtcbiAgICBpZiAodGhpcy5tb2RlICE9PSB0aGlzLk5PTkUpIHtcbiAgICAgIHRoaXMuaXNSb3dDbGlja2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5kZWZhdWx0QWN0aW9uID0gdGhpcy5yb3dBY3Rpb25zWzBdO1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbk5hbWVzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8gdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0IHJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uX3BhZ2VEYXRhKHRoaXMuZGF0YVNvdXJjZS5kYXRhKSA/IHRoaXMuZGF0YVNvdXJjZS5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmRhdGEpLmxlbmd0aCA6IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9IHRoaXMuQkFUQ0ggfHwgY291bnQgPCAyKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiIChcIiArIGNvdW50ICsgXCIpXCI7XG4gIH1cblxuICBwdWJsaWMgaXNEaXNhYmxlZChhY3Rpb25UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgdGhpcy5TSU5HTEU6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgIT0gMTtcbiAgICAgIGNhc2UgdGhpcy5CQVRDSDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDb3VudCA8IDE7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uVG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIC8vIGNsZWFyIGFsbCBzZWxlY3Rpb24gZmlyc3RcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgLy8gdG9nZ2xlIGFsbCBjaGVja2JveFxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgLy8gc2VsZWN0IGFsbCByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmRhdGEpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGFSb3c6IGFueSA9IHJvdyBhcyBhbnk7XG4gICAgICAgICAgY29uc3Qgcm93SWQgPSBcIlwiICsgZGF0YVJvdy5yb3dJZDtcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdChyb3dJZCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzU2VsZWN0ZWQocm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQocm93SWQpO1xuICB9XG5cbiAgcHVibGljIHNldEZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHVibGljIG9uUm93Q2hlY2tib3goZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIG5vIGNsaWNrIGV2ZW50IG9uIHJvd1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdy5yb3dJZCk7XG4gIH1cblxuICBwdWJsaWMgb25Sb3dFdmVudChldmVudDogTW91c2VFdmVudCwgcm93OiBhbnksIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbik6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgIHRoaXMub25Sb3dDaGVja2JveChldmVudCwgcm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRoaXMuU0lOR0xFOlxuICAgICAgICAvLyBlbWl0IHRoZSBkZWZhdWx0IGFjdGlvbiBpZiB0aGUgcm93IChub3QgdGhlIGljb24hKSB3YXMgY2xpY2tlZFxuICAgICAgICBpZiAoISFhY3Rpb24gJiYgIURhdGFUYWJsZUNvbXBvbmVudC5pc0NsaWNrT25Sb3dNZW51SWNvbihldmVudCkpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IFtdO1xuICAgICAgICAgIC8vIGlmIElELWdlbmVyYXRvciBpcyBwcm92aWRlZCwgcmV0dXJuIHRoZSBJRCwgZWxzZSByZXR1cm4gdGhlIEFDVFVBTCBkYXRhXG4gICAgICAgICAgc2VsZWN0ZWQucHVzaCh0aGlzLmlkR2VuZXJhdG9yID8gcm93LnJvd0lkIDogdGhpcy5hY3R1YWxEYXRhTWFwLmdldChyb3cucm93SWQpKTtcbiAgICAgICAgICB0aGlzLmVtaXRUYWJsZUFjdGlvbihhY3Rpb24sIHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgbW9kZSBpcyBOT05FIChvciBudWxsKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU29ydGluZ0V2ZW50KHNvcnRpbmdQYXJhbXM6IFNvcnQpOiB2b2lkIHtcbiAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnRpbmdQYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIG9uUGFnaW5hdGlvbkV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luZ0V2ZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uVGFibGVBY3Rpb24odGFibGVBY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGlmICghIXRhYmxlQWN0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb246IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdGVkIG9mIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2godGhpcy5pZEdlbmVyYXRvciA/IHNlbGVjdGVkIDogdGhpcy5hY3R1YWxEYXRhTWFwLmdldChzZWxlY3RlZCkpO1xuICAgICAgfVxuICAgICAgdGFibGVBY3Rpb24uc2VsZWN0ZWQgPSBzZWxlY3Rpb247XG4gICAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQodGFibGVBY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHRyYW5zZm9ybURhdGEodmFsdWU6IGFueSwgdHJhbnNmb3JtZXI6IGFueSwgdHJhbnNmb3JtZXJQYXJhbXM6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0cmFuc2Zvcm1lciB8fCAhKHRyYW5zZm9ybWVyIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lcih2YWx1ZSwgdHJhbnNmb3JtZXJQYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVSb3dJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkVjQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzQ2xpY2tPblJvd01lbnVJY29uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uY2xhc3NMaXN0LmNvbnRhaW5zKFwibWF0LWljb25cIik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRUYWJsZUFjdGlvbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbiwgc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZW1pdEFjdGlvbiA9IHsgLi4uYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbi50eXBlICE9PSB0aGlzLk5PTkUpIHtcbiAgICAgIGVtaXRBY3Rpb24uc2VsZWN0ZWQgPSBbLi4uc2VsZWN0ZWRdO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRGlzcGxheWVkRGF0YUVsZW1lbnQocm93SWQ6IHN0cmluZywgYWN0dWFsRGF0YUVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUVsZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBkaXNwbGF5ZWREYXRhRWxlbWVudFtcInJvd0lkXCJdID0gcm93SWQ7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbERhdGFFbGVtZW50W2NvbHVtbi5kYXRhUHJvcGVydHlOYW1lXTtcbiAgICAgIGRpc3BsYXllZERhdGFFbGVtZW50W2NvbHVtbi5kYXRhUHJvcGVydHlOYW1lXSA9IERhdGFUYWJsZUNvbXBvbmVudC50cmFuc2Zvcm1EYXRhKGFjdHVhbFZhbHVlLCBjb2x1bW4udHJhbnNmb3JtZXIsIGNvbHVtbi50cmFuc2Zvcm1lclBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiBkaXNwbGF5ZWREYXRhRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMubW9kZSAhPT0gYWN0aW9uLmhpZGRlbkluTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IHRoaXMuU0lOR0xFKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93QWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSB0aGlzLlNJTkdMRSkge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy50YWJsZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUxpc3QgPSBbXTtcbiAgICB0aGlzLmFjdHVhbERhdGFNYXAuY2xlYXIoKTtcbiAgICB0aGlzLmRpc3BsYXllZERhdGFNYXAuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGRhdGFFbnRyeSBvZiBkYXRhKSB7XG4gICAgICBjb25zdCByb3dJZCA9ICh0aGlzLmlkR2VuZXJhdG9yKSA/IHRoaXMuaWRHZW5lcmF0b3IoZGF0YUVudHJ5KSA6IERhdGFUYWJsZUNvbXBvbmVudC5nZW5lcmF0ZVJvd0lkKCk7XG4gICAgICB0aGlzLmFjdHVhbERhdGFNYXAuc2V0KHJvd0lkLCBkYXRhRW50cnkpO1xuICAgICAgY29uc3QgZGlzcGxheWVkRGF0YUVsZW1lbnQgPSB0aGlzLmdlbmVyYXRlRGlzcGxheWVkRGF0YUVsZW1lbnQocm93SWQsIGRhdGFFbnRyeSk7XG4gICAgICB0aGlzLmRpc3BsYXllZERhdGFNYXAuc2V0KHJvd0lkLCBkaXNwbGF5ZWREYXRhRWxlbWVudCk7XG4gICAgICBkaXNwbGF5ZWREYXRhTGlzdC5wdXNoKGRpc3BsYXllZERhdGFFbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkaXNwbGF5ZWREYXRhTGlzdDtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRUYWJsZU1vZGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fZm9yY2VNb2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9yY2VNb2RlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hY3Rpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5OT05FO1xuICAgIH1cbiAgICBjb25zdCBkaXN0aW5jdEFjdGlvblR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3dBY3Rpb24gb2YgdGhpcy5hY3Rpb25zKSB7XG4gICAgICBkaXN0aW5jdEFjdGlvblR5cGVzLmFkZChyb3dBY3Rpb24udHlwZSk7XG4gICAgfVxuICAgIGlmIChkaXN0aW5jdEFjdGlvblR5cGVzLmhhcyh0aGlzLkJBVENIKSkge1xuICAgICAgcmV0dXJuIHRoaXMuQkFUQ0g7XG4gICAgfVxuICAgIGlmIChkaXN0aW5jdEFjdGlvblR5cGVzLmhhcyh0aGlzLlNJTkdMRSkpIHtcbiAgICAgIHJldHVybiB0aGlzLlNJTkdMRTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuTk9ORTtcbiAgfVxufVxuIl19
459
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbWF0ZXJpYWwtYWRkb25zL21hdGVyaWFsLWFkZG9ucy9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjLyIsInNvdXJjZXMiOlsibGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFRL0csTUFBTSxPQUFPLGtCQUFrQjtJQXVKN0IsWUFBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXRKeEMsZUFBZTtRQUNOLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUN2Qix1QkFBa0IsR0FBRyxRQUFRLENBQUM7UUFDOUIsNkJBQXdCLEdBQUcsMEJBQTBCLENBQUM7UUFDdEQsZUFBVSxHQUFHLHdCQUF3QixDQUFDO1FBQ3RDLGtDQUE2QixH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QkFDMUIsZzdNQUEwQzs7YUFFM0M7OztZQVJRLFNBQVM7OzswQkFXZixLQUFLO2dDQUNMLEtBQUs7aUNBQ0wsS0FBSzt1Q0FDTCxLQUFLO3lCQUNMLEtBQUs7NENBQ0wsS0FBSzs0QkFDTCxLQUFLOzZCQUNMLEtBQUs7d0JBQ0wsS0FBSzswQkFDTCxLQUFLOzBCQUNMLEtBQUs7NEJBQ0wsS0FBSzt5QkFDTCxLQUFLOzhCQUVMLEtBQUs7NkJBQ0wsS0FBSztzQkFFTCxLQUFLOzBCQUNMLEtBQUs7c0NBQ0wsS0FBSzt1QkFFTCxLQUFLOytCQUVMLEtBQUs7d0NBUUwsS0FBSzt3QkFPTCxLQUFLO21CQU9MLEtBQUs7Z0NBTUwsS0FBSztzQkFjTCxLQUFLOzhCQUlMLEtBQUs7Z0NBSUwsS0FBSztnQ0FJTCxLQUFLO3lCQUtMLEtBQUs7NEJBT0wsS0FBSzt3QkFNTCxLQUFLO3dCQVNMLE1BQU07MEJBQ04sTUFBTTt3QkFDTixNQUFNOzhCQUNOLE1BQU07MENBQ04sTUFBTTt3Q0FDTixNQUFNO3dCQUVOLFNBQVMsU0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO21CQUN6QyxTQUFTLFNBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtYWN0aW9uJztcbmltcG9ydCB7IERhdGFUYWJsZUFjdGlvblR5cGUgfSBmcm9tICcuL2RhdGEtdGFibGUtYWN0aW9uLXR5cGUnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZFY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uc01vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbnMtbW9kYWwvZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uLCBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uQ2hhbmdlLCBEYXRhVGFibGVEaWFsb2dEYXRhIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbi1kZWZpbml0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gVHJhbnNsYXRpb25zXG4gIEBJbnB1dCgpIGZpbHRlckxhYmVsID0gJ0ZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zID0gWzUsIDEwLCAxNV07XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG5cbiAgQElucHV0KCkgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgaWRHZW5lcmF0b3I6IGFueTtcbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSB1c2VBc3luYyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5zKGNvbHM6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXllZENvbHVtbkRlZmluaXRpb24pIHtcbiAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHMgPyBbLi4uY29sc10gOiBbXTtcbiAgICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLmlkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKGRlZjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbikge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5EZWZpbmlvbiA9IGRlZjtcbiAgICB0aGlzLmNvbHVtbnMgPSBkZWYuZGlzcGxheWVkQ29sdW1ucztcbiAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5pZCk7XG4gICAgdGhpcy5jb2x1bW5JZHMudW5zaGlmdCh0aGlzLkFDVElPTl9DT0xVTU5fTkFNRSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFibGVEYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihkYXRhKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGEpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2UocGFnZTogUGFnZUV2ZW50KSB7XG4gICAgdGhpcy5wYWdpbmF0b3JQYWdlSW5kZXggPSBwYWdlLnBhZ2VJbmRleDtcbiAgICB0aGlzLnBhZ2luYXRvclBhZ2VTaXplID0gcGFnZS5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2luYXRvckxlbmd0aCA9IHBhZ2UubGVuZ3RoO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNvbHVtbkRlZmluaXRpb25zKGRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10pIHtcbiAgICB0aGlzLmVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFsbENvbHVtbkRlZmluaXRpb25zID0gWy4uLmRlZmluaXRpb25zXTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgZGVmaW5pdGlvbnMpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLmVkaXRhYmxlKSB7XG4gICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmluaXRpb24uZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGlzTG9hZGluZztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnaW5hdG9yUGFnZVNpemUgPSBkZWZhdWx0U2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBleHRlcm5hbFBhZ2luYXRvcihwYWdpbmF0b3I6IGFueSkge1xuICAgIHRoaXMuZXh0UGFnaW5hdG9yID0gcGFnaW5hdG9yO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2luYXRpb25FbmFibGVkKGlzUGFnaW5hdGlvbkVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUGFnaW5hdGlvbkVuYWJsZWQgPSBpc1BhZ2luYXRpb25FbmFibGVkO1xuICAgIHRoaXMudW5zZXRQYWdlU2l6ZUlmTmVjZXNzYXJ5KCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWxsQ29sdW1ucyhhbGxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIHRoaXMuYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5zaG93Q29sdW1uTW9kYWwpIHtcbiAgICAgIHRoaXMub3BlbkNvbHVtbk1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGZpbHRlckVuYWJsZWQoaXNGaWx0ZXJFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0ZpbHRlckVuYWJsZWQgPSAhdGhpcy51c2VBc3luYyA/IGlzRmlsdGVyRW5hYmxlZCA6IGZhbHNlO1xuICAgIHRoaXMuc2V0RmlsdGVyVmFsdWUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBmb3JjZU1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKG1vZGUgPT09IHRoaXMuU0lOR0xFIHx8IG1vZGUgPT09IHRoaXMuQkFUQ0ggfHwgbW9kZSA9PT0gdGhpcy5OT05FKSB7XG4gICAgICB0aGlzLl9mb3JjZU1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgIHRoaXMuc2V0QWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhbGxDb2x1bW5zRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5EZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25DaGFuZ2U+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uPigpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogZmFsc2UgfSkgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSkgc29ydDogTWF0U29ydDtcblxuICByZWFkb25seSBBQ1RJT05fQ09MVU1OX05BTUUgPSAnX19hY3Rpb25fXyc7XG4gIHJlYWRvbmx5IFNJTkdMRSA9IERhdGFUYWJsZUFjdGlvblR5cGUuU0lOR0xFO1xuICByZWFkb25seSBCQVRDSCA9IERhdGFUYWJsZUFjdGlvblR5cGUuQkFUQ0g7XG4gIHJlYWRvbmx5IE5PTkUgPSBEYXRhVGFibGVBY3Rpb25UeXBlLk5PTkU7XG5cbiAgdGFibGVBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICByb3dBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBhbGxTZWxlY3RlZCA9IGZhbHNlO1xuICBzZWxlY3RlZDogW107XG4gIF9mb3JjZU1vZGU6IHN0cmluZztcbiAgZGlzcGxheWVkRGF0YU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIGFjdHVhbERhdGFNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55W10+O1xuICBzZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxzdHJpbmc+KHRydWUpO1xuICBjb2x1bW5JZHM6IHN0cmluZ1tdO1xuICBhbGxDb2x1bW5EZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdID0gW107XG4gIGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcbiAgdmlld2FibGVDb2x1bW5EZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdO1xuICBzZWxlY3RlZENvbHVtbkRlZmluaW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uO1xuICBhbGxBdmFpbGFibGVDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXTtcbiAgc2VsZWN0ZWREZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uO1xuICBkZWZhdWx0QWN0aW9uOiBEYXRhVGFibGVBY3Rpb247XG4gIGlzRmlsdGVyRW5hYmxlZCA9IGZhbHNlO1xuICBpc1BhZ2luYXRpb25FbmFibGVkID0gZmFsc2U7XG4gIG1vZGUgPSB0aGlzLk5PTkU7XG4gIGlzUm93Q2xpY2thYmxlID0gZmFsc2U7XG4gIHNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgZXh0UGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcGFnaW5hdG9yTGVuZ3RoID0gMDtcbiAgcGFnaW5hdG9yUGFnZUluZGV4ID0gMDtcbiAgcGFnaW5hdG9yUGFnZVNpemUgPSA1MDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nKSB7fVxuXG4gIHN0YXRpYyBjb21wYXJlKGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGI6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvcnQ6IFNvcnQpOiBudW1iZXIge1xuICAgIGNvbnN0IHggPSBhW3NvcnQuYWN0aXZlXTtcbiAgICBjb25zdCB5ID0gYltzb3J0LmFjdGl2ZV07XG4gICAgY29uc3QgYXNjZW5kaW5nID0gc29ydC5kaXJlY3Rpb24gPT09ICdhc2MnO1xuICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiBEYXRhVGFibGVDb21wb25lbnQuY29tcGFyZU51bWJlcih4LCB5LCBhc2NlbmRpbmcpO1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlU3RyaW5nKHgsIHksIGFzY2VuZGluZyk7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlQm9vbGVhbih4LCB5LCBhc2NlbmRpbmcpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gY2Fubm90IGNvbXBhcmUgLT4gcmV0dXJuIGVxdWFsXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlTnVtYmVyKHg6IG51bWJlciwgeTogbnVtYmVyLCBhc2NlbmRpbmc6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBhc2NlbmRpbmcgPyB4IC0geSA6IHkgLSB4O1xuICB9XG5cbiAgc3RhdGljIGNvbXBhcmVTdHJpbmcoeDogc3RyaW5nLCB5OiBzdHJpbmcsIGFzY2VuZGluZzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGFzY2VuZGluZyA/IHgubG9jYWxlQ29tcGFyZSh5KSA6IHkubG9jYWxlQ29tcGFyZSh4KTtcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlQm9vbGVhbih4OiBib29sZWFuLCB5OiBib29sZWFuLCBhc2NlbmRpbmc6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGFzY2VuZGluZykge1xuICAgICAgLy8gdHJ1ZSBmaXJzdFxuICAgICAgcmV0dXJuIHggPyAtMSA6IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbHNlIGZpcnN0XG4gICAgICByZXR1cm4geCA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdHJhbnNmb3JtRGF0YSh2YWx1ZTogYW55LCB0cmFuc2Zvcm1lcjogYW55LCB0cmFuc2Zvcm1lclBhcmFtczogYW55KTogYW55IHtcbiAgICBpZiAoIXRyYW5zZm9ybWVyIHx8ICEodHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyKHZhbHVlLCB0cmFuc2Zvcm1lclBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGVSb3dJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkVjQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc0NsaWNrT25Sb3dNZW51SWNvbihldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LmNsYXNzTGlzdC5jb250YWlucygnbWF0LWljb24nKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IHRoaXMuZ2V0VGFibGVNb2RlKCk7XG4gICAgdGhpcy5zZXRBY3Rpb25zKCk7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gdGhpcy5OT05FKSB7XG4gICAgICB0aGlzLmlzUm93Q2xpY2thYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGVmYXVsdEFjdGlvbiA9IHRoaXMucm93QWN0aW9uc1swXTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICB9XG5cbiAgb25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uPzogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb24gPyBkZWZpbml0aW9uIDogdGhpcy5hbGxDb2x1bW5EZWZpbml0aW9uc1swXTtcbiAgICBpZiAodGhpcy5hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblZpZXdEZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy52aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50LmVtaXQoZGVmaW5pdGlvbik7XG4gIH1cblxuICBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERlZmluaXRpb24gJiYgdGhpcy5zZWxlY3RlZERlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCA/IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEFsbERhdGFTb3VyY2VSb3dzT2ZDdXJyZW50UGFnZSgpID8gdGhpcy5nZXRBbGxEYXRhU291cmNlUm93c09mQ3VycmVudFBhZ2UoKS5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSB0aGlzLkJBVENIIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyAoJyArIGNvdW50ICsgJyknO1xuICB9XG5cbiAgaXNEaXNhYmxlZChhY3Rpb25UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgdGhpcy5TSU5HTEU6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgIT09IDE7XG4gICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgPCAxO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uVG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIC8vIGNsZWFyIGFsbCBzZWxlY3Rpb24gZmlyc3RcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgLy8gdG9nZ2xlIGFsbCBjaGVja2JveFxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgLy8gc2VsZWN0IGFsbCByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIHRoaXMuZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCkuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCgnJyArIHJvdy5yb3dJZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1NlbGVjdGVkKHJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHNldEZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgb25Sb3dDaGVja2JveChldmVudDogTW91c2VFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gbm8gY2xpY2sgZXZlbnQgb24gcm93XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC50b2dnbGUocm93LnJvd0lkKTtcbiAgfVxuXG4gIG9uUm93RXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSB0aGlzLkJBVENIOlxuICAgICAgICB0aGlzLm9uUm93Q2hlY2tib3goZXZlbnQsIHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgLy8gZW1pdCB0aGUgZGVmYXVsdCBhY3Rpb24gaWYgdGhlIHJvdyAobm90IHRoZSBpY29uISkgd2FzIGNsaWNrZWRcbiAgICAgICAgaWYgKCEhYWN0aW9uICYmICFEYXRhVGFibGVDb21wb25lbnQuaXNDbGlja09uUm93TWVudUljb24oZXZlbnQpKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgICAvLyBpZiBJRC1nZW5lcmF0b3IgaXMgcHJvdmlkZWQsIHJldHVybiB0aGUgSUQsIGVsc2UgcmV0dXJuIHRoZSBBQ1RVQUwgZGF0YVxuICAgICAgICAgIHNlbGVjdGVkLnB1c2godGhpcy5pZEdlbmVyYXRvciA/IHJvdy5yb3dJZCA6IHRoaXMuYWN0dWFsRGF0YU1hcC5nZXQocm93LnJvd0lkKSk7XG4gICAgICAgICAgdGhpcy5lbWl0VGFibGVBY3Rpb24oYWN0aW9uLCBzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBkbyBub3RoaW5nIGlmIG1vZGUgaXMgTk9ORSAob3IgbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG9uU29ydGluZ0V2ZW50KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VBc3luYykge1xuICAgICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5hbFNvcnQoc29ydCk7XG4gICAgfVxuICB9XG5cbiAgb25QYWdlRXZlbnQoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZUFzeW5jKSB7XG4gICAgICB0aGlzLnBhZ2VFdmVudC5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBvblRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uOiBEYXRhVGFibGVBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISF0YWJsZUFjdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzZWxlY3RlZCBvZiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHRoaXMuaWRHZW5lcmF0b3IgPyBzZWxlY3RlZCA6IHRoaXMuYWN0dWFsRGF0YU1hcC5nZXQoc2VsZWN0ZWQpKTtcbiAgICAgIH1cbiAgICAgIHRhYmxlQWN0aW9uLnNlbGVjdGVkID0gc2VsZWN0aW9uO1xuICAgICAgdGhpcy5hY3Rpb25FdmVudC5lbWl0KHRhYmxlQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRUYWJsZUFjdGlvbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbiwgc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZW1pdEFjdGlvbiA9IHsgLi4uYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbi50eXBlICE9PSB0aGlzLk5PTkUpIHtcbiAgICAgIGVtaXRBY3Rpb24uc2VsZWN0ZWQgPSBbLi4uc2VsZWN0ZWRdO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRGlzcGxheWVkRGF0YUVsZW1lbnQocm93SWQ6IHN0cmluZywgYWN0dWFsRGF0YUVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUVsZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBkaXNwbGF5ZWREYXRhRWxlbWVudC5yb3dJZCA9IHJvd0lkO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxEYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV07XG4gICAgICBkaXNwbGF5ZWREYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV0gPSBEYXRhVGFibGVDb21wb25lbnQudHJhbnNmb3JtRGF0YShcbiAgICAgICAgYWN0dWFsVmFsdWUsXG4gICAgICAgIGNvbHVtbi50cmFuc2Zvcm1lcixcbiAgICAgICAgY29sdW1uLnRyYW5zZm9ybWVyUGFyYW1zLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXllZERhdGFFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNvcnQoc29ydDogU29ydCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlLmRhdGFdLnNvcnQoKGEsIGIpID0+IERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlKGEsIGIsIHNvcnQpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi5zb3J0ZWREYXRhXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMubW9kZSAhPT0gYWN0aW9uLmhpZGRlbkluTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IHRoaXMuU0lOR0xFKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93QWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSB0aGlzLlNJTkdMRSkge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy50YWJsZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUxpc3QgPSBbXTtcbiAgICB0aGlzLmFjdHVhbERhdGFNYXAuY2xlYXIoKTtcbiAgICB0aGlzLmRpc3BsYXllZERhdGFNYXAuY2xlYXIoKTtcbiAgICBpZiAoZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBkYXRhRW50cnkgb2YgZGF0YSkge1xuICAgICAgICBjb25zdCByb3dJZCA9IHRoaXMuaWRHZW5lcmF0b3IgPyB0aGlzLmlkR2VuZXJhdG9yKGRhdGFFbnRyeSkgOiBEYXRhVGFibGVDb21wb25lbnQuZ2VuZXJhdGVSb3dJZCgpO1xuICAgICAgICB0aGlzLmFjdHVhbERhdGFNYXAuc2V0KHJvd0lkLCBkYXRhRW50cnkpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ZWREYXRhRWxlbWVudCA9IHRoaXMuZ2VuZXJhdGVEaXNwbGF5ZWREYXRhRWxlbWVudChyb3dJZCwgZGF0YUVudHJ5KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhTWFwLnNldChyb3dJZCwgZGlzcGxheWVkRGF0YUVsZW1lbnQpO1xuICAgICAgICBkaXNwbGF5ZWREYXRhTGlzdC5wdXNoKGRpc3BsYXllZERhdGFFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkaXNwbGF5ZWREYXRhTGlzdDtcbiAgICB0aGlzLnVuc2V0UGFnZVNpemVJZk5lY2Vzc2FyeSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nRGF0YTogRGF0YVRhYmxlRGlhbG9nRGF0YSA9IHtcbiAgICAgIGFsbENvbHVtbnM6IHRoaXMuYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuc2VsZWN0ZWREZWZpbml0aW9uLFxuICAgICAgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQ6IHRoaXMuZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQsXG4gICAgICBmaWx0ZXJDb2x1bW5zTGFiZWw6IHRoaXMuZmlsdGVyQ29sdW1uc0xhYmVsLFxuICAgICAgZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyOiB0aGlzLmZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcixcbiAgICAgIG5vRGF0YVRleHQ6IHRoaXMubm9EYXRhVGV4dCxcbiAgICAgIHRpdGxlTGFiZWw6IHRoaXMuY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwsXG4gICAgICBzZWxlY3RlZExhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwsXG4gICAgICBhdmFpbGFibGVMYWJlbDogdGhpcy5hdmFpbGFibGVMYWJlbCxcbiAgICAgIHNhdmVMYWJlbDogdGhpcy5zYXZlTGFiZWwsXG4gICAgICBkZWxldGVMYWJlbDogdGhpcy5kZWxldGVMYWJlbCxcbiAgICAgIGNhbmNlbExhYmVsOiB0aGlzLmNhbmNlbExhYmVsLFxuICAgICAgaW5mb1RleHRMYWJlbDogdGhpcy5pbmZvVGV4dExhYmVsLFxuICAgIH07XG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5tYXREaWFsb2cub3BlbihEYXRhVGFibGVDb2x1bW5zTW9kYWxDb21wb25lbnQsIHsgZGF0YTogZGlhbG9nRGF0YSB9KTtcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhYmxlTW9kZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9mb3JjZU1vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mb3JjZU1vZGU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFjdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLk5PTkU7XG4gICAgfVxuICAgIGNvbnN0IGRpc3RpbmN0QWN0aW9uVHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHJvd0FjdGlvbiBvZiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgIGRpc3RpbmN0QWN0aW9uVHlwZXMuYWRkKHJvd0FjdGlvbi50eXBlKTtcbiAgICB9XG4gICAgaWYgKGRpc3RpbmN0QWN0aW9uVHlwZXMuaGFzKHRoaXMuQkFUQ0gpKSB7XG4gICAgICByZXR1cm4gdGhpcy5CQVRDSDtcbiAgICB9XG4gICAgaWYgKGRpc3RpbmN0QWN0aW9uVHlwZXMuaGFzKHRoaXMuU0lOR0xFKSkge1xuICAgICAgcmV0dXJuIHRoaXMuU0lOR0xFO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5OT05FO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnNldFBhZ2VTaXplSWZOZWNlc3NhcnkoKSB7XG4gICAgaWYgKCF0aGlzLnVzZUFzeW5jICYmICF0aGlzLmlzUGFnaW5hdGlvbkVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRhdGFDb3VudCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhID8gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoIDogMDtcbiAgICAgIHRoaXMucGFnaW5hdG9yUGFnZVNpemUgPSBkYXRhQ291bnQ7XG4gICAgICB0aGlzLnBhZ2luYXRvckxlbmd0aCA9IGRhdGFDb3VudDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9tYXRlcmlhbC1hZGRvbnMvbWF0ZXJpYWwtYWRkb25zL3Byb2plY3RzL21hdGVyaWFsLWFkZG9ucy9zcmMvIiwic291cmNlcyI6WyJsaWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBEYXRhVGFibGVDb2x1bW5IZWFkZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtY29sdW1uLWhlYWRlcic7XG5leHBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtYWN0aW9uJztcbiJdfQ==
1
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9tYXRlcmlhbC1hZGRvbnMvbWF0ZXJpYWwtYWRkb25zL3Byb2plY3RzL21hdGVyaWFsLWFkZG9ucy9zcmMvIiwic291cmNlcyI6WyJsaWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBEYXRhVGFibGVDb2x1bW4gfSBmcm9tICcuL2RhdGEtdGFibGUtY29sdW1uJztcbmV4cG9ydCB7IERhdGFUYWJsZUFjdGlvbiB9IGZyb20gJy4vZGF0YS10YWJsZS1hY3Rpb24nO1xuZXhwb3J0IHsgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4tZGVmaW5pdGlvbic7XG4iXX0=