ngx-sfc-components 0.0.19 → 0.0.21

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 (80) hide show
  1. package/README.md +1 -1
  2. package/esm2020/lib/components/avatar/avatar.component.mjs +14 -20
  3. package/esm2020/lib/components/avatar/models/avatar-data.model.mjs +1 -1
  4. package/esm2020/lib/components/avatar/models/avatar-image.model.mjs +3 -2
  5. package/esm2020/lib/components/avatar/parts/badge/avatar-badge.component.mjs +17 -8
  6. package/esm2020/lib/components/avatar/parts/badge/avatar-badge.constants.mjs +3 -3
  7. package/esm2020/lib/components/avatar/parts/badge/avatar-badge.model.mjs +2 -0
  8. package/esm2020/lib/components/carousel/carousel.component.mjs +2 -2
  9. package/esm2020/lib/components/index.mjs +3 -2
  10. package/esm2020/lib/components/menu/dropdown/dropdown-menu.component.mjs +21 -6
  11. package/esm2020/lib/components/menu/dropdown/parts/item/dropdown-menu-item.component.mjs +2 -2
  12. package/esm2020/lib/components/menu/navigation/navigation-menu.component.mjs +2 -2
  13. package/esm2020/lib/components/menu/navigation/parts/item/navigation-menu-item.component.mjs +2 -2
  14. package/esm2020/lib/components/menu/side/parts/header/side-menu-header.component.mjs +2 -2
  15. package/esm2020/lib/components/menu/side/parts/item/content/side-menu-item-content.component.mjs +2 -2
  16. package/esm2020/lib/components/menu/side/parts/title/side-menu-title.component.mjs +2 -2
  17. package/esm2020/lib/components/no-export-index.mjs +3 -1
  18. package/esm2020/lib/components/progress/circle/progress-circle.component.mjs +2 -2
  19. package/esm2020/lib/components/progress/line/progress-line.component.mjs +2 -2
  20. package/esm2020/lib/components/progress/semi-circle/progress-semi-circle.component.mjs +2 -2
  21. package/esm2020/lib/components/stars/stars.component.mjs +2 -2
  22. package/esm2020/lib/components/table/models/table.model.mjs +1 -1
  23. package/esm2020/lib/components/table/parts/columns/default/default-table-column.component.mjs +3 -3
  24. package/esm2020/lib/components/table/parts/columns/selectable/selectable-table-column.component.mjs +11 -4
  25. package/esm2020/lib/components/table/parts/columns/selectable/selectable-table-column.constants.mjs +5 -0
  26. package/esm2020/lib/components/table/parts/columns/sorting/sorting-column.component.mjs +69 -0
  27. package/esm2020/lib/components/table/parts/columns/sorting/sorting-column.constants.mjs +6 -0
  28. package/esm2020/lib/components/table/parts/columns/sorting/sorting-column.model.mjs +2 -0
  29. package/esm2020/lib/components/table/parts/columns/table-column.model.mjs +1 -1
  30. package/esm2020/lib/components/table/parts/content/base-default-table-content.component.mjs +16 -18
  31. package/esm2020/lib/components/table/parts/content/cards/default/default-table-card.component.mjs +3 -3
  32. package/esm2020/lib/components/table/parts/content/rows/default/default-table-row.component.mjs +4 -7
  33. package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row.component.mjs +3 -4
  34. package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row.model.mjs +1 -1
  35. package/esm2020/lib/components/table/parts/toggle/columns-toggle.component.mjs +15 -10
  36. package/esm2020/lib/components/table/parts/toggle/columns-toggle.constants.mjs +3 -10
  37. package/esm2020/lib/components/table/parts/toggle/service/columns-toggle.service.mjs +10 -20
  38. package/esm2020/lib/components/table/service/select/table-select.service.mjs +14 -1
  39. package/esm2020/lib/components/table/table.component.mjs +198 -140
  40. package/esm2020/lib/components/table/table.constants.mjs +5 -6
  41. package/esm2020/lib/components/tabs/parts/labels/tab-label-icon/tab-label-icon.component.mjs +2 -2
  42. package/esm2020/lib/components/tabs/parts/labels/tab-label-line/tab-label-line.component.mjs +2 -2
  43. package/esm2020/lib/components/tabs/tabs.component.mjs +2 -2
  44. package/esm2020/lib/components/tags/parts/tag/tag.component.mjs +2 -2
  45. package/esm2020/lib/components/tags/tags.component.mjs +3 -3
  46. package/esm2020/lib/components/timeline/parts/item/timeline-item.component.mjs +2 -2
  47. package/esm2020/lib/ngx-sfc-components.module.mjs +5 -5
  48. package/fesm2015/ngx-sfc-components.mjs +426 -281
  49. package/fesm2015/ngx-sfc-components.mjs.map +1 -1
  50. package/fesm2020/ngx-sfc-components.mjs +425 -279
  51. package/fesm2020/ngx-sfc-components.mjs.map +1 -1
  52. package/lib/components/avatar/avatar.component.d.ts +8 -7
  53. package/lib/components/avatar/models/avatar-data.model.d.ts +5 -4
  54. package/lib/components/avatar/models/avatar-image.model.d.ts +2 -1
  55. package/lib/components/avatar/parts/badge/avatar-badge.component.d.ts +3 -3
  56. package/lib/components/avatar/parts/badge/avatar-badge.model.d.ts +14 -0
  57. package/lib/components/index.d.ts +6 -4
  58. package/lib/components/menu/dropdown/dropdown-menu.component.d.ts +5 -2
  59. package/lib/components/no-export-index.d.ts +2 -0
  60. package/lib/components/table/models/table.model.d.ts +2 -5
  61. package/lib/components/table/parts/columns/default/default-table-column.component.d.ts +2 -2
  62. package/lib/components/table/parts/columns/selectable/selectable-table-column.component.d.ts +3 -0
  63. package/lib/components/table/parts/columns/selectable/selectable-table-column.constants.d.ts +4 -0
  64. package/lib/components/table/parts/columns/sorting/sorting-column.component.d.ts +21 -0
  65. package/lib/components/table/parts/columns/sorting/sorting-column.constants.d.ts +4 -0
  66. package/lib/components/table/parts/columns/sorting/sorting-column.model.d.ts +12 -0
  67. package/lib/components/table/parts/columns/table-column.model.d.ts +8 -5
  68. package/lib/components/table/parts/content/base-default-table-content.component.d.ts +10 -9
  69. package/lib/components/table/parts/content/rows/default/default-table-row.component.d.ts +0 -3
  70. package/lib/components/table/parts/content/rows/expanded/expanded-table-row.model.d.ts +2 -3
  71. package/lib/components/table/parts/toggle/columns-toggle.component.d.ts +3 -1
  72. package/lib/components/table/parts/toggle/columns-toggle.constants.d.ts +2 -8
  73. package/lib/components/table/parts/toggle/service/columns-toggle.service.d.ts +2 -8
  74. package/lib/components/table/service/select/table-select.service.d.ts +2 -0
  75. package/lib/components/table/table.component.d.ts +57 -32
  76. package/lib/components/table/table.constants.d.ts +8 -9
  77. package/lib/ngx-sfc-components.module.d.ts +11 -10
  78. package/package.json +2 -2
  79. package/esm2020/lib/components/table/models/table-pagination.model.mjs +0 -2
  80. package/lib/components/table/models/table-pagination.model.d.ts +0 -5
@@ -1,64 +1,95 @@
1
- import { Component, ContentChildren, HostBinding, Inject, Input } from '@angular/core';
2
- import { all, firstOrDefault, getCalcValue, hasItemBy, isDefined, MediaLimits, PaginationService, Position, ResizeService, sortByPath, SortingDirection, SortingService, TemplateReferenceDirective, WINDOW } from 'ngx-sfc-common';
3
- import { BehaviorSubject, combineLatest, map, startWith } from 'rxjs';
1
+ import { Component, ContentChildren, EventEmitter, HostBinding, Inject, Input, Output } from '@angular/core';
2
+ import { all, firstOrDefault, getCalcValue, getCssLikeValue, isDefined, MediaLimits, Position, ResizeService, SortingDirection, TemplateReferenceDirective, WINDOW, UIConstants, LoadContainerType, LoadContainerLoadType, PaginationConstants, generateGuid, any, hasItem, SortingService, UIClass } from 'ngx-sfc-common';
3
+ import { BehaviorSubject, filter, map } from 'rxjs';
4
4
  import { TableColumnType } from './parts/columns/table-column-type.enum';
5
5
  import { ColumnsToggleService } from './parts/toggle/service/columns-toggle.service';
6
6
  import { TableSelectService } from './service/select/table-select.service';
7
7
  import { TableDataType } from './enums/table-data-type.enum';
8
8
  import { TableConstants } from './table.constants';
9
9
  import { TableTemplate } from './enums/table-template.enum';
10
+ import { faTableList, faBorderAll } from '@fortawesome/free-solid-svg-icons';
10
11
  import * as i0 from "@angular/core";
11
- import * as i1 from "ngx-sfc-common";
12
+ import * as i1 from "./parts/toggle/service/columns-toggle.service";
12
13
  import * as i2 from "./service/select/table-select.service";
13
- import * as i3 from "./parts/toggle/service/columns-toggle.service";
14
+ import * as i3 from "ngx-sfc-common";
14
15
  import * as i4 from "@angular/common";
15
16
  import * as i5 from "./parts/columns/default/default-table-column.component";
16
17
  import * as i6 from "./parts/columns/selectable/selectable-table-column.component";
17
18
  import * as i7 from "./parts/toggle/columns-toggle.component";
