@aquera/ngx-smart-table 0.0.17-alpha → 0.0.19-alpha

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 (170) hide show
  1. package/{fesm2020 → fesm2022}/aquera-ngx-smart-table.mjs +1579 -2101
  2. package/fesm2022/aquera-ngx-smart-table.mjs.map +1 -0
  3. package/package.json +8 -16
  4. package/types/aquera-ngx-smart-table.d.ts +5909 -0
  5. package/aquera-ngx-smart-table.d.ts +0 -5
  6. package/esm2020/aquera-ngx-smart-table.mjs +0 -5
  7. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +0 -63
  8. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +0 -115
  9. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +0 -206
  10. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +0 -125
  11. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +0 -105
  12. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +0 -132
  13. package/esm2020/lib/builder/definition-builder.module.mjs +0 -70
  14. package/esm2020/lib/builder/models/builder-state.interface.mjs +0 -5
  15. package/esm2020/lib/builder/services/definition-builder.service.mjs +0 -251
  16. package/esm2020/lib/builder/services/definition-export.service.mjs +0 -167
  17. package/esm2020/lib/builder/services/definition-import.service.mjs +0 -193
  18. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +0 -126
  19. package/esm2020/lib/builder/utils/config-validator.util.mjs +0 -165
  20. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +0 -206
  21. package/esm2020/lib/editors/index.mjs +0 -9
  22. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +0 -228
  23. package/esm2020/lib/editors/nile-calendar-editor.mjs +0 -211
  24. package/esm2020/lib/editors/nile-date-picker-editor.mjs +0 -188
  25. package/esm2020/lib/editors/nile-input-editor.mjs +0 -235
  26. package/esm2020/lib/editors/nile-select-editor.mjs +0 -498
  27. package/esm2020/lib/factories/column-config.factory.mjs +0 -231
  28. package/esm2020/lib/models/autosave-config.interface.mjs +0 -8
  29. package/esm2020/lib/models/base-column-config.class.mjs +0 -253
  30. package/esm2020/lib/models/cell-strategies.interface.mjs +0 -6
  31. package/esm2020/lib/models/cell-types.mjs +0 -147
  32. package/esm2020/lib/models/column-action.interface.mjs +0 -6
  33. package/esm2020/lib/models/column-config.interface.mjs +0 -43
  34. package/esm2020/lib/models/column-config.utils.mjs +0 -101
  35. package/esm2020/lib/models/row-action.interface.mjs +0 -5
  36. package/esm2020/lib/models/row-validator.interface.mjs +0 -2
  37. package/esm2020/lib/models/schema-validation.interface.mjs +0 -2
  38. package/esm2020/lib/models/sheet-action.interface.mjs +0 -5
  39. package/esm2020/lib/models/sheet-config.interface.mjs +0 -5
  40. package/esm2020/lib/models/table-config.interface.mjs +0 -107
  41. package/esm2020/lib/models/table-validator.interface.mjs +0 -2
  42. package/esm2020/lib/models/workbook-action.interface.mjs +0 -5
  43. package/esm2020/lib/models/workbook-config.interface.mjs +0 -5
  44. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +0 -24
  45. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +0 -397
  46. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +0 -103
  47. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +0 -383
  48. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +0 -232
  49. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +0 -97
  50. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +0 -157
  51. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +0 -87
  52. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +0 -167
  53. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +0 -165
  54. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +0 -112
  55. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +0 -1453
  56. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +0 -169
  57. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +0 -581
  58. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +0 -28
  59. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +0 -108
  60. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +0 -83
  61. package/esm2020/lib/renderer/models/cell-state.interface.mjs +0 -66
  62. package/esm2020/lib/renderer/models/cell.class.mjs +0 -389
  63. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +0 -7
  64. package/esm2020/lib/renderer/models/sheet-state.class.mjs +0 -90
  65. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +0 -5
  66. package/esm2020/lib/renderer/models/table-state.class.mjs +0 -871
  67. package/esm2020/lib/renderer/models/table-state.interface.mjs +0 -5
  68. package/esm2020/lib/renderer/models/table-types.mjs +0 -29
  69. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +0 -7
  70. package/esm2020/lib/renderer/models/workbook-state.class.mjs +0 -174
  71. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +0 -5
  72. package/esm2020/lib/renderer/models/z-index.enum.mjs +0 -55
  73. package/esm2020/lib/schemas/table-config.schema.mjs +0 -472
  74. package/esm2020/lib/services/autosave.service.mjs +0 -92
  75. package/esm2020/lib/services/custom-validation-rules.util.mjs +0 -124
  76. package/esm2020/lib/services/json-schema-validator.service.mjs +0 -216
  77. package/esm2020/lib/services/row-validation.service.mjs +0 -42
  78. package/esm2020/lib/services/validation-logger.service.mjs +0 -177
  79. package/esm2020/lib/services/virtual-scroll.service.mjs +0 -52
  80. package/esm2020/lib/shared/shared-table-components.module.mjs +0 -35
  81. package/esm2020/lib/smart-table.module.mjs +0 -124
  82. package/esm2020/lib/strategies/default-editors.mjs +0 -433
  83. package/esm2020/lib/strategies/default-formatters.mjs +0 -238
  84. package/esm2020/lib/strategies/default-validators.mjs +0 -327
  85. package/esm2020/public-api.mjs +0 -146
  86. package/fesm2015/aquera-ngx-smart-table.mjs +0 -12347
  87. package/fesm2015/aquera-ngx-smart-table.mjs.map +0 -1
  88. package/fesm2020/aquera-ngx-smart-table.mjs.map +0 -1
  89. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +0 -31
  90. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +0 -53
  91. package/lib/builder/components/column-editor/column-editor.component.d.ts +0 -69
  92. package/lib/builder/components/column-list/column-list.component.d.ts +0 -65
  93. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +0 -58
  94. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +0 -32
  95. package/lib/builder/definition-builder.module.d.ts +0 -15
  96. package/lib/builder/models/builder-state.interface.d.ts +0 -93
  97. package/lib/builder/services/definition-builder.service.d.ts +0 -80
  98. package/lib/builder/services/definition-export.service.d.ts +0 -59
  99. package/lib/builder/services/definition-import.service.d.ts +0 -31
  100. package/lib/builder/services/sample-data-generator.service.d.ts +0 -41
  101. package/lib/builder/utils/config-validator.util.d.ts +0 -32
  102. package/lib/builder/utils/typescript-generator.util.d.ts +0 -29
  103. package/lib/editors/index.d.ts +0 -8
  104. package/lib/editors/nile-autocomplete-editor.d.ts +0 -102
  105. package/lib/editors/nile-calendar-editor.d.ts +0 -88
  106. package/lib/editors/nile-date-picker-editor.d.ts +0 -97
  107. package/lib/editors/nile-input-editor.d.ts +0 -67
  108. package/lib/editors/nile-select-editor.d.ts +0 -113
  109. package/lib/factories/column-config.factory.d.ts +0 -73
  110. package/lib/models/autosave-config.interface.d.ts +0 -23
  111. package/lib/models/base-column-config.class.d.ts +0 -115
  112. package/lib/models/cell-strategies.interface.d.ts +0 -188
  113. package/lib/models/cell-types.d.ts +0 -337
  114. package/lib/models/column-action.interface.d.ts +0 -86
  115. package/lib/models/column-config.interface.d.ts +0 -272
  116. package/lib/models/column-config.utils.d.ts +0 -37
  117. package/lib/models/row-action.interface.d.ts +0 -86
  118. package/lib/models/row-validator.interface.d.ts +0 -37
  119. package/lib/models/schema-validation.interface.d.ts +0 -42
  120. package/lib/models/sheet-action.interface.d.ts +0 -59
  121. package/lib/models/sheet-config.interface.d.ts +0 -41
  122. package/lib/models/table-config.interface.d.ts +0 -251
  123. package/lib/models/table-validator.interface.d.ts +0 -40
  124. package/lib/models/workbook-action.interface.d.ts +0 -95
  125. package/lib/models/workbook-config.interface.d.ts +0 -107
  126. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +0 -9
  127. package/lib/renderer/components/st-cell/st-cell.component.d.ts +0 -69
  128. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +0 -39
  129. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +0 -139
  130. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +0 -81
  131. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +0 -44
  132. package/lib/renderer/components/st-header/st-header.component.d.ts +0 -93
  133. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +0 -42
  134. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +0 -67
  135. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +0 -98
  136. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +0 -58
  137. package/lib/renderer/components/st-table/st-table.component.d.ts +0 -380
  138. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +0 -77
  139. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +0 -275
  140. package/lib/renderer/directives/click-outside.directive.d.ts +0 -10
  141. package/lib/renderer/directives/st-column-resize.directive.d.ts +0 -44
  142. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +0 -19
  143. package/lib/renderer/models/cell-state.interface.d.ts +0 -118
  144. package/lib/renderer/models/cell.class.d.ts +0 -174
  145. package/lib/renderer/models/row-validation-state.interface.d.ts +0 -27
  146. package/lib/renderer/models/sheet-state.class.d.ts +0 -67
  147. package/lib/renderer/models/sheet-state.interface.d.ts +0 -55
  148. package/lib/renderer/models/table-state.class.d.ts +0 -320
  149. package/lib/renderer/models/table-state.interface.d.ts +0 -18
  150. package/lib/renderer/models/table-types.d.ts +0 -228
  151. package/lib/renderer/models/table-validation-state.interface.d.ts +0 -34
  152. package/lib/renderer/models/workbook-state.class.d.ts +0 -117
  153. package/lib/renderer/models/workbook-state.interface.d.ts +0 -71
  154. package/lib/renderer/models/z-index.enum.d.ts +0 -44
  155. package/lib/schemas/table-config.schema.d.ts +0 -455
  156. package/lib/services/autosave.service.d.ts +0 -73
  157. package/lib/services/custom-validation-rules.util.d.ts +0 -12
  158. package/lib/services/json-schema-validator.service.d.ts +0 -49
  159. package/lib/services/row-validation.service.d.ts +0 -17
  160. package/lib/services/validation-logger.service.d.ts +0 -87
  161. package/lib/services/virtual-scroll.service.d.ts +0 -44
  162. package/lib/shared/shared-table-components.module.d.ts +0 -9
  163. package/lib/smart-table.module.d.ts +0 -26
  164. package/lib/strategies/default-editors.d.ts +0 -109
  165. package/lib/strategies/default-formatters.d.ts +0 -116
  166. package/lib/strategies/default-validators.d.ts +0 -113
  167. package/public-api.d.ts +0 -70
  168. package/src/lib/builder/README.md +0 -30
  169. package/src/lib/editors/README.md +0 -303
  170. package/src/lib/renderer/components/st-column-filter/README.md +0 -286
