@aquera/ngx-smart-table 0.0.2-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 (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. package/src/lib/renderer/components/st-column-filter/README.md +286 -0
@@ -0,0 +1,171 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class StTableActionsComponent {
5
+ constructor() {
6
+ this.allowAddColumn = false;
7
+ this.addColumnClicked = new EventEmitter();
8
+ this.isOpen = false;
9
+ this.currentView = 'main';
10
+ this.columnsVisibility = [];
11
+ /**
12
+ * Dropdown positioning style
13
+ */
14
+ this.dropdownStyle = {};
15
+ }
16
+ ngOnInit() {
17
+ if (!this.tableState) {
18
+ console.warn('tableState is required for st-table-actions component');
19
+ return;
20
+ }
21
+ // Initialize with current state
22
+ this.updateColumnsVisibility();
23
+ // Subscribe to state changes to update visibility list
24
+ this.subscribeToStateChanges();
25
+ }
26
+ ngOnDestroy() {
27
+ this.stateSubscription?.unsubscribe();
28
+ // Re-enable body scroll if component is destroyed while menu is open
29
+ if (this.isOpen) {
30
+ document.body.style.overflow = '';
31
+ }
32
+ }
33
+ /**
34
+ * Update columns visibility list from current table state
35
+ */
36
+ updateColumnsVisibility() {
37
+ if (this.tableState) {
38
+ this.columnsVisibility = this.tableState.getAllColumnsVisibility();
39
+ }
40
+ }
41
+ /**
42
+ * Subscribe to table state changes
43
+ */
44
+ subscribeToStateChanges() {
45
+ if (!this.tableState)
46
+ return;
47
+ this.stateSubscription = this.tableState.stateChange$
48
+ .subscribe(event => {
49
+ if (event.type === 'column-visibility' || event.type === 'column-config') {
50
+ this.updateColumnsVisibility();
51
+ }
52
+ });
53
+ }
54
+ /**
55
+ * Toggle menu open/close
56
+ */
57
+ toggleMenu(event) {
58
+ event.stopPropagation();
59
+ this.isOpen = !this.isOpen;
60
+ if (this.isOpen) {
61
+ this.currentView = 'main';
62
+ this.updateDropdownPosition(event);
63
+ // Disable body scroll when menu opens
64
+ document.body.style.overflow = 'hidden';
65
+ }
66
+ else {
67
+ // Re-enable body scroll when menu closes
68
+ document.body.style.overflow = '';
69
+ }
70
+ }
71
+ /**
72
+ * Update dropdown position based on trigger button
73
+ */
74
+ updateDropdownPosition(event) {
75
+ const button = event.currentTarget;
76
+ const rect = button.getBoundingClientRect();
77
+ const viewportWidth = window.innerWidth;
78
+ const viewportHeight = window.innerHeight;
79
+ const dropdownWidth = 280;
80
+ const dropdownHeight = 400;
81
+ let x = rect.left;
82
+ let y = rect.bottom + 5;
83
+ // Adjust horizontal position if dropdown would overflow
84
+ if (x + dropdownWidth > viewportWidth) {
85
+ x = Math.max(10, viewportWidth - dropdownWidth - 10);
86
+ }
87
+ // Adjust vertical position if dropdown would overflow
88
+ if (y + dropdownHeight > viewportHeight) {
89
+ y = rect.top - dropdownHeight - 5;
90
+ }
91
+ this.dropdownStyle = {
92
+ position: 'fixed',
93
+ left: `${x}px`,
94
+ top: `${y}px`,
95
+ 'z-index': 9999
96
+ };
97
+ }
98
+ /**
99
+ * Close menu
100
+ */
101
+ closeMenu() {
102
+ this.isOpen = false;
103
+ this.currentView = 'main';
104
+ // Re-enable body scroll when menu closes
105
+ document.body.style.overflow = '';
106
+ }
107
+ /**
108
+ * Handle add column action
109
+ */
110
+ onAddColumn(event) {
111
+ event.stopPropagation();
112
+ this.addColumnClicked.emit();
113
+ this.closeMenu();
114
+ }
115
+ /**
116
+ * Open column visibility submenu
117
+ */
118
+ openColumnsSubmenu(event) {
119
+ event.stopPropagation();
120
+ this.currentView = 'columns';
121
+ }
122
+ /**
123
+ * Go back to main menu
124
+ */
125
+ backToMain(event) {
126
+ event.stopPropagation();
127
+ this.currentView = 'main';
128
+ }
129
+ /**
130
+ * Toggle column visibility
131
+ */
132
+ onToggleColumn(columnKey, event) {
133
+ event.stopPropagation();
134
+ // Check if column is hideable before toggling
135
+ const column = this.columnsVisibility.find(col => col.key === columnKey);
136
+ if (column && column.hideable !== false) {
137
+ if (this.tableState) {
138
+ this.tableState.toggleColumnVisibility(columnKey);
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Check if column is visible
144
+ */
145
+ isColumnVisible(columnKey) {
146
+ if (!this.tableState) {
147
+ return true;
148
+ }
149
+ const column = this.tableState.getColumns().find(col => col.key === columnKey);
150
+ return column ? (column.visible !== false) : true;
151
+ }
152
+ /**
153
+ * Check if column is hideable
154
+ */
155
+ isColumnHideable(column) {
156
+ return column.hideable !== false; // Default to true if not set
157
+ }
158
+ }
159
+ StTableActionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
160
+ StTableActionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StTableActionsComponent, selector: "st-table-actions", inputs: { tableState: "tableState", allowAddColumn: "allowAddColumn" }, outputs: { addColumnClicked: "addColumnClicked" }, ngImport: i0, template: "<button \n class=\"table-actions-button\"\n (click)=\"toggleMenu($event)\"\n type=\"button\"\n title=\"Table Actions\"\n aria-label=\"Table actions menu\"\n [class.active]=\"isOpen\">\n <nile-icon name=\"settings\"></nile-icon>\n</button>\n\n<!-- Dropdown container with shared pattern -->\n<div class=\"dropdown-container\" *ngIf=\"isOpen\">\n <!-- Backdrop -->\n <div class=\"dropdown-backdrop\" (click)=\"closeMenu()\"></div>\n \n <!-- Main Menu -->\n <div class=\"dropdown-menu\" *ngIf=\"currentView === 'main'\" [ngStyle]=\"dropdownStyle\">\n <nile-menu>\n <!-- Add Column -->\n <nile-menu-item *ngIf=\"allowAddColumn\" (click)=\"onAddColumn($event)\">\n <nile-icon slot=\"prefix\" name=\"plus\" size=\"12\"></nile-icon>\n Add Column\n </nile-menu-item>\n \n <!-- Show/Hide Columns -->\n <nile-menu-item (click)=\"openColumnsSubmenu($event)\">\n <nile-icon size=\"12\" slot=\"prefix\" name=\"eye\"></nile-icon>\n Show/Hide Columns\n </nile-menu-item>\n </nile-menu>\n </div>\n \n <!-- Column Visibility Submenu -->\n <div class=\"dropdown-menu\" *ngIf=\"currentView === 'columns'\" [ngStyle]=\"dropdownStyle\">\n <nile-menu>\n <!-- Back button -->\n <nile-menu-item (click)=\"backToMain($event)\" class=\"back-item\">\n <nile-icon size=\"12\" slot=\"prefix\" name=\"chevron-left\"></nile-icon>\n Back\n </nile-menu-item>\n \n <nile-divider></nile-divider>\n \n <!-- Column checkboxes -->\n <nile-menu-item \n *ngFor=\"let column of columnsVisibility\"\n [class.disabled]=\"!isColumnHideable(column)\"\n (click)=\"onToggleColumn(column.key, $event)\">\n <nile-checkbox \n [checked]=\"isColumnVisible(column.key)\" \n [disabled]=\"!isColumnHideable(column)\" \n [label]=\"column.header || column.key\" \n (nile-change)=\"onToggleColumn(column.key, $event)\">\n </nile-checkbox>\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n", styles: [".table-actions-button{display:flex;align-items:center;justify-content:center;padding:6px;background:transparent;border:none;cursor:pointer;transition:background-color .15s}.table-actions-button:hover{background-color:#0000000d}.table-actions-button.active{background-color:#0000001a}.table-actions-button:focus{outline:none}.dropdown-container{position:fixed;inset:0;z-index:9996}.dropdown-backdrop{position:absolute;inset:0;background:transparent;pointer-events:auto;z-index:9996}.dropdown-menu{position:fixed;pointer-events:auto;z-index:9997;min-width:15rem}nile-menu{max-height:30rem;overflow-y:auto}nile-menu::part(base){width:fit-content;min-height:auto}nile-menu nile-menu-item::part(base){min-height:2.5rem}nile-menu nile-menu-item::part(label){font-size:12px}nile-menu nile-menu-item.back-item{font-weight:500}nile-menu nile-menu-item.disabled{opacity:.5;cursor:not-allowed}nile-menu nile-menu-item nile-checkbox::part(base){display:flex;align-items:center}nile-menu nile-menu-item nile-checkbox::part(label){font-size:12px;margin-top:0}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableActionsComponent, decorators: [{
162
+ type: Component,
163
+ args: [{ selector: 'st-table-actions', template: "<button \n class=\"table-actions-button\"\n (click)=\"toggleMenu($event)\"\n type=\"button\"\n title=\"Table Actions\"\n aria-label=\"Table actions menu\"\n [class.active]=\"isOpen\">\n <nile-icon name=\"settings\"></nile-icon>\n</button>\n\n<!-- Dropdown container with shared pattern -->\n<div class=\"dropdown-container\" *ngIf=\"isOpen\">\n <!-- Backdrop -->\n <div class=\"dropdown-backdrop\" (click)=\"closeMenu()\"></div>\n \n <!-- Main Menu -->\n <div class=\"dropdown-menu\" *ngIf=\"currentView === 'main'\" [ngStyle]=\"dropdownStyle\">\n <nile-menu>\n <!-- Add Column -->\n <nile-menu-item *ngIf=\"allowAddColumn\" (click)=\"onAddColumn($event)\">\n <nile-icon slot=\"prefix\" name=\"plus\" size=\"12\"></nile-icon>\n Add Column\n </nile-menu-item>\n \n <!-- Show/Hide Columns -->\n <nile-menu-item (click)=\"openColumnsSubmenu($event)\">\n <nile-icon size=\"12\" slot=\"prefix\" name=\"eye\"></nile-icon>\n Show/Hide Columns\n </nile-menu-item>\n </nile-menu>\n </div>\n \n <!-- Column Visibility Submenu -->\n <div class=\"dropdown-menu\" *ngIf=\"currentView === 'columns'\" [ngStyle]=\"dropdownStyle\">\n <nile-menu>\n <!-- Back button -->\n <nile-menu-item (click)=\"backToMain($event)\" class=\"back-item\">\n <nile-icon size=\"12\" slot=\"prefix\" name=\"chevron-left\"></nile-icon>\n Back\n </nile-menu-item>\n \n <nile-divider></nile-divider>\n \n <!-- Column checkboxes -->\n <nile-menu-item \n *ngFor=\"let column of columnsVisibility\"\n [class.disabled]=\"!isColumnHideable(column)\"\n (click)=\"onToggleColumn(column.key, $event)\">\n <nile-checkbox \n [checked]=\"isColumnVisible(column.key)\" \n [disabled]=\"!isColumnHideable(column)\" \n [label]=\"column.header || column.key\" \n (nile-change)=\"onToggleColumn(column.key, $event)\">\n </nile-checkbox>\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n", styles: [".table-actions-button{display:flex;align-items:center;justify-content:center;padding:6px;background:transparent;border:none;cursor:pointer;transition:background-color .15s}.table-actions-button:hover{background-color:#0000000d}.table-actions-button.active{background-color:#0000001a}.table-actions-button:focus{outline:none}.dropdown-container{position:fixed;inset:0;z-index:9996}.dropdown-backdrop{position:absolute;inset:0;background:transparent;pointer-events:auto;z-index:9996}.dropdown-menu{position:fixed;pointer-events:auto;z-index:9997;min-width:15rem}nile-menu{max-height:30rem;overflow-y:auto}nile-menu::part(base){width:fit-content;min-height:auto}nile-menu nile-menu-item::part(base){min-height:2.5rem}nile-menu nile-menu-item::part(label){font-size:12px}nile-menu nile-menu-item.back-item{font-weight:500}nile-menu nile-menu-item.disabled{opacity:.5;cursor:not-allowed}nile-menu nile-menu-item nile-checkbox::part(base){display:flex;align-items:center}nile-menu nile-menu-item nile-checkbox::part(label){font-size:12px;margin-top:0}\n"] }]
164
+ }], ctorParameters: function () { return []; }, propDecorators: { tableState: [{
165
+ type: Input
166
+ }], allowAddColumn: [{
167
+ type: Input
168
+ }], addColumnClicked: [{
169
+ type: Output
170
+ }] } });
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUtYWN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtdGFibGUtYWN0aW9ucy9zdC10YWJsZS1hY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC10YWJsZS1hY3Rpb25zL3N0LXRhYmxlLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7OztBQVcxRixNQUFNLE9BQU8sdUJBQXVCO0lBaUJsQztRQWZTLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRS9CLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFdEQsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGdCQUFXLEdBQWEsTUFBTSxDQUFDO1FBQy9CLHNCQUFpQixHQUEyRSxFQUFFLENBQUM7UUFFL0Y7O1dBRUc7UUFDSCxrQkFBYSxHQUFRLEVBQUUsQ0FBQztJQUlULENBQUM7SUFFaEIsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUN0RSxPQUFPO1NBQ1I7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FB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QUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxNQUE0RTtRQUMzRixPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsNkJBQTZCO0lBQ2pFLENBQUM7O29IQW5MVSx1QkFBdUI7d0dBQXZCLHVCQUF1QixtTENYcEMsa2dFQTJEQTsyRkRoRGEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLGtCQUFrQjswRUFLbkIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVTdGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS1zdGF0ZS5jbGFzcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxudHlwZSBNZW51VmlldyA9ICdtYWluJyB8ICdjb2x1bW5zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3QtdGFibGUtYWN0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdC10YWJsZS1hY3Rpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3QtdGFibGUtYWN0aW9ucy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN0VGFibGVBY3Rpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0YWJsZVN0YXRlITogVGFibGVTdGF0ZTtcbiAgQElucHV0KCkgYWxsb3dBZGRDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIEBPdXRwdXQoKSBhZGRDb2x1bW5DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgaXNPcGVuID0gZmFsc2U7XG4gIGN1cnJlbnRWaWV3OiBNZW51VmlldyA9ICdtYWluJztcbiAgY29sdW1uc1Zpc2liaWxpdHk6IHsga2V5OiBzdHJpbmc7IGhlYWRlcjogc3RyaW5nOyB2aXNpYmxlOiBib29sZWFuOyBoaWRlYWJsZTogYm9vbGVhbiB9W10gPSBbXTtcbiAgXG4gIC8qKlxuICAgKiBEcm9wZG93biBwb3NpdGlvbmluZyBzdHlsZVxuICAgKi9cbiAgZHJvcGRvd25TdHlsZTogYW55ID0ge307XG4gIFxuICBwcml2YXRlIHN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBcbiAgY29uc3RydWN0b3IoKSB7fVxuICBcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybigndGFibGVTdGF0ZSBpcyByZXF1aXJlZCBmb3Igc3QtdGFibGUtYWN0aW9ucyBjb21wb25lbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgc3RhdGVcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnNWaXNpYmlsaXR5KCk7XG4gICAgXG4gICAgLy8gU3Vic2NyaWJlIHRvIHN0YXRlIGNoYW5nZXMgdG8gdXBkYXRlIHZpc2liaWxpdHkgbGlzdFxuICAgIHRoaXMuc3Vic2NyaWJlVG9TdGF0ZUNoYW5nZXMoKTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAvLyBSZS1lbmFibGUgYm9keSBzY3JvbGwgaWYgY29tcG9uZW50IGlzIGRlc3Ryb3llZCB3aGlsZSBtZW51IGlzIG9wZW5cbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgY29sdW1ucyB2aXNpYmlsaXR5IGxpc3QgZnJvbSBjdXJyZW50IHRhYmxlIHN0YXRlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnNWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgIHRoaXMuY29sdW1uc1Zpc2liaWxpdHkgPSB0aGlzLnRhYmxlU3RhdGUuZ2V0QWxsQ29sdW1uc1Zpc2liaWxpdHkoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGFibGUgc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1N0YXRlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlU3RhdGUuc3RhdGVDaGFuZ2UkXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb2x1bW4tdmlzaWJpbGl0eScgfHwgZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi1jb25maWcnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zVmlzaWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBtZW51IG9wZW4vY2xvc2VcbiAgICovXG4gIHRvZ2dsZU1lbnUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ21haW4nO1xuICAgICAgdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKGV2ZW50IGFzIE1vdXNlRXZlbnQpO1xuICAgICAgLy8gRGlzYWJsZSBib2R5IHNjcm9sbCB3aGVuIG1lbnUgb3BlbnNcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUtZW5hYmxlIGJvZHkgc2Nyb2xsIHdoZW4gbWVudSBjbG9zZXNcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZHJvcGRvd24gcG9zaXRpb24gYmFzZWQgb24gdHJpZ2dlciBidXR0b25cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25Qb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IGJ1dHRvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3QgZHJvcGRvd25XaWR0aCA9IDI4MDtcbiAgICBjb25zdCBkcm9wZG93bkhlaWdodCA9IDQwMDtcbiAgICBcbiAgICBsZXQgeCA9IHJlY3QubGVmdDtcbiAgICBsZXQgeSA9IHJlY3QuYm90dG9tICsgNTtcbiAgICBcbiAgICAvLyBBZGp1c3QgaG9yaXpvbnRhbCBwb3NpdGlvbiBpZiBkcm9wZG93biB3b3VsZCBvdmVyZmxvd1xuICAgIGlmICh4ICsgZHJvcGRvd25XaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgIHggPSBNYXRoLm1heCgxMCwgdmlld3BvcnRXaWR0aCAtIGRyb3Bkb3duV2lkdGggLSAxMCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbiBpZiBkcm9wZG93biB3b3VsZCBvdmVyZmxvd1xuICAgIGlmICh5ICsgZHJvcGRvd25IZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgeSA9IHJlY3QudG9wIC0gZHJvcGRvd25IZWlnaHQgLSA1O1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmRyb3Bkb3duU3R5bGUgPSB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIGxlZnQ6IGAke3h9cHhgLFxuICAgICAgdG9wOiBgJHt5fXB4YCxcbiAgICAgICd6LWluZGV4JzogOTk5OVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbG9zZSBtZW51XG4gICAqL1xuICBjbG9zZU1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ21haW4nO1xuICAgIC8vIFJlLWVuYWJsZSBib2R5IHNjcm9sbCB3aGVuIG1lbnUgY2xvc2VzXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGFkZCBjb2x1bW4gYWN0aW9uXG4gICAqL1xuICBvbkFkZENvbHVtbihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmFkZENvbHVtbkNsaWNrZWQuZW1pdCgpO1xuICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBPcGVuIGNvbHVtbiB2aXNpYmlsaXR5IHN1Ym1lbnVcbiAgICovXG4gIG9wZW5Db2x1bW5zU3VibWVudShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2NvbHVtbnMnO1xuICB9XG4gIFxuICAvKipcbiAgICogR28gYmFjayB0byBtYWluIG1lbnVcbiAgICovXG4gIGJhY2tUb01haW4oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9ICdtYWluJztcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBjb2x1bW4gdmlzaWJpbGl0eVxuICAgKi9cbiAgb25Ub2dnbGVDb2x1bW4oY29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIGNvbHVtbiBpcyBoaWRlYWJsZSBiZWZvcmUgdG9nZ2xpbmdcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNWaXNpYmlsaXR5LmZpbmQoY29sID0+IGNvbC5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uaGlkZWFibGUgIT09IGZhbHNlKSB7XG4gICAgICBpZiAodGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICAgIHRoaXMudGFibGVTdGF0ZS50b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbktleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgY29sdW1uIGlzIHZpc2libGVcbiAgICovXG4gIGlzQ29sdW1uVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy50YWJsZVN0YXRlLmdldENvbHVtbnMoKS5maW5kKGNvbCA9PiBjb2wua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIHJldHVybiBjb2x1bW4gPyAoY29sdW1uLnZpc2libGUgIT09IGZhbHNlKSA6IHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb2x1bW4gaXMgaGlkZWFibGVcbiAgICovXG4gIGlzQ29sdW1uSGlkZWFibGUoY29sdW1uOiB7IGtleTogc3RyaW5nOyBoZWFkZXI6IHN0cmluZzsgdmlzaWJsZTogYm9vbGVhbjsgaGlkZWFibGU6IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW4uaGlkZWFibGUgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICB9XG59XG5cbiIsIjxidXR0b24gXG4gIGNsYXNzPVwidGFibGUtYWN0aW9ucy1idXR0b25cIlxuICAoY2xpY2spPVwidG9nZ2xlTWVudSgkZXZlbnQpXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIHRpdGxlPVwiVGFibGUgQWN0aW9uc1wiXG4gIGFyaWEtbGFiZWw9XCJUYWJsZSBhY3Rpb25zIG1lbnVcIlxuICBbY2xhc3MuYWN0aXZlXT1cImlzT3BlblwiPlxuICA8bmlsZS1pY29uIG5hbWU9XCJzZXR0aW5nc1wiPjwvbmlsZS1pY29uPlxuPC9idXR0b24+XG5cbjwhLS0gRHJvcGRvd24gY29udGFpbmVyIHdpdGggc2hhcmVkIHBhdHRlcm4gLS0+XG48ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCIgKm5nSWY9XCJpc09wZW5cIj5cbiAgPCEtLSBCYWNrZHJvcCAtLT5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlTWVudSgpXCI+PC9kaXY+XG4gIFxuICA8IS0tIE1haW4gTWVudSAtLT5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnbWFpbidcIiBbbmdTdHlsZV09XCJkcm9wZG93blN0eWxlXCI+XG4gICAgPG5pbGUtbWVudT5cbiAgICAgIDwhLS0gQWRkIENvbHVtbiAtLT5cbiAgICAgIDxuaWxlLW1lbnUtaXRlbSAqbmdJZj1cImFsbG93QWRkQ29sdW1uXCIgKGNsaWNrKT1cIm9uQWRkQ29sdW1uKCRldmVudClcIj5cbiAgICAgICAgPG5pbGUtaWNvbiBzbG90PVwicHJlZml4XCIgbmFtZT1cInBsdXNcIiBzaXplPVwiMTJcIj48L25pbGUtaWNvbj5cbiAgICAgICAgQWRkIENvbHVtblxuICAgICAgPC9uaWxlLW1lbnUtaXRlbT5cbiAgICAgIFxuICAgICAgPCEtLSBTaG93L0hpZGUgQ29sdW1ucyAtLT5cbiAgICAgIDxuaWxlLW1lbnUtaXRlbSAoY2xpY2spPVwib3BlbkNvbHVtbnNTdWJtZW51KCRldmVudClcIj5cbiAgICAgICAgPG5pbGUtaWNvbiBzaXplPVwiMTJcIiBzbG90PVwicHJlZml4XCIgbmFtZT1cImV5ZVwiPjwvbmlsZS1pY29uPlxuICAgICAgICBTaG93L0hpZGUgQ29sdW1uc1xuICAgICAgPC9uaWxlLW1lbnUtaXRlbT5cbiAgICA8L25pbGUtbWVudT5cbiAgPC9kaXY+XG4gIFxuICA8IS0tIENvbHVtbiBWaXNpYmlsaXR5IFN1Ym1lbnUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ2NvbHVtbnMnXCIgW25nU3R5bGVdPVwiZHJvcGRvd25TdHlsZVwiPlxuICAgIDxuaWxlLW1lbnU+XG4gICAgICA8IS0tIEJhY2sgYnV0dG9uIC0tPlxuICAgICAgPG5pbGUtbWVudS1pdGVtIChjbGljayk9XCJiYWNrVG9NYWluKCRldmVudClcIiBjbGFzcz1cImJhY2staXRlbVwiPlxuICAgICAgICA8bmlsZS1pY29uIHNpemU9XCIxMlwiIHNsb3Q9XCJwcmVmaXhcIiBuYW1lPVwiY2hldnJvbi1sZWZ0XCI+PC9uaWxlLWljb24+XG4gICAgICAgIEJhY2tcbiAgICAgIDwvbmlsZS1tZW51LWl0ZW0+XG4gICAgICBcbiAgICAgIDxuaWxlLWRpdmlkZXI+PC9uaWxlLWRpdmlkZXI+XG4gICAgICBcbiAgICAgIDwhLS0gQ29sdW1uIGNoZWNrYm94ZXMgLS0+XG4gICAgICA8bmlsZS1tZW51LWl0ZW0gXG4gICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1Zpc2liaWxpdHlcIlxuICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzQ29sdW1uSGlkZWFibGUoY29sdW1uKVwiXG4gICAgICAgIChjbGljayk9XCJvblRvZ2dsZUNvbHVtbihjb2x1bW4ua2V5LCAkZXZlbnQpXCI+XG4gICAgICAgIDxuaWxlLWNoZWNrYm94IFxuICAgICAgICBbY2hlY2tlZF09XCJpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSlcIiBcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0NvbHVtbkhpZGVhYmxlKGNvbHVtbilcIiBcbiAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5oZWFkZXIgfHwgY29sdW1uLmtleVwiIFxuICAgICAgICAobmlsZS1jaGFuZ2UpPVwib25Ub2dnbGVDb2x1bW4oY29sdW1uLmtleSwgJGV2ZW50KVwiPlxuICAgICAgPC9uaWxlLWNoZWNrYm94PlxuICAgICAgPC9uaWxlLW1lbnUtaXRlbT5cbiAgICA8L25pbGUtbWVudT5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19