18
- import * as i8 from "./parts/content/rows/default/default-table-row.component";
19
- import * as i9 from "./parts/content/cards/default/default-table-card.component";
19
+ import * as i8 from "./parts/columns/sorting/sorting-column.component";
20
+ import * as i9 from "./parts/content/rows/default/default-table-row.component";
21
+ import * as i10 from "./parts/content/cards/default/default-table-card.component";
20
22
  export class TableComponent {
21
- constructor(window, paginationService, selectedService, sortingService, changeDetector, resizeService, columnsToggleService, iterableDiffers) {
23
+ constructor(columnsToggleService, window, selectedService, sortingService, changeDetector, resizeService, iterableDiffers) {
24
+ this.columnsToggleService = columnsToggleService;
22
25
  this.window = window;
23
- this.paginationService = paginationService;
24
26
  this.selectedService = selectedService;
25
27
  this.sortingService = sortingService;
26
28
  this.changeDetector = changeDetector;
27
29
  this.resizeService = resizeService;
28
- this.columnsToggleService = columnsToggleService;
29
30
  this.iterableDiffers = iterableDiffers;
30
31
  this.TableDataType = TableDataType;
31
32
  this.TableColumnType = TableColumnType;
32
33
  this.TableTemplate = TableTemplate;
33
34
  this.Constants = TableConstants;
35
+ this.LoadContainerType = LoadContainerType;
34
36
  this.position = Position.Center;
35
37
  this.delimeter = false;
36
38
  this.dataType = TableDataType.Rows;
37
39
  this.dataToggle = true;
38
40
  this.showColumns = true;
39
- this.pagination = { enabled: true, page: TableConstants.DEFAULT_PAGE, size: TableConstants.DEFAULT_PAGE_SIZE };
41
+ this.columnsToggle = false;
42
+ this.pagination = PaginationConstants.DEFAULT_PAGINATION;
40
43
  this.sequence = false;
41
44
  this.expanded = false;
42
- this.selectable = false;
43
- this.selectOnClick = false;
45
+ this.notFoundLabel = this.Constants.NOT_FOUND_LABEL_DEFAULT;
46
+ this.showTotal = false;
47
+ this.totalLabel = this.Constants.TOTAL_LABEL_DEFAULT;
48
+ this.paginationCount = PaginationConstants.DEFAULT_COUNT;
49
+ this.paginationLimits = false;
50
+ this.showLoading = true;
44
51
  // End Template references
45
52
  //Data
46
53
  this.data = [];
47
54
  // End Data
48
55
  // Columns
49
56
  this.columns = [];
57
+ this.resize = true;
50
58
  this.columnsSubject = new BehaviorSubject(this.columns);
59
+ this.tableColumns = [];
51
60
  // End Columns
52
- this.allRowsSelected = false;
61
+ // Load container
62
+ this.loadType = LoadContainerLoadType.Pagination;
63
+ this.loadContainerId = generateGuid();
64
+ this.items = [];
65
+ this.total = 0;
66
+ this.page = PaginationConstants.DEFAULT_PAGE;
67
+ this.loading = false;
68
+ // End Load container
69
+ // Selection
70
+ this.selectable = false;
71
+ this.selectOnClick = false;
72
+ this.selected = new EventEmitter();
73
+ this.allSelected = false;
74
+ // End Selection
75
+ // Data toggle
76
+ this.dataListLabel = this.Constants.DATA_LIST_LABEL;
77
+ this.dataCardsLabel = this.Constants.DATA_CARDS_LABEL;
53
78
  this.dataDiffer = iterableDiffers.find([]).create(undefined);
54
79
  this.columnsDiffer = iterableDiffers.find([]).create(undefined);
55
80
  }
56
- set data$(value) {
57
- this._data$ = value;
58
- this.paginationService.init(this._data$, this.pagination.page, this.pagination.size);
81
+ get allRowsSelected() {
82
+ return (this.allSelected || this.total == this.selectedService.selectedItems.length)
83
+ && !any(this.selectedService.unselectedItems)
84
+ && any(this.items);
59
85
  }
60
- get data$() {
61
- return this._data$;
86
+ ;
87
+ get initialSorting() {
88
+ const activeSortingColumn = firstOrDefault(this.columns, column => column.sorting?.active);
89
+ if (activeSortingColumn)
90
+ return { id: activeSortingColumn.field, direction: activeSortingColumn.sorting?.direction };
91
+ const enabledSortingColumn = firstOrDefault(this.columns, column => column.sorting?.enabled);
92
+ return enabledSortingColumn ? { id: enabledSortingColumn.field, direction: enabledSortingColumn.sorting?.direction } : null;
62
93
  }
63
94
  ngOnInit() {
64
95
  // if data is static, make it observable
@@ -66,67 +97,24 @@ export class TableComponent {
66
97
  this.dataSubject = new BehaviorSubject(this.data);
67
98
  this.data$ = this.dataSubject.asObservable();
68
99
  }
69
- // set up data models with indexes
70
- const dataIndexed$ = this.data$.pipe(map((data) => data.map((dataModel, index) => { return { index, dataModel }; }))),
71
- // set up sorting observable
72
- sorting$ = this.getSortingObservable(),
73
- // set up selection observable
74
- selection$ = this.selectedService.select$.pipe(startWith(null));
75
- // set up columns (conditionally add sequence or selectable columns)
76
- this.columns$ = this.columnsSubject.asObservable().pipe(map(columns => {
77
- let tableColumns = columns.slice(0);
78
- if (this.sequence)
79
- tableColumns.unshift(TableConstants.SEQUENCE_COLUMN);
80
- if (this.selectable)
81
- tableColumns.unshift(TableConstants.SELECTABLE_COLUMN);
82
- if (this.expanded)
83
- tableColumns.push(TableConstants.EXPANDED_COLUMN);
84
- return tableColumns;
85
- }));
86
- this.columnsSorting$ = combineLatest([this.columns$, sorting$]).pipe(map(([columns, event]) => {
87
- columns.forEach(column => {
88
- if (column.sorting?.enabled) {
89
- column.sorting.active = column.field == event?.id || false;
90
- if (!column.sorting.active)
91
- column.sorting.direction = SortingDirection.Ascending;
92
- }
93
- });
94
- return columns;
95
- }));
96
- // set up main data observable
97
- this.dataValue$ = combineLatest([
98
- dataIndexed$,
99
- this.paginationService.pagination$,
100
- sorting$,
101
- selection$
102
- ]).pipe(map(([data, paginationEvent, sortingEvent, selectionEvent]) => {
103
- // handle selection
104
- this.handleSelectionEvent(data, selectionEvent);
105
- // handle pagination and sorting
106
- let sortedData = this.sortData(data, sortingEvent), paginatedData = this.paginateData(sortedData, paginationEvent);
107
- // handle data sequence
108
- if (this.sequence) {
109
- this.updateRowSequenceValues(paginationEvent.page, paginatedData);
110
- }
111
- return paginatedData;
112
- }));
113
- }
114
- ngAfterViewInit() {
115
- // combine all observable to view model
116
- this.vm$ = combineLatest([
117
- this.columnsSorting$,
118
- this.dataValue$,
119
- this.columnsToggleService.showColumns$,
120
- this.columnWidth$
121
- ]).pipe(map(([columns, data, showColumns, columnWidth]) => {
122
- return {
123
- columns,
124
- data,
125
- columnWidth,
126
- showColumns: this.showColumns && showColumns,
127
- columnStyle: { width: getCalcValue(columnWidth), justifyContent: this.position }
128
- };
129
- }));
100
+ if (this.selectable)
101
+ this.selectionSubscribe();
102
+ // set up columns (conditionally add sequence, selectable and expand columns)
103
+ this.columnsSubscribe();
104
+ if (this.resize)
105
+ this.resizeSubscribe();
106
+ this.sortingSubscribe();
107
+ this.loadModel = {
108
+ predicate$: this.predicate$,
109
+ data$: this.data$,
110
+ loader: this.loader,
111
+ filter: this.filter,
112
+ loadType: this.loadType,
113
+ pagination: this.pagination,
114
+ sorting: this.initialSorting
115
+ };
116
+ this.toggleSwitcherLeftModel = { label: this.dataListLabel, icon: faTableList };
117
+ this.toggleSwitcherRightModel = { label: this.dataCardsLabel, icon: faBorderAll };
130
118
  }
131
119
  ngAfterViewChecked() {
132
120
  this.changeDetector.detectChanges();
@@ -142,73 +130,106 @@ export class TableComponent {
142
130
  ngAfterContentChecked() {
143
131
  this.changeDetector.detectChanges();
144
132
  }
145
- ngAfterContentInit() {
146
- this.columnWidth$ = combineLatest([
147
- this.resizeService.onResize$.pipe(startWith({})),
148
- this.columns$
149
- ]).pipe(map(([_, columns]) => this.getColumnWidth(this.window.innerWidth, columns.length)));
133
+ ngOnDestroy() {
134
+ this._allSelectionSubscription?.unsubscribe();
135
+ this._columnsResizeSubscription?.unsubscribe();
136
+ this._columnsSubscription?.unsubscribe();
137
+ this._sortingSubscription?.unsubscribe();
150
138
  }
151
139
  onDataTypeToggle() {
152
- this.dataType = this.dataType == TableDataType.Rows ? TableDataType.Cards : TableDataType.Rows;
153
- }
154
- selectRow(model) {
155
- this.selectedService.select(model.index, model.selected);
156
- }
157
- getSortingObservable() {
158
- const firstSortingColumn = firstOrDefault(this.columns, column => column?.sorting?.enabled || false);
159
- return this.sortingService.sorting$.pipe(startWith(firstSortingColumn ? { id: firstSortingColumn.field, direction: firstSortingColumn.sorting?.direction || SortingDirection.Ascending } : null));
160
- }
161
- getColumnWidth(windowWidth, columnsLength) {
162
- if (windowWidth <= MediaLimits.MobileLarge)
163
- return 1;
164
- if (windowWidth <= MediaLimits.Tablet)
165
- return Math.ceil(columnsLength / 2);
166
- return columnsLength;
167
- }
168
- handleSelectionEvent(data, selectionEvent) {
169
- if (selectionEvent != null) {
170
- if (selectionEvent.index == null) {
171
- data.forEach(item => item.dataModel.selected = selectionEvent.selected);
172
- }
173
- else {
174
- data.forEach(item => {
175
- if (selectionEvent.index === item.index) {
176
- item.dataModel.selected = selectionEvent.selected;
177
- }
178
- });
140
+ this.dataType = this.dataType == TableDataType.Rows
141
+ ? TableDataType.Cards
142
+ : TableDataType.Rows;
143
+ }
144
+ handleSuccess(result) {
145
+ this.page = result.page;
146
+ this.total = result.total;
147
+ const items = result.items.map((item, index) => {
148
+ const sequence = (index + 1) + ((this.page * this.pagination.size) - this.pagination.size);
149
+ return {
150
+ index: index,
151
+ sequence: sequence,
152
+ selected: this.getItemSelected(sequence),
153
+ data: item
154
+ };
155
+ });
156
+ if (result.reset)
157
+ this.items = items;
158
+ else
159
+ this.items = this.items.concat(items);
160
+ }
161
+ selectionSubscribe() {
162
+ this._allSelectionSubscription = this.selectedService.select$
163
+ .subscribe((event) => {
164
+ if (event.index == null) {
165
+ this.allSelected = event.selected;
166
+ this.items.forEach(item => item.selected = event.selected);
179
167
  }
180
- }
181
- this.allRowsSelected = all(data, item => Boolean(item.dataModel.selected));
182
- }
183
- paginateData(data, paginationEvent) {
184
- let pagedData = this.pagination.enabled
185
- ? data.slice((paginationEvent.page - 1) * this.pagination.size, paginationEvent.page * this.pagination.size)
186
- : data;
187
- return pagedData;
188
- }
189
- sortData(data, sortingEvent) {
190
- const sortedData = sortingEvent && hasItemBy(this.columns, col => col.field == sortingEvent.id)
191
- ? sortByPath(data, `dataModel.data.${sortingEvent.id}`, sortingEvent.direction)
192
- : data;
193
- return sortedData;
194
- }
195
- updateRowSequenceValues(page, data) {
196
- let from = (page - 1) * this.pagination.size;
197
- data.forEach(item => {
198
- item.sequence = from + 1;
199
- from++;
168
+ this.selected.emit(event);
200
169
  });
201
170
  }
171
+ resizeSubscribe() {
172
+ this._columnsResizeSubscription = this.resizeService.onResize$
173
+ .subscribe(() => this.tableColumns.forEach(column => column.calculatedWidth = this.calculateColumnWidth(column, this.tableColumns.length)));
174
+ }
175
+ columnsSubscribe() {
176
+ this._columnsSubscription = this.columnsSubject.asObservable().pipe(filter(columns => any(columns)), map((columns) => {
177
+ let tableColumns = JSON.parse(JSON.stringify(columns));
178
+ if (this.sequence)
179
+ tableColumns.unshift(TableConstants.SEQUENCE_COLUMN);
180
+ if (this.selectable)
181
+ tableColumns.unshift(TableConstants.SELECTABLE_COLUMN);
182
+ if (this.expanded)
183
+ tableColumns.push(TableConstants.EXPANDED_COLUMN);
184
+ // calculated width not work without deep copy
185
+ return JSON.parse(JSON.stringify(tableColumns));
186
+ })).subscribe((columns) => {
187
+ columns.forEach((column) => {
188
+ column.calculatedWidth = this.calculateColumnWidth(column, columns.length);
189
+ const sortingColumn = this.initialSorting;
190
+ if (this.initialSorting) {
191
+ this.setColumnSorting(column, sortingColumn?.id);
192
+ }
193
+ });
194
+ this.tableColumns = columns;
195
+ });
196
+ }
197
+ sortingSubscribe() {
198
+ this._sortingSubscription = this.sortingService.sorting$.subscribe((sortingEvent) => this.tableColumns.forEach((column) => this.setColumnSorting(column, sortingEvent?.id)));
199
+ }
200
+ calculateColumnWidth(column, columnsLength) {
201
+ // defined width for all columns
202
+ if (all(this.columns, column => isDefined(column.width)))
203
+ return getCssLikeValue(column.width, UIConstants.CSS_PERCENTAGE);
204
+ let width = columnsLength;
205
+ if (this.window.innerWidth <= MediaLimits.MobileLarge)
206
+ width = 1;
207
+ else if (this.window.innerWidth <= MediaLimits.Tablet)
208
+ width = Math.ceil(columnsLength / 2);
209
+ return getCalcValue(width);
210
+ }
211
+ setColumnSorting(column, sortingId) {
212
+ if (column.sorting?.enabled) {
213
+ column.sorting.active = column.field == sortingId;
214
+ if (!column.sorting.active)
215
+ column.sorting.direction = SortingDirection.Ascending;
216
+ }
217
+ }
218
+ getItemSelected(sequence) {
219
+ return this.allSelected
220
+ ? !hasItem(this.selectedService.unselectedItems, sequence)
221
+ : hasItem(this.selectedService.selectedItems, sequence);
222
+ }
202
223
  }
203
- TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TableComponent, deps: [{ token: WINDOW }, { token: i1.PaginationService }, { token: i2.TableSelectService }, { token: i1.SortingService }, { token: i0.ChangeDetectorRef }, { token: i1.ResizeService }, { token: i3.ColumnsToggleService }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
204
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: TableComponent, selector: "sfc-table", inputs: { position: "position", delimeter: "delimeter", dataType: "dataType", dataToggle: "dataToggle", showColumns: "showColumns", pagination: "pagination", sequence: "sequence", expanded: "expanded", selectable: "selectable", selectOnClick: "selectOnClick", columnContent: "columnContent", rowContent: "rowContent", cardContent: "cardContent", data: "data", data$: "data$", columns: "columns" }, host: { properties: { "class": "this.dataType" } }, providers: [PaginationService, SortingService, TableSelectService, ColumnsToggleService, ResizeService], queries: [{ propertyName: "templates", predicate: TemplateReferenceDirective, read: TemplateReferenceDirective }], ngImport: i0, template: "<div class=\"container\" *ngIf=\"vm$ | async as vm\">\r\n <div class=\"columns-container\">\r\n <div class=\"columns-actions\">\r\n <sfc-columns-toggle *ngIf=\"showColumns\"></sfc-columns-toggle>\r\n <sfc-toggle-switcher *ngIf=\"dataToggle\" [active]=\"dataType === TableDataType.Cards\"\r\n [leftModel]=\"Constants.TOGGLE_SWITCHER_LEFT_MODEL\" [rightModel]=\"Constants.TOGGLE_SWITCHER_RIGHT_MODEL\"\r\n (click)=\"onDataTypeToggle()\">\r\n </sfc-toggle-switcher>\r\n </div>\r\n\r\n <div *ngIf=\"vm.showColumns\" class=\"columns\">\r\n <div class=\"column\" [ngStyle]=\"vm.columnStyle\" *ngFor=\"let column of vm.columns\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <sfc-selectable-table-column *ngSwitchCase=\"TableColumnType.Selectable\"\r\n [selected]=\"allRowsSelected\">\r\n </sfc-selectable-table-column>\r\n\r\n <sfc-sorting *ngSwitchDefault [model]=\"column.sorting\" [id]=\"column.field\">\r\n\r\n <sfc-template-content [referenceContent]=\"columnContent\" [templatesContent]=\"templates\"\r\n [templateType]=\"TableTemplate.Column\" [defaultContent]=\"defaultColumn\"\r\n [contextData]=\"column\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultColumn>\r\n <sfc-default-table-column [model]=\"column\"></sfc-default-table-column>\r\n </ng-template>\r\n\r\n </sfc-sorting>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <sfc-delimeter *ngIf=\"delimeter\"></sfc-delimeter>\r\n\r\n <div class=\"rows-container\">\r\n <div class=\"row\" *ngFor=\"let item of vm.data\">\r\n\r\n <ng-container [ngSwitch]=\"dataType\">\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Rows\" [referenceContent]=\"rowContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Row\" [defaultContent]=\"defaultRow\"\r\n [contextData]=\"{model: item, columns: vm.columns, columnWidth: vm.columnWidth, position: position}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultRow>\r\n <sfc-default-table-row [columns]=\"vm.columns\" [model]=\"item\" [position]=\"position\"\r\n [columnWidth]=\"vm.columnWidth\" [selectOnClick]=\"selectOnClick\" (selected)=\"selectRow($event)\">\r\n </sfc-default-table-row>\r\n </ng-template>\r\n\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Cards\" [referenceContent]=\"cardContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Card\" [defaultContent]=\"defaultCard\"\r\n [contextData]=\"{model: item, columns: vm.columns}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultCard>\r\n <sfc-default-table-card [columns]=\"vm.columns\" [model]=\"item\" [selectOnClick]=\"selectOnClick\"\r\n (selected)=\"selectRow($event)\">\r\n </sfc-default-table-card>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pagination-container\">\r\n <sfc-pagination *ngIf=\"pagination.enabled\" [limits]=\"false\" [full]=\"false\" [data$]=\"data$\"></sfc-pagination>\r\n </div>\r\n</div>", styles: [":host .container{display:block;margin:2em auto;width:90%}:host .container .columns-container{display:flex;flex-flow:row wrap;transition:.5s;justify-content:space-between}:host .container .columns-container .columns-actions{display:flex;align-items:center;width:100%}:host .container .columns-container .columns-actions sfc-toggle-switcher{margin-left:auto}:host .container .columns-container .columns{text-align:center;padding:.5em;width:100%;display:flex;flex-flow:row wrap}:host .container .columns-container .columns .column{text-align:center;padding:.5em;display:flex;align-items:center;justify-content:center;box-sizing:border-box}:host .container .rows-container{display:flex;flex-wrap:wrap;justify-content:center;transition:.5s;gap:1em;margin-block:1em 2em}:host .container .rows-container .row{display:contents}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i1.DelimeterComponent, selector: "sfc-delimeter", inputs: ["label", "direction"] }, { kind: "component", type: i1.TemplateContentComponent, selector: "sfc-template-content", inputs: ["contextData", "referenceContent", "templateType", "templatesContent", "defaultContent"] }, { kind: "component", type: i1.ToggleSwitcherComponent, selector: "sfc-toggle-switcher", inputs: ["active", "disabled", "leftModel", "rightModel"] }, { kind: "component", type: i1.PaginationComponent, selector: "sfc-pagination", inputs: ["count", "full", "limits", "data$"] }, { kind: "component", type: i1.SortingComponent, selector: "sfc-sorting", inputs: ["id", "model"] }, { kind: "component", type: i5.DefaultTableColumnComponent, selector: "sfc-default-table-column", inputs: ["model"] }, { kind: "component", type: i6.SelectableTableColumnComponent, selector: "sfc-selectable-table-column", inputs: ["selected"] }, { kind: "component", type: i7.ColumnsToggleComponent, selector: "sfc-columns-toggle" }, { kind: "component", type: i8.DefaultTableRowComponent, selector: "sfc-default-table-row" }, { kind: "component", type: i9.DefaultTableCardComponent, selector: "sfc-default-table-card" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
224
+ TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TableComponent, deps: [{ token: i1.ColumnsToggleService }, { token: WINDOW }, { token: i2.TableSelectService }, { token: i3.SortingService }, { token: i0.ChangeDetectorRef }, { token: i3.ResizeService }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
225
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: TableComponent, selector: "sfc-table", inputs: { position: "position", delimeter: "delimeter", dataType: "dataType", dataToggle: "dataToggle", showColumns: "showColumns", columnsToggle: "columnsToggle", pagination: "pagination", sequence: "sequence", expanded: "expanded", notFoundLabel: "notFoundLabel", showTotal: "showTotal", totalLabel: "totalLabel", paginationCount: "paginationCount", paginationLimits: "paginationLimits", showLoading: "showLoading", columnContent: "columnContent", rowContent: "rowContent", cardContent: "cardContent", data: "data", data$: "data$", columns: "columns", showColumnsLabel: "showColumnsLabel", hideColumnsLabel: "hideColumnsLabel", resize: "resize", loadType: "loadType", loader: "loader", filter: "filter", predicate$: "predicate$", selectable: "selectable", selectOnClick: "selectOnClick", dataListLabel: "dataListLabel", dataCardsLabel: "dataCardsLabel" }, outputs: { selected: "selected" }, host: { properties: { "class": "this.dataType", "class.loading": "this.loading" } }, providers: [SortingService, TableSelectService, ColumnsToggleService, ResizeService], queries: [{ propertyName: "templates", predicate: TemplateReferenceDirective, read: TemplateReferenceDirective }], ngImport: i0, template: "<div class=\"container\">\r\n <div *ngIf=\"showLoading\" class=\"table-loader\"></div>\r\n <div class=\"columns-container\">\r\n <div class=\"columns-actions\">\r\n <div class=\"left\">\r\n <sfc-columns-toggle *ngIf=\"columnsToggle\" [showLabel]=\"showColumnsLabel\" [hideLabel]=\"hideColumnsLabel\">\r\n </sfc-columns-toggle>\r\n </div>\r\n\r\n <div class=\"right\">\r\n <p *ngIf=\"showTotal\">{{totalLabel}}: <span>{{total}}</span></p>\r\n <sfc-toggle-switcher *ngIf=\"dataToggle\" [active]=\"dataType === TableDataType.Cards\"\r\n [leftModel]=\"toggleSwitcherLeftModel\" [rightModel]=\"toggleSwitcherRightModel\"\r\n (click)=\"onDataTypeToggle()\">\r\n </sfc-toggle-switcher>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showColumns && columnsToggleService.show\" class=\"columns\">\r\n <div class=\"column\" [style.justifyContent]=\"position\" [style.minWidth]=\"column.calculatedWidth\"\r\n *ngFor=\"let column of tableColumns\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <sfc-selectable-table-column *ngSwitchCase=\"TableColumnType.Selectable\"\r\n [selected]=\"allRowsSelected\">\r\n </sfc-selectable-table-column>\r\n\r\n <sfc-sorting-column *ngSwitchDefault [model]=\"column.sorting!\" [id]=\"column.field\">\r\n\r\n <sfc-template-content [referenceContent]=\"columnContent\" [templatesContent]=\"templates\"\r\n [templateType]=\"TableTemplate.Column\" [defaultContent]=\"defaultColumn\"\r\n [contextData]=\"column\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultColumn>\r\n <sfc-default-table-column [model]=\"column\"></sfc-default-table-column>\r\n </ng-template>\r\n\r\n </sfc-sorting-column>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <sfc-delimeter *ngIf=\"delimeter\" class=\"table-delimeter\"></sfc-delimeter>\r\n\r\n <div class=\"rows-container\">\r\n <sfc-load-container [id]=\"loadContainerId\" [type]=\"LoadContainerType.Table\" [model]=\"loadModel\"\r\n [paginationCount]=\"paginationCount\" [paginationLimits]=\"paginationLimits\" [showLoading]=\"showLoading\"\r\n (handleSuccess)=\"handleSuccess($event)\" (handleLoading)=\"loading = $event\" [emptyLabel]=\"notFoundLabel\">\r\n <div class=\"row\" *ngFor=\"let item of items; index as i;\">\r\n <ng-container [ngSwitch]=\"dataType\">\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Rows\" [referenceContent]=\"rowContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Row\" [defaultContent]=\"defaultRow\"\r\n [contextData]=\"{model: item, columns: tableColumns, position: position}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultRow>\r\n <sfc-default-table-row [columns]=\"tableColumns\" [model]=\"item\" [position]=\"position\"\r\n [selectOnClick]=\"selectOnClick\">\r\n </sfc-default-table-row>\r\n </ng-template>\r\n\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Cards\" [referenceContent]=\"cardContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Card\"\r\n [defaultContent]=\"defaultCard\" [contextData]=\"{model: item, columns: tableColumns}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultCard>\r\n <sfc-default-table-card [columns]=\"tableColumns\" [model]=\"item\" [selectOnClick]=\"selectOnClick\">\r\n </sfc-default-table-card>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n </sfc-load-container>\r\n </div>\r\n</div>", styles: [":host .container{display:block;margin:2em auto;width:90%;position:relative}:host .container .columns-container{display:flex;flex-flow:row wrap;transition:.5s;justify-content:space-between}:host .container .columns-container .columns-actions{display:flex;align-items:center;width:100%}:host .container .columns-container .columns-actions .right{display:inline-flex;align-items:center;flex-wrap:wrap;justify-content:center;margin-left:auto}:host .container .columns-container .columns-actions .right>p{transition:color .5s ease;margin:0;font-size:.8em;padding-right:1em;font-weight:700;-webkit-user-select:none;user-select:none;text-align:center}:host .container .columns-container .columns-actions .right>p,:host-context(.sfc-default-theme) :host .container .columns-container .columns-actions .right>p{color:#545e61}:host-context(.sfc-dark-theme) :host .container .columns-container .columns-actions .right>p{color:#fff}:host .container .columns-container .columns-actions .right>p span{font-size:1.1em;color:#ffce54}:host .container .columns-container .columns{text-align:center;padding:.5em;width:100%;display:flex;flex-flow:row wrap}:host .container .columns-container .columns .column{text-align:center;padding:.5em;display:flex;align-items:center;justify-content:center;box-sizing:border-box}:host .container .rows-container{display:flex;flex-wrap:wrap;justify-content:center;transition:.5s;gap:1em;margin-block:1em 2em}:host .container .rows-container sfc-load-container ::ng-deep>.content{background:transparent}:host .container .rows-container sfc-load-container.loading{cursor:initial;z-index:9999}:host .container .rows-container sfc-load-container.loading .preloader{transition:background .5s ease}:host .container .rows-container sfc-load-container.loading .preloader,:host-context(.sfc-default-theme) :host .container .rows-container sfc-load-container.loading .preloader{background:#fff}:host-context(.sfc-dark-theme) :host .container .rows-container sfc-load-container.loading .preloader{background:transparent}:host .container .rows-container .row{display:contents}:host.loading .container .table-loader{position:relative;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;z-index:9998;position:absolute;transition:background-color .5s ease;opacity:.7}:host.loading .container .table-loader,:host-context(.sfc-default-theme) :host.loading .container .table-loader{background-color:#fff}:host-context(.sfc-dark-theme) :host.loading .container .table-loader{background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.DelimeterComponent, selector: "sfc-delimeter", inputs: ["label", "direction"] }, { kind: "component", type: i3.TemplateContentComponent, selector: "sfc-template-content", inputs: ["contextData", "referenceContent", "templateType", "templatesContent", "defaultContent"] }, { kind: "component", type: i3.ToggleSwitcherComponent, selector: "sfc-toggle-switcher", inputs: ["active", "disabled", "leftModel", "rightModel"] }, { kind: "component", type: i3.LoadContainerComponent, selector: "sfc-load-container", inputs: ["id", "type", "open", "loadMore", "loadMoreLabel", "showEmpty", "emptyLabel", "model", "scrollTarget", "paginationCount", "paginationLimits", "showLoading"], outputs: ["handleError", "handleSuccess", "handleLoading"] }, { kind: "component", type: i5.DefaultTableColumnComponent, selector: "sfc-default-table-column", inputs: ["model"] }, { kind: "component", type: i6.SelectableTableColumnComponent, selector: "sfc-selectable-table-column", inputs: ["selected"] }, { kind: "component", type: i7.ColumnsToggleComponent, selector: "sfc-columns-toggle", inputs: ["showLabel", "hideLabel"] }, { kind: "component", type: i8.SortingColumnComponent, selector: "sfc-sorting-column", inputs: ["id", "model"] }, { kind: "component", type: i9.DefaultTableRowComponent, selector: "sfc-default-table-row" }, { kind: "component", type: i10.DefaultTableCardComponent, selector: "sfc-default-table-card" }] });
205
226
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TableComponent, decorators: [{
206
227
  type: Component,
207
- args: [{ selector: 'sfc-table', providers: [PaginationService, SortingService, TableSelectService, ColumnsToggleService, ResizeService], template: "<div class=\"container\" *ngIf=\"vm$ | async as vm\">\r\n <div class=\"columns-container\">\r\n <div class=\"columns-actions\">\r\n <sfc-columns-toggle *ngIf=\"showColumns\"></sfc-columns-toggle>\r\n <sfc-toggle-switcher *ngIf=\"dataToggle\" [active]=\"dataType === TableDataType.Cards\"\r\n [leftModel]=\"Constants.TOGGLE_SWITCHER_LEFT_MODEL\" [rightModel]=\"Constants.TOGGLE_SWITCHER_RIGHT_MODEL\"\r\n (click)=\"onDataTypeToggle()\">\r\n </sfc-toggle-switcher>\r\n </div>\r\n\r\n <div *ngIf=\"vm.showColumns\" class=\"columns\">\r\n <div class=\"column\" [ngStyle]=\"vm.columnStyle\" *ngFor=\"let column of vm.columns\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <sfc-selectable-table-column *ngSwitchCase=\"TableColumnType.Selectable\"\r\n [selected]=\"allRowsSelected\">\r\n </sfc-selectable-table-column>\r\n\r\n <sfc-sorting *ngSwitchDefault [model]=\"column.sorting\" [id]=\"column.field\">\r\n\r\n <sfc-template-content [referenceContent]=\"columnContent\" [templatesContent]=\"templates\"\r\n [templateType]=\"TableTemplate.Column\" [defaultContent]=\"defaultColumn\"\r\n [contextData]=\"column\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultColumn>\r\n <sfc-default-table-column [model]=\"column\"></sfc-default-table-column>\r\n </ng-template>\r\n\r\n </sfc-sorting>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <sfc-delimeter *ngIf=\"delimeter\"></sfc-delimeter>\r\n\r\n <div class=\"rows-container\">\r\n <div class=\"row\" *ngFor=\"let item of vm.data\">\r\n\r\n <ng-container [ngSwitch]=\"dataType\">\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Rows\" [referenceContent]=\"rowContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Row\" [defaultContent]=\"defaultRow\"\r\n [contextData]=\"{model: item, columns: vm.columns, columnWidth: vm.columnWidth, position: position}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultRow>\r\n <sfc-default-table-row [columns]=\"vm.columns\" [model]=\"item\" [position]=\"position\"\r\n [columnWidth]=\"vm.columnWidth\" [selectOnClick]=\"selectOnClick\" (selected)=\"selectRow($event)\">\r\n </sfc-default-table-row>\r\n </ng-template>\r\n\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Cards\" [referenceContent]=\"cardContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Card\" [defaultContent]=\"defaultCard\"\r\n [contextData]=\"{model: item, columns: vm.columns}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultCard>\r\n <sfc-default-table-card [columns]=\"vm.columns\" [model]=\"item\" [selectOnClick]=\"selectOnClick\"\r\n (selected)=\"selectRow($event)\">\r\n </sfc-default-table-card>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pagination-container\">\r\n <sfc-pagination *ngIf=\"pagination.enabled\" [limits]=\"false\" [full]=\"false\" [data$]=\"data$\"></sfc-pagination>\r\n </div>\r\n</div>", styles: [":host .container{display:block;margin:2em auto;width:90%}:host .container .columns-container{display:flex;flex-flow:row wrap;transition:.5s;justify-content:space-between}:host .container .columns-container .columns-actions{display:flex;align-items:center;width:100%}:host .container .columns-container .columns-actions sfc-toggle-switcher{margin-left:auto}:host .container .columns-container .columns{text-align:center;padding:.5em;width:100%;display:flex;flex-flow:row wrap}:host .container .columns-container .columns .column{text-align:center;padding:.5em;display:flex;align-items:center;justify-content:center;box-sizing:border-box}:host .container .rows-container{display:flex;flex-wrap:wrap;justify-content:center;transition:.5s;gap:1em;margin-block:1em 2em}:host .container .rows-container .row{display:contents}\n"] }]
208
- }], ctorParameters: function () { return [{ type: Window, decorators: [{
228
+ args: [{ selector: 'sfc-table', providers: [SortingService, TableSelectService, ColumnsToggleService, ResizeService], template: "<div class=\"container\">\r\n <div *ngIf=\"showLoading\" class=\"table-loader\"></div>\r\n <div class=\"columns-container\">\r\n <div class=\"columns-actions\">\r\n <div class=\"left\">\r\n <sfc-columns-toggle *ngIf=\"columnsToggle\" [showLabel]=\"showColumnsLabel\" [hideLabel]=\"hideColumnsLabel\">\r\n </sfc-columns-toggle>\r\n </div>\r\n\r\n <div class=\"right\">\r\n <p *ngIf=\"showTotal\">{{totalLabel}}: <span>{{total}}</span></p>\r\n <sfc-toggle-switcher *ngIf=\"dataToggle\" [active]=\"dataType === TableDataType.Cards\"\r\n [leftModel]=\"toggleSwitcherLeftModel\" [rightModel]=\"toggleSwitcherRightModel\"\r\n (click)=\"onDataTypeToggle()\">\r\n </sfc-toggle-switcher>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showColumns && columnsToggleService.show\" class=\"columns\">\r\n <div class=\"column\" [style.justifyContent]=\"position\" [style.minWidth]=\"column.calculatedWidth\"\r\n *ngFor=\"let column of tableColumns\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <sfc-selectable-table-column *ngSwitchCase=\"TableColumnType.Selectable\"\r\n [selected]=\"allRowsSelected\">\r\n </sfc-selectable-table-column>\r\n\r\n <sfc-sorting-column *ngSwitchDefault [model]=\"column.sorting!\" [id]=\"column.field\">\r\n\r\n <sfc-template-content [referenceContent]=\"columnContent\" [templatesContent]=\"templates\"\r\n [templateType]=\"TableTemplate.Column\" [defaultContent]=\"defaultColumn\"\r\n [contextData]=\"column\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultColumn>\r\n <sfc-default-table-column [model]=\"column\"></sfc-default-table-column>\r\n </ng-template>\r\n\r\n </sfc-sorting-column>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <sfc-delimeter *ngIf=\"delimeter\" class=\"table-delimeter\"></sfc-delimeter>\r\n\r\n <div class=\"rows-container\">\r\n <sfc-load-container [id]=\"loadContainerId\" [type]=\"LoadContainerType.Table\" [model]=\"loadModel\"\r\n [paginationCount]=\"paginationCount\" [paginationLimits]=\"paginationLimits\" [showLoading]=\"showLoading\"\r\n (handleSuccess)=\"handleSuccess($event)\" (handleLoading)=\"loading = $event\" [emptyLabel]=\"notFoundLabel\">\r\n <div class=\"row\" *ngFor=\"let item of items; index as i;\">\r\n <ng-container [ngSwitch]=\"dataType\">\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Rows\" [referenceContent]=\"rowContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Row\" [defaultContent]=\"defaultRow\"\r\n [contextData]=\"{model: item, columns: tableColumns, position: position}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultRow>\r\n <sfc-default-table-row [columns]=\"tableColumns\" [model]=\"item\" [position]=\"position\"\r\n [selectOnClick]=\"selectOnClick\">\r\n </sfc-default-table-row>\r\n </ng-template>\r\n\r\n <sfc-template-content *ngSwitchCase=\"TableDataType.Cards\" [referenceContent]=\"cardContent\"\r\n [templatesContent]=\"templates\" [templateType]=\"TableTemplate.Card\"\r\n [defaultContent]=\"defaultCard\" [contextData]=\"{model: item, columns: tableColumns}\">\r\n </sfc-template-content>\r\n\r\n <ng-template #defaultCard>\r\n <sfc-default-table-card [columns]=\"tableColumns\" [model]=\"item\" [selectOnClick]=\"selectOnClick\">\r\n </sfc-default-table-card>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n </sfc-load-container>\r\n </div>\r\n</div>", styles: [":host .container{display:block;margin:2em auto;width:90%;position:relative}:host .container .columns-container{display:flex;flex-flow:row wrap;transition:.5s;justify-content:space-between}:host .container .columns-container .columns-actions{display:flex;align-items:center;width:100%}:host .container .columns-container .columns-actions .right{display:inline-flex;align-items:center;flex-wrap:wrap;justify-content:center;margin-left:auto}:host .container .columns-container .columns-actions .right>p{transition:color .5s ease;margin:0;font-size:.8em;padding-right:1em;font-weight:700;-webkit-user-select:none;user-select:none;text-align:center}:host .container .columns-container .columns-actions .right>p,:host-context(.sfc-default-theme) :host .container .columns-container .columns-actions .right>p{color:#545e61}:host-context(.sfc-dark-theme) :host .container .columns-container .columns-actions .right>p{color:#fff}:host .container .columns-container .columns-actions .right>p span{font-size:1.1em;color:#ffce54}:host .container .columns-container .columns{text-align:center;padding:.5em;width:100%;display:flex;flex-flow:row wrap}:host .container .columns-container .columns .column{text-align:center;padding:.5em;display:flex;align-items:center;justify-content:center;box-sizing:border-box}:host .container .rows-container{display:flex;flex-wrap:wrap;justify-content:center;transition:.5s;gap:1em;margin-block:1em 2em}:host .container .rows-container sfc-load-container ::ng-deep>.content{background:transparent}:host .container .rows-container sfc-load-container.loading{cursor:initial;z-index:9999}:host .container .rows-container sfc-load-container.loading .preloader{transition:background .5s ease}:host .container .rows-container sfc-load-container.loading .preloader,:host-context(.sfc-default-theme) :host .container .rows-container sfc-load-container.loading .preloader{background:#fff}:host-context(.sfc-dark-theme) :host .container .rows-container sfc-load-container.loading .preloader{background:transparent}:host .container .rows-container .row{display:contents}:host.loading .container .table-loader{position:relative;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;z-index:9998;position:absolute;transition:background-color .5s ease;opacity:.7}:host.loading .container .table-loader,:host-context(.sfc-default-theme) :host.loading .container .table-loader{background-color:#fff}:host-context(.sfc-dark-theme) :host.loading .container .table-loader{background-color:transparent}\n"] }]
229
+ }], ctorParameters: function () { return [{ type: i1.ColumnsToggleService }, { type: Window, decorators: [{
209
230
  type: Inject,
210
231
  args: [WINDOW]
211
- }] }, { type: i1.PaginationService }, { type: i2.TableSelectService }, { type: i1.SortingService }, { type: i0.ChangeDetectorRef }, { type: i1.ResizeService }, { type: i3.ColumnsToggleService }, { type: i0.IterableDiffers }]; }, propDecorators: { position: [{
232
+ }] }, { type: i2.TableSelectService }, { type: i3.SortingService }, { type: i0.ChangeDetectorRef }, { type: i3.ResizeService }, { type: i0.IterableDiffers }]; }, propDecorators: { position: [{
212
233
  type: Input
213
234
  }], delimeter: [{
214
235
  type: Input
@@ -221,15 +242,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
221
242
  type: Input
222
243
  }], showColumns: [{
223
244
  type: Input
245
+ }], columnsToggle: [{
246
+ type: Input
224
247
  }], pagination: [{
225
248
  type: Input
226
249
  }], sequence: [{
227
250
  type: Input
228
251
  }], expanded: [{
229
252
  type: Input
230
- }], selectable: [{
253
+ }], notFoundLabel: [{
231
254
  type: Input
232
- }], selectOnClick: [{
255
+ }], showTotal: [{
256
+ type: Input
257
+ }], totalLabel: [{
258
+ type: Input
259
+ }], paginationCount: [{
260
+ type: Input
261
+ }], paginationLimits: [{
262
+ type: Input
263
+ }], showLoading: [{
233
264
  type: Input
234
265
  }], columnContent: [{
235
266
  type: Input
@@ -243,8 +274,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
243
274
  type: Input
244
275
  }], columns: [{
245
276
  type: Input
277
+ }], showColumnsLabel: [{
278
+ type: Input
279
+ }], hideColumnsLabel: [{
280
+ type: Input
281
+ }], resize: [{
282
+ type: Input
283
+ }], loadType: [{
284
+ type: Input
285
+ }], loader: [{
286
+ type: Input
287
+ }], filter: [{
288
+ type: Input
289
+ }], predicate$: [{
290
+ type: Input
291
+ }], loading: [{
292
+ type: HostBinding,
293
+ args: [`class.${UIClass.Loading}`]
294
+ }], selectable: [{
295
+ type: Input
296
+ }], selectOnClick: [{
297
+ type: Input
298
+ }], selected: [{
299
+ type: Output
300
+ }], dataListLabel: [{
301
+ type: Input
302
+ }], dataCardsLabel: [{
303
+ type: Input
246
304
  }], templates: [{
247
305
  type: ContentChildren,
248
306
  args: [TemplateReferenceDirective, { read: TemplateReferenceDirective }]
249
307
  }] } });
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBNkYsU0FBUyxFQUFFLGVBQWUsRUFBVyxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBbUUsTUFBTSxlQUFlLENBQUM7QUFDNVAsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwTyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUVyRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7QUFTNUQsTUFBTSxPQUFPLGNB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TUFBTTt1UUE1RmhCLFFBQVE7c0JBRFAsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBS04sUUFBUTtzQkFGUCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLE9BQU87Z0JBSXBCLFVBQVU7c0JBRFQsS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFNTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFRTixJQUFJO3NCQURILEtBQUs7Z0JBSUYsS0FBSztzQkFEUixLQUFLO2dCQXNCTixPQUFPO3NCQUROLEtBQUs7Z0JBb0JOLFNBQVM7c0JBRFIsZUFBZTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudENoZWNrZWQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRG9DaGVjaywgSG9zdEJpbmRpbmcsIEluamVjdCwgSW5wdXQsIEl0ZXJhYmxlRGlmZmVyLCBJdGVyYWJsZURpZmZlcnMsIE9uSW5pdCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBhbGwsIGZpcnN0T3JEZWZhdWx0LCBnZXRDYWxjVmFsdWUsIGhhc0l0ZW1CeSwgaXNEZWZpbmVkLCBNZWRpYUxpbWl0cywgUGFnaW5hdGlvblNlcnZpY2UsIFBvc2l0aW9uLCBSZXNpemVTZXJ2aWNlLCBzb3J0QnlQYXRoLCBTb3J0aW5nRGlyZWN0aW9uLCBTb3J0aW5nU2VydmljZSwgVGVtcGxhdGVSZWZlcmVuY2VEaXJlY3RpdmUsIFdJTkRPVyB9IGZyb20gJ25neC1zZmMtY29tbW9uJztcclxuaW1wb3J0IHsgSVBhZ2luYXRpb25FdmVudCB9IGZyb20gJ25neC1zZmMtY29tbW9uJztcclxuaW1wb3J0IHsgSVNvcnRpbmdFdmVudCB9IGZyb20gJ25neC1zZmMtY29tbW9uJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuL3BhcnRzL2NvbHVtbnMvdGFibGUtY29sdW1uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IElEZWZhdWx0VGFibGVDb2x1bW5Jbm5lck1vZGVsLCBJRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWwgfSBmcm9tICcuL3BhcnRzL2NvbHVtbnMvdGFibGUtY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgQ29sdW1uc1RvZ2dsZVNlcnZpY2UgfSBmcm9tICcuL3BhcnRzL3RvZ2dsZS9zZXJ2aWNlL2NvbHVtbnMtdG9nZ2xlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJVGFibGVTZWxlY3RFdmVudCB9IGZyb20gJy4vc2VydmljZS9zZWxlY3QvdGFibGUtc2VsZWN0LmV2ZW50JztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL3NlbGVjdC90YWJsZS1zZWxlY3Quc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVR5cGUgfSBmcm9tICcuL2VudW1zL3RhYmxlLWRhdGEtdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgSVRhYmxlUGFnaW5hdGlvbk1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvdGFibGUtcGFnaW5hdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFRhYmxlQ29uc3RhbnRzIH0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBUYWJsZVRlbXBsYXRlIH0gZnJvbSAnLi9lbnVtcy90YWJsZS10ZW1wbGF0ZS5lbnVtJztcclxuaW1wb3J0IHsgSVRhYmxlRGF0YU1vZGVsLCBJVGFibGVNb2RlbCB9IGZyb20gJy4vbW9kZWxzL3RhYmxlLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ZjLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbUGFnaW5hdGlvblNlcnZpY2UsIFNvcnRpbmdTZXJ2aWNlLCBUYWJsZVNlbGVjdFNlcnZpY2UsIENvbHVtbnNUb2dnbGVTZXJ2aWNlLCBSZXNpemVTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIEFmdGVyVmlld0NoZWNrZWQsIERvQ2hlY2sge1xyXG5cclxuICBUYWJsZURhdGFUeXBlID0gVGFibGVEYXRhVHlwZTtcclxuICBUYWJsZUNvbHVtblR5cGUgPSBUYWJsZUNvbHVtblR5cGU7XHJcbiAgVGFibGVUZW1wbGF0ZSA9IFRhYmxlVGVtcGxhdGU7XHJcbiAgQ29uc3RhbnRzID0gVGFibGVDb25zdGFudHM7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcG9zaXRpb246IFBvc2l0aW9uID0gUG9zaXRpb24uQ2VudGVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRlbGltZXRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGRhdGFUeXBlOiBUYWJsZURhdGFUeXBlID0gVGFibGVEYXRhVHlwZS5Sb3dzO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRhdGFUb2dnbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNob3dDb2x1bW5zOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwYWdpbmF0aW9uOiBJVGFibGVQYWdpbmF0aW9uTW9kZWwgPSB7IGVuYWJsZWQ6IHRydWUsIHBhZ2U6IFRhYmxlQ29uc3RhbnRzLkRFRkFVTFRfUEFHRSwgc2l6ZTogVGFibGVDb25zdGFudHMuREVGQVVMVF9QQUdFX1NJWkUgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXF1ZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdE9uQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gVGVtcGxhdGUgcmVmZXJlbmNlcyBcclxuXHJcbiAgQElucHV0KClcclxuICBjb2x1bW5Db250ZW50PzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICByb3dDb250ZW50PzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICBjYXJkQ29udGVudD86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8vIEVuZCBUZW1wbGF0ZSByZWZlcmVuY2VzXHJcblxyXG4gIC8vRGF0YVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGRhdGE6IElUYWJsZURhdGFNb2RlbFtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRhdGEkKHZhbHVlOiBPYnNlcnZhYmxlPElUYWJsZURhdGFNb2RlbFtdPikge1xyXG4gICAgdGhpcy5fZGF0YSQgPSB2YWx1ZTtcclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuaW5pdCh0aGlzLl9kYXRhJCwgdGhpcy5wYWdpbmF0aW9uLnBhZ2UsIHRoaXMucGFnaW5hdGlvbi5zaXplKTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRhJCgpOiBPYnNlcnZhYmxlPElUYWJsZURhdGFNb2RlbFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YSQ7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2RhdGEkITogT2JzZXJ2YWJsZTxJVGFibGVEYXRhTW9kZWxbXT5cclxuXHJcbiAgcHJpdmF0ZSBkYXRhRGlmZmVyITogSXRlcmFibGVEaWZmZXI8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBkYXRhU3ViamVjdCE6IEJlaGF2aW9yU3ViamVjdDxJVGFibGVEYXRhTW9kZWxbXT47XHJcblxyXG4gIHByaXZhdGUgZGF0YVZhbHVlJCE6IE9ic2VydmFibGU8SVRhYmxlTW9kZWxbXT47XHJcblxyXG4gIC8vIEVuZCBEYXRhXHJcblxyXG4gIC8vIENvbHVtbnNcclxuXHJcbiAgQElucHV0KClcclxuICBjb2x1bW5zOiBJRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWxbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGNvbHVtbnNEaWZmZXIhOiBJdGVyYWJsZURpZmZlcjxJRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWw+O1xyXG5cclxuICBwcml2YXRlIGNvbHVtbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SURlZmF1bHRUYWJsZUNvbHVtbk1vZGVsW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWxbXT4odGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgcHJpdmF0ZSBjb2x1bW5zJCE6IE9ic2VydmFibGU8SURlZmF1bHRUYWJsZUNvbHVtbklubmVyTW9kZWxbXT47XHJcblxyXG4gIHByaXZhdGUgY29sdW1uc1NvcnRpbmckITogT2JzZXJ2YWJsZTxJRGVmYXVsdFRhYmxlQ29sdW1uSW5uZXJNb2RlbFtdPjtcclxuXHJcbiAgcHJpdmF0ZSBjb2x1bW5XaWR0aCQhOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcblxyXG4gIC8vIEVuZCBDb2x1bW5zICBcclxuXHJcbiAgcHVibGljIGFsbFJvd3NTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgdm0kITogT2JzZXJ2YWJsZTxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmZXJlbmNlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmZXJlbmNlRGlyZWN0aXZlIH0pXHJcbiAgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWZlcmVuY2VEaXJlY3RpdmU+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoV0lORE9XKSBwcml2YXRlIHdpbmRvdzogV2luZG93LFxyXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlbGVjdGVkU2VydmljZTogVGFibGVTZWxlY3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzb3J0aW5nU2VydmljZTogU29ydGluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcmVzaXplU2VydmljZTogUmVzaXplU2VydmljZSxcclxuICAgIHByaXZhdGUgY29sdW1uc1RvZ2dsZVNlcnZpY2U6IENvbHVtbnNUb2dnbGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xyXG4gICAgdGhpcy5kYXRhRGlmZmVyID0gaXRlcmFibGVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZTxJdGVyYWJsZURpZmZlcjxJVGFibGVEYXRhTW9kZWw+Pih1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5jb2x1bW5zRGlmZmVyID0gaXRlcmFibGVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZTxJRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWw+KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGlmIGRhdGEgaXMgc3RhdGljLCBtYWtlIGl0IG9ic2VydmFibGVcclxuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuZGF0YSQpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuZGF0YSk7XHJcbiAgICAgIHRoaXMuZGF0YSQgPSB0aGlzLmRhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNldCB1cCBkYXRhIG1vZGVscyB3aXRoIGluZGV4ZXNcclxuICAgIGNvbnN0IGRhdGFJbmRleGVkJDogT2JzZXJ2YWJsZTxJVGFibGVNb2RlbFtdPiA9IHRoaXMuZGF0YSQucGlwZShtYXAoKGRhdGEpID0+IGRhdGEubWFwKChkYXRhTW9kZWwsIGluZGV4KSA9PiB7IHJldHVybiB7IGluZGV4LCBkYXRhTW9kZWwgfSB9KSkpLFxyXG4gICAgICAvLyBzZXQgdXAgc29ydGluZyBvYnNlcnZhYmxlXHJcbiAgICAgIHNvcnRpbmckOiBPYnNlcnZhYmxlPElTb3J0aW5nRXZlbnQgfCBudWxsPiA9IHRoaXMuZ2V0U29ydGluZ09ic2VydmFibGUoKSxcclxuICAgICAgLy8gc2V0IHVwIHNlbGVjdGlvbiBvYnNlcnZhYmxlXHJcbiAgICAgIHNlbGVjdGlvbiQ6IE9ic2VydmFibGU8SVRhYmxlU2VsZWN0RXZlbnQgfCBudWxsPiA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlbGVjdCQucGlwZShcclxuICAgICAgICBzdGFydFdpdGgobnVsbClcclxuICAgICAgKTtcclxuXHJcbiAgICAvLyBzZXQgdXAgY29sdW1ucyAoY29uZGl0aW9uYWxseSBhZGQgc2VxdWVuY2Ugb3Igc2VsZWN0YWJsZSBjb2x1bW5zKVxyXG4gICAgdGhpcy5jb2x1bW5zJCA9IHRoaXMuY29sdW1uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcclxuICAgICAgbWFwKGNvbHVtbnMgPT4ge1xyXG4gICAgICAgIGxldCB0YWJsZUNvbHVtbnMgPSBjb2x1bW5zLnNsaWNlKDApO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZSlcclxuICAgICAgICAgIHRhYmxlQ29sdW1ucy51bnNoaWZ0KFRhYmxlQ29uc3RhbnRzLlNFUVVFTkNFX0NPTFVNTik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpXHJcbiAgICAgICAgICB0YWJsZUNvbHVtbnMudW5zaGlmdChUYWJsZUNvbnN0YW50cy5TRUxFQ1RBQkxFX0NPTFVNTik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmV4cGFuZGVkKVxyXG4gICAgICAgICAgdGFibGVDb2x1bW5zLnB1c2goVGFibGVDb25zdGFudHMuRVhQQU5ERURfQ09MVU1OKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRhYmxlQ29sdW1ucztcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5jb2x1bW5zU29ydGluZyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmNvbHVtbnMkLCBzb3J0aW5nJF0pLnBpcGUoXHJcbiAgICAgIG1hcCgoW2NvbHVtbnMsIGV2ZW50XSkgPT4ge1xyXG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgaWYgKGNvbHVtbi5zb3J0aW5nPy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbi5zb3J0aW5nLmFjdGl2ZSA9IGNvbHVtbi5maWVsZCA9PSBldmVudD8uaWQgfHwgZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbHVtbi5zb3J0aW5nLmFjdGl2ZSlcclxuICAgICAgICAgICAgICBjb2x1bW4uc29ydGluZy5kaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLkFzY2VuZGluZztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHNldCB1cCBtYWluIGRhdGEgb2JzZXJ2YWJsZVxyXG4gICAgdGhpcy5kYXRhVmFsdWUkID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgIGRhdGFJbmRleGVkJCxcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5wYWdpbmF0aW9uJCxcclxuICAgICAgc29ydGluZyQsXHJcbiAgICAgIHNlbGVjdGlvbiRcclxuICAgIF0pLnBpcGUoXHJcbiAgICAgIG1hcCgoW2RhdGEsIHBhZ2luYXRpb25FdmVudCwgc29ydGluZ0V2ZW50LCBzZWxlY3Rpb25FdmVudF0pID0+IHtcclxuICAgICAgICAvLyBoYW5kbGUgc2VsZWN0aW9uXHJcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25FdmVudChkYXRhLCBzZWxlY3Rpb25FdmVudCk7XHJcblxyXG4gICAgICAgIC8vIGhhbmRsZSBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nXHJcbiAgICAgICAgbGV0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKGRhdGEsIHNvcnRpbmdFdmVudCksXHJcbiAgICAgICAgICBwYWdpbmF0ZWREYXRhID0gdGhpcy5wYWdpbmF0ZURhdGEoc29ydGVkRGF0YSwgcGFnaW5hdGlvbkV2ZW50KTtcclxuXHJcbiAgICAgICAgLy8gaGFuZGxlIGRhdGEgc2VxdWVuY2UgIFxyXG4gICAgICAgIGlmICh0aGlzLnNlcXVlbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVJvd1NlcXVlbmNlVmFsdWVzKHBhZ2luYXRpb25FdmVudC5wYWdlLCBwYWdpbmF0ZWREYXRhKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhZ2luYXRlZERhdGE7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgLy8gY29tYmluZSBhbGwgb2JzZXJ2YWJsZSB0byB2aWV3IG1vZGVsXHJcbiAgICB0aGlzLnZtJCA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgICB0aGlzLmNvbHVtbnNTb3J0aW5nJCxcclxuICAgICAgdGhpcy5kYXRhVmFsdWUkLFxyXG4gICAgICB0aGlzLmNvbHVtbnNUb2dnbGVTZXJ2aWNlLnNob3dDb2x1bW5zJCxcclxuICAgICAgdGhpcy5jb2x1bW5XaWR0aCRcclxuICAgIF0pLnBpcGUoXHJcbiAgICAgIG1hcCgoW2NvbHVtbnMsIGRhdGEsIHNob3dDb2x1bW5zLCBjb2x1bW5XaWR0aF0pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICBjb2x1bW5XaWR0aCxcclxuICAgICAgICAgIHNob3dDb2x1bW5zOiB0aGlzLnNob3dDb2x1bW5zICYmIHNob3dDb2x1bW5zLFxyXG4gICAgICAgICAgY29sdW1uU3R5bGU6IHsgd2lkdGg6IGdldENhbGNWYWx1ZShjb2x1bW5XaWR0aCksIGp1c3RpZnlDb250ZW50OiB0aGlzLnBvc2l0aW9uIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgKSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIGlmICh0aGlzLmRhdGFEaWZmZXIuZGlmZih0aGlzLmRhdGEpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dCh0aGlzLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnNEaWZmZXIuZGlmZih0aGlzLmNvbHVtbnMpKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh0aGlzLmNvbHVtbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbHVtbldpZHRoJCA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgICB0aGlzLnJlc2l6ZVNlcnZpY2Uub25SZXNpemUkLnBpcGUoc3RhcnRXaXRoKHt9KSksXHJcbiAgICAgIHRoaXMuY29sdW1ucyRcclxuICAgIF0pLnBpcGUobWFwKChbXywgY29sdW1uc10pID0+IHRoaXMuZ2V0Q29sdW1uV2lkdGgodGhpcy53aW5kb3cuaW5uZXJXaWR0aCwgY29sdW1ucy5sZW5ndGgpKSk7XHJcbiAgfVxyXG5cclxuICBvbkRhdGFUeXBlVG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGUgPT0gVGFibGVEYXRhVHlwZS5Sb3dzID8gVGFibGVEYXRhVHlwZS5DYXJkcyA6IFRhYmxlRGF0YVR5cGUuUm93cztcclxuICB9XHJcblxyXG4gIHNlbGVjdFJvdyhtb2RlbDogSVRhYmxlU2VsZWN0RXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlbGVjdChtb2RlbC5pbmRleCwgbW9kZWwuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTb3J0aW5nT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPElTb3J0aW5nRXZlbnQgfCBudWxsPiB7XHJcbiAgICBjb25zdCBmaXJzdFNvcnRpbmdDb2x1bW46IElEZWZhdWx0VGFibGVDb2x1bW5Nb2RlbCB8IHVuZGVmaW5lZCA9IGZpcnN0T3JEZWZhdWx0KHRoaXMuY29sdW1ucywgY29sdW1uID0+IGNvbHVtbj8uc29ydGluZz8uZW5hYmxlZCB8fCBmYWxzZSk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0aW5nU2VydmljZS5zb3J0aW5nJC5waXBlKFxyXG4gICAgICBzdGFydFdpdGgoZmlyc3RTb3J0aW5nQ29sdW1uID8geyBpZDogZmlyc3RTb3J0aW5nQ29sdW1uLmZpZWxkLCBkaXJlY3Rpb246IGZpcnN0U29ydGluZ0NvbHVtbi5zb3J0aW5nPy5kaXJlY3Rpb24gfHwgU29ydGluZ0RpcmVjdGlvbi5Bc2NlbmRpbmcgfSA6IG51bGwpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb2x1bW5XaWR0aCh3aW5kb3dXaWR0aDogbnVtYmVyLCBjb2x1bW5zTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKHdpbmRvd1dpZHRoIDw9IE1lZGlhTGltaXRzLk1vYmlsZUxhcmdlKVxyXG4gICAgICByZXR1cm4gMTtcclxuXHJcbiAgICBpZiAod2luZG93V2lkdGggPD0gTWVkaWFMaW1pdHMuVGFibGV0KVxyXG4gICAgICByZXR1cm4gTWF0aC5jZWlsKGNvbHVtbnNMZW5ndGggLyAyKTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uc0xlbmd0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uRXZlbnQoZGF0YTogSVRhYmxlTW9kZWxbXSwgc2VsZWN0aW9uRXZlbnQ6IElUYWJsZVNlbGVjdEV2ZW50IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHNlbGVjdGlvbkV2ZW50ICE9IG51bGwpIHtcclxuICAgICAgaWYgKHNlbGVjdGlvbkV2ZW50LmluZGV4ID09IG51bGwpIHtcclxuICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiBpdGVtLmRhdGFNb2RlbC5zZWxlY3RlZCA9IHNlbGVjdGlvbkV2ZW50LnNlbGVjdGVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uRXZlbnQuaW5kZXggPT09IGl0ZW0uaW5kZXgpIHtcclxuICAgICAgICAgICAgaXRlbS5kYXRhTW9kZWwuc2VsZWN0ZWQgPSBzZWxlY3Rpb25FdmVudC5zZWxlY3RlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gYWxsKGRhdGEsIGl0ZW0gPT4gQm9vbGVhbihpdGVtLmRhdGFNb2RlbC5zZWxlY3RlZCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWdpbmF0ZURhdGEoZGF0YTogSVRhYmxlTW9kZWxbXSwgcGFnaW5hdGlvbkV2ZW50OiBJUGFnaW5hdGlvbkV2ZW50KTogSVRhYmxlTW9kZWxbXSB7XHJcbiAgICBsZXQgcGFnZWREYXRhID0gdGhpcy5wYWdpbmF0aW9uLmVuYWJsZWRcclxuICAgICAgPyBkYXRhLnNsaWNlKChwYWdpbmF0aW9uRXZlbnQucGFnZSAtIDEpICogdGhpcy5wYWdpbmF0aW9uLnNpemUsIHBhZ2luYXRpb25FdmVudC5wYWdlICogdGhpcy5wYWdpbmF0aW9uLnNpemUpXHJcbiAgICAgIDogZGF0YTtcclxuXHJcbiAgICByZXR1cm4gcGFnZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0RGF0YShkYXRhOiBJVGFibGVNb2RlbFtdLCBzb3J0aW5nRXZlbnQ6IElTb3J0aW5nRXZlbnQgfCBudWxsKTogSVRhYmxlTW9kZWxbXSB7XHJcbiAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydGluZ0V2ZW50ICYmIGhhc0l0ZW1CeSh0aGlzLmNvbHVtbnMsIGNvbCA9PiBjb2wuZmllbGQgPT0gc29ydGluZ0V2ZW50LmlkKVxyXG4gICAgICA/IHNvcnRCeVBhdGgoZGF0YSwgYGRhdGFNb2RlbC5kYXRhLiR7c29ydGluZ0V2ZW50LmlkfWAsIHNvcnRpbmdFdmVudC5kaXJlY3Rpb24pXHJcbiAgICAgIDogZGF0YTtcclxuXHJcbiAgICByZXR1cm4gc29ydGVkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUm93U2VxdWVuY2VWYWx1ZXMocGFnZTogbnVtYmVyLCBkYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IGZyb20gPSAocGFnZSAtIDEpICogdGhpcy5wYWdpbmF0aW9uLnNpemU7XHJcbiAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGl0ZW0uc2VxdWVuY2UgPSBmcm9tICsgMTtcclxuICAgICAgZnJvbSsrO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIiAqbmdJZj1cInZtJCB8IGFzeW5jIGFzIHZtXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucy1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucy1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxzZmMtY29sdW1ucy10b2dnbGUgKm5nSWY9XCJzaG93Q29sdW1uc1wiPjwvc2ZjLWNvbHVtbnMtdG9nZ2xlPlxyXG4gICAgICAgICAgICA8c2ZjLXRvZ2dsZS1zd2l0Y2hlciAqbmdJZj1cImRhdGFUb2dnbGVcIiBbYWN0aXZlXT1cImRhdGFUeXBlID09PSBUYWJsZURhdGFUeXBlLkNhcmRzXCJcclxuICAgICAgICAgICAgICAgIFtsZWZ0TW9kZWxdPVwiQ29uc3RhbnRzLlRPR0dMRV9TV0lUQ0hFUl9MRUZUX01PREVMXCIgW3JpZ2h0TW9kZWxdPVwiQ29uc3RhbnRzLlRPR0dMRV9TV0lUQ0hFUl9SSUdIVF9NT0RFTFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EYXRhVHlwZVRvZ2dsZSgpXCI+XHJcbiAgICAgICAgICAgIDwvc2ZjLXRvZ2dsZS1zd2l0Y2hlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInZtLnNob3dDb2x1bW5zXCIgY2xhc3M9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiBbbmdTdHlsZV09XCJ2bS5jb2x1bW5TdHlsZVwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygdm0uY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2ZjLXNlbGVjdGFibGUtdGFibGUtY29sdW1uICpuZ1N3aXRjaENhc2U9XCJUYWJsZUNvbHVtblR5cGUuU2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NmYy1zZWxlY3RhYmxlLXRhYmxlLWNvbHVtbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHNmYy1zb3J0aW5nICpuZ1N3aXRjaERlZmF1bHQgW21vZGVsXT1cImNvbHVtbi5zb3J0aW5nXCIgW2lkXT1cImNvbHVtbi5maWVsZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNmYy10ZW1wbGF0ZS1jb250ZW50IFtyZWZlcmVuY2VDb250ZW50XT1cImNvbHVtbkNvbnRlbnRcIiBbdGVtcGxhdGVzQ29udGVudF09XCJ0ZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlVHlwZV09XCJUYWJsZVRlbXBsYXRlLkNvbHVtblwiIFtkZWZhdWx0Q29udGVudF09XCJkZWZhdWx0Q29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZXh0RGF0YV09XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZmMtdGVtcGxhdGUtY29udGVudD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbHVtbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZmMtZGVmYXVsdC10YWJsZS1jb2x1bW4gW21vZGVsXT1cImNvbHVtblwiPjwvc2ZjLWRlZmF1bHQtdGFibGUtY29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L3NmYy1zb3J0aW5nPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPHNmYy1kZWxpbWV0ZXIgKm5nSWY9XCJkZWxpbWV0ZXJcIj48L3NmYy1kZWxpbWV0ZXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInJvd3MtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHZtLmRhdGFcIj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImRhdGFUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICA8c2ZjLXRlbXBsYXRlLWNvbnRlbnQgKm5nU3dpdGNoQ2FzZT1cIlRhYmxlRGF0YVR5cGUuUm93c1wiIFtyZWZlcmVuY2VDb250ZW50XT1cInJvd0NvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZXNDb250ZW50XT1cInRlbXBsYXRlc1wiIFt0ZW1wbGF0ZVR5cGVdPVwiVGFibGVUZW1wbGF0ZS5Sb3dcIiBbZGVmYXVsdENvbnRlbnRdPVwiZGVmYXVsdFJvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRleHREYXRhXT1cInttb2RlbDogaXRlbSwgY29sdW1uczogdm0uY29sdW1ucywgY29sdW1uV2lkdGg6IHZtLmNvbHVtbldpZHRoLCBwb3NpdGlvbjogcG9zaXRpb259XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NmYy10ZW1wbGF0ZS1jb250ZW50PlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvdz5cclxuICAgICAgICAgICAgICAgICAgICA8c2ZjLWRlZmF1bHQtdGFibGUtcm93IFtjb2x1bW5zXT1cInZtLmNvbHVtbnNcIiBbbW9kZWxdPVwiaXRlbVwiIFtwb3NpdGlvbl09XCJwb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5XaWR0aF09XCJ2bS5jb2x1bW5XaWR0aFwiIFtzZWxlY3RPbkNsaWNrXT1cInNlbGVjdE9uQ2xpY2tcIiAoc2VsZWN0ZWQpPVwic2VsZWN0Um93KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NmYy1kZWZhdWx0LXRhYmxlLXJvdz5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPHNmYy10ZW1wbGF0ZS1jb250ZW50ICpuZ1N3aXRjaENhc2U9XCJUYWJsZURhdGFUeXBlLkNhcmRzXCIgW3JlZmVyZW5jZUNvbnRlbnRdPVwiY2FyZENvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZXNDb250ZW50XT1cInRlbXBsYXRlc1wiIFt0ZW1wbGF0ZVR5cGVdPVwiVGFibGVUZW1wbGF0ZS5DYXJkXCIgW2RlZmF1bHRDb250ZW50XT1cImRlZmF1bHRDYXJkXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29udGV4dERhdGFdPVwie21vZGVsOiBpdGVtLCBjb2x1bW5zOiB2bS5jb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9zZmMtdGVtcGxhdGUtY29udGVudD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDYXJkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZmMtZGVmYXVsdC10YWJsZS1jYXJkIFtjb2x1bW5zXT1cInZtLmNvbHVtbnNcIiBbbW9kZWxdPVwiaXRlbVwiIFtzZWxlY3RPbkNsaWNrXT1cInNlbGVjdE9uQ2xpY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0Um93KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NmYy1kZWZhdWx0LXRhYmxlLWNhcmQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxzZmMtcGFnaW5hdGlvbiAqbmdJZj1cInBhZ2luYXRpb24uZW5hYmxlZFwiIFtsaW1pdHNdPVwiZmFsc2VcIiBbZnVsbF09XCJmYWxzZVwiIFtkYXRhJF09XCJkYXRhJFwiPjwvc2ZjLXBhZ2luYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDcUQsU0FBUyxFQUFFLGVBQWUsRUFDM0UsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUN6QyxNQUFNLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQzdELFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFDMUYsV0FBVyxFQUFFLGlCQUFpQixFQUFrQixxQkFBcUIsRUFDeEIsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBb0UsT0FBTyxFQUNuRyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0s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QUFVO3NCQURULEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQU1OLGFBQWE7c0JBRFosS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQVFOLElBQUk7c0JBREgsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBWU4sT0FBTztzQkFETixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFjTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sTUFBTTtzQkFETCxLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBY0MsT0FBTztzQkFEYixXQUFXO3VCQUFDLFNBQVMsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFRdkMsVUFBVTtzQkFEVCxLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFJTixRQUFRO3NCQURQLE1BQU07Z0JBa0JQLGFBQWE7c0JBRFosS0FBSztnQkFJTixjQUFjO3NCQURiLEtBQUs7Z0JBNkJOLFNBQVM7c0JBRFIsZUFBZTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLFxyXG4gIERvQ2hlY2ssIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIEluamVjdCwgSW5wdXQsIEl0ZXJhYmxlRGlmZmVyLCBJdGVyYWJsZURpZmZlcnMsIE9uRGVzdHJveSxcclxuICBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGFsbCwgZmlyc3RPckRlZmF1bHQsIGdldENhbGNWYWx1ZSwgZ2V0Q3NzTGlrZVZhbHVlLCBpc0RlZmluZWQsXHJcbiAgTWVkaWFMaW1pdHMsIFBvc2l0aW9uLCBSZXNpemVTZXJ2aWNlLCBTb3J0aW5nRGlyZWN0aW9uLCBUZW1wbGF0ZVJlZmVyZW5jZURpcmVjdGl2ZSwgV0lORE9XLFxyXG4gIFVJQ29uc3RhbnRzLCBMb2FkQ29udGFpbmVyVHlwZSwgTG9hZGVyRnVuY3Rpb24sIExvYWRDb250YWluZXJMb2FkVHlwZSwgSUxvYWRDb250YWluZXJNb2RlbCxcclxuICBJTG9hZENvbnRhaW5lclJlc3VsdE1vZGVsLCBJUGFnaW5hdGlvbk1vZGVsLCBQYWdpbmF0aW9uQ29uc3RhbnRzLCBnZW5lcmF0ZUd1aWQsIGFueSxcclxuICBoYXNJdGVtLCBTb3J0aW5nU2VydmljZSwgSVNvcnRpbmdNb2RlbCwgSUxvYWRDb250YWluZXJQcmVkaWNhdGVQYXJhbWV0ZXJzLCBGaWx0ZXJGdW5jdGlvbiwgVUlDbGFzcywgSVRvZ2dsZVN3aXRjaGVyTW9kZWxcclxufSBmcm9tICduZ3gtc2ZjLWNvbW1vbic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuL3BhcnRzL2NvbHVtbnMvdGFibGUtY29sdW1uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IElUYWJsZUNvbHVtbkV4dGVuZGVkTW9kZWwsIElUYWJsZUNvbHVtbk1vZGVsIH0gZnJvbSAnLi9wYXJ0cy9jb2x1bW5zL3RhYmxlLWNvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IENvbHVtbnNUb2dnbGVTZXJ2aWNlIH0gZnJvbSAnLi9wYXJ0cy90b2dnbGUvc2VydmljZS9jb2x1bW5zLXRvZ2dsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSVRhYmxlU2VsZWN0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2Uvc2VsZWN0L3RhYmxlLXNlbGVjdC5ldmVudCc7XHJcbmltcG9ydCB7IFRhYmxlU2VsZWN0U2VydmljZSB9IGZyb20gJy4vc2VydmljZS9zZWxlY3QvdGFibGUtc2VsZWN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUYWJsZURhdGFUeXBlIH0gZnJvbSAnLi9lbnVtcy90YWJsZS1kYXRhLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFRhYmxlQ29uc3RhbnRzIH0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBUYWJsZVRlbXBsYXRlIH0gZnJvbSAnLi9lbnVtcy90YWJsZS10ZW1wbGF0ZS5lbnVtJztcclxuaW1wb3J0IHsgSVRhYmxlTW9kZWwgfSBmcm9tICcuL21vZGVscy90YWJsZS5tb2RlbCc7XHJcbmltcG9ydCB7IGZhVGFibGVMaXN0LCBmYUJvcmRlckFsbCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NmYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1NvcnRpbmdTZXJ2aWNlLCBUYWJsZVNlbGVjdFNlcnZpY2UsIENvbHVtbnNUb2dnbGVTZXJ2aWNlLCBSZXNpemVTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIEFmdGVyVmlld0NoZWNrZWQsIERvQ2hlY2ssIE9uRGVzdHJveSB7XHJcblxyXG4gIFRhYmxlRGF0YVR5cGUgPSBUYWJsZURhdGFUeXBlO1xyXG4gIFRhYmxlQ29sdW1uVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcclxuICBUYWJsZVRlbXBsYXRlID0gVGFibGVUZW1wbGF0ZTtcclxuICBDb25zdGFudHMgPSBUYWJsZUNvbnN0YW50cztcclxuICBMb2FkQ29udGFpbmVyVHlwZSA9IExvYWRDb250YWluZXJUeXBlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHBvc2l0aW9uOiBQb3NpdGlvbiA9IFBvc2l0aW9uLkNlbnRlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBkZWxpbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcclxuICBkYXRhVHlwZTogVGFibGVEYXRhVHlwZSA9IFRhYmxlRGF0YVR5cGUuUm93cztcclxuXHJcbiAgQElucHV0KClcclxuICBkYXRhVG9nZ2xlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzaG93Q29sdW1uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uc1RvZ2dsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHBhZ2luYXRpb246IElQYWdpbmF0aW9uTW9kZWwgPSBQYWdpbmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfUEFHSU5BVElPTjtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXF1ZW5jZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgbm90Rm91bmRMYWJlbDogc3RyaW5nID0gdGhpcy5Db25zdGFudHMuTk9UX0ZPVU5EX0xBQkVMX0RFRkFVTFQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2hvd1RvdGFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdG90YWxMYWJlbDogc3RyaW5nID0gdGhpcy5Db25zdGFudHMuVE9UQUxfTEFCRUxfREVGQVVMVDtcclxuXHJcbiAgQElucHV0KClcclxuICBwYWdpbmF0aW9uQ291bnQ6IG51bWJlciA9IFBhZ2luYXRpb25Db25zdGFudHMuREVGQVVMVF9DT1VOVDtcclxuXHJcbiAgQElucHV0KClcclxuICBwYWdpbmF0aW9uTGltaXRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2hvd0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyBUZW1wbGF0ZSByZWZlcmVuY2VzIFxyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbkNvbnRlbnQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHJvd0NvbnRlbnQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNhcmRDb250ZW50PzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLy8gRW5kIFRlbXBsYXRlIHJlZmVyZW5jZXNcclxuXHJcbiAgLy9EYXRhXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZGF0YTogYW55W10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBkYXRhJCE6IE9ic2VydmFibGU8YW55W10+O1xyXG5cclxuICBwcml2YXRlIGRhdGFEaWZmZXIhOiBJdGVyYWJsZURpZmZlcjxhbnk+O1xyXG5cclxuICBwcml2YXRlIGRhdGFTdWJqZWN0ITogQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcclxuXHJcbiAgLy8gRW5kIERhdGFcclxuXHJcbiAgLy8gQ29sdW1uc1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbnM6IElUYWJsZUNvbHVtbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBzaG93Q29sdW1uc0xhYmVsITogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhpZGVDb2x1bW5zTGFiZWwhOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcmVzaXplOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBjb2x1bW5zRGlmZmVyITogSXRlcmFibGVEaWZmZXI8SVRhYmxlQ29sdW1uTW9kZWw+O1xyXG5cclxuICBwcml2YXRlIGNvbHVtbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8SVRhYmxlQ29sdW1uTW9kZWxbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElUYWJsZUNvbHVtbk1vZGVsW10+KHRoaXMuY29sdW1ucyk7XHJcblxyXG4gIHB1YmxpYyB0YWJsZUNvbHVtbnM6IElUYWJsZUNvbHVtbkV4dGVuZGVkTW9kZWxbXSA9IFtdO1xyXG5cclxuICAvLyBFbmQgQ29sdW1ucyAgXHJcblxyXG4gIC8vIExvYWQgY29udGFpbmVyXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgbG9hZFR5cGU6IExvYWRDb250YWluZXJMb2FkVHlwZSA9IExvYWRDb250YWluZXJMb2FkVHlwZS5QYWdpbmF0aW9uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGxvYWRlciE6IExvYWRlckZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGZpbHRlcj86IEZpbHRlckZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHByZWRpY2F0ZSQhOiBPYnNlcnZhYmxlPElMb2FkQ29udGFpbmVyUHJlZGljYXRlUGFyYW1ldGVycyB8IG51bGw+O1xyXG5cclxuICBwdWJsaWMgbG9hZE1vZGVsITogSUxvYWRDb250YWluZXJNb2RlbDtcclxuXHJcbiAgcHVibGljIGxvYWRDb250YWluZXJJZDogc3RyaW5nID0gZ2VuZXJhdGVHdWlkKCk7XHJcblxyXG4gIHB1YmxpYyBpdGVtczogSVRhYmxlTW9kZWxbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgdG90YWw6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgcGFnZTogbnVtYmVyID0gUGFnaW5hdGlvbkNvbnN0YW50cy5ERUZBVUxUX1BBR0U7XHJcblxyXG4gIEBIb3N0QmluZGluZyhgY2xhc3MuJHtVSUNsYXNzLkxvYWRpbmd9YClcclxuICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBFbmQgTG9hZCBjb250YWluZXJcclxuXHJcbiAgLy8gU2VsZWN0aW9uXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdE9uQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxJVGFibGVTZWxlY3RFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZVNlbGVjdEV2ZW50PigpO1xyXG5cclxuICBwdWJsaWMgZ2V0IGFsbFJvd3NTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5hbGxTZWxlY3RlZCB8fCB0aGlzLnRvdGFsID09IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlbGVjdGVkSXRlbXMubGVuZ3RoKVxyXG4gICAgICAmJiAhYW55KHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnVuc2VsZWN0ZWRJdGVtcylcclxuICAgICAgJiYgYW55KHRoaXMuaXRlbXMpO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgYWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfYWxsU2VsZWN0aW9uU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvLyBFbmQgU2VsZWN0aW9uXHJcblxyXG4gIC8vIERhdGEgdG9nZ2xlXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZGF0YUxpc3RMYWJlbDogc3RyaW5nID0gdGhpcy5Db25zdGFudHMuREFUQV9MSVNUX0xBQkVMO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRhdGFDYXJkc0xhYmVsOiBzdHJpbmcgPSB0aGlzLkNvbnN0YW50cy5EQVRBX0NBUkRTX0xBQkVMO1xyXG5cclxuICBwdWJsaWMgdG9nZ2xlU3dpdGNoZXJMZWZ0TW9kZWwhOiBJVG9nZ2xlU3dpdGNoZXJNb2RlbDtcclxuXHJcbiAgcHVibGljIHRvZ2dsZVN3aXRjaGVyUmlnaHRNb2RlbCE6IElUb2dnbGVTd2l0Y2hlck1vZGVsO1xyXG5cclxuICAvLyBFbmQgZGF0YSB0b2dnbGVcclxuXHJcbiAgcHVibGljIHZtJCE6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBfY29sdW1uc1Jlc2l6ZVN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBfY29sdW1uc1N1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBfc29ydGluZ1N1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW5pdGlhbFNvcnRpbmcoKTogSVNvcnRpbmdNb2RlbCB8IG51bGwge1xyXG4gICAgY29uc3QgYWN0aXZlU29ydGluZ0NvbHVtbiA9IGZpcnN0T3JEZWZhdWx0KHRoaXMuY29sdW1ucywgY29sdW1uID0+IGNvbHVtbi5zb3J0aW5nPy5hY3RpdmUhKTtcclxuXHJcbiAgICBpZiAoYWN0aXZlU29ydGluZ0NvbHVtbilcclxuICAgICAgcmV0dXJuIHsgaWQ6IGFjdGl2ZVNvcnRpbmdDb2x1bW4uZmllbGQsIGRpcmVjdGlvbjogYWN0aXZlU29ydGluZ0NvbHVtbi5zb3J0aW5nPy5kaXJlY3Rpb24hIH07XHJcblxyXG4gICAgY29uc3QgZW5hYmxlZFNvcnRpbmdDb2x1bW4gPSBmaXJzdE9yRGVmYXVsdCh0aGlzLmNvbHVtbnMsIGNvbHVtbiA9PiBjb2x1bW4uc29ydGluZz8uZW5hYmxlZCEpO1xyXG5cclxuICAgIHJldHVybiBlbmFibGVkU29ydGluZ0NvbHVtbiA/IHsgaWQ6IGVuYWJsZWRTb3J0aW5nQ29sdW1uLmZpZWxkLCBkaXJlY3Rpb246IGVuYWJsZWRTb3J0aW5nQ29sdW1uLnNvcnRpbmc/LmRpcmVjdGlvbiEgfSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmZXJlbmNlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmZXJlbmNlRGlyZWN0aXZlIH0pXHJcbiAgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWZlcmVuY2VEaXJlY3RpdmU+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjb2x1bW5zVG9nZ2xlU2VydmljZTogQ29sdW1uc1RvZ2dsZVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFdJTkRPVykgcHJpdmF0ZSB3aW5kb3c6IFdpbmRvdyxcclxuICAgIHByaXZhdGUgc2VsZWN0ZWRTZXJ2aWNlOiBUYWJsZVNlbGVjdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNvcnRpbmdTZXJ2aWNlOiBTb3J0aW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByZXNpemVTZXJ2aWNlOiBSZXNpemVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xyXG4gICAgdGhpcy5kYXRhRGlmZmVyID0gaXRlcmFibGVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZTxJdGVyYWJsZURpZmZlcjxhbnk+Pih1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5jb2x1bW5zRGlmZmVyID0gaXRlcmFibGVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZTxJVGFibGVDb2x1bW5Nb2RlbD4odW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gaWYgZGF0YSBpcyBzdGF0aWMsIG1ha2UgaXQgb2JzZXJ2YWJsZVxyXG4gICAgaWYgKCFpc0RlZmluZWQodGhpcy5kYXRhJCkpIHtcclxuICAgICAgdGhpcy5kYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5kYXRhKTtcclxuICAgICAgdGhpcy5kYXRhJCA9IHRoaXMuZGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0YWJsZSlcclxuICAgICAgdGhpcy5zZWxlY3Rpb25TdWJzY3JpYmUoKTtcclxuXHJcbiAgICAvLyBzZXQgdXAgY29sdW1ucyAoY29uZGl0aW9uYWxseSBhZGQgc2VxdWVuY2UsIHNlbGVjdGFibGUgYW5kIGV4cGFuZCBjb2x1bW5zKVxyXG4gICAgdGhpcy5jb2x1bW5zU3Vic2NyaWJlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVzaXplKVxyXG4gICAgICB0aGlzLnJlc2l6ZVN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuc29ydGluZ1N1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMubG9hZE1vZGVsID0ge1xyXG4gICAgICBwcmVkaWNhdGUkOiB0aGlzLnByZWRpY2F0ZSQsXHJcbiAgICAgIGRhdGEkOiB0aGlzLmRhdGEkLFxyXG4gICAgICBsb2FkZXI6IHRoaXMubG9hZGVyLFxyXG4gICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVyLFxyXG4gICAgICBsb2FkVHlwZTogdGhpcy5sb2FkVHlwZSxcclxuICAgICAgcGFnaW5hdGlvbjogdGhpcy5wYWdpbmF0aW9uLFxyXG4gICAgICBzb3J0aW5nOiB0aGlzLmluaXRpYWxTb3J0aW5nXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudG9nZ2xlU3dpdGNoZXJMZWZ0TW9kZWwgPSB7IGxhYmVsOiB0aGlzLmRhdGFMaXN0TGFiZWwsIGljb246IGZhVGFibGVMaXN0IH07XHJcbiAgICB0aGlzLnRvZ2dsZVN3aXRjaGVyUmlnaHRNb2RlbCA9IHsgbGFiZWw6IHRoaXMuZGF0YUNhcmRzTGFiZWwsIGljb246IGZhQm9yZGVyQWxsIH07XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRhdGFEaWZmZXIuZGlmZih0aGlzLmRhdGEpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dCh0aGlzLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnNEaWZmZXIuZGlmZih0aGlzLmNvbHVtbnMpKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh0aGlzLmNvbHVtbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2FsbFNlbGVjdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX2NvbHVtbnNSZXNpemVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLl9jb2x1bW5zU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fc29ydGluZ1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRhdGFUeXBlVG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGUgPT0gVGFibGVEYXRhVHlwZS5Sb3dzXHJcbiAgICAgID8gVGFibGVEYXRhVHlwZS5DYXJkc1xyXG4gICAgICA6IFRhYmxlRGF0YVR5cGUuUm93cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVTdWNjZXNzKHJlc3VsdDogSUxvYWRDb250YWluZXJSZXN1bHRNb2RlbDxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSByZXN1bHQucGFnZTtcclxuICAgIHRoaXMudG90YWwgPSByZXN1bHQudG90YWw7XHJcblxyXG4gICAgY29uc3QgaXRlbXM6IElUYWJsZU1vZGVsW10gPSByZXN1bHQuaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBzZXF1ZW5jZSA9IChpbmRleCArIDEpICsgKCh0aGlzLnBhZ2UgKiB0aGlzLnBhZ2luYXRpb24uc2l6ZSkgLSB0aGlzLnBhZ2luYXRpb24uc2l6ZSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgIHNlcXVlbmNlOiBzZXF1ZW5jZSxcclxuICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRJdGVtU2VsZWN0ZWQoc2VxdWVuY2UpLFxyXG4gICAgICAgIGRhdGE6IGl0ZW1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChyZXN1bHQucmVzZXQpXHJcbiAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuY29uY2F0KGl0ZW1zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0aW9uU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsU2VsZWN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VsZWN0JFxyXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogSVRhYmxlU2VsZWN0RXZlbnQpID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQuaW5kZXggPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IGV2ZW50LnNlbGVjdGVkO1xyXG4gICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCA9IGV2ZW50LnNlbGVjdGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNpemVTdWJzY3JpYmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb2x1bW5zUmVzaXplU3Vic2NyaXB0aW9uID0gdGhpcy5yZXNpemVTZXJ2aWNlLm9uUmVzaXplJFxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudGFibGVDb2x1bW5zLmZvckVhY2goY29sdW1uID0+XHJcbiAgICAgICAgY29sdW1uLmNhbGN1bGF0ZWRXaWR0aCA9IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgoY29sdW1uLCB0aGlzLnRhYmxlQ29sdW1ucy5sZW5ndGgpKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbHVtbnNTdWJzY3JpYmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb2x1bW5zU3Vic2NyaXB0aW9uID0gdGhpcy5jb2x1bW5zU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoY29sdW1ucyA9PiBhbnkoY29sdW1ucykpLFxyXG4gICAgICBtYXAoKGNvbHVtbnM6IElUYWJsZUNvbHVtbk1vZGVsW10pID0+IHtcclxuICAgICAgICBsZXQgdGFibGVDb2x1bW5zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb2x1bW5zKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlcXVlbmNlKVxyXG4gICAgICAgICAgdGFibGVDb2x1bW5zLnVuc2hpZnQoVGFibGVDb25zdGFudHMuU0VRVUVOQ0VfQ09MVU1OKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSlcclxuICAgICAgICAgIHRhYmxlQ29sdW1ucy51bnNoaWZ0KFRhYmxlQ29uc3RhbnRzLlNFTEVDVEFCTEVfQ09MVU1OKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpXHJcbiAgICAgICAgICB0YWJsZUNvbHVtbnMucHVzaChUYWJsZUNvbnN0YW50cy5FWFBBTkRFRF9DT0xVTU4pO1xyXG5cclxuICAgICAgICAvLyBjYWxjdWxhdGVkIHdpZHRoIG5vdCB3b3JrIHdpdGhvdXQgZGVlcCBjb3B5XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGFibGVDb2x1bW5zKSk7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgoY29sdW1uczogSVRhYmxlQ29sdW1uRXh0ZW5kZWRNb2RlbFtdKSA9PiB7XHJcbiAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBJVGFibGVDb2x1bW5FeHRlbmRlZE1vZGVsKSA9PiB7XHJcbiAgICAgICAgY29sdW1uLmNhbGN1bGF0ZWRXaWR0aCA9IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgoY29sdW1uLCBjb2x1bW5zLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNvcnRpbmdDb2x1bW4gPSB0aGlzLmluaXRpYWxTb3J0aW5nO1xyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxTb3J0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnNldENvbHVtblNvcnRpbmcoY29sdW1uLCBzb3J0aW5nQ29sdW1uPy5pZCEpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudGFibGVDb2x1bW5zID0gY29sdW1ucztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0aW5nU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc29ydGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMuc29ydGluZ1NlcnZpY2Uuc29ydGluZyQuc3Vic2NyaWJlKChzb3J0aW5nRXZlbnQpID0+XHJcbiAgICAgIHRoaXMudGFibGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbjogSVRhYmxlQ29sdW1uRXh0ZW5kZWRNb2RlbCkgPT4gdGhpcy5zZXRDb2x1bW5Tb3J0aW5nKGNvbHVtbiwgc29ydGluZ0V2ZW50Py5pZCkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgoY29sdW1uOiBJVGFibGVDb2x1bW5FeHRlbmRlZE1vZGVsLCBjb2x1bW5zTGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgLy8gZGVmaW5lZCB3aWR0aCBmb3IgYWxsIGNvbHVtbnNcclxuICAgIGlmIChhbGwodGhpcy5jb2x1bW5zLCBjb2x1bW4gPT4gaXNEZWZpbmVkKGNvbHVtbi53aWR0aCkpKVxyXG4gICAgICByZXR1cm4gZ2V0Q3NzTGlrZVZhbHVlKGNvbHVtbi53aWR0aCEsIFVJQ29uc3RhbnRzLkNTU19QRVJDRU5UQUdFKTtcclxuXHJcbiAgICBsZXQgd2lkdGg6IG51bWJlciA9IGNvbHVtbnNMZW5ndGg7XHJcblxyXG4gICAgaWYgKHRoaXMud2luZG93LmlubmVyV2lkdGggPD0gTWVkaWFMaW1pdHMuTW9iaWxlTGFyZ2UpXHJcbiAgICAgIHdpZHRoID0gMTtcclxuICAgIGVsc2UgaWYgKHRoaXMud2luZG93LmlubmVyV2lkdGggPD0gTWVkaWFMaW1pdHMuVGFibGV0KVxyXG4gICAgICB3aWR0aCA9IE1hdGguY2VpbChjb2x1bW5zTGVuZ3RoIC8gMik7XHJcblxyXG4gICAgcmV0dXJuIGdldENhbGNWYWx1ZSh3aWR0aCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbHVtblNvcnRpbmcoY29sdW1uOiBJVGFibGVDb2x1bW5FeHRlbmRlZE1vZGVsLCBzb3J0aW5nSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGNvbHVtbi5zb3J0aW5nPy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbHVtbi5zb3J0aW5nLmFjdGl2ZSA9IGNvbHVtbi5maWVsZCA9PSBzb3J0aW5nSWQ7XHJcblxyXG4gICAgICBpZiAoIWNvbHVtbi5zb3J0aW5nLmFjdGl2ZSlcclxuICAgICAgICBjb2x1bW4uc29ydGluZy5kaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLkFzY2VuZGluZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXRlbVNlbGVjdGVkKHNlcXVlbmNlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFsbFNlbGVjdGVkXHJcbiAgICAgID8gIWhhc0l0ZW0odGhpcy5zZWxlY3RlZFNlcnZpY2UudW5zZWxlY3RlZEl0ZW1zLCBzZXF1ZW5jZSlcclxuICAgICAgOiBoYXNJdGVtKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlbGVjdGVkSXRlbXMsIHNlcXVlbmNlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dMb2FkaW5nXCIgY2xhc3M9XCJ0YWJsZS1sb2FkZXJcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cclxuICAgICAgICAgICAgICAgIDxzZmMtY29sdW1ucy10b2dnbGUgKm5nSWY9XCJjb2x1bW5zVG9nZ2xlXCIgW3Nob3dMYWJlbF09XCJzaG93Q29sdW1uc0xhYmVsXCIgW2hpZGVMYWJlbF09XCJoaWRlQ29sdW1uc0xhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NmYy1jb2x1bW5zLXRvZ2dsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2hvd1RvdGFsXCI+e3t0b3RhbExhYmVsfX06IDxzcGFuPnt7dG90YWx9fTwvc3Bhbj48L3A+XHJcbiAgICAgICAgICAgICAgICA8c2ZjLXRvZ2dsZS1zd2l0Y2hlciAqbmdJZj1cImRhdGFUb2dnbGVcIiBbYWN0aXZlXT1cImRhdGFUeXBlID09PSBUYWJsZURhdGFUeXBlLkNhcmRzXCJcclxuICAgICAgICAgICAgICAgICAgICBbbGVmdE1vZGVsXT1cInRvZ2dsZVN3aXRjaGVyTGVmdE1vZGVsXCIgW3JpZ2h0TW9kZWxdPVwidG9nZ2xlU3dpdGNoZXJSaWdodE1vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EYXRhVHlwZVRvZ2dsZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NmYy10b2dnbGUtc3dpdGNoZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbHVtbnMgJiYgY29sdW1uc1RvZ2dsZVNlcnZpY2Uuc2hvd1wiIGNsYXNzPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uXCIgW3N0eWxlLmp1c3RpZnlDb250ZW50XT1cInBvc2l0aW9uXCIgW3N0eWxlLm1pbldpZHRoXT1cImNvbHVtbi5jYWxjdWxhdGVkV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0YWJsZUNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNmYy1zZWxlY3RhYmxlLXRhYmxlLWNvbHVtbiAqbmdTd2l0Y2hDYXNlPVwiVGFibGVDb2x1bW5UeXBlLlNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiYWxsUm93c1NlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZmMtc2VsZWN0YWJsZS10YWJsZS1jb2x1bW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzZmMtc29ydGluZy1jb2x1bW4gKm5nU3dpdGNoRGVmYXVsdCBbbW9kZWxdPVwiY29sdW1uLnNvcnRpbmchXCIgW2lkXT1cImNvbHVtbi5maWVsZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNmYy10ZW1wbGF0ZS1jb250ZW50IFtyZWZlcmVuY2VDb250ZW50XT1cImNvbHVtbkNvbnRlbnRcIiBbdGVtcGxhdGVzQ29udGVudF09XCJ0ZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlVHlwZV09XCJUYWJsZVRlbXBsYXRlLkNvbHVtblwiIFtkZWZhdWx0Q29udGVudF09XCJkZWZhdWx0Q29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZXh0RGF0YV09XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZmMtdGVtcGxhdGUtY29udGVudD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbHVtbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZmMtZGVmYXVsdC10YWJsZS1jb2x1bW4gW21vZGVsXT1cImNvbHVtblwiPjwvc2ZjLWRlZmF1bHQtdGFibGUtY29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L3NmYy1zb3J0aW5nLWNvbHVtbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxzZmMtZGVsaW1ldGVyICpuZ0lmPVwiZGVsaW1ldGVyXCIgY2xhc3M9XCJ0YWJsZS1kZWxpbWV0ZXJcIj48L3NmYy1kZWxpbWV0ZXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInJvd3MtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHNmYy1sb2FkLWNvbnRhaW5lciBbaWRdPVwibG9hZENvbnRhaW5lcklkXCIgW3R5cGVdPVwiTG9hZENvbnRhaW5lclR5cGUuVGFibGVcIiBbbW9kZWxdPVwibG9hZE1vZGVsXCJcclxuICAgICAgICAgICAgW3BhZ2luYXRpb25Db3VudF09XCJwYWdpbmF0aW9uQ291bnRcIiBbcGFnaW5hdGlvbkxpbWl0c109XCJwYWdpbmF0aW9uTGltaXRzXCIgW3Nob3dMb2FkaW5nXT1cInNob3dMb2FkaW5nXCJcclxuICAgICAgICAgICAgKGhhbmRsZVN1Y2Nlc3MpPVwiaGFuZGxlU3VjY2VzcygkZXZlbnQpXCIgKGhhbmRsZUxvYWRpbmcpPVwibG9hZGluZyA9ICRldmVudFwiIFtlbXB0eUxhYmVsXT1cIm5vdEZvdW5kTGFiZWxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpO1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZGF0YVR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2ZjLXRlbXBsYXRlLWNvbnRlbnQgKm5nU3dpdGNoQ2FzZT1cIlRhYmxlRGF0YVR5cGUuUm93c1wiIFtyZWZlcmVuY2VDb250ZW50XT1cInJvd0NvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVzQ29udGVudF09XCJ0ZW1wbGF0ZXNcIiBbdGVtcGxhdGVUeXBlXT1cIlRhYmxlVGVtcGxhdGUuUm93XCIgW2RlZmF1bHRDb250ZW50XT1cImRlZmF1bHRSb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGV4dERhdGFdPVwie21vZGVsOiBpdGVtLCBjb2x1bW5zOiB0YWJsZUNvbHVtbnMsIHBvc2l0aW9uOiBwb3NpdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NmYy10ZW1wbGF0ZS1jb250ZW50PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZmMtZGVmYXVsdC10YWJsZS1yb3cgW2NvbHVtbnNdPVwidGFibGVDb2x1bW5zXCIgW21vZGVsXT1cIml0ZW1cIiBbcG9zaXRpb25dPVwicG9zaXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdE9uQ2xpY2tdPVwic2VsZWN0T25DbGlja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NmYy1kZWZhdWx0LXRhYmxlLXJvdz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8c2ZjLXRlbXBsYXRlLWNvbnRlbnQgKm5nU3dpdGNoQ2FzZT1cIlRhYmxlRGF0YVR5cGUuQ2FyZHNcIiBbcmVmZXJlbmNlQ29udGVudF09XCJjYXJkQ29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZXNDb250ZW50XT1cInRlbXBsYXRlc1wiIFt0ZW1wbGF0ZVR5cGVdPVwiVGFibGVUZW1wbGF0ZS5DYXJkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRDb250ZW50XT1cImRlZmF1bHRDYXJkXCIgW2NvbnRleHREYXRhXT1cInttb2RlbDogaXRlbSwgY29sdW1uczogdGFibGVDb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2ZjLXRlbXBsYXRlLWNvbnRlbnQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENhcmQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZmMtZGVmYXVsdC10YWJsZS1jYXJkIFtjb2x1bW5zXT1cInRhYmxlQ29sdW1uc1wiIFttb2RlbF09XCJpdGVtXCIgW3NlbGVjdE9uQ2xpY2tdPVwic2VsZWN0T25DbGlja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NmYy1kZWZhdWx0LXRhYmxlLWNhcmQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9zZmMtbG9hZC1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19