@@ -1,383 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { FilterOperator } from '../../models/table-types';
3
- import { CellDataType } from '../../../models/cell-types';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- /**
7
- * Filter popup component for per-column filtering
8
- * Uses Nile components for consistent UI
9
- * Designed as a shared component with context input
10
- */
11
- export class StColumnFilterComponent {
12
- constructor() {
13
- this.columnIndex = 0;
14
- this.isFirstColumn = false;
15
- this.isLastColumn = false;
16
- this._isOpen = false;
17
- this.closed = new EventEmitter();
18
- this.filterApplied = new EventEmitter();
19
- this.filterCleared = new EventEmitter();
20
- // Current filter state
21
- this.selectedOperator = FilterOperator.CONTAINS;
22
- this.filterValue = '';
23
- this.selectedValues = []; // For multi-select
24
- // Available operators for the current column
25
- this.availableOperators = [];
26
- // Input type to render
27
- this.inputType = 'text';
28
- // Dropdown options (for custom filter options)
29
- this.dropdownOptions = [];
30
- }
31
- set isOpen(value) {
32
- this._isOpen = value;
33
- if (value) {
34
- // Reinitialize when opened
35
- this.initializeFilterState();
36
- this.determineInputType();
37
- this.setAvailableOperators();
38
- }
39
- }
40
- get isOpen() {
41
- return this._isOpen;
42
- }
43
- /**
44
- * Get filter context for external use
45
- */
46
- get context() {
47
- return {
48
- column: this.column,
49
- tableState: this.tableState,
50
- columnIndex: this.columnIndex,
51
- isFirstColumn: this.isFirstColumn,
52
- isLastColumn: this.isLastColumn
53
- };
54
- }
55
- /**
56
- * Set filter context (allows using component as context-driven)
57
- */
58
- set filterContext(context) {
59
- if (context) {
60
- this.column = context.column;
61
- this.tableState = context.tableState;
62
- this.columnIndex = context.columnIndex;
63
- this.isFirstColumn = context.isFirstColumn;
64
- this.isLastColumn = context.isLastColumn;
65
- }
66
- }
67
- ngOnInit() {
68
- this.initializeFilterState();
69
- this.determineInputType();
70
- this.setAvailableOperators();
71
- }
72
- ngAfterViewInit() {
73
- // Popover will be controlled via isOpen property
74
- }
75
- ngOnChanges(changes) {
76
- // When isOpen changes, show/hide the popover
77
- if (changes['isOpen'] && this.filterAnchor) {
78
- const popover = this.filterAnchor.nativeElement.closest('nile-popover');
79
- if (popover) {
80
- if (this.isOpen) {
81
- popover.show();
82
- }
83
- else {
84
- popover.hide();
85
- }
86
- }
87
- }
88
- }
89
- /**
90
- * Initialize filter state from column config
91
- */
92
- initializeFilterState() {
93
- // Set operator from column or use default
94
- this.selectedOperator = this.column.filterConfig?.operator || FilterOperator.CONTAINS;
95
- // Set value from column if filter is active
96
- if (this.column.filterConfig?.enabled && this.column.filterConfig?.value !== undefined) {
97
- if (Array.isArray(this.column.filterConfig.value)) {
98
- this.selectedValues = [...this.column.filterConfig.value];
99
- }
100
- else {
101
- this.filterValue = this.column.filterConfig.value;
102
- }
103
- }
104
- }
105
- /**
106
- * Determine which input type to render based on priority
107
- */
108
- determineInputType() {
109
- // Priority 1: Custom dropdown options
110
- if (this.hasValidFilterOptions()) {
111
- this.processDropdownOptions();
112
- this.inputType = this.column.filterConfig?.options?.multiselect ? 'multiselect' : 'select';
113
- return;
114
- }
115
- // Priority 2: Data type based
116
- const dataType = this.column.dataType;
117
- switch (dataType) {
118
- case CellDataType.NUMBER:
119
- this.inputType = 'number';
120
- break;
121
- case CellDataType.DATE:
122
- this.inputType = 'date';
123
- break;
124
- case CellDataType.BOOLEAN:
125
- this.inputType = 'checkbox';
126
- break;
127
- case CellDataType.STRING:
128
- case CellDataType.CUSTOM:
129
- default:
130
- this.inputType = 'text';
131
- break;
132
- }
133
- }
134
- /**
135
- * Check if column has valid filter options configuration
136
- */
137
- hasValidFilterOptions() {
138
- return !!(this.column.filterConfig?.options &&
139
- this.column.filterConfig.options.data &&
140
- this.column.filterConfig.options.handler &&
141
- Array.isArray(this.column.filterConfig.options.data) &&
142
- typeof this.column.filterConfig.options.handler === 'function');
143
- }
144
- /**
145
- * Process dropdown options using the handler
146
- */
147
- processDropdownOptions() {
148
- if (!this.column.filterConfig?.options)
149
- return;
150
- try {
151
- this.dropdownOptions = this.column.filterConfig.options.data.map(item => {
152
- const result = this.column.filterConfig.options.handler(item);
153
- return {
154
- label: result.label,
155
- value: result.value
156
- };
157
- });
158
- }
159
- catch (error) {
160
- console.error('Error processing filter options:', error);
161
- this.dropdownOptions = [];
162
- }
163
- }
164
- /**
165
- * Set available operators based on input type
166
- */
167
- setAvailableOperators() {
168
- switch (this.inputType) {
169
- case 'text':
170
- this.availableOperators = [
171
- { value: FilterOperator.EQUALS, label: 'Equals' },
172
- { value: FilterOperator.CONTAINS, label: 'Contains' },
173
- { value: FilterOperator.STARTS_WITH, label: 'Starts With' },
174
- { value: FilterOperator.ENDS_WITH, label: 'Ends With' }
175
- ];
176
- break;
177
- case 'number':
178
- case 'date':
179
- this.availableOperators = [
180
- { value: FilterOperator.EQUALS, label: 'Equals' },
181
- { value: FilterOperator.GT, label: this.inputType === 'date' ? 'After' : 'Greater Than (>)' },
182
- { value: FilterOperator.LT, label: this.inputType === 'date' ? 'Before' : 'Less Than (<)' },
183
- { value: FilterOperator.GTE, label: this.inputType === 'date' ? 'On or After (≥)' : 'Greater or Equal (≥)' },
184
- { value: FilterOperator.LTE, label: this.inputType === 'date' ? 'On or Before (≤)' : 'Less or Equal (≤)' }
185
- ];
186
- break;
187
- case 'checkbox':
188
- case 'select':
189
- this.availableOperators = [
190
- { value: FilterOperator.EQUALS, label: 'Equals' }
191
- ];
192
- this.selectedOperator = FilterOperator.EQUALS;
193
- break;
194
- case 'multiselect':
195
- this.availableOperators = [
196
- { value: FilterOperator.IN, label: 'In' }
197
- ];
198
- this.selectedOperator = FilterOperator.IN;
199
- break;
200
- default:
201
- this.availableOperators = [
202
- { value: FilterOperator.EQUALS, label: 'Equals' },
203
- { value: FilterOperator.CONTAINS, label: 'Contains' }
204
- ];
205
- break;
206
- }
207
- }
208
- /**
209
- * Open the filter popup
210
- */
211
- open() {
212
- this.isOpen = true;
213
- }
214
- /**
215
- * Close the filter popup
216
- */
217
- close() {
218
- this.isOpen = false;
219
- this.closed.emit();
220
- }
221
- /**
222
- * Handle popover hide event from nile-popover
223
- */
224
- onPopoverHide() {
225
- this.close();
226
- }
227
- /**
228
- * Handle operator change from nile-select
229
- */
230
- onOperatorChange(event) {
231
- const customEvent = event;
232
- this.selectedOperator = customEvent.detail.value;
233
- }
234
- /**
235
- * Handle value input from nile-input
236
- */
237
- onValueInput(event) {
238
- const customEvent = event;
239
- this.filterValue = customEvent.detail.value;
240
- }
241
- /**
242
- * Handle checkbox change from nile-checkbox
243
- */
244
- onCheckboxChange(event) {
245
- const customEvent = event;
246
- this.filterValue = customEvent.detail.checked;
247
- }
248
- /**
249
- * Handle select change from nile-select
250
- */
251
- onSelectChange(event) {
252
- const customEvent = event;
253
- this.filterValue = customEvent.detail.value;
254
- }
255
- /**
256
- * Handle multiselect checkbox change
257
- */
258
- onMultiselectCheckboxChange(event, value) {
259
- const customEvent = event;
260
- const checked = customEvent.detail.checked;
261
- if (checked) {
262
- if (!this.selectedValues.includes(value)) {
263
- this.selectedValues.push(value);
264
- }
265
- }
266
- else {
267
- const index = this.selectedValues.indexOf(value);
268
- if (index > -1) {
269
- this.selectedValues.splice(index, 1);
270
- }
271
- }
272
- }
273
- /**
274
- * Apply the filter
275
- */
276
- onApply() {
277
- if (!this.tableState)
278
- return;
279
- let value;
280
- // Get the value based on input type
281
- if (this.inputType === 'multiselect') {
282
- value = this.selectedValues.length > 0 ? this.selectedValues : null;
283
- }
284
- else if (this.inputType === 'checkbox') {
285
- value = this.filterValue;
286
- }
287
- else {
288
- value = this.filterValue !== '' ? this.filterValue : null;
289
- }
290
- // Apply filter via table state
291
- if (value !== null) {
292
- this.tableState.setFilterOnColumn(this.column.key, this.selectedOperator, value);
293
- this.filterApplied.emit({ operator: this.selectedOperator, value });
294
- }
295
- else {
296
- // Clear filter if no value
297
- this.onClear();
298
- return;
299
- }
300
- this.close();
301
- }
302
- /**
303
- * Clear the filter
304
- */
305
- onClear() {
306
- if (!this.tableState)
307
- return;
308
- // Reset local state
309
- this.filterValue = this.inputType === 'checkbox' ? false : '';
310
- this.selectedValues = [];
311
- // Clear filter via table state
312
- this.tableState.clearFilterOnColumn(this.column.key);
313
- this.filterCleared.emit();
314
- this.close();
315
- }
316
- /**
317
- * Handle multiselect change (kept for backward compatibility)
318
- * @deprecated Use onMultiselectCheckboxChange instead
319
- */
320
- onMultiselectChange(value, event) {
321
- const checked = event.target.checked;
322
- if (checked) {
323
- if (!this.selectedValues.includes(value)) {
324
- this.selectedValues.push(value);
325
- }
326
- }
327
- else {
328
- const index = this.selectedValues.indexOf(value);
329
- if (index > -1) {
330
- this.selectedValues.splice(index, 1);
331
- }
332
- }
333
- }
334
- /**
335
- * Check if a value is selected in multiselect
336
- */
337
- isValueSelected(value) {
338
- return this.selectedValues.includes(value);
339
- }
340
- /**
341
- * Get column display name
342
- */
343
- getColumnName() {
344
- return this.column.header || this.column.key;
345
- }
346
- /**
347
- * Determine if filter should align to the left (for first few columns)
348
- */
349
- shouldAlignLeft() {
350
- // Align left for first 2 columns to prevent clipping
351
- return this.columnIndex <= 1;
352
- }
353
- }
354
- StColumnFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
355
- StColumnFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StColumnFilterComponent, selector: "st-column-filter", inputs: { column: "column", tableState: "tableState", columnIndex: "columnIndex", isFirstColumn: "isFirstColumn", isLastColumn: "isLastColumn", isOpen: "isOpen", filterContext: "filterContext" }, outputs: { closed: "closed", filterApplied: "filterApplied", filterCleared: "filterCleared" }, viewQueries: [{ propertyName: "filterAnchor", first: true, predicate: ["filterAnchor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: " <!-- Popover content -->\n <div class=\"filter-content\">\n <!-- Operator Select -->\n <nile-select \n *ngIf=\"availableOperators.length > 1\"\n label=\"Operator\"\n [value]=\"selectedOperator\"\n (nile-change)=\"onOperatorChange($event)\"\n class=\"filter-operator\">\n <nile-option \n *ngFor=\"let op of availableOperators\" \n [value]=\"op.value\">\n {{ op.label }}\n </nile-option>\n </nile-select>\n \n <!-- Input Field based on type -->\n <div class=\"filter-value-section\">\n \n <!-- Text Input -->\n <nile-input \n *ngIf=\"inputType === 'text'\"\n type=\"text\"\n label=\"Value\"\n [value]=\"filterValue\"\n placeholder=\"Enter value...\"\n (nile-input)=\"onValueInput($event)\"\n class=\"filter-value-input\">\n </nile-input>\n \n <!-- Number Input -->\n <nile-input \n *ngIf=\"inputType === 'number'\"\n type=\"number\"\n label=\"Value\"\n [value]=\"filterValue\"\n placeholder=\"Enter number...\"\n (nile-input)=\"onValueInput($event)\"\n class=\"filter-value-input\">\n </nile-input>\n \n <!-- Date Input -->\n <nile-input \n *ngIf=\"inputType === 'date'\"\n type=\"date\"\n label=\"Value\"\n [value]=\"filterValue\"\n (nile-input)=\"onValueInput($event)\"\n class=\"filter-value-input\">\n </nile-input>\n \n <!-- Checkbox Input -->\n <nile-checkbox\n *ngIf=\"inputType === 'checkbox'\"\n [checked]=\"filterValue\"\n (nile-change)=\"onCheckboxChange($event)\"\n class=\"filter-checkbox\">\n {{ filterValue ? 'True' : 'False' }}\n </nile-checkbox>\n \n <!-- Single Select Dropdown -->\n <nile-select \n *ngIf=\"inputType === 'select'\"\n label=\"Value\"\n [value]=\"filterValue\"\n placeholder=\"-- Select --\"\n (nile-change)=\"onSelectChange($event)\"\n class=\"filter-value-select\">\n <nile-option \n *ngFor=\"let option of dropdownOptions\" \n [value]=\"option.value\">\n {{ option.label }}\n </nile-option>\n </nile-select>\n \n <!-- Multi-Select with Radio Group as example (or keep checkboxes) -->\n <div *ngIf=\"inputType === 'multiselect'\" class=\"filter-multiselect\">\n <label class=\"multiselect-title\">Select Values</label>\n <div class=\"multiselect-options\">\n <nile-checkbox\n *ngFor=\"let option of dropdownOptions\"\n [checked]=\"isValueSelected(option.value)\"\n [value]=\"option.value\"\n (nile-change)=\"onMultiselectCheckboxChange($event, option.value)\"\n class=\"multiselect-checkbox\">\n {{ option.label }}\n </nile-checkbox>\n </div>\n <div *ngIf=\"dropdownOptions.length === 0\" class=\"empty-state\">\n No options available\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"filter-actions\">\n <nile-button \n variant=\"primary\"\n size=\"small\"\n (click)=\"onApply()\">\n Apply\n </nile-button>\n <nile-button \n variant=\"default\"\n size=\"small\"\n (click)=\"onClear()\">\n Clear\n </nile-button>\n </div>\n </div>\n", styles: [".filter-content{padding:16px;display:flex;flex-direction:column;gap:16px}.filter-content nile-select,.filter-content nile-input,.filter-content nile-checkbox{width:100%}.filter-content .filter-operator,.filter-content .filter-value-input,.filter-content .filter-value-select{margin-bottom:0}.filter-value-section{display:flex;flex-direction:column;gap:12px}.filter-value-section nile-checkbox{margin-top:8px}.filter-multiselect{display:flex;flex-direction:column;gap:8px}.filter-multiselect .multiselect-title{display:block;font-size:13px;font-weight:600;color:#2d3748;margin-bottom:8px}.filter-multiselect .multiselect-options{max-height:200px;overflow-y:auto;border:1px solid #cbd5e0;border-radius:4px;padding:8px;background-color:#f7fafc;display:flex;flex-direction:column;gap:6px}.filter-multiselect .multiselect-options nile-checkbox{width:100%}.filter-multiselect .multiselect-options nile-checkbox::part(base){padding:4px 8px;border-radius:4px;transition:background-color .15s}.filter-multiselect .multiselect-options nile-checkbox:hover::part(base){background-color:#edf2f7}.filter-multiselect .empty-state{padding:12px;text-align:center;color:#718096;font-size:13px}.filter-actions{display:flex;gap:8px;justify-content:flex-end;padding-top:12px;border-top:1px solid #e2e8f0;margin-top:4px}.filter-actions nile-button{flex:0 0 auto}.multiselect-options::-webkit-scrollbar{width:6px}.multiselect-options::-webkit-scrollbar-track{background:#edf2f7;border-radius:3px}.multiselect-options::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:3px}.multiselect-options::-webkit-scrollbar-thumb:hover{background:#a0aec0}nile-input::part(base){width:100%}nile-select::part(base){width:100%}nile-button::part(base){min-width:80px}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
356
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnFilterComponent, decorators: [{
357
- type: Component,
358
- args: [{ selector: 'st-column-filter', template: " <!-- Popover content -->\n <div class=\"filter-content\">\n <!-- Operator Select -->\n <nile-select \n *ngIf=\"availableOperators.length > 1\"\n label=\"Operator\"\n [value]=\"selectedOperator\"\n (nile-change)=\"onOperatorChange($event)\"\n class=\"filter-operator\">\n <nile-option \n *ngFor=\"let op of availableOperators\" \n [value]=\"op.value\">\n {{ op.label }}\n </nile-option>\n </nile-select>\n \n <!-- Input Field based on type -->\n <div class=\"filter-value-section\">\n \n <!-- Text Input -->\n <nile-input \n *ngIf=\"inputType === 'text'\"\n type=\"text\"\n label=\"Value\"\n [value]=\"filterValue\"\n placeholder=\"Enter value...\"\n (nile-input)=\"onValueInput($event)\"\n class=\"filter-value-input\">\n </nile-input>\n \n <!-- Number Input -->\n <nile-input \n *ngIf=\"inputType === 'number'\"\n type=\"number\"\n label=\"Value\"\n [value]=\"filterValue\"\n placeholder=\"Enter number...\"\n (nile-input)=\"onValueInput($event)\"\n class=\"filter-value-input\">\n </nile-input>\n \n <!-- Date Input -->\n <nile-input \n *ngIf=\"inputType === 'date'\"\n type=\"date\"\n label=\"Value\"\n [value]=\"filterValue\"\n (nile-input)=\"onValueInput($event)\"\n class=\"filter-value-input\">\n </nile-input>\n \n <!-- Checkbox Input -->\n <nile-checkbox\n *ngIf=\"inputType === 'checkbox'\"\n [checked]=\"filterValue\"\n (nile-change)=\"onCheckboxChange($event)\"\n class=\"filter-checkbox\">\n {{ filterValue ? 'True' : 'False' }}\n </nile-checkbox>\n \n <!-- Single Select Dropdown -->\n <nile-select \n *ngIf=\"inputType === 'select'\"\n label=\"Value\"\n [value]=\"filterValue\"\n placeholder=\"-- Select --\"\n (nile-change)=\"onSelectChange($event)\"\n class=\"filter-value-select\">\n <nile-option \n *ngFor=\"let option of dropdownOptions\" \n [value]=\"option.value\">\n {{ option.label }}\n </nile-option>\n </nile-select>\n \n <!-- Multi-Select with Radio Group as example (or keep checkboxes) -->\n <div *ngIf=\"inputType === 'multiselect'\" class=\"filter-multiselect\">\n <label class=\"multiselect-title\">Select Values</label>\n <div class=\"multiselect-options\">\n <nile-checkbox\n *ngFor=\"let option of dropdownOptions\"\n [checked]=\"isValueSelected(option.value)\"\n [value]=\"option.value\"\n (nile-change)=\"onMultiselectCheckboxChange($event, option.value)\"\n class=\"multiselect-checkbox\">\n {{ option.label }}\n </nile-checkbox>\n </div>\n <div *ngIf=\"dropdownOptions.length === 0\" class=\"empty-state\">\n No options available\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"filter-actions\">\n <nile-button \n variant=\"primary\"\n size=\"small\"\n (click)=\"onApply()\">\n Apply\n </nile-button>\n <nile-button \n variant=\"default\"\n size=\"small\"\n (click)=\"onClear()\">\n Clear\n </nile-button>\n </div>\n </div>\n", styles: [".filter-content{padding:16px;display:flex;flex-direction:column;gap:16px}.filter-content nile-select,.filter-content nile-input,.filter-content nile-checkbox{width:100%}.filter-content .filter-operator,.filter-content .filter-value-input,.filter-content .filter-value-select{margin-bottom:0}.filter-value-section{display:flex;flex-direction:column;gap:12px}.filter-value-section nile-checkbox{margin-top:8px}.filter-multiselect{display:flex;flex-direction:column;gap:8px}.filter-multiselect .multiselect-title{display:block;font-size:13px;font-weight:600;color:#2d3748;margin-bottom:8px}.filter-multiselect .multiselect-options{max-height:200px;overflow-y:auto;border:1px solid #cbd5e0;border-radius:4px;padding:8px;background-color:#f7fafc;display:flex;flex-direction:column;gap:6px}.filter-multiselect .multiselect-options nile-checkbox{width:100%}.filter-multiselect .multiselect-options nile-checkbox::part(base){padding:4px 8px;border-radius:4px;transition:background-color .15s}.filter-multiselect .multiselect-options nile-checkbox:hover::part(base){background-color:#edf2f7}.filter-multiselect .empty-state{padding:12px;text-align:center;color:#718096;font-size:13px}.filter-actions{display:flex;gap:8px;justify-content:flex-end;padding-top:12px;border-top:1px solid #e2e8f0;margin-top:4px}.filter-actions nile-button{flex:0 0 auto}.multiselect-options::-webkit-scrollbar{width:6px}.multiselect-options::-webkit-scrollbar-track{background:#edf2f7;border-radius:3px}.multiselect-options::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:3px}.multiselect-options::-webkit-scrollbar-thumb:hover{background:#a0aec0}nile-input::part(base){width:100%}nile-select::part(base){width:100%}nile-button::part(base){min-width:80px}\n"] }]
359
- }], propDecorators: { filterAnchor: [{
360
- type: ViewChild,
361
- args: ['filterAnchor', { static: false }]
362
- }], column: [{
363
- type: Input
364
- }], tableState: [{
365
- type: Input
366
- }], columnIndex: [{
367
- type: Input
368
- }], isFirstColumn: [{
369
- type: Input
370
- }], isLastColumn: [{
371
- type: Input
372
- }], isOpen: [{
373
- type: Input
374
- }], closed: [{
375
- type: Output
376
- }], filterApplied: [{
377
- type: Output
378
- }], filterCleared: [{
379
- type: Output
380
- }], filterContext: [{
381
- type: Input
382
- }] } });
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtY29sdW1uLWZpbHRlci9zdC1jb2x1bW4tZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jb2x1bW4tZmlsdGVyL3N0LWNvbHVtbi1maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQXVELE1BQU0sZUFBZSxDQUFDO0FBRy9JLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQWExRDs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHVCQUF1QjtJQUxwQztRQVVXLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBYy9CLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFZCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNsQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUE0QyxDQUFDO1FBQzdFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVuRCx1QkFBdUI7UUFDdkIscUJBQWdCLEdBQW1CLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFDM0QsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBVSxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7UUFFL0MsNkNBQTZD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dUI7d0dBQXZCLHVCQUF1Qiw4ZEMzQnBDLHc0R0E4R0E7MkZEbkZhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxrQkFBa0I7OEJBS2tCLFlBQVk7c0JBQXpELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFbkMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRU8sTUFBTTtzQkFBbEIsS0FBSztnQkFjSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQWdDTSxhQUFhO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IEZpbHRlck9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IENlbGxEYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jZWxsLXR5cGVzJztcblxuLyoqXG4gKiBGaWx0ZXIgY29udGV4dCBmb3IgdGhlIHBvcG92ZXIgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyQ29udGV4dCB7XG4gIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT47XG4gIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBjb2x1bW5JbmRleDogbnVtYmVyO1xuICBpc0ZpcnN0Q29sdW1uOiBib29sZWFuO1xuICBpc0xhc3RDb2x1bW46IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmlsdGVyIHBvcHVwIGNvbXBvbmVudCBmb3IgcGVyLWNvbHVtbiBmaWx0ZXJpbmdcbiAqIFVzZXMgTmlsZSBjb21wb25lbnRzIGZvciBjb25zaXN0ZW50IFVJXG4gKiBEZXNpZ25lZCBhcyBhIHNoYXJlZCBjb21wb25lbnQgd2l0aCBjb250ZXh0IGlucHV0XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LWNvbHVtbi1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3QtY29sdW1uLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0LWNvbHVtbi1maWx0ZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdENvbHVtbkZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnZmlsdGVyQW5jaG9yJywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbHRlckFuY2hvcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBcbiAgQElucHV0KCkgY29sdW1uITogQ29sdW1uQ29uZmlnPGFueT47XG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBASW5wdXQoKSBjb2x1bW5JbmRleDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgaXNGaXJzdENvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xhc3RDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIEBJbnB1dCgpIHNldCBpc09wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc09wZW4gPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIC8vIFJlaW5pdGlhbGl6ZSB3aGVuIG9wZW5lZFxuICAgICAgdGhpcy5pbml0aWFsaXplRmlsdGVyU3RhdGUoKTtcbiAgICAgIHRoaXMuZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgICB0aGlzLnNldEF2YWlsYWJsZU9wZXJhdG9ycygpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG4gIFxuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZmlsdGVyQXBwbGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3I7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIGZpbHRlckNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICAvLyBDdXJyZW50IGZpbHRlciBzdGF0ZVxuICBzZWxlY3RlZE9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvciA9IEZpbHRlck9wZXJhdG9yLkNPTlRBSU5TO1xuICBmaWx0ZXJWYWx1ZTogYW55ID0gJyc7XG4gIHNlbGVjdGVkVmFsdWVzOiBhbnlbXSA9IFtdOyAvLyBGb3IgbXVsdGktc2VsZWN0XG4gIFxuICAvLyBBdmFpbGFibGUgb3BlcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb2x1bW5cbiAgYXZhaWxhYmxlT3BlcmF0b3JzOiB7IHZhbHVlOiBGaWx0ZXJPcGVyYXRvcjsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgXG4gIC8vIElucHV0IHR5cGUgdG8gcmVuZGVyXG4gIGlucHV0VHlwZTogJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAnY2hlY2tib3gnIHwgJ3NlbGVjdCcgfCAnbXVsdGlzZWxlY3QnID0gJ3RleHQnO1xuICBcbiAgLy8gRHJvcGRvd24gb3B0aW9ucyAoZm9yIGN1c3RvbSBmaWx0ZXIgb3B0aW9ucylcbiAgZHJvcGRvd25PcHRpb25zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdID0gW107XG4gIFxuICAvKipcbiAgICogR2V0IGZpbHRlciBjb250ZXh0IGZvciBleHRlcm5hbCB1c2VcbiAgICovXG4gIGdldCBjb250ZXh0KCk6IEZpbHRlckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgdGFibGVTdGF0ZTogdGhpcy50YWJsZVN0YXRlLFxuICAgICAgY29sdW1uSW5kZXg6IHRoaXMuY29sdW1uSW5kZXgsXG4gICAgICBpc0ZpcnN0Q29sdW1uOiB0aGlzLmlzRmlyc3RDb2x1bW4sXG4gICAgICBpc0xhc3RDb2x1bW46IHRoaXMuaXNMYXN0Q29sdW1uXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNldCBmaWx0ZXIgY29udGV4dCAoYWxsb3dzIHVzaW5nIGNvbXBvbmVudCBhcyBjb250ZXh0LWRyaXZlbilcbiAgICovXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJDb250ZXh0KGNvbnRleHQ6IEZpbHRlckNvbnRleHQgfCBudWxsKSB7XG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29sdW1uID0gY29udGV4dC5jb2x1bW47XG4gICAgICB0aGlzLnRhYmxlU3RhdGUgPSBjb250ZXh0LnRhYmxlU3RhdGU7XG4gICAgICB0aGlzLmNvbHVtbkluZGV4ID0gY29udGV4dC5jb2x1bW5JbmRleDtcbiAgICAgIHRoaXMuaXNGaXJzdENvbHVtbiA9IGNvbnRleHQuaXNGaXJzdENvbHVtbjtcbiAgICAgIHRoaXMuaXNMYXN0Q29sdW1uID0gY29udGV4dC5pc0xhc3RDb2x1bW47XG4gICAgfVxuICB9XG4gIFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaWx0ZXJTdGF0ZSgpO1xuICAgIHRoaXMuZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgdGhpcy5zZXRBdmFpbGFibGVPcGVyYXRvcnMoKTtcbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFBvcG92ZXIgd2lsbCBiZSBjb250cm9sbGVkIHZpYSBpc09wZW4gcHJvcGVydHlcbiAgfVxuICBcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFdoZW4gaXNPcGVuIGNoYW5nZXMsIHNob3cvaGlkZSB0aGUgcG9wb3ZlclxuICAgIGlmIChjaGFuZ2VzWydpc09wZW4nXSAmJiB0aGlzLmZpbHRlckFuY2hvcikge1xuICAgICAgY29uc3QgcG9wb3ZlciA9IHRoaXMuZmlsdGVyQW5jaG9yLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnbmlsZS1wb3BvdmVyJykgYXMgYW55O1xuICAgICAgaWYgKHBvcG92ZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgcG9wb3Zlci5zaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcG9wb3Zlci5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGZpbHRlciBzdGF0ZSBmcm9tIGNvbHVtbiBjb25maWdcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZpbHRlclN0YXRlKCk6IHZvaWQge1xuICAgIC8vIFNldCBvcGVyYXRvciBmcm9tIGNvbHVtbiBvciB1c2UgZGVmYXVsdFxuICAgIHRoaXMuc2VsZWN0ZWRPcGVyYXRvciA9IHRoaXMuY29sdW1uLmZpbHRlckNvbmZpZz8ub3BlcmF0b3IgfHwgRmlsdGVyT3BlcmF0b3IuQ09OVEFJTlM7XG4gICAgXG4gICAgLy8gU2V0IHZhbHVlIGZyb20gY29sdW1uIGlmIGZpbHRlciBpcyBhY3RpdmVcbiAgICBpZiAodGhpcy5jb2x1bW4uZmlsdGVyQ29uZmlnPy5lbmFibGVkICYmIHRoaXMuY29sdW1uLmZpbHRlckNvbmZpZz8udmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jb2x1bW4uZmlsdGVyQ29uZmlnLnZhbHVlKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gWy4uLnRoaXMuY29sdW1uLmZpbHRlckNvbmZpZy52YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gdGhpcy5jb2x1bW4uZmlsdGVyQ29uZmlnLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVybWluZSB3aGljaCBpbnB1dCB0eXBlIHRvIHJlbmRlciBiYXNlZCBvbiBwcmlvcml0eVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlcm1pbmVJbnB1dFR5cGUoKTogdm9pZCB7XG4gICAgLy8gUHJpb3JpdHkgMTogQ3VzdG9tIGRyb3Bkb3duIG9wdGlvbnNcbiAgICBpZiAodGhpcy5oYXNWYWxpZEZpbHRlck9wdGlvbnMoKSkge1xuICAgICAgdGhpcy5wcm9jZXNzRHJvcGRvd25PcHRpb25zKCk7XG4gICAgICB0aGlzLmlucHV0VHlwZSA9IHRoaXMuY29sdW1uLmZpbHRlckNvbmZpZz8ub3B0aW9ucz8ubXVsdGlzZWxlY3QgPyAnbXVsdGlzZWxlY3QnIDogJ3NlbGVjdCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFByaW9yaXR5IDI6IERhdGEgdHlwZSBiYXNlZFxuICAgIGNvbnN0IGRhdGFUeXBlID0gdGhpcy5jb2x1bW4uZGF0YVR5cGU7XG4gICAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuTlVNQkVSOlxuICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICdudW1iZXInO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2VsbERhdGFUeXBlLkRBVEU6XG4gICAgICAgIHRoaXMuaW5wdXRUeXBlID0gJ2RhdGUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2VsbERhdGFUeXBlLkJPT0xFQU46XG4gICAgICAgIHRoaXMuaW5wdXRUeXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENlbGxEYXRhVHlwZS5TVFJJTkc6XG4gICAgICBjYXNlIENlbGxEYXRhVHlwZS5DVVNUT006XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmlucHV0VHlwZSA9ICd0ZXh0JztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgY29sdW1uIGhhcyB2YWxpZCBmaWx0ZXIgb3B0aW9ucyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGhhc1ZhbGlkRmlsdGVyT3B0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmNvbHVtbi5maWx0ZXJDb25maWc/Lm9wdGlvbnMgJiZcbiAgICAgIHRoaXMuY29sdW1uLmZpbHRlckNvbmZpZy5vcHRpb25zLmRhdGEgJiZcbiAgICAgIHRoaXMuY29sdW1uLmZpbHRlckNvbmZpZy5vcHRpb25zLmhhbmRsZXIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5jb2x1bW4uZmlsdGVyQ29uZmlnLm9wdGlvbnMuZGF0YSkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmNvbHVtbi5maWx0ZXJDb25maWcub3B0aW9ucy5oYW5kbGVyID09PSAnZnVuY3Rpb24nXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFByb2Nlc3MgZHJvcGRvd24gb3B0aW9ucyB1c2luZyB0aGUgaGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzRHJvcGRvd25PcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb2x1bW4uZmlsdGVyQ29uZmlnPy5vcHRpb25zKSByZXR1cm47XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZHJvcGRvd25PcHRpb25zID0gdGhpcy5jb2x1bW4uZmlsdGVyQ29uZmlnLm9wdGlvbnMuZGF0YS5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uLmZpbHRlckNvbmZpZyEub3B0aW9ucyEuaGFuZGxlcihpdGVtKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogcmVzdWx0LmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGZpbHRlciBvcHRpb25zOicsIGVycm9yKTtcbiAgICAgIHRoaXMuZHJvcGRvd25PcHRpb25zID0gW107XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2V0IGF2YWlsYWJsZSBvcGVyYXRvcnMgYmFzZWQgb24gaW5wdXQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRBdmFpbGFibGVPcGVyYXRvcnMoKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLmlucHV0VHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW1xuICAgICAgICAgIHsgdmFsdWU6IEZpbHRlck9wZXJhdG9yLkVRVUFMUywgbGFiZWw6ICdFcXVhbHMnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogRmlsdGVyT3BlcmF0b3IuQ09OVEFJTlMsIGxhYmVsOiAnQ29udGFpbnMnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogRmlsdGVyT3BlcmF0b3IuU1RBUlRTX1dJVEgsIGxhYmVsOiAnU3RhcnRzIFdpdGgnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogRmlsdGVyT3BlcmF0b3IuRU5EU19XSVRILCBsYWJlbDogJ0VuZHMgV2l0aCcgfVxuICAgICAgICBdO1xuICAgICAgICBicmVhaztcbiAgICAgIFxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFtcbiAgICAgICAgICB7IHZhbHVlOiBGaWx0ZXJPcGVyYXRvci5FUVVBTFMsIGxhYmVsOiAnRXF1YWxzJyB9LFxuICAgICAgICAgIHsgdmFsdWU6IEZpbHRlck9wZXJhdG9yLkdULCBsYWJlbDogdGhpcy5pbnB1dFR5cGUgPT09ICdkYXRlJyA/ICdBZnRlcicgOiAnR3JlYXRlciBUaGFuICg+KScgfSxcbiAgICAgICAgICB7IHZhbHVlOiBGaWx0ZXJPcGVyYXRvci5MVCwgbGFiZWw6IHRoaXMuaW5wdXRUeXBlID09PSAnZGF0ZScgPyAnQmVmb3JlJyA6ICdMZXNzIFRoYW4gKDwpJyB9LFxuICAgICAgICAgIHsgdmFsdWU6IEZpbHRlck9wZXJhdG9yLkdURSwgbGFiZWw6IHRoaXMuaW5wdXRUeXBlID09PSAnZGF0ZScgPyAnT24gb3IgQWZ0ZXIgKOKJpSknIDogJ0dyZWF0ZXIgb3IgRXF1YWwgKOKJpSknIH0sXG4gICAgICAgICAgeyB2YWx1ZTogRmlsdGVyT3BlcmF0b3IuTFRFLCBsYWJlbDogdGhpcy5pbnB1dFR5cGUgPT09ICdkYXRlJyA/ICdPbiBvciBCZWZvcmUgKOKJpCknIDogJ0xlc3Mgb3IgRXF1YWwgKOKJpCknIH1cbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBcbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW1xuICAgICAgICAgIHsgdmFsdWU6IEZpbHRlck9wZXJhdG9yLkVRVUFMUywgbGFiZWw6ICdFcXVhbHMnIH1cbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wZXJhdG9yID0gRmlsdGVyT3BlcmF0b3IuRVFVQUxTO1xuICAgICAgICBicmVhaztcbiAgICAgIFxuICAgICAgY2FzZSAnbXVsdGlzZWxlY3QnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFtcbiAgICAgICAgICB7IHZhbHVlOiBGaWx0ZXJPcGVyYXRvci5JTiwgbGFiZWw6ICdJbicgfVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3BlcmF0b3IgPSBGaWx0ZXJPcGVyYXRvci5JTjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW1xuICAgICAgICAgIHsgdmFsdWU6IEZpbHRlck9wZXJhdG9yLkVRVUFMUywgbGFiZWw6ICdFcXVhbHMnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogRmlsdGVyT3BlcmF0b3IuQ09OVEFJTlMsIGxhYmVsOiAnQ29udGFpbnMnIH1cbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogT3BlbiB0aGUgZmlsdGVyIHBvcHVwXG4gICAqL1xuICBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsb3NlIHRoZSBmaWx0ZXIgcG9wdXBcbiAgICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHBvcG92ZXIgaGlkZSBldmVudCBmcm9tIG5pbGUtcG9wb3ZlclxuICAgKi9cbiAgb25Qb3BvdmVySGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgb3BlcmF0b3IgY2hhbmdlIGZyb20gbmlsZS1zZWxlY3RcbiAgICovXG4gIG9uT3BlcmF0b3JDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDtcbiAgICB0aGlzLnNlbGVjdGVkT3BlcmF0b3IgPSBjdXN0b21FdmVudC5kZXRhaWwudmFsdWUgYXMgRmlsdGVyT3BlcmF0b3I7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdmFsdWUgaW5wdXQgZnJvbSBuaWxlLWlucHV0XG4gICAqL1xuICBvblZhbHVlSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDtcbiAgICB0aGlzLmZpbHRlclZhbHVlID0gY3VzdG9tRXZlbnQuZGV0YWlsLnZhbHVlO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNoZWNrYm94IGNoYW5nZSBmcm9tIG5pbGUtY2hlY2tib3hcbiAgICovXG4gIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDtcbiAgICB0aGlzLmZpbHRlclZhbHVlID0gY3VzdG9tRXZlbnQuZGV0YWlsLmNoZWNrZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0IGNoYW5nZSBmcm9tIG5pbGUtc2VsZWN0XG4gICAqL1xuICBvblNlbGVjdENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50O1xuICAgIHRoaXMuZmlsdGVyVmFsdWUgPSBjdXN0b21FdmVudC5kZXRhaWwudmFsdWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgbXVsdGlzZWxlY3QgY2hlY2tib3ggY2hhbmdlXG4gICAqL1xuICBvbk11bHRpc2VsZWN0Q2hlY2tib3hDaGFuZ2UoZXZlbnQ6IEV2ZW50LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDtcbiAgICBjb25zdCBjaGVja2VkID0gY3VzdG9tRXZlbnQuZGV0YWlsLmNoZWNrZWQ7XG4gICAgXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBmaWx0ZXJcbiAgICovXG4gIG9uQXBwbHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlU3RhdGUpIHJldHVybjtcbiAgICBcbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICBcbiAgICAvLyBHZXQgdGhlIHZhbHVlIGJhc2VkIG9uIGlucHV0IHR5cGVcbiAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwID8gdGhpcy5zZWxlY3RlZFZhbHVlcyA6IG51bGw7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgdmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZmlsdGVyVmFsdWUgIT09ICcnID8gdGhpcy5maWx0ZXJWYWx1ZSA6IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGZpbHRlciB2aWEgdGFibGUgc3RhdGVcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudGFibGVTdGF0ZS5zZXRGaWx0ZXJPbkNvbHVtbih0aGlzLmNvbHVtbi5rZXksIHRoaXMuc2VsZWN0ZWRPcGVyYXRvciwgdmFsdWUpO1xuICAgICAgdGhpcy5maWx0ZXJBcHBsaWVkLmVtaXQoeyBvcGVyYXRvcjogdGhpcy5zZWxlY3RlZE9wZXJhdG9yLCB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgZmlsdGVyIGlmIG5vIHZhbHVlXG4gICAgICB0aGlzLm9uQ2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgdGhlIGZpbHRlclxuICAgKi9cbiAgb25DbGVhcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIFJlc2V0IGxvY2FsIHN0YXRlXG4gICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHRoaXMuaW5wdXRUeXBlID09PSAnY2hlY2tib3gnID8gZmFsc2UgOiAnJztcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgXG4gICAgLy8gQ2xlYXIgZmlsdGVyIHZpYSB0YWJsZSBzdGF0ZVxuICAgIHRoaXMudGFibGVTdGF0ZS5jbGVhckZpbHRlck9uQ29sdW1uKHRoaXMuY29sdW1uLmtleSk7XG4gICAgdGhpcy5maWx0ZXJDbGVhcmVkLmVtaXQoKTtcbiAgICBcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgbXVsdGlzZWxlY3QgY2hhbmdlIChrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugb25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlIGluc3RlYWRcbiAgICovXG4gIG9uTXVsdGlzZWxlY3RDaGFuZ2UodmFsdWU6IGFueSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICBcbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkVmFsdWVzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBzZWxlY3RlZCBpbiBtdWx0aXNlbGVjdFxuICAgKi9cbiAgaXNWYWx1ZVNlbGVjdGVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY29sdW1uIGRpc3BsYXkgbmFtZVxuICAgKi9cbiAgZ2V0Q29sdW1uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbi5oZWFkZXIgfHwgdGhpcy5jb2x1bW4ua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiBmaWx0ZXIgc2hvdWxkIGFsaWduIHRvIHRoZSBsZWZ0IChmb3IgZmlyc3QgZmV3IGNvbHVtbnMpXG4gICAqL1xuICBzaG91bGRBbGlnbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgLy8gQWxpZ24gbGVmdCBmb3IgZmlyc3QgMiBjb2x1bW5zIHRvIHByZXZlbnQgY2xpcHBpbmdcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5JbmRleCA8PSAxO1xuICB9XG59XG5cbiIsIiAgPCEtLSBQb3BvdmVyIGNvbnRlbnQgLS0+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29udGVudFwiPlxuICAgIDwhLS0gT3BlcmF0b3IgU2VsZWN0IC0tPlxuICAgIDxuaWxlLXNlbGVjdCBcbiAgICAgICpuZ0lmPVwiYXZhaWxhYmxlT3BlcmF0b3JzLmxlbmd0aCA+IDFcIlxuICAgICAgbGFiZWw9XCJPcGVyYXRvclwiXG4gICAgICBbdmFsdWVdPVwic2VsZWN0ZWRPcGVyYXRvclwiXG4gICAgICAobmlsZS1jaGFuZ2UpPVwib25PcGVyYXRvckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiZmlsdGVyLW9wZXJhdG9yXCI+XG4gICAgICA8bmlsZS1vcHRpb24gXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcCBvZiBhdmFpbGFibGVPcGVyYXRvcnNcIiBcbiAgICAgICAgW3ZhbHVlXT1cIm9wLnZhbHVlXCI+XG4gICAgICAgIHt7IG9wLmxhYmVsIH19XG4gICAgICA8L25pbGUtb3B0aW9uPlxuICAgIDwvbmlsZS1zZWxlY3Q+XG4gICAgXG4gICAgPCEtLSBJbnB1dCBGaWVsZCBiYXNlZCBvbiB0eXBlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdmFsdWUtc2VjdGlvblwiPlxuICAgICAgXG4gICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICA8bmlsZS1pbnB1dCBcbiAgICAgICAgKm5nSWY9XCJpbnB1dFR5cGUgPT09ICd0ZXh0J1wiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgbGFiZWw9XCJWYWx1ZVwiXG4gICAgICAgIFt2YWx1ZV09XCJmaWx0ZXJWYWx1ZVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdmFsdWUuLi5cIlxuICAgICAgICAobmlsZS1pbnB1dCk9XCJvblZhbHVlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiZmlsdGVyLXZhbHVlLWlucHV0XCI+XG4gICAgICA8L25pbGUtaW5wdXQ+XG4gICAgICBcbiAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxuICAgICAgPG5pbGUtaW5wdXQgXG4gICAgICAgICpuZ0lmPVwiaW5wdXRUeXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICBsYWJlbD1cIlZhbHVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImZpbHRlclZhbHVlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBudW1iZXIuLi5cIlxuICAgICAgICAobmlsZS1pbnB1dCk9XCJvblZhbHVlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiZmlsdGVyLXZhbHVlLWlucHV0XCI+XG4gICAgICA8L25pbGUtaW5wdXQ+XG4gICAgICBcbiAgICAgIDwhLS0gRGF0ZSBJbnB1dCAtLT5cbiAgICAgIDxuaWxlLWlucHV0IFxuICAgICAgICAqbmdJZj1cImlucHV0VHlwZSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICBsYWJlbD1cIlZhbHVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImZpbHRlclZhbHVlXCJcbiAgICAgICAgKG5pbGUtaW5wdXQpPVwib25WYWx1ZUlucHV0KCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImZpbHRlci12YWx1ZS1pbnB1dFwiPlxuICAgICAgPC9uaWxlLWlucHV0PlxuICAgICAgXG4gICAgICA8IS0tIENoZWNrYm94IElucHV0IC0tPlxuICAgICAgPG5pbGUtY2hlY2tib3hcbiAgICAgICAgKm5nSWY9XCJpbnB1dFR5cGUgPT09ICdjaGVja2JveCdcIlxuICAgICAgICBbY2hlY2tlZF09XCJmaWx0ZXJWYWx1ZVwiXG4gICAgICAgIChuaWxlLWNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImZpbHRlci1jaGVja2JveFwiPlxuICAgICAgICB7eyBmaWx0ZXJWYWx1ZSA/ICdUcnVlJyA6ICdGYWxzZScgfX1cbiAgICAgIDwvbmlsZS1jaGVja2JveD5cbiAgICAgIFxuICAgICAgPCEtLSBTaW5nbGUgU2VsZWN0IERyb3Bkb3duIC0tPlxuICAgICAgPG5pbGUtc2VsZWN0IFxuICAgICAgICAqbmdJZj1cImlucHV0VHlwZSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICBsYWJlbD1cIlZhbHVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImZpbHRlclZhbHVlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCItLSBTZWxlY3QgLS1cIlxuICAgICAgICAobmlsZS1jaGFuZ2UpPVwib25TZWxlY3RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwiZmlsdGVyLXZhbHVlLXNlbGVjdFwiPlxuICAgICAgICA8bmlsZS1vcHRpb24gXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkcm9wZG93bk9wdGlvbnNcIiBcbiAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgIDwvbmlsZS1vcHRpb24+XG4gICAgICA8L25pbGUtc2VsZWN0PlxuICAgICAgXG4gICAgICA8IS0tIE11bHRpLVNlbGVjdCB3aXRoIFJhZGlvIEdyb3VwIGFzIGV4YW1wbGUgKG9yIGtlZXAgY2hlY2tib3hlcykgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaW5wdXRUeXBlID09PSAnbXVsdGlzZWxlY3QnXCIgY2xhc3M9XCJmaWx0ZXItbXVsdGlzZWxlY3RcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXVsdGlzZWxlY3QtdGl0bGVcIj5TZWxlY3QgVmFsdWVzPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpc2VsZWN0LW9wdGlvbnNcIj5cbiAgICAgICAgICA8bmlsZS1jaGVja2JveFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkcm9wZG93bk9wdGlvbnNcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNWYWx1ZVNlbGVjdGVkKG9wdGlvbi52YWx1ZSlcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAobmlsZS1jaGFuZ2UpPVwib25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlKCRldmVudCwgb3B0aW9uLnZhbHVlKVwiXG4gICAgICAgICAgICBjbGFzcz1cIm11bHRpc2VsZWN0LWNoZWNrYm94XCI+XG4gICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cbiAgICAgICAgICA8L25pbGUtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25PcHRpb25zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgICBObyBvcHRpb25zIGF2YWlsYWJsZVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1hY3Rpb25zXCI+XG4gICAgICA8bmlsZS1idXR0b24gXG4gICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcbiAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQXBwbHkoKVwiPlxuICAgICAgICBBcHBseVxuICAgICAgPC9uaWxlLWJ1dHRvbj5cbiAgICAgIDxuaWxlLWJ1dHRvbiBcbiAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhcigpXCI+XG4gICAgICAgIENsZWFyXG4gICAgICA8L25pbGUtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiJdfQ==