@one-paragon/angular-utilities 1.2.9-beta.1 → 1.2.10

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 (122) hide show
  1. package/README.md +24 -24
  2. package/action-state/ngrx.d.ts +1 -1
  3. package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +3 -3
  4. package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +1 -1
  5. package/esm2022/action-state/index.mjs +1 -1
  6. package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +1 -1
  7. package/esm2022/action-state/ngrx.mjs +1 -1
  8. package/esm2022/http-request-state/directives/index.mjs +1 -1
  9. package/esm2022/http-request-state/index.mjs +1 -1
  10. package/esm2022/http-request-state/rxjs/getRequestorBody.mjs +1 -1
  11. package/esm2022/http-request-state/rxjs/getRequestorState.mjs +1 -1
  12. package/esm2022/http-request-state/rxjs/index.mjs +1 -1
  13. package/esm2022/ngrx/actionable-selector.mjs +1 -1
  14. package/esm2022/public-api.mjs +1 -1
  15. package/esm2022/rxjs/defaultShareReplay.mjs +1 -1
  16. package/esm2022/rxjs/index.mjs +1 -1
  17. package/esm2022/rxjs/mapError.mjs +1 -1
  18. package/esm2022/rxjs/rxjs-operators.mjs +1 -1
  19. package/esm2022/rxjs/subjectifier.mjs +1 -1
  20. package/esm2022/rxjs/subscriber.directive.mjs +1 -1
  21. package/esm2022/table-builder/classes/DefaultSettings.mjs +1 -1
  22. package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +1 -1
  23. package/esm2022/table-builder/classes/TableBuilderConfig.mjs +1 -1
  24. package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +12 -18
  25. package/esm2022/table-builder/classes/TableState.mjs +3 -5
  26. package/esm2022/table-builder/classes/display-col.mjs +1 -1
  27. package/esm2022/table-builder/classes/filter-info.mjs +1 -1
  28. package/esm2022/table-builder/classes/table-builder-general-settings.mjs +4 -11
  29. package/esm2022/table-builder/classes/table-builder.mjs +3 -3
  30. package/esm2022/table-builder/classes/table-store.mjs +46 -71
  31. package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +4 -4
  32. package/esm2022/table-builder/components/column-builder/column-helpers.mjs +1 -1
  33. package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +3 -3
  34. package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +3 -3
  35. package/esm2022/table-builder/components/filter/filter.component.mjs +3 -3
  36. package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +19 -19
  37. package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +3 -3
  38. package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +61 -94
  39. package/esm2022/table-builder/components/generic-table/paginator.component.mjs +28 -30
  40. package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +3 -3
  41. package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +3 -3
  42. package/esm2022/table-builder/components/index.mjs +1 -1
  43. package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +3 -3
  44. package/esm2022/table-builder/components/link-column.component.mjs +31 -31
  45. package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +3 -3
  46. package/esm2022/table-builder/components/profiles-menu/profiles-menu.component.mjs +3 -3
  47. package/esm2022/table-builder/components/scroll-strategy.mjs +1 -1
  48. package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +2 -4
  49. package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +3 -3
  50. package/esm2022/table-builder/components/table-container/table-container-imports.mjs +1 -1
  51. package/esm2022/table-builder/components/table-container/table-container.helpers/data-state.helpers.mjs +1 -1
  52. package/esm2022/table-builder/components/table-container/table-container.helpers/filter-state.helpers.mjs +1 -1
  53. package/esm2022/table-builder/components/table-container/table-container.helpers/groupBy.helpers.mjs +1 -1
  54. package/esm2022/table-builder/components/table-container/table-container.helpers/sort-state.helpers.mjs +1 -1
  55. package/esm2022/table-builder/components/table-container/table-container.mjs +31 -42
  56. package/esm2022/table-builder/components/table-container/tableProps.mjs +2 -1
  57. package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +15 -17
  58. package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +6 -5
  59. package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +11 -9
  60. package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +1 -1
  61. package/esm2022/table-builder/directives/custom-cell-directive.mjs +13 -12
  62. package/esm2022/table-builder/directives/index.mjs +1 -1
  63. package/esm2022/table-builder/directives/multi-sort.directive.mjs +1 -1
  64. package/esm2022/table-builder/directives/resize-column.directive.mjs +1 -1
  65. package/esm2022/table-builder/directives/table-wrapper.directive.mjs +1 -1
  66. package/esm2022/table-builder/directives/tb-filter.directive.mjs +1 -1
  67. package/esm2022/table-builder/enums/filterTypes.mjs +1 -1
  68. package/esm2022/table-builder/functions/boolean-filter-function.mjs +1 -1
  69. package/esm2022/table-builder/functions/date-filter-function.mjs +1 -1
  70. package/esm2022/table-builder/functions/download-data.mjs +1 -1
  71. package/esm2022/table-builder/functions/null-filter-function.mjs +1 -1
  72. package/esm2022/table-builder/functions/number-filter-function.mjs +1 -1
  73. package/esm2022/table-builder/functions/sort-data-function.mjs +1 -1
  74. package/esm2022/table-builder/functions/string-filter-function.mjs +1 -1
  75. package/esm2022/table-builder/interfaces/ColumnInfo.mjs +1 -1
  76. package/esm2022/table-builder/interfaces/report-def.mjs +1 -1
  77. package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +1 -1
  78. package/esm2022/table-builder/pipes/column-total.pipe.mjs +1 -1
  79. package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +1 -1
  80. package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +1 -1
  81. package/esm2022/table-builder/services/export-to-csv.service.mjs +3 -3
  82. package/esm2022/table-builder/services/link-creator.service.mjs +1 -1
  83. package/esm2022/table-builder/services/table-template-service.mjs +1 -1
  84. package/esm2022/table-builder/services/transform-creator.mjs +1 -1
  85. package/esm2022/table-builder/table-builder.module.mjs +1 -1
  86. package/esm2022/utilities/array-helpers.mjs +1 -1
  87. package/esm2022/utilities/directives/auto-focus.directive.mjs +1 -1
  88. package/esm2022/utilities/directives/clickEmitterDirective.mjs +1 -1
  89. package/esm2022/utilities/directives/clickSubject.mjs +1 -1
  90. package/esm2022/utilities/directives/conditional-classes.directive.mjs +1 -1
  91. package/esm2022/utilities/directives/dialog-service.mjs +1 -1
  92. package/esm2022/utilities/directives/dialog.mjs +1 -1
  93. package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +1 -1
  94. package/esm2022/utilities/directives/prevent-enter.directive.mjs +1 -1
  95. package/esm2022/utilities/directives/stop-propagation.directive.mjs +1 -1
  96. package/esm2022/utilities/directives/trim-whitespace.directive.mjs +1 -1
  97. package/esm2022/utilities/index.mjs +1 -1
  98. package/esm2022/utilities/module.mjs +1 -1
  99. package/esm2022/utilities/pipes/function.pipe.mjs +1 -1
  100. package/esm2022/utilities/pipes/phone.pipe.mjs +1 -1
  101. package/esm2022/utilities/pipes/space-case.pipes.mjs +1 -1
  102. package/fesm2022/one-paragon-angular-utilities.mjs +289 -381
  103. package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -1
  104. package/package.json +1 -1
  105. package/table-builder/classes/TableBuilderDataSource.d.ts +3 -2
  106. package/table-builder/classes/TableState.d.ts +4 -14
  107. package/table-builder/classes/table-builder-general-settings.d.ts +2 -4
  108. package/table-builder/classes/table-store.d.ts +28 -16
  109. package/table-builder/components/generic-table/generic-table.component.d.ts +11 -19
  110. package/table-builder/components/generic-table/paginator.component.d.ts +0 -1
  111. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +0 -1
  112. package/table-builder/components/table-container/table-container-imports.d.ts +1 -1
  113. package/table-builder/components/table-container/table-container.d.ts +8 -10
  114. package/table-builder/components/table-container/tableProps.d.ts +1 -0
  115. package/table-builder/components/table-container/virtual-scroll-container.d.ts +0 -1
  116. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +3 -2
  117. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +3 -1
  118. package/table-builder/directives/custom-cell-directive.d.ts +4 -6
  119. package/table-builder/directives/table-wrapper.directive.d.ts +1 -1
  120. package/table-builder/interfaces/ColumnInfo.d.ts +1 -1
  121. package/esm2022/table-builder/classes/data-store.mjs +0 -15
  122. package/table-builder/classes/data-store.d.ts +0 -8
@@ -1,9 +1,9 @@
1
- import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ViewContainerRef, Injector, EventEmitter, computed, inject, input, viewChild, effect, untracked, signal } from '@angular/core';
2
- import { MatFooterRowDef, MatHeaderRowDef, MatTable, MatTableModule } from '@angular/material/table';
1
+ import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ViewContainerRef, Injector, EventEmitter, computed, inject, input } from '@angular/core';
2
+ import { MatTable, MatTableModule } from '@angular/material/table';
3
3
  import { combineLatest } from 'rxjs';
4
4
  import { SelectionModel } from '@angular/cdk/collections';
5
5
  import { TableStore } from '../../classes/table-store';
6
- import { map } from 'rxjs/operators';
6
+ import { map, distinctUntilChanged } from 'rxjs/operators';
7
7
  import { ColumnBuilderComponent } from '../column-builder/column-builder.component';
8
8
  import { FieldType } from '../../interfaces/report-def';
9
9
  import { previousAndCurrent } from '../../../rxjs/rxjs-operators';
@@ -17,7 +17,6 @@ import { MatTooltipModule } from '@angular/material/tooltip';
17
17
  import { TransformCreator } from '../../services/transform-creator';
18
18
  import { initIndexSymbol } from '../table-container/table-container.helpers/sort-state.helpers';
19
19
  import { toObservable } from '@angular/core/rxjs-interop';
20
- import { DataStore } from '../../classes/data-store';
21
20
  import * as i0 from "@angular/core";
22
21
  import * as i1 from "@angular/material/table";
23
22
  import * as i2 from "@angular/cdk/drag-drop";
@@ -26,12 +25,8 @@ import * as i4 from "@angular/material/button";
26
25
  import * as i5 from "@angular/material/icon";
27
26
  export class GenericTableComponent {
28
27
  state = inject(TableStore);
29
- dataStore = inject(DataStore);
30
28
  viewContainer = inject(ViewContainerRef);
31
29
  transformCreator = inject(TransformCreator);
32
- $headerRow = viewChild(MatHeaderRowDef);
33
- $footerRow = viewChild(MatFooterRowDef);
34
- $table = viewChild(MatTable);
35
30
  drop(event) {
36
31
  this.state.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
37
32
  }
@@ -44,103 +39,55 @@ export class GenericTableComponent {
44
39
  this.setUpSelections(trackBy);
45
40
  }
46
41
  get trackBy() { return this._trackBy; }
47
- $displayData = input.required({ alias: 'displayData' });
48
- $displayDataLength = computed(() => this.$displayData()?.length || 0);
49
- $hasFooterMeta = computed(() => this.state.$metaDataArray().some(md => !!md.additional?.footer));
42
+ displayData$;
50
43
  $data = input.required({ alias: 'data' });
51
44
  data$ = toObservable(this.$data);
52
45
  rows;
53
46
  columnBuilders;
54
- $columnInfos = input.required({ alias: 'columnInfos' });
55
- $hasCustomFooter = computed(() => this.$columnInfos()?.some(ci => !!ci.customCell?.columnDef?.footerCell));
47
+ columnInfos;
48
+ table;
56
49
  dropList;
57
- $footerRowStyle = computed(() => {
58
- const hasData = !!this.$displayDataLength();
59
- const metaFooter = this.$hasFooterMeta();
60
- const customFooter = this.$hasCustomFooter();
61
- const hasSelectionColumn = this.state.props().selectionColumn;
62
- return customFooter || (hasData && (metaFooter || hasSelectionColumn)) ? 'regular-footer' : hasData ? 'no-footer' : 'small-footer';
63
- });
64
- $showFooterRow = computed(() => this.$footerRowStyle() !== 'no-footer');
65
50
  currentColumns;
51
+ keys = [];
66
52
  _injector = inject(Injector);
67
53
  injector = Injector.create({
68
54
  providers: [
69
- { provide: MatTable, useFactory: () => this.$table() },
55
+ { provide: MatTable, useFactory: () => this.table },
70
56
  { provide: CdkDropList, useFactory: () => this.dropList },
71
57
  ],
72
58
  parent: this._injector
73
59
  });
74
60
  rowDefArr = [];
75
- $hasSelectColumn = computed(() => this.state.selectSignal(state => state.props.selectionColumn)());
76
- $hasIndexColumn = computed(() => this.state.selectSignal(state => state.props.indexColumn)());
77
- myColumns = signal({});
78
- $showHeader = computed(() => !this.state.tableSettings().hideColumnHeader);
79
- offset$ = this.dataStore.select(s => s.virtualScrollOffset);
61
+ columns = [];
62
+ myColumns = {};
63
+ showHeader$;
64
+ offset$ = this.state.select(s => s.virtualScrollOffset);
80
65
  offsetIndex = 0;
81
66
  dataView;
82
67
  constructor() {
83
68
  this.setUpSelections();
84
- effect(() => {
85
- const columnInfos = this.$columnInfos() || [];
86
- untracked(() => {
87
- Object.entries(this.myColumns()).forEach(([key, value]) => {
88
- const columnInfo = columnInfos.find(ci => ci.metaData.key === key);
89
- if (!columnInfo || columnInfo.customCell !== value.customCell) {
90
- delete this.myColumns()[key];
91
- this.$table()?.removeColumnDef(value.columnDef);
92
- }
93
- });
94
- columnInfos.forEach(ci => this.addMetaData(ci));
95
- });
96
- });
97
- effect(() => {
98
- const headerRow = this.$headerRow();
99
- const showHeader = this.$showHeader();
100
- const table = this.$table();
101
- untracked(() => {
102
- if (headerRow && showHeader && table)
103
- table.addHeaderRowDef(headerRow);
104
- else if (headerRow && table)
105
- table.removeHeaderRowDef(headerRow);
106
- });
107
- });
108
- effect(() => {
109
- const footerRow = this.$footerRow();
110
- const showFooter = this.$showFooterRow();
111
- const table = this.$table();
112
- untracked(() => {
113
- if (footerRow && showFooter && table)
114
- table.addFooterRowDef(footerRow);
115
- else if (footerRow && table)
116
- table.removeFooterRowDef(footerRow);
117
- });
118
- });
119
69
  }
120
70
  defaultTrackBy = (index, item) => item[initIndexSymbol];
121
71
  trackByFunction = this.defaultTrackBy;
122
72
  ngOnChanges(changes) {
123
- if (changes.rows && this.rows && this.myColumns().length) {
73
+ if (changes.rows && this.rows && this.myColumns.length) {
124
74
  this.initializeRowDefs([...this.rows]);
125
75
  }
126
76
  }
127
- $keys = computed(() => {
128
- const displayed = this.state.$orderedVisibleColumns();
129
- const built = this.myColumns();
130
- const keys = displayed.filter(d => !!built[d]);
131
- if (this.$hasSelectColumn()) {
132
- keys.unshift('select');
77
+ ngOnInit() {
78
+ if (this.state.props().selectionColumn) {
79
+ this.columns.push('select');
133
80
  }
134
- if (this.$hasIndexColumn()) {
135
- keys.unshift('index');
81
+ if (this.state.props().indexColumn) {
82
+ this.columns.push('index');
136
83
  }
137
- return keys;
138
- });
139
- keys$ = toObservable(this.$keys);
140
- ngOnInit() {
84
+ this.state.on(this.columnInfos, columns => {
85
+ columns.forEach(ci => this.addMetaData(ci));
86
+ });
141
87
  this.initializeRowDefs([...this.rows]);
142
- this.state.on(this.keys$, keys => {
143
- this.rowDefArr?.forEach(row => row.columns = keys);
88
+ this.state.on(this.state.displayedColumns$, keys => {
89
+ this.keys = [...this.columns, ...keys];
90
+ this.rowDefArr?.forEach(row => row.columns = this.keys);
144
91
  });
145
92
  this.state.on(this.selectableData$, (data) => {
146
93
  if (this.selection.selected.length) {
@@ -149,9 +96,18 @@ export class GenericTableComponent {
149
96
  this.selection.deselect(...removed);
150
97
  }
151
98
  });
99
+ this.showHeader$ = this.state.tableSettings$.pipe(map(settings => !(settings.hideColumnHeader)));
100
+ this.showFooterRow$ = combineLatest([
101
+ this.displayData$.pipe(map(d => !!d.length), distinctUntilChanged()),
102
+ this.state.metaDataArray$.pipe(map(metaData => metaData.some(md => !!md.additional?.footer)), distinctUntilChanged()),
103
+ this.columnInfos.pipe(map(columnInfos => columnInfos.some(ci => !!ci.customCell?.columnDef?.footerCell)), distinctUntilChanged()),
104
+ ]).pipe(map(([hasData, hasFooterDef, hasCustomFooter]) => {
105
+ const hasSelectionColumn = this.state.props().selectionColumn;
106
+ return hasCustomFooter || (hasData && (hasFooterDef || hasSelectionColumn)) ? 'regular-footer' : hasData ? 'no-footer' : 'small-footer';
107
+ }));
152
108
  if (this.state.tableSettings().usePaginator || this.state.tableSettings().useVirtualScroll) {
153
- this.state.on(combineLatest([this.state.state$, this.dataStore.state$]), ([state, data]) => {
154
- this.offsetIndex = data.virtualEnds.start;
109
+ this.state.on(this.state.state$, (state) => {
110
+ this.offsetIndex = state.virtualEnds.start;
155
111
  if (this.state.tableSettings().usePaginator) {
156
112
  this.offsetIndex += (state.pageSize * state.currentPage);
157
113
  }
@@ -165,7 +121,7 @@ export class GenericTableComponent {
165
121
  this.state.updateExpandedGroups({ key, isExpanded, groupKey });
166
122
  }
167
123
  addMetaData(column) {
168
- const columnBuilder = this.myColumns()[column.metaData.key];
124
+ const columnBuilder = this.myColumns[column.metaData.key];
169
125
  if (columnBuilder) {
170
126
  columnBuilder.metaData = column.metaData;
171
127
  }
@@ -177,18 +133,17 @@ export class GenericTableComponent {
177
133
  component.instance.customCell = column.customCell;
178
134
  component.instance.metaData = column.metaData;
179
135
  component.instance.data$ = this.data$;
180
- this.myColumns.update(mc => ({ ...mc, [column.metaData.key]: component.instance }));
136
+ this.myColumns[column.metaData.key] = component.instance;
181
137
  }
182
138
  }
183
139
  initializeRowDefs = (defs) => {
184
- const table = this.$table();
185
- if (!table)
186
- return;
187
- this.rowDefArr.forEach(r => table.removeRowDef(r));
140
+ this.rowDefArr.forEach(r => this.table.removeRowDef(r));
188
141
  this.rowDefArr = defs;
189
142
  defs.forEach(r => {
190
- r.columns = this.$keys().concat(Object.values(this.myColumns).filter(c => c.metaData.fieldType !== FieldType.Hidden).map(c => c.metaData.key));
191
- table.addRowDef(r);
143
+ r.columns = this.columns.concat(Object.values(this.myColumns).filter(c => c.metaData.fieldType !== FieldType.Hidden).map(c => c.metaData.key));
144
+ if (this.table) {
145
+ this.table.addRowDef(r);
146
+ }
192
147
  });
193
148
  };
194
149
  selection;
@@ -239,6 +194,7 @@ export class GenericTableComponent {
239
194
  return (previousUserDefinedWidth ?? 0) >= 0 && currentUserDefinedWidth == null;
240
195
  }
241
196
  }));
197
+ showFooterRow$;
242
198
  getTransform = (key, val) => {
243
199
  if (val == undefined || val === 'null')
244
200
  return '';
@@ -251,8 +207,7 @@ export class GenericTableComponent {
251
207
  };
252
208
  $rowHeight = this.state.selectSignal(s => {
253
209
  if (this.state.$isVirtual() && s.notPersistedTableSettings.useVirtualScroll?.enforceRowHeight) {
254
- const height = s.notPersistedTableSettings.useVirtualScroll.rowHeight;
255
- return height + 'px';
210
+ return s.notPersistedTableSettings.useVirtualScroll.rowHeight + 'px';
256
211
  }
257
212
  if (typeof s.notPersistedTableSettings.rowHeight === 'number') {
258
213
  return s.notPersistedTableSettings.rowHeight + 'px';
@@ -261,34 +216,46 @@ export class GenericTableComponent {
261
216
  });
262
217
  $headerHeight = this.state.selectSignal(s => {
263
218
  if (this.state.$isVirtual() && s.notPersistedTableSettings.useVirtualScroll?.enforceHeaderHeight) {
264
- const height = s.notPersistedTableSettings.useVirtualScroll.headerHeight;
265
- return height + 'px';
219
+ return s.notPersistedTableSettings.useVirtualScroll.headerHeight + 'px';
266
220
  }
267
221
  if (typeof s.notPersistedTableSettings.headerHeight === 'number') {
268
222
  return s.notPersistedTableSettings.headerHeight + 'px';
269
223
  }
270
224
  return s.notPersistedTableSettings.headerHeight;
271
225
  });
226
+ $groupHeaderHeight = this.state.selectSignal(s => {
227
+ if (s.notPersistedTableSettings.groupHeaderHeight) {
228
+ return s.notPersistedTableSettings.groupHeaderHeight + 'px';
229
+ }
230
+ return this.$rowHeight();
231
+ });
272
232
  $stickyFooter = computed(() => this.state.props().stickyFooter || this.state.$isVirtual());
273
233
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
274
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: false, isRequired: false, transformFunction: null }, $displayData: { classPropertyName: "$displayData", publicName: "displayData", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: false, isRequired: false, transformFunction: null }, columnBuilders: { classPropertyName: "columnBuilders", publicName: "columnBuilders", isSignal: false, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + offsetIndex }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
234
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: false, isRequired: false, transformFunction: null }, displayData$: { classPropertyName: "displayData$", publicName: "displayData$", isSignal: false, isRequired: false, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: false, isRequired: false, transformFunction: null }, columnBuilders: { classPropertyName: "columnBuilders", publicName: "columnBuilders", isSignal: false, isRequired: false, transformFunction: null }, columnInfos: { classPropertyName: "columnInfos", publicName: "columnInfos", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\n cdkDropList\n cdkDropListLockAxis='x'\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"table-drag-list\"\n [class]=\"(showFooterRow$ | async)\"\n #table\n [dataSource]=\"state.props().dataSource!\"\n [trackBy]=\"trackByFunction\"\n [style]=\"tableWidth | async \"\n>\n\n <!-- select column -->\n <ng-container matColumnDef=\"select\">\n\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\n [checked]=\"!!(masterToggleChecked$ | async)\"\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\n </mat-checkbox>\n </mat-header-cell>\n\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"/>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\n {{ selection.selected.length }}\n </mat-footer-cell>\n </ng-container>\n\n\n <!-- index column -->\n <ng-container matColumnDef=\"index\">\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\n </mat-header-cell>\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\n {{ 1 + i + offsetIndex }}\n </mat-cell>\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\n </ng-container>\n\n <!-- Grouping -->\n <ng-container matColumnDef=\"groupHeader\">\n <mat-cell *matCellDef=\"let row\">\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\n @if (!expanded()) {\n <mat-icon>chevron_right</mat-icon>\n } @else {\n <mat-icon>expand_more</mat-icon>\n }\n </button>\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\n </div>\n <div style=\"flex-grow: 1\">\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\n </div>\n </mat-cell>\n </ng-container>\n\n @if (showHeader$ | async) {\n <mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\n *matHeaderRowDef=\"keys; sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\n }\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\n *matRowDef=\"let row; columns: keys; let i = index\"/>\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\n <mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\n *matFooterRowDef=\"(showFooterRow$ | async) === 'regular-footer' ? keys : []; sticky: $stickyFooter() \"\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>\n\n</mat-table>\n", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}.no-footer mat-footer-row{display:none}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
275
235
  }
276
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, decorators: [{
277
237
  type: Component,
278
238
  args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
279
239
  MatTableModule, DragDropModule, MatCheckboxModule, MatButtonModule, MatIconModule, NgTemplateOutlet,
280
240
  MatTooltipModule, AsyncPipe, FunctionPipe,
281
- ], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + offsetIndex }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}\n"] }]
241
+ ], template: "<mat-table\n cdkDropList\n cdkDropListLockAxis='x'\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"table-drag-list\"\n [class]=\"(showFooterRow$ | async)\"\n #table\n [dataSource]=\"state.props().dataSource!\"\n [trackBy]=\"trackByFunction\"\n [style]=\"tableWidth | async \"\n>\n\n <!-- select column -->\n <ng-container matColumnDef=\"select\">\n\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\n [checked]=\"!!(masterToggleChecked$ | async)\"\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\n </mat-checkbox>\n </mat-header-cell>\n\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"/>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\n {{ selection.selected.length }}\n </mat-footer-cell>\n </ng-container>\n\n\n <!-- index column -->\n <ng-container matColumnDef=\"index\">\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\n </mat-header-cell>\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\n {{ 1 + i + offsetIndex }}\n </mat-cell>\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\n </ng-container>\n\n <!-- Grouping -->\n <ng-container matColumnDef=\"groupHeader\">\n <mat-cell *matCellDef=\"let row\">\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\n @if (!expanded()) {\n <mat-icon>chevron_right</mat-icon>\n } @else {\n <mat-icon>expand_more</mat-icon>\n }\n </button>\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\n </div>\n <div style=\"flex-grow: 1\">\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\n </div>\n </mat-cell>\n </ng-container>\n\n @if (showHeader$ | async) {\n <mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\n *matHeaderRowDef=\"keys; sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\n }\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\n *matRowDef=\"let row; columns: keys; let i = index\"/>\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\n <mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\n *matFooterRowDef=\"(showFooterRow$ | async) === 'regular-footer' ? keys : []; sticky: $stickyFooter() \"\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>\n\n</mat-table>\n", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}.no-footer mat-footer-row{display:none}\n"] }]
282
242
  }], ctorParameters: () => [], propDecorators: { trackBy: [{
283
243
  type: Input
244
+ }], displayData$: [{
245
+ type: Input
284
246
  }], rows: [{
285
247
  type: Input
286
248
  }], columnBuilders: [{
287
249
  type: Input
250
+ }], columnInfos: [{
251
+ type: Input
252
+ }], table: [{
253
+ type: ViewChild,
254
+ args: [MatTable, { static: true }]
288
255
  }], dropList: [{
289
256
  type: ViewChild,
290
257
  args: [CdkDropList, { static: true }]
291
258
  }], selection$: [{
292
259
  type: Output
293
260
  }] } });
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFvQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBYSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEgsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FB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QVMsRUFBRSxZQUFZO3FCQUMxQzt3REFnQlksT0FBTztzQkFBbkIsS0FBSztnQkFhRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFHb0MsUUFBUTtzQkFBakQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWdKOUIsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDb250YWluZXJSZWYsIEluamVjdG9yLCBFdmVudEVtaXR0ZXIsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCB2aWV3Q2hpbGQsIGVmZmVjdCwgdW50cmFja2VkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9vdGVyUm93RGVmLCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvd0RlZiwgTWF0VGFibGUsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkNoYW5nZSwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1zdG9yZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbi1idWlsZGVyL2NvbHVtbi1idWlsZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1kZWYnO1xyXG5pbXBvcnQgeyBwcmV2aW91c0FuZEN1cnJlbnQgfSBmcm9tICcuLi8uLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgRnVuY3Rpb25QaXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBUcmFuc2Zvcm1DcmVhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNmb3JtLWNyZWF0b3InO1xyXG5pbXBvcnQgeyBpbml0SW5kZXhTeW1ib2wgfSBmcm9tICcuLi90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgVmlydHVhbFNjcm9sbE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLWJ1aWxkZXItZ2VuZXJhbC1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgRGF0YVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kYXRhLXN0b3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGItZ2VuZXJpYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdFRhYmxlTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsIEFzeW5jUGlwZSwgRnVuY3Rpb25QaXBlLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByb3RlY3RlZCBzdGF0ZSA9IGluamVjdChUYWJsZVN0b3JlKTtcclxuICBwcml2YXRlIGRhdGFTdG9yZSA9IGluamVjdChEYXRhU3RvcmUpO1xyXG4gIHByaXZhdGUgdmlld0NvbnRhaW5lciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcclxuICBwcml2YXRlIHRyYW5zZm9ybUNyZWF0b3IgPSBpbmplY3QoVHJhbnNmb3JtQ3JlYXRvcik7XHJcblxyXG4gICRoZWFkZXJSb3cgPSB2aWV3Q2hpbGQoTWF0SGVhZGVyUm93RGVmKTtcclxuICAkZm9vdGVyUm93ID0gdmlld0NoaWxkKE1hdEZvb3RlclJvd0RlZik7XHJcbiAgJHRhYmxlID0gdmlld0NoaWxkKE1hdFRhYmxlKTtcclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnN0YXRlLnNldFVzZXJEZWZpbmVkT3JkZXIoeyBuZXdPcmRlcjpldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgX3RyYWNrQnk/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2V0IHRyYWNrQnkodHJhY2tCeTogc3RyaW5nKXtcclxuICAgIGlmKHRyYWNrQnkpe1xyXG4gICAgICB0aGlzLl90cmFja0J5ID0gdHJhY2tCeTtcclxuICAgICAgdGhpcy50cmFja0J5RnVuY3Rpb24gPSAoaW5kZXg6bnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW1bdHJhY2tCeV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFVwU2VsZWN0aW9ucyh0cmFja0J5KTtcclxuICB9XHJcbiAgZ2V0IHRyYWNrQnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3RyYWNrQnkgfVxyXG4gICRkaXNwbGF5RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGlzcGxheURhdGEnIH0pO1xyXG4gICRkaXNwbGF5RGF0YUxlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGRpc3BsYXlEYXRhKCk/Lmxlbmd0aCB8fCAwKTtcclxuICAkaGFzRm9vdGVyTWV0YSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuJG1ldGFEYXRhQXJyYXkoKS5zb21lKG1kID0+ICEhbWQuYWRkaXRpb25hbD8uZm9vdGVyKSlcclxuICAkZGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGF0YScgfSlcclxuICBkYXRhJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRkYXRhKTtcclxuICBASW5wdXQoKSByb3dzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcclxuICBASW5wdXQoKSBjb2x1bW5CdWlsZGVycyE6IENvbHVtbkJ1aWxkZXJDb21wb25lbnRbXTtcclxuICAkY29sdW1uSW5mb3MgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5JbmZvW10+KHsgYWxpYXM6ICdjb2x1bW5JbmZvcycgfSk7XHJcbiAgJGhhc0N1c3RvbUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGNvbHVtbkluZm9zKCk/LnNvbWUoY2kgPT4gISFjaS5jdXN0b21DZWxsPy5jb2x1bW5EZWY/LmZvb3RlckNlbGwpKVxyXG4gIEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3QsIHsgc3RhdGljOiB0cnVlIH0pIGRyb3BMaXN0ITogQ2RrRHJvcExpc3Q7XHJcbiAgJGZvb3RlclJvd1N0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgaGFzRGF0YSA9ICEhdGhpcy4kZGlzcGxheURhdGFMZW5ndGgoKTtcclxuICAgIGNvbnN0IG1ldGFGb290ZXIgPSB0aGlzLiRoYXNGb290ZXJNZXRhKCk7XHJcbiAgICBjb25zdCBjdXN0b21Gb290ZXIgPSB0aGlzLiRoYXNDdXN0b21Gb290ZXIoKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc3RhdGUucHJvcHMoKS5zZWxlY3Rpb25Db2x1bW47XHJcbiAgICByZXR1cm4gY3VzdG9tRm9vdGVyIHx8IChoYXNEYXRhICYmIChtZXRhRm9vdGVyIHx8IGhhc1NlbGVjdGlvbkNvbHVtbikpID8gJ3JlZ3VsYXItZm9vdGVyJyA6IGhhc0RhdGEgPyAnbm8tZm9vdGVyJyA6ICdzbWFsbC1mb290ZXInO1xyXG4gIH0pO1xyXG4gICRzaG93Rm9vdGVyUm93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4kZm9vdGVyUm93U3R5bGUoKSAhPT0gJ25vLWZvb3RlcicpO1xyXG4gIGN1cnJlbnRDb2x1bW5zITogc3RyaW5nW107XHJcbiAgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAge3Byb3ZpZGU6IE1hdFRhYmxlLCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuJHRhYmxlKCkgfSxcclxuICAgICAge3Byb3ZpZGU6IENka0Ryb3BMaXN0LCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuZHJvcExpc3QgfSxcclxuICAgIF0sXHJcbiAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXHJcbiAgfSk7XHJcbiAgcm93RGVmQXJyIDpNYXRSb3dEZWY8YW55PltdID0gW107XHJcbiAgJGhhc1NlbGVjdENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLnByb3BzLnNlbGVjdGlvbkNvbHVtbikoKSk7XHJcbiAgJGhhc0luZGV4Q29sdW1uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUucHJvcHMuaW5kZXhDb2x1bW4pKCkpO1xyXG4gIG15Q29sdW1ucyA9IHNpZ25hbDxEaWN0aW9uYXJ5PENvbHVtbkJ1aWxkZXJDb21wb25lbnQ+Pih7fSk7XHJcbiAgJHNob3dIZWFkZXIgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkuaGlkZUNvbHVtbkhlYWRlcilcclxuICBvZmZzZXQkID0gdGhpcy5kYXRhU3RvcmUuc2VsZWN0KCBzID0+IHMudmlydHVhbFNjcm9sbE9mZnNldCApO1xyXG4gIG9mZnNldEluZGV4ID0gMDtcclxuICBkYXRhVmlldyE6IE9ic2VydmFibGU8YW55W10+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuc2V0VXBTZWxlY3Rpb25zKCk7XHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5JbmZvcyA9IHRoaXMuJGNvbHVtbkluZm9zKCkgfHwgW107XHJcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5teUNvbHVtbnMoKSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW5JbmZvID0gY29sdW1uSW5mb3MuZmluZChjaSA9PiBjaS5tZXRhRGF0YS5rZXkgPT09IGtleSk7XHJcbiAgICAgICAgICBpZighY29sdW1uSW5mbyB8fCBjb2x1bW5JbmZvLmN1c3RvbUNlbGwgIT09IHZhbHVlLmN1c3RvbUNlbGwpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMubXlDb2x1bW5zKClba2V5XTtcclxuICAgICAgICAgICAgdGhpcy4kdGFibGUoKT8ucmVtb3ZlQ29sdW1uRGVmKHZhbHVlLmNvbHVtbkRlZik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb2x1bW5JbmZvcy5mb3JFYWNoKGNpID0+IHRoaXMuYWRkTWV0YURhdGEoY2kpKVxyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLiRoZWFkZXJSb3coKTtcclxuICAgICAgY29uc3Qgc2hvd0hlYWRlciA9IHRoaXMuJHNob3dIZWFkZXIoKTtcclxuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLiR0YWJsZSgpO1xyXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xyXG4gICAgICAgIGlmKGhlYWRlclJvdyAmJiBzaG93SGVhZGVyICYmIHRhYmxlKSB0YWJsZS5hZGRIZWFkZXJSb3dEZWYoaGVhZGVyUm93KTtcclxuICAgICAgICBlbHNlIGlmKGhlYWRlclJvdyAmJiB0YWJsZSkgdGFibGUucmVtb3ZlSGVhZGVyUm93RGVmKGhlYWRlclJvdyk7XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZvb3RlclJvdyA9IHRoaXMuJGZvb3RlclJvdygpO1xyXG4gICAgICBjb25zdCBzaG93Rm9vdGVyID0gdGhpcy4kc2hvd0Zvb3RlclJvdygpO1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuJHRhYmxlKCk7XHJcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYoZm9vdGVyUm93ICYmIHNob3dGb290ZXIgJiYgdGFibGUpIHRhYmxlLmFkZEZvb3RlclJvd0RlZihmb290ZXJSb3cpO1xyXG4gICAgICAgIGVsc2UgaWYoZm9vdGVyUm93ICYmIHRhYmxlKSB0YWJsZS5yZW1vdmVGb290ZXJSb3dEZWYoZm9vdGVyUm93KTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVmYXVsdFRyYWNrQnkgPSAoaW5kZXg6bnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW1baW5pdEluZGV4U3ltYm9sXTtcclxuICB0cmFja0J5RnVuY3Rpb24gPSB0aGlzLmRlZmF1bHRUcmFja0J5O1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnJvd3MgJiYgdGhpcy5yb3dzICYmIHRoaXMubXlDb2x1bW5zKCkubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVJvd0RlZnMoWy4uLnRoaXMucm93c10pO1xyXG4gICAgfVxyXG4gIH1cclxuICAka2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGRpc3BsYXllZCA9IHRoaXMuc3RhdGUuJG9yZGVyZWRWaXNpYmxlQ29sdW1ucygpO1xyXG4gICAgY29uc3QgYnVpbHQgPSB0aGlzLm15Q29sdW1ucygpO1xyXG4gICAgY29uc3Qga2V5cyA9IGRpc3BsYXllZC5maWx0ZXIoZCA9PiAhIWJ1aWx0W2RdKTtcclxuICAgIGlmKHRoaXMuJGhhc1NlbGVjdENvbHVtbigpKXtcclxuICAgICAga2V5cy51bnNoaWZ0KCdzZWxlY3QnKTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuJGhhc0luZGV4Q29sdW1uKCkpIHtcclxuICAgICAga2V5cy51bnNoaWZ0KCdpbmRleCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleXM7XHJcbiAgfSlcclxuICBrZXlzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRrZXlzKTtcclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVJvd0RlZnMoWy4uLnRoaXMucm93c10pO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5rZXlzJCwga2V5cyA9PiB7XHJcbiAgICAgIHRoaXMucm93RGVmQXJyPy5mb3JFYWNoKHJvdyA9PiByb3cuY29sdW1ucyA9IGtleXMpXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLm9uKHRoaXMuc2VsZWN0YWJsZURhdGEkLCAoZGF0YSkgPT4ge1xyXG4gICAgICBpZih0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpe1xyXG4gICAgICAgIGNvbnN0IHRyYWNrQnlGdW5jdGlvbiA9IHRoaXMudHJhY2tCeSA/IChzKSA9PiBkYXRhLmV2ZXJ5KGQgPT4gIGRbdGhpcy50cmFja0J5IV0gIT09IHNbdGhpcy50cmFja0J5IV0pIDogcyA9PiAhZGF0YS5pbmNsdWRlcyhzKTtcclxuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQuZmlsdGVyKHRyYWNrQnlGdW5jdGlvbik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoLi4ucmVtb3ZlZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmKHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVBhZ2luYXRvciB8fCB0aGlzLnN0YXRlLnRhYmxlU2V0dGluZ3MoKS51c2VWaXJ0dWFsU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUub24oY29tYmluZUxhdGVzdChbdGhpcy5zdGF0ZS5zdGF0ZSQsIHRoaXMuZGF0YVN0b3JlLnN0YXRlJF0pLCAoW3N0YXRlLCBkYXRhXSkgPT4ge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0SW5kZXggPSBkYXRhLnZpcnR1YWxFbmRzLnN0YXJ0O1xyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVBhZ2luYXRvcikge1xyXG4gICAgICAgICAgdGhpcy5vZmZzZXRJbmRleCArPSAoc3RhdGUucGFnZVNpemUgKiBzdGF0ZS5jdXJyZW50UGFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBpc0dyb3VwSGVhZGVyKF86IG51bWJlciwgcm93OiB7IGlzR3JvdXBIZWFkZXI6IGJvb2xlYW4gfSkge1xyXG4gICAgcmV0dXJuIHJvdy5pc0dyb3VwSGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgc2V0RXhwYW5kZWQoa2V5OiBzdHJpbmcsIGdyb3VwS2V5OiBzdHJpbmcsIGlzRXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUudXBkYXRlRXhwYW5kZWRHcm91cHMoeyBrZXkgLCBpc0V4cGFuZGVkLCBncm91cEtleSB9KTtcclxuICB9XHJcblxyXG4gIGFkZE1ldGFEYXRhKGNvbHVtbjogQ29sdW1uSW5mbykge1xyXG4gICAgY29uc3QgY29sdW1uQnVpbGRlciA9IHRoaXMubXlDb2x1bW5zKClbY29sdW1uLm1ldGFEYXRhLmtleV07XHJcbiAgICBpZihjb2x1bW5CdWlsZGVyKSB7XHJcbiAgICAgIGNvbHVtbkJ1aWxkZXIubWV0YURhdGEgPSBjb2x1bW4ubWV0YURhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KENvbHVtbkJ1aWxkZXJDb21wb25lbnQsIHtcclxuICAgICAgICBpbmRleDogMCxcclxuICAgICAgICBpbmplY3RvcjogdGhpcy5pbmplY3RvclxyXG4gICAgICB9KTtcclxuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmN1c3RvbUNlbGwgPSBjb2x1bW4uY3VzdG9tQ2VsbDtcclxuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLm1ldGFEYXRhID0gY29sdW1uLm1ldGFEYXRhO1xyXG4gICAgICBjb21wb25lbnQuaW5zdGFuY2UuZGF0YSQgPSB0aGlzLmRhdGEkO1xyXG4gICAgICB0aGlzLm15Q29sdW1ucy51cGRhdGUobWMgPT4gKHsuLi5tYywgW2NvbHVtbi5tZXRhRGF0YS5rZXldOiBjb21wb25lbnQuaW5zdGFuY2V9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplUm93RGVmcyA9IChkZWZzOk1hdFJvd0RlZjxhbnk+W10pPT57XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuJHRhYmxlKCk7XHJcbiAgICBpZighdGFibGUpIHJldHVybjtcclxuICAgIHRoaXMucm93RGVmQXJyLmZvckVhY2gocj0+IHRhYmxlLnJlbW92ZVJvd0RlZihyKSk7XHJcbiAgICB0aGlzLnJvd0RlZkFyciA9IGRlZnM7XHJcbiAgICBkZWZzLmZvckVhY2gociA9PiB7XHJcbiAgICAgIHIuY29sdW1ucyA9IHRoaXMuJGtleXMoKS5jb25jYXQoT2JqZWN0LnZhbHVlcyh0aGlzLm15Q29sdW1ucykuZmlsdGVyKGMgPT4gYy5tZXRhRGF0YS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pLm1hcChjID0+IGMubWV0YURhdGEua2V5KSk7XHJcbiAgICAgIHRhYmxlLmFkZFJvd0RlZihyKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24hIDogU2VsZWN0aW9uTW9kZWw8YW55PjtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uJCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlPGFueT4+KCk7XHJcbiAgbWFzdGVyVG9nZ2xlQ2hlY2tlZCQgPSB0aGlzLnNlbGVjdGlvbiQucGlwZShtYXAoKCk9PnRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBtYXN0ZXJUb2dnbGVJbmRldGVybWluYXRlJCA9IHRoaXMuc2VsZWN0aW9uJC5waXBlKG1hcCgoKT0+dGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBzZXRVcFNlbGVjdGlvbnModHJhY2tCeT86IHN0cmluZyl7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRyYWNrQnkgPyBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSwgdHJ1ZSwgKGEsIGIpID0+IGFbdHJhY2tCeV0gPT09IGJbdHJhY2tCeV0pIDogbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLCBjID0+IHRoaXMuc2VsZWN0aW9uJC5lbWl0KGMpKTtcclxuICB9XHJcbiAgJHNlbGVjdGFibGVEYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kdmlld1R5cGUoKSA9PT0gJ3BhZ2luYXRvcicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucHJvcHMoKS5kYXRhU291cmNlIS5kYXRhO1xyXG4gICAgfSBlbHNlIGlmKHRoaXMuc3RhdGUuJHZpZXdUeXBlKCkgPT09ICd2aXJ0dWFsIHBhZ2luYXRvcicpe1xyXG4gICAgICBjb25zdCBwcmV2aW91c1BhZ2VSZWNvcmRzID0gdGhpcy5zdGF0ZS5zdGF0ZSgpLmN1cnJlbnRQYWdlICogdGhpcy5zdGF0ZS5zdGF0ZSgpLnBhZ2VTaXplO1xyXG4gICAgICByZXR1cm4gdGhpcy4kZGF0YSgpLnNsaWNlKHByZXZpb3VzUGFnZVJlY29yZHMsIHByZXZpb3VzUGFnZVJlY29yZHMgKyB0aGlzLnN0YXRlLnN0YXRlKCkucGFnZVNpemUpO1xyXG4gICAgfWVsc2UgaWYodGhpcy5zdGF0ZS4kdmlld1R5cGUoKSA9PT0gJ2FsbCcpe1xyXG4gICAgICByZXR1cm4gdGhpcy4kZGF0YSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH0pO1xyXG4gIHNlbGVjdGFibGVEYXRhJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRzZWxlY3RhYmxlRGF0YSk7XHJcbiAgaXNBbGxTZWxlY3RlZCgpIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuJHNlbGVjdGFibGVEYXRhKCk/Lmxlbmd0aCB8fCAwO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cclxuICBtYXN0ZXJUb2dnbGUoKSB7XHJcbiAgICBpZih0aGlzLmlzQWxsU2VsZWN0ZWQoKSl7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLiRzZWxlY3RhYmxlRGF0YSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRhYmxlV2lkdGggPSB0aGlzLnN0YXRlLmdldFVzZXJEZWZpbmVkVGFibGVTaXplJC5waXBlKFxyXG4gICAgcHJldmlvdXNBbmRDdXJyZW50PG51bWJlciB8IHVuZGVmaW5lZD4oMCksXHJcbiAgICBtYXAoKFtwcmV2aW91c1VzZXJEZWZpbmVkV2lkdGgsIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoXSkgPT4ge1xyXG4gICAgICBpZiggY3VycmVudFVzZXJEZWZpbmVkV2lkdGgpe1xyXG4gICAgICAgIHJldHVybiAoe3dpZHRoOmAke2N1cnJlbnRVc2VyRGVmaW5lZFdpZHRofXB4YH0pO1xyXG4gICAgICB9IGlmKCB3YXNSZXNldCgpICl7XHJcbiAgICAgICAgcmV0dXJuICh7d2lkdGg6J2luaXRpYWwnfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICh7fSk7XHJcblxyXG4gICAgICBmdW5jdGlvbiB3YXNSZXNldCgpe1xyXG4gICAgICAgIHJldHVybiAocHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoID8/IDApID49MCAmJiBjdXJyZW50VXNlckRlZmluZWRXaWR0aCA9PSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIGdldFRyYW5zZm9ybSA9IChrZXk6IHN0cmluZywgdmFsOiBzdHJpbmcpID0+IHtcclxuICAgIGlmKHZhbCA9PSB1bmRlZmluZWQgfHwgdmFsID09PSAnbnVsbCcpIHJldHVybiAnJztcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUNyZWF0b3IuY3JlYXRlVHJhbnNmb3JtZXIodGhpcy5teUNvbHVtbnNba2V5XS5tZXRhRGF0YSwgdHJ1ZSkoeyBba2V5XTogdmFsfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJHJvd0hlaWdodCA9IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHMgPT4ge1xyXG4gICAgICBpZih0aGlzLnN0YXRlLiRpc1ZpcnR1YWwoKSAmJiAocy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpPy5lbmZvcmNlUm93SGVpZ2h0KXtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSAocy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpIS5yb3dIZWlnaHQ7XHJcbiAgICAgICAgcmV0dXJuIGhlaWdodCArICdweCcgO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHR5cGVvZiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3Mucm93SGVpZ2h0ID09PSAnbnVtYmVyJyl7XHJcbiAgICAgICAgcmV0dXJuIHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5yb3dIZWlnaHQgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3Mucm93SGVpZ2h0O1xyXG4gICAgICBcclxuICAgIH0pO1xyXG5cclxuICAkaGVhZGVySGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XHJcbiAgICBpZih0aGlzLnN0YXRlLiRpc1ZpcnR1YWwoKSAmJiAocy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpPy5lbmZvcmNlSGVhZGVySGVpZ2h0KXtcclxuICAgICAgY29uc3QgaGVpZ2h0ID0gKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKSEuaGVhZGVySGVpZ2h0O1xyXG4gICAgICByZXR1cm4gaGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIGlmKHR5cGVvZiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuaGVhZGVySGVpZ2h0ID09PSAnbnVtYmVyJyl7XHJcbiAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuaGVhZGVySGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuaGVhZGVySGVpZ2h0O1xyXG4gIH0pO1xyXG5cclxuICAkc3RpY2t5Rm9vdGVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5wcm9wcygpLnN0aWNreUZvb3RlciB8fCB0aGlzLnN0YXRlLiRpc1ZpcnR1YWwoKSk7XHJcbn1cclxuIiwiPG1hdC10YWJsZVxyXG4gIGNka0Ryb3BMaXN0XHJcbiAgY2RrRHJvcExpc3RMb2NrQXhpcz0neCdcclxuICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXHJcbiAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxyXG4gIGNsYXNzPVwidGFibGUtZHJhZy1saXN0XCJcclxuICBbY2xhc3NdPVwiKCRmb290ZXJSb3dTdHlsZSgpKVwiXHJcbiAgI3RhYmxlXHJcbiAgW2RhdGFTb3VyY2VdPVwic3RhdGUucHJvcHMoKS5kYXRhU291cmNlIVwiXHJcbiAgW3RyYWNrQnldPVwidHJhY2tCeUZ1bmN0aW9uXCJcclxuICBbc3R5bGVdPVwidGFibGVXaWR0aCB8IGFzeW5jIFwiXHJcbj5cclxuXHJcbiAgPCEtLSBzZWxlY3QgY29sdW1uIC0tPlxyXG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XHJcblxyXG4gICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiAgY2xhc3M9XCJzZWxlY3QtY29sdW1uXCI+XHJcbiAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIiEhKG1hc3RlclRvZ2dsZUNoZWNrZWQkIHwgYXN5bmMpXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJtYXN0ZXJUb2dnbGVJbmRldGVybWluYXRlJCB8IGFzeW5jXCI+XHJcbiAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgPC9tYXQtaGVhZGVyLWNlbGw+XHJcblxyXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKHJvdykgOiBudWxsXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCIvPlxyXG4gICAgPC9tYXQtY2VsbD5cclxuXHJcbiAgICA8bWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxyXG4gICAgICB7eyBzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoIH19XHJcbiAgICA8L21hdC1mb290ZXItY2VsbD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gIDwhLS0gaW5kZXggY29sdW1uIC0tPlxyXG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cclxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJmLW1hdC1oZWFkZXItY2VsbFwiIGNsYXNzPVwiaW5kZXgtY29sdW1uXCI+I1xyXG4gICAgPC9tYXQtaGVhZGVyLWNlbGw+XHJcbiAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwiaW5kZXgtY29sdW1uXCI+XHJcbiAgICAgIHt7IDEgKyBpICsgb2Zmc2V0SW5kZXggfX1cclxuICAgIDwvbWF0LWNlbGw+XHJcbiAgICA8bWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIGNsYXNzPVwiaW5kZXgtY29sdW1uXCI+PC9tYXQtZm9vdGVyLWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwhLS0gR3JvdXBpbmcgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJncm91cEhlYWRlclwiPlxyXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICBAbGV0IGV4cGFuZGVkID0gKHN0YXRlLmdldElzRXhwYW5kZWQgfCBmdW5jIDogcm93LmtleSA6IHJvdy5ncm91cE5hbWUgKTtcclxuICAgICAgPGRpdiBbc3R5bGUucGFkZGluZ0xlZnRdPVwicm93LnBhZGRpbmcgKyAncHggIWltcG9ydGFudCdcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2V0RXhwYW5kZWQocm93LmtleSwgcm93Lmdyb3VwTmFtZSwgIWV4cGFuZGVkKCkpO1wiPlxyXG4gICAgICAgICAgQGlmICghZXhwYW5kZWQoKSkge1xyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPG1hdC1pY29uPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB7eyBnZXRUcmFuc2Zvcm0gfCBmdW5jIDogcm93LmtleSA6ICByb3cuZ3JvdXBIZWFkZXJEaXNwbGF5IH19ICh7eyByb3cubGVuZ3RoIH19KVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBzdHlsZT1cImZsZXgtZ3JvdzogMVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVyVGVtcGxhdGUhOyBjb250ZXh0OiB7IGVsZW1lbnQ6IHJvdyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtY2VsbD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPG1hdC1yb3cgW3N0eWxlLmhlaWdodF09XCIkcm93SGVpZ2h0KClcIiBbc3R5bGUubWluLWhlaWdodF09XCIkcm93SGVpZ2h0KClcIlxyXG4gICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiAka2V5cygpOyBsZXQgaSA9IGluZGV4XCIvPlxyXG4gIDxtYXQtcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydncm91cEhlYWRlciddOyB3aGVuOiBpc0dyb3VwSGVhZGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcIi8+XHJcbjwvbWF0LXRhYmxlPlxyXG5cclxuPG1hdC1oZWFkZXItcm93IFtzdHlsZS5oZWlnaHRdPVwiJGhlYWRlckhlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJGhlYWRlckhlaWdodCgpXCJcclxuICAqbWF0SGVhZGVyUm93RGVmPVwiJGtleXMoKTsgc3RpY2t5OiBzdGF0ZS5wcm9wcygpLmlzU3RpY2t5XCIgW3N0eWxlLnRvcC5weF09XCIoKG9mZnNldCQgfCBhc3luYykhICogLTEpXCIvPlxyXG48bWF0LWZvb3Rlci1yb3cgW3N0eWxlLmhlaWdodF09XCIkcm93SGVpZ2h0KClcIiBbc3R5bGUubWluLWhlaWdodF09XCIkcm93SGVpZ2h0KClcIlxyXG4gICptYXRGb290ZXJSb3dEZWY9XCIka2V5cygpOyBzdGlja3k6ICRzdGlja3lGb290ZXIoKSBcIlxyXG4gIFtzdHlsZS5ib3R0b20ucHhdPVwiJHN0aWNreUZvb3RlcigpID8gKG9mZnNldCQgfCBhc3luYykgOiB1bmRlZmluZWRcIi8+Il19
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFvQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xNLE9BQU8sRUFBYSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWxFLE9BQU8sRUFBZSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENB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QUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFzSDlCLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdDaGlsZCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIE9uSW5pdCwgUXVlcnlMaXN0LCBWaWV3Q29udGFpbmVyUmVmLCBJbmplY3RvciwgRXZlbnRFbWl0dGVyLCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25DaGFuZ2UsIFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcbmltcG9ydCB7IG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb2x1bW5CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1uLWJ1aWxkZXIvY29sdW1uLWJ1aWxkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmJztcbmltcG9ydCB7IHByZXZpb3VzQW5kQ3VycmVudCB9IGZyb20gJy4uLy4uLy4uL3J4anMvcnhqcy1vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgQ2RrRHJvcExpc3QsIERyYWdEcm9wTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBGdW5jdGlvblBpcGUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFRyYW5zZm9ybUNyZWF0b3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2Zvcm0tY3JlYXRvcic7XG5pbXBvcnQgeyBpbml0SW5kZXhTeW1ib2wgfSBmcm9tICcuLi90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxPcHRpb25zIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1idWlsZGVyLWdlbmVyYWwtc2V0dGluZ3MnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0Yi1nZW5lcmljLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nZW5lcmljLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0VGFibGVNb2R1bGUsIERyYWdEcm9wTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsIEFzeW5jUGlwZSwgRnVuY3Rpb25QaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgc3RhdGUgPSBpbmplY3QoVGFibGVTdG9yZSk7XG4gIHByaXZhdGUgdmlld0NvbnRhaW5lciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1DcmVhdG9yID0gaW5qZWN0KFRyYW5zZm9ybUNyZWF0b3IpO1xuXG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgdGhpcy5zdGF0ZS5zZXRVc2VyRGVmaW5lZE9yZGVyKHsgbmV3T3JkZXI6ZXZlbnQuY3VycmVudEluZGV4LCBvbGRPcmRlcjpldmVudC5wcmV2aW91c0luZGV4IH0pXG4gIH1cbiAgX3RyYWNrQnk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNldCB0cmFja0J5KHRyYWNrQnk6IHN0cmluZyl7XG4gICAgaWYodHJhY2tCeSl7XG4gICAgICB0aGlzLl90cmFja0J5ID0gdHJhY2tCeTtcbiAgICAgIHRoaXMudHJhY2tCeUZ1bmN0aW9uID0gKGluZGV4Om51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtW3RyYWNrQnldO1xuICAgIH1cbiAgICB0aGlzLnNldFVwU2VsZWN0aW9ucyh0cmFja0J5KTtcbiAgfVxuICBnZXQgdHJhY2tCeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fdHJhY2tCeSB9XG4gIEBJbnB1dCgpIGRpc3BsYXlEYXRhJCE6IE9ic2VydmFibGU8YW55W10+O1xuICAkZGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGF0YScgfSlcbiAgZGF0YSQgPSB0b09ic2VydmFibGUodGhpcy4kZGF0YSk7XG4gIEBJbnB1dCgpIHJvd3MhOiBRdWVyeUxpc3Q8TWF0Um93RGVmPGFueT4+O1xuICBASW5wdXQoKSBjb2x1bW5CdWlsZGVycyE6IENvbHVtbkJ1aWxkZXJDb21wb25lbnRbXTtcbiAgQElucHV0KCkgY29sdW1uSW5mb3MhOiBPYnNlcnZhYmxlPENvbHVtbkluZm9bXT47XG5cbiAgQFZpZXdDaGlsZChNYXRUYWJsZSwgeyBzdGF0aWM6IHRydWUgfSkgdGFibGUhOiBNYXRUYWJsZTxhbnk+O1xuICBAVmlld0NoaWxkKENka0Ryb3BMaXN0LCB7IHN0YXRpYzogdHJ1ZSB9KSBkcm9wTGlzdCE6IENka0Ryb3BMaXN0O1xuXG4gIGN1cnJlbnRDb2x1bW5zITogc3RyaW5nW107XG4gIGtleXM6IHN0cmluZyBbXSA9IFtdO1xuICBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICB7cHJvdmlkZTogTWF0VGFibGUsIHVzZUZhY3Rvcnk6ICgpPT4gdGhpcy50YWJsZSB9LFxuICAgICAge3Byb3ZpZGU6IENka0Ryb3BMaXN0LCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuZHJvcExpc3QgfSxcbiAgICBdLFxuICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3JcbiAgfSk7XG4gIHJvd0RlZkFyciA6TWF0Um93RGVmPGFueT5bXSA9IFtdO1xuICBjb2x1bW5zOnN0cmluZyBbXSA9IFtdO1xuICBteUNvbHVtbnM6IERpY3Rpb25hcnk8Q29sdW1uQnVpbGRlckNvbXBvbmVudD4gPSB7fTtcbiAgc2hvd0hlYWRlciQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBvZmZzZXQkID0gdGhpcy5zdGF0ZS5zZWxlY3QoIHMgPT4gcy52aXJ0dWFsU2Nyb2xsT2Zmc2V0ICk7XG4gIG9mZnNldEluZGV4ID0gMDtcbiAgZGF0YVZpZXchOiBPYnNlcnZhYmxlPGFueVtdPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNldFVwU2VsZWN0aW9ucygpO1xuICB9XG5cbiAgZGVmYXVsdFRyYWNrQnkgPSAoaW5kZXg6bnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW1baW5pdEluZGV4U3ltYm9sXTtcbiAgdHJhY2tCeUZ1bmN0aW9uID0gdGhpcy5kZWZhdWx0VHJhY2tCeTtcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnJvd3MgJiYgdGhpcy5yb3dzICYmIHRoaXMubXlDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUucHJvcHMoKS5zZWxlY3Rpb25Db2x1bW4pIHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKCdzZWxlY3QnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5wcm9wcygpLmluZGV4Q29sdW1uKSB7XG4gICAgIHRoaXMuY29sdW1ucy5wdXNoKCdpbmRleCcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUub24odGhpcy5jb2x1bW5JbmZvcywgY29sdW1ucyA9PiB7XG4gICAgICBjb2x1bW5zLmZvckVhY2goY2kgPT4gdGhpcy5hZGRNZXRhRGF0YShjaSkpXG4gICAgfSk7XG5cbiAgICB0aGlzLmluaXRpYWxpemVSb3dEZWZzKFsuLi50aGlzLnJvd3NdKTtcblxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zdGF0ZS5kaXNwbGF5ZWRDb2x1bW5zJCwga2V5cyA9PiB7XG4gICAgICB0aGlzLmtleXMgPSBbLi4udGhpcy5jb2x1bW5zLCAuLi5rZXlzXTtcbiAgICAgIHRoaXMucm93RGVmQXJyPy5mb3JFYWNoKHJvdyA9PiByb3cuY29sdW1ucyA9IHRoaXMua2V5cylcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zZWxlY3RhYmxlRGF0YSQsIChkYXRhKSA9PiB7XG4gICAgICBpZih0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpe1xuICAgICAgICBjb25zdCB0cmFja0J5RnVuY3Rpb24gPSB0aGlzLnRyYWNrQnkgPyAocykgPT4gZGF0YS5ldmVyeShkID0+ICBkW3RoaXMudHJhY2tCeSFdICE9PSBzW3RoaXMudHJhY2tCeSFdKSA6IHMgPT4gIWRhdGEuaW5jbHVkZXMocyk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5maWx0ZXIodHJhY2tCeUZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoLi4ucmVtb3ZlZCk7XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuc2hvd0hlYWRlciQgPSB0aGlzLnN0YXRlLnRhYmxlU2V0dGluZ3MkLnBpcGUobWFwKHNldHRpbmdzID0+ICEoc2V0dGluZ3MuaGlkZUNvbHVtbkhlYWRlcikpKTtcblxuICAgIHRoaXMuc2hvd0Zvb3RlclJvdyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZGlzcGxheURhdGEkLnBpcGUobWFwKGQgPT4gISFkLmxlbmd0aCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgdGhpcy5zdGF0ZS5tZXRhRGF0YUFycmF5JC5waXBlKG1hcChtZXRhRGF0YSA9PiBtZXRhRGF0YS5zb21lKG1kID0+ICEhbWQuYWRkaXRpb25hbD8uZm9vdGVyKSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgdGhpcy5jb2x1bW5JbmZvcy5waXBlKG1hcChjb2x1bW5JbmZvcyA9PiBjb2x1bW5JbmZvcy5zb21lKGNpID0+ICEhY2kuY3VzdG9tQ2VsbD8uY29sdW1uRGVmPy5mb290ZXJDZWxsKSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgIF0pLnBpcGUobWFwKChbaGFzRGF0YSwgaGFzRm9vdGVyRGVmLCBoYXNDdXN0b21Gb290ZXJdKSA9PiB7XG4gICAgICBjb25zdCBoYXNTZWxlY3Rpb25Db2x1bW4gPSB0aGlzLnN0YXRlLnByb3BzKCkuc2VsZWN0aW9uQ29sdW1uO1xuICAgICAgcmV0dXJuIGhhc0N1c3RvbUZvb3RlciB8fCAoaGFzRGF0YSAmJiAoaGFzRm9vdGVyRGVmIHx8IGhhc1NlbGVjdGlvbkNvbHVtbikpID8gJ3JlZ3VsYXItZm9vdGVyJyA6IGhhc0RhdGEgPyAnbm8tZm9vdGVyJyA6ICdzbWFsbC1mb290ZXInO1xuICAgIH0pKTtcblxuICAgIGlmKHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVBhZ2luYXRvciB8fCB0aGlzLnN0YXRlLnRhYmxlU2V0dGluZ3MoKS51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLnN0YXRlLm9uKHRoaXMuc3RhdGUuc3RhdGUkLCAoc3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5vZmZzZXRJbmRleCA9IHN0YXRlLnZpcnR1YWxFbmRzLnN0YXJ0O1xuICAgICAgICBpZih0aGlzLnN0YXRlLnRhYmxlU2V0dGluZ3MoKS51c2VQYWdpbmF0b3IpIHtcbiAgICAgICAgICB0aGlzLm9mZnNldEluZGV4ICs9IChzdGF0ZS5wYWdlU2l6ZSAqIHN0YXRlLmN1cnJlbnRQYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICBpc0dyb3VwSGVhZGVyKF86IG51bWJlciwgcm93OiB7IGlzR3JvdXBIZWFkZXI6IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiByb3cuaXNHcm91cEhlYWRlcjtcbiAgfVxuXG4gIHNldEV4cGFuZGVkKGtleTogc3RyaW5nLCBncm91cEtleTogc3RyaW5nLCBpc0V4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGVFeHBhbmRlZEdyb3Vwcyh7IGtleSAsIGlzRXhwYW5kZWQsIGdyb3VwS2V5IH0pO1xuICB9XG5cbiAgYWRkTWV0YURhdGEoY29sdW1uOiBDb2x1bW5JbmZvKSB7XG4gICAgY29uc3QgY29sdW1uQnVpbGRlciA9IHRoaXMubXlDb2x1bW5zW2NvbHVtbi5tZXRhRGF0YS5rZXldO1xuICAgIGlmKGNvbHVtbkJ1aWxkZXIpIHtcbiAgICAgIGNvbHVtbkJ1aWxkZXIubWV0YURhdGEgPSBjb2x1bW4ubWV0YURhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoQ29sdW1uQnVpbGRlckNvbXBvbmVudCwge1xuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmN1c3RvbUNlbGwgPSBjb2x1bW4uY3VzdG9tQ2VsbDtcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5kYXRhJCA9IHRoaXMuZGF0YSQ7XG4gICAgICB0aGlzLm15Q29sdW1uc1tjb2x1bW4ubWV0YURhdGEua2V5XSA9IGNvbXBvbmVudC5pbnN0YW5jZTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplUm93RGVmcyA9IChkZWZzOk1hdFJvd0RlZjxhbnk+W10pPT57XG4gICAgdGhpcy5yb3dEZWZBcnIuZm9yRWFjaChyPT50aGlzLnRhYmxlLnJlbW92ZVJvd0RlZihyKSk7XG4gICAgdGhpcy5yb3dEZWZBcnIgPSBkZWZzO1xuICAgIGRlZnMuZm9yRWFjaChyID0+IHtcbiAgICAgIHIuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5jb25jYXQoT2JqZWN0LnZhbHVlcyh0aGlzLm15Q29sdW1ucykuZmlsdGVyKGMgPT4gYy5tZXRhRGF0YS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pLm1hcChjID0+IGMubWV0YURhdGEua2V5KSk7XG4gICAgICBpZiAodGhpcy50YWJsZSkge1xuICAgICAgICB0aGlzLnRhYmxlLmFkZFJvd0RlZihyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdGlvbiEgOiBTZWxlY3Rpb25Nb2RlbDxhbnk+O1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uJCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlPGFueT4+KCk7XG4gIG1hc3RlclRvZ2dsZUNoZWNrZWQkID0gdGhpcy5zZWxlY3Rpb24kLnBpcGUobWFwKCgpPT50aGlzLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIHRoaXMuaXNBbGxTZWxlY3RlZCgpKSk7XG4gIG1hc3RlclRvZ2dsZUluZGV0ZXJtaW5hdGUkID0gdGhpcy5zZWxlY3Rpb24kLnBpcGUobWFwKCgpPT50aGlzLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICF0aGlzLmlzQWxsU2VsZWN0ZWQoKSkpO1xuICBzZXRVcFNlbGVjdGlvbnModHJhY2tCeT86IHN0cmluZyl7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSB0cmFja0J5ID8gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10sIHRydWUsIChhLCBiKSA9PiBhW3RyYWNrQnldID09PSBiW3RyYWNrQnldKSA6IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcbiAgICB0aGlzLnN0YXRlLm9uKHRoaXMuc2VsZWN0aW9uLmNoYW5nZWQsIGMgPT4gdGhpcy5zZWxlY3Rpb24kLmVtaXQoYykpO1xuICB9XG4gICRzZWxlY3RhYmxlRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZih0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAncGFnaW5hdG9yJykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucHJvcHMoKS5kYXRhU291cmNlIS5kYXRhO1xuICAgIH0gZWxzZSBpZih0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAndmlydHVhbCBwYWdpbmF0b3InKXtcbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZVJlY29yZHMgPSB0aGlzLnN0YXRlLnN0YXRlKCkuY3VycmVudFBhZ2UgKiB0aGlzLnN0YXRlLnN0YXRlKCkucGFnZVNpemU7XG4gICAgICByZXR1cm4gdGhpcy4kZGF0YSgpLnNsaWNlKHByZXZpb3VzUGFnZVJlY29yZHMsIHByZXZpb3VzUGFnZVJlY29yZHMgKyB0aGlzLnN0YXRlLnN0YXRlKCkucGFnZVNpemUpO1xuICAgIH1lbHNlIGlmKHRoaXMuc3RhdGUuJHZpZXdUeXBlKCkgPT09ICdhbGwnKXtcbiAgICAgIHJldHVybiB0aGlzLiRkYXRhKCk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSk7XG4gIHNlbGVjdGFibGVEYXRhJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRzZWxlY3RhYmxlRGF0YSk7XG4gIGlzQWxsU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuJHNlbGVjdGFibGVEYXRhKCk/Lmxlbmd0aCB8fCAwO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXG4gIG1hc3RlclRvZ2dsZSgpIHtcbiAgICBpZih0aGlzLmlzQWxsU2VsZWN0ZWQoKSl7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLiRzZWxlY3RhYmxlRGF0YSgpKTtcbiAgICB9XG4gIH1cblxuICB0YWJsZVdpZHRoID0gdGhpcy5zdGF0ZS5nZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQucGlwZShcbiAgICBwcmV2aW91c0FuZEN1cnJlbnQ8bnVtYmVyIHwgdW5kZWZpbmVkPigwKSxcbiAgICBtYXAoKFtwcmV2aW91c1VzZXJEZWZpbmVkV2lkdGgsIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoXSkgPT4ge1xuICAgICAgaWYoIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoKXtcbiAgICAgICAgcmV0dXJuICh7d2lkdGg6YCR7Y3VycmVudFVzZXJEZWZpbmVkV2lkdGh9cHhgfSk7XG4gICAgICB9IGlmKCB3YXNSZXNldCgpICl7XG4gICAgICAgIHJldHVybiAoe3dpZHRoOidpbml0aWFsJ30pO1xuICAgICAgfVxuICAgICAgcmV0dXJuICh7fSk7XG5cbiAgICAgIGZ1bmN0aW9uIHdhc1Jlc2V0KCl7XG4gICAgICAgIHJldHVybiAocHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoID8/IDApID49MCAmJiBjdXJyZW50VXNlckRlZmluZWRXaWR0aCA9PSBudWxsO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgc2hvd0Zvb3RlclJvdyQhOiBPYnNlcnZhYmxlPCdyZWd1bGFyLWZvb3RlcicgfCAnbm8tZm9vdGVyJyB8ICdzbWFsbC1mb290ZXInPjtcbiAgZ2V0VHJhbnNmb3JtID0gKGtleTogc3RyaW5nLCB2YWw6IHN0cmluZykgPT4ge1xuICAgIGlmKHZhbCA9PSB1bmRlZmluZWQgfHwgdmFsID09PSAnbnVsbCcpIHJldHVybiAnJztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtQ3JlYXRvci5jcmVhdGVUcmFuc2Zvcm1lcih0aGlzLm15Q29sdW1uc1trZXldLm1ldGFEYXRhLCB0cnVlKSh7IFtrZXldOiB2YWx9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gIH1cblxuICAkcm93SGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XG4gICAgICBpZih0aGlzLnN0YXRlLiRpc1ZpcnR1YWwoKSAmJiAocy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpPy5lbmZvcmNlUm93SGVpZ2h0KXtcbiAgICAgICAgcmV0dXJuIChzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MudXNlVmlydHVhbFNjcm9sbCBhcyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucykhLnJvd0hlaWdodCArICdweCcgO1xuICAgICAgfVxuICAgICAgaWYodHlwZW9mIHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5yb3dIZWlnaHQgPT09ICdudW1iZXInKXtcbiAgICAgICAgcmV0dXJuIHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5yb3dIZWlnaHQgKyAncHgnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5yb3dIZWlnaHQ7XG5cbiAgICB9KTtcblxuICAkaGVhZGVySGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XG4gICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZUhlYWRlckhlaWdodCl7XG4gICAgICByZXR1cm4gKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKSEuaGVhZGVySGVpZ2h0ICsgJ3B4JztcbiAgICB9XG4gICAgaWYodHlwZW9mIHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5oZWFkZXJIZWlnaHQgPT09ICdudW1iZXInKXtcbiAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuaGVhZGVySGVpZ2h0ICsgJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5oZWFkZXJIZWlnaHQ7XG4gIH0pO1xuXG4gICRncm91cEhlYWRlckhlaWdodCA9IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHMgPT4ge1xuICAgIGlmKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy5ncm91cEhlYWRlckhlaWdodCl7XG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuJHJvd0hlaWdodCgpO1xuICB9KTtcblxuICAkc3RpY2t5Rm9vdGVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5wcm9wcygpLnN0aWNreUZvb3RlciB8fCB0aGlzLnN0YXRlLiRpc1ZpcnR1YWwoKSk7XG59XG4iLCI8bWF0LXRhYmxlXG4gIGNka0Ryb3BMaXN0XG4gIGNka0Ryb3BMaXN0TG9ja0F4aXM9J3gnXG4gIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxuICBjbGFzcz1cInRhYmxlLWRyYWctbGlzdFwiXG4gIFtjbGFzc109XCIoc2hvd0Zvb3RlclJvdyQgfCBhc3luYylcIlxuICAjdGFibGVcbiAgW2RhdGFTb3VyY2VdPVwic3RhdGUucHJvcHMoKS5kYXRhU291cmNlIVwiXG4gIFt0cmFja0J5XT1cInRyYWNrQnlGdW5jdGlvblwiXG4gIFtzdHlsZV09XCJ0YWJsZVdpZHRoIHwgYXN5bmMgXCJcbj5cblxuICA8IS0tIHNlbGVjdCBjb2x1bW4gLS0+XG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG5cbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmICBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cbiAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIShtYXN0ZXJUb2dnbGVDaGVja2VkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIm1hc3RlclRvZ2dsZUluZGV0ZXJtaW5hdGUkIHwgYXN5bmNcIj5cbiAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxuICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKHJvdykgOiBudWxsXCJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiLz5cbiAgICA8L21hdC1jZWxsPlxuXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cbiAgICAgIHt7IHNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggfX1cbiAgICA8L21hdC1mb290ZXItY2VsbD5cbiAgPC9uZy1jb250YWluZXI+XG5cblxuICA8IS0tIGluZGV4IGNvbHVtbiAtLT5cbiAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbmRleFwiPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJmLW1hdC1oZWFkZXItY2VsbFwiIGNsYXNzPVwiaW5kZXgtY29sdW1uXCI+I1xuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJpbmRleC1jb2x1bW5cIj5cbiAgICAgIHt7IDEgKyBpICsgb2Zmc2V0SW5kZXggfX1cbiAgICA8L21hdC1jZWxsPlxuICAgIDxtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWYgY2xhc3M9XCJpbmRleC1jb2x1bW5cIj48L21hdC1mb290ZXItY2VsbD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBHcm91cGluZyAtLT5cbiAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJncm91cEhlYWRlclwiPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgIEBsZXQgZXhwYW5kZWQgPSAoc3RhdGUuZ2V0SXNFeHBhbmRlZCB8IGZ1bmMgOiByb3cua2V5IDogcm93Lmdyb3VwTmFtZSApO1xuICAgICAgPGRpdiBbc3R5bGUucGFkZGluZ0xlZnRdPVwicm93LnBhZGRpbmcgKyAncHggIWltcG9ydGFudCdcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldEV4cGFuZGVkKHJvdy5rZXksIHJvdy5ncm91cE5hbWUsICFleHBhbmRlZCgpKTtcIj5cbiAgICAgICAgICBAaWYgKCFleHBhbmRlZCgpKSB7XG4gICAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8bWF0LWljb24+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIHt7IGdldFRyYW5zZm9ybSB8IGZ1bmMgOiByb3cua2V5IDogIHJvdy5ncm91cEhlYWRlckRpc3BsYXkgfX0gKHt7IHJvdy5sZW5ndGggfX0pXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWdyb3c6IDFcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXRlLnByb3BzKCkuZ3JvdXBIZWFkZXJUZW1wbGF0ZSE7IGNvbnRleHQ6IHsgZWxlbWVudDogcm93IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIEBpZiAoc2hvd0hlYWRlciQgfCBhc3luYykge1xuICAgIDxtYXQtaGVhZGVyLXJvdyBbc3R5bGUuaGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiIFtzdHlsZS5taW4taGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICptYXRIZWFkZXJSb3dEZWY9XCJrZXlzOyBzdGlja3k6IHN0YXRlLnByb3BzKCkuaXNTdGlja3lcIiBbc3R5bGUudG9wLnB4XT1cIigob2Zmc2V0JCB8IGFzeW5jKSEgKiAtMSlcIi8+XG4gIH1cbiAgPG1hdC1yb3cgW3N0eWxlLmhlaWdodF09XCIkcm93SGVpZ2h0KClcIiBbc3R5bGUubWluLWhlaWdodF09XCIkcm93SGVpZ2h0KClcIlxuICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczoga2V5czsgbGV0IGkgPSBpbmRleFwiLz5cbiAgPG1hdC1yb3cgW3N0eWxlLmhlaWdodF09XCJzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ID8gc3RhdGUucHJvcHMoKS5ncm91cEhlYWRlckhlaWdodCArICdweCcgOiAkZ3JvdXBIZWFkZXJIZWlnaHQoKVwiXG4gICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0XT1cInN0YXRlLnByb3BzKCkuZ3JvdXBIZWFkZXJIZWlnaHQgPyBzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JyA6ICRncm91cEhlYWRlckhlaWdodCgpXCJcbiAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cEhlYWRlclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIvPlxuICA8bWF0LWZvb3Rlci1yb3cgW3N0eWxlLmhlaWdodF09XCIkcm93SGVpZ2h0KClcIiBbc3R5bGUubWluLWhlaWdodF09XCIkcm93SGVpZ2h0KClcIlxuICAgICAgICAgICAgICAgICAgKm1hdEZvb3RlclJvd0RlZj1cIihzaG93Rm9vdGVyUm93JCB8IGFzeW5jKSA9PT0gJ3JlZ3VsYXItZm9vdGVyJyA/IGtleXMgOiBbXTsgc3RpY2t5OiAkc3RpY2t5Rm9vdGVyKCkgXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5ib3R0b20ucHhdPVwiJHN0aWNreUZvb3RlcigpID8gKG9mZnNldCQgfCBhc3luYykgOiB1bmRlZmluZWRcIi8+XG5cbjwvbWF0LXRhYmxlPlxuIl19