@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.
- package/README.md +152 -0
- package/aquera-ngx-smart-table.d.ts +5 -0
- package/esm2020/aquera-ngx-smart-table.mjs +5 -0
- package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
- package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
- package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
- package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
- package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
- package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
- package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
- package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
- package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
- package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
- package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
- package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
- package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
- package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
- package/esm2020/lib/editors/index.mjs +9 -0
- package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
- package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
- package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
- package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
- package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
- package/esm2020/lib/factories/column-config.factory.mjs +231 -0
- package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
- package/esm2020/lib/models/base-column-config.class.mjs +253 -0
- package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
- package/esm2020/lib/models/cell-types.mjs +147 -0
- package/esm2020/lib/models/column-action.interface.mjs +6 -0
- package/esm2020/lib/models/column-config.interface.mjs +43 -0
- package/esm2020/lib/models/column-config.utils.mjs +101 -0
- package/esm2020/lib/models/row-action.interface.mjs +5 -0
- package/esm2020/lib/models/row-validator.interface.mjs +2 -0
- package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
- package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
- package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
- package/esm2020/lib/models/table-config.interface.mjs +106 -0
- package/esm2020/lib/models/table-validator.interface.mjs +2 -0
- package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
- package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
- package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
- package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
- package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
- package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
- package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
- package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
- package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
- package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
- package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
- package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
- package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
- package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
- package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
- package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
- package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
- package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
- package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
- package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-types.mjs +29 -0
- package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
- package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
- package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
- package/esm2020/lib/services/autosave.service.mjs +92 -0
- package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
- package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
- package/esm2020/lib/services/row-validation.service.mjs +42 -0
- package/esm2020/lib/services/validation-logger.service.mjs +177 -0
- package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
- package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
- package/esm2020/lib/smart-table.module.mjs +124 -0
- package/esm2020/lib/strategies/default-editors.mjs +433 -0
- package/esm2020/lib/strategies/default-formatters.mjs +238 -0
- package/esm2020/lib/strategies/default-validators.mjs +327 -0
- package/esm2020/public-api.mjs +146 -0
- package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
- package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
- package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
- package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
- package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
- package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
- package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
- package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
- package/lib/builder/definition-builder.module.d.ts +15 -0
- package/lib/builder/models/builder-state.interface.d.ts +93 -0
- package/lib/builder/services/definition-builder.service.d.ts +80 -0
- package/lib/builder/services/definition-export.service.d.ts +59 -0
- package/lib/builder/services/definition-import.service.d.ts +31 -0
- package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
- package/lib/builder/utils/config-validator.util.d.ts +32 -0
- package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
- package/lib/editors/index.d.ts +8 -0
- package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
- package/lib/editors/nile-calendar-editor.d.ts +89 -0
- package/lib/editors/nile-date-picker-editor.d.ts +95 -0
- package/lib/editors/nile-input-editor.d.ts +67 -0
- package/lib/editors/nile-select-editor.d.ts +109 -0
- package/lib/factories/column-config.factory.d.ts +73 -0
- package/lib/models/autosave-config.interface.d.ts +23 -0
- package/lib/models/base-column-config.class.d.ts +115 -0
- package/lib/models/cell-strategies.interface.d.ts +181 -0
- package/lib/models/cell-types.d.ts +337 -0
- package/lib/models/column-action.interface.d.ts +86 -0
- package/lib/models/column-config.interface.d.ts +272 -0
- package/lib/models/column-config.utils.d.ts +37 -0
- package/lib/models/row-action.interface.d.ts +86 -0
- package/lib/models/row-validator.interface.d.ts +37 -0
- package/lib/models/schema-validation.interface.d.ts +42 -0
- package/lib/models/sheet-action.interface.d.ts +59 -0
- package/lib/models/sheet-config.interface.d.ts +41 -0
- package/lib/models/table-config.interface.d.ts +245 -0
- package/lib/models/table-validator.interface.d.ts +40 -0
- package/lib/models/workbook-action.interface.d.ts +90 -0
- package/lib/models/workbook-config.interface.d.ts +107 -0
- package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
- package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
- package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
- package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
- package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
- package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
- package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
- package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
- package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
- package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
- package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
- package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
- package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
- package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
- package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
- package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
- package/lib/renderer/models/cell-state.interface.d.ts +118 -0
- package/lib/renderer/models/cell.class.d.ts +174 -0
- package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
- package/lib/renderer/models/sheet-state.class.d.ts +67 -0
- package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
- package/lib/renderer/models/table-state.class.d.ts +313 -0
- package/lib/renderer/models/table-state.interface.d.ts +18 -0
- package/lib/renderer/models/table-types.d.ts +228 -0
- package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
- package/lib/renderer/models/workbook-state.class.d.ts +117 -0
- package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
- package/lib/renderer/models/z-index.enum.d.ts +44 -0
- package/lib/schemas/table-config.schema.d.ts +455 -0
- package/lib/services/autosave.service.d.ts +73 -0
- package/lib/services/custom-validation-rules.util.d.ts +12 -0
- package/lib/services/json-schema-validator.service.d.ts +49 -0
- package/lib/services/row-validation.service.d.ts +17 -0
- package/lib/services/validation-logger.service.d.ts +87 -0
- package/lib/services/virtual-scroll.service.d.ts +44 -0
- package/lib/shared/shared-table-components.module.d.ts +9 -0
- package/lib/smart-table.module.d.ts +26 -0
- package/lib/strategies/default-editors.d.ts +109 -0
- package/lib/strategies/default-formatters.d.ts +116 -0
- package/lib/strategies/default-validators.d.ts +113 -0
- package/package.json +42 -0
- package/public-api.d.ts +70 -0
- package/src/lib/builder/README.md +30 -0
- package/src/lib/editors/README.md +303 -0
- package/src/lib/renderer/components/st-column-filter/README.md +286 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, HostListener } from '@angular/core';
|
|
2
|
+
import { EditMode, NavigationKey, NavigationDirection } from '../../../models/cell-types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class StCellComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.editMode = EditMode.CLICK;
|
|
8
|
+
this.cellChange = new EventEmitter();
|
|
9
|
+
this.cellEdit = new EventEmitter();
|
|
10
|
+
this.cellSave = new EventEmitter();
|
|
11
|
+
this.cellCancel = new EventEmitter();
|
|
12
|
+
this.cellSaveAndNavigate = new EventEmitter();
|
|
13
|
+
}
|
|
14
|
+
ngOnInit() {
|
|
15
|
+
// Subscribe to editing position changes
|
|
16
|
+
// When another cell starts editing, save this cell if it's currently editing
|
|
17
|
+
if (this.tableState && this.columnIndex !== undefined) {
|
|
18
|
+
this.editingPositionSubscription = this.tableState.editingCellPosition$.subscribe(position => {
|
|
19
|
+
const rowIndex = this.cell.getRowIndex();
|
|
20
|
+
// If this cell is currently editing
|
|
21
|
+
if (this.cell.isEditing() && rowIndex !== undefined) {
|
|
22
|
+
// And the new editing position is a different cell
|
|
23
|
+
if (position &&
|
|
24
|
+
(position.rowIndex !== rowIndex || position.columnIndex !== this.columnIndex)) {
|
|
25
|
+
// Force save this cell
|
|
26
|
+
this.saveEdit(this.cell.getValue());
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
ngAfterViewInit() {
|
|
33
|
+
// If cell is already in editing mode, render the editor
|
|
34
|
+
if (this.cell.isEditing() && this.editorContainer) {
|
|
35
|
+
this.renderEditor();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
ngOnDestroy() {
|
|
39
|
+
this.cleanupEditor();
|
|
40
|
+
// Unsubscribe from editing position changes
|
|
41
|
+
if (this.editingPositionSubscription) {
|
|
42
|
+
this.editingPositionSubscription.unsubscribe();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
get isEditable() {
|
|
46
|
+
const config = this.cell.getColumnConfig();
|
|
47
|
+
return config.editable ?? false;
|
|
48
|
+
}
|
|
49
|
+
get validationError() {
|
|
50
|
+
// Read validation state without triggering validation
|
|
51
|
+
// This prevents ExpressionChangedAfterItHasBeenCheckedError
|
|
52
|
+
const state = this.cell.getState();
|
|
53
|
+
if (state.error) {
|
|
54
|
+
return state.error;
|
|
55
|
+
}
|
|
56
|
+
if (state.errors && Array.isArray(state.errors) && state.errors.length > 0) {
|
|
57
|
+
return state.errors.join(', ');
|
|
58
|
+
}
|
|
59
|
+
// Only return generic message if cell is marked as invalid
|
|
60
|
+
if (!this.cell.isValid()) {
|
|
61
|
+
return 'Invalid value';
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
get hasCellTemplate() {
|
|
66
|
+
const config = this.cell.getColumnConfig();
|
|
67
|
+
return !!config.cellTemplate;
|
|
68
|
+
}
|
|
69
|
+
get cellTemplate() {
|
|
70
|
+
return this.cell.getColumnConfig().cellTemplate || null;
|
|
71
|
+
}
|
|
72
|
+
get templateContext() {
|
|
73
|
+
return {
|
|
74
|
+
$implicit: this.cell.getValue(),
|
|
75
|
+
cell: this.cell,
|
|
76
|
+
rowData: this.cell.getRowData(),
|
|
77
|
+
rowIndex: this.cell.getRowIndex()
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
onCellKeyDown(event) {
|
|
81
|
+
// Only handle if this cell is focused
|
|
82
|
+
if (!this.cell.isFocused()) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Use NavigationKey enum for type-safe key checking
|
|
86
|
+
switch (event.key) {
|
|
87
|
+
case NavigationKey.ENTER:
|
|
88
|
+
if (this.cell.isEditing()) {
|
|
89
|
+
// Save and let navigation happen
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
event.stopPropagation();
|
|
92
|
+
this.saveEdit(this.cell.getValue());
|
|
93
|
+
// Emit event to trigger navigation down
|
|
94
|
+
this.cellSaveAndNavigate.emit({ event, direction: NavigationDirection.DOWN });
|
|
95
|
+
}
|
|
96
|
+
// If not editing, let directive handle navigation
|
|
97
|
+
break;
|
|
98
|
+
case NavigationKey.TAB:
|
|
99
|
+
if (this.cell.isEditing()) {
|
|
100
|
+
// Save and let navigation happen
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
event.stopPropagation();
|
|
103
|
+
this.saveEdit(this.cell.getValue());
|
|
104
|
+
const direction = event.shiftKey ? NavigationDirection.LEFT : NavigationDirection.RIGHT;
|
|
105
|
+
this.cellSaveAndNavigate.emit({ event, direction });
|
|
106
|
+
}
|
|
107
|
+
// If not editing, let directive handle navigation
|
|
108
|
+
break;
|
|
109
|
+
case NavigationKey.ESCAPE:
|
|
110
|
+
if (this.cell.isEditing()) {
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
event.stopPropagation();
|
|
113
|
+
this.cancelEdit();
|
|
114
|
+
// Stay focused on same cell (no navigation)
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
// Check for alphanumeric keys when focused but not editing
|
|
119
|
+
if (!this.cell.isEditing() && this.isAlphanumericKey(event)) {
|
|
120
|
+
if (this.canEditViaKeyboard()) {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
event.stopPropagation();
|
|
123
|
+
// Start editing with the pressed key as initial value
|
|
124
|
+
this.startEditWithKey(event.key);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if Enter key can trigger editing
|
|
132
|
+
* Using EditMode enum values
|
|
133
|
+
*/
|
|
134
|
+
canEditViaEnter() {
|
|
135
|
+
return this.isEditable &&
|
|
136
|
+
(this.editMode === EditMode.ENTER || this.editMode === EditMode.CLICK);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if keyboard can trigger editing (for alphanumeric and double-click)
|
|
140
|
+
*/
|
|
141
|
+
canEditViaKeyboard() {
|
|
142
|
+
return this.isEditable &&
|
|
143
|
+
(this.editMode === EditMode.ENTER || this.editMode === EditMode.CLICK);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if a key is alphanumeric (single character)
|
|
147
|
+
*/
|
|
148
|
+
isAlphanumericKey(event) {
|
|
149
|
+
// Single character keys (letters, numbers, symbols)
|
|
150
|
+
return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Start editing with a specific key as the initial value
|
|
154
|
+
*/
|
|
155
|
+
startEditWithKey(key) {
|
|
156
|
+
const canStart = this.cell.startEdit();
|
|
157
|
+
if (canStart) {
|
|
158
|
+
// Replace current value with the key
|
|
159
|
+
this.cell.setValue(key, false);
|
|
160
|
+
const column = this.cell.getColumnConfig();
|
|
161
|
+
const editEvent = {
|
|
162
|
+
cell: this.cell,
|
|
163
|
+
value: key,
|
|
164
|
+
rowData: this.cell.getRowData(),
|
|
165
|
+
columnKey: column.key,
|
|
166
|
+
rowIndex: this.cell.getRowIndex(),
|
|
167
|
+
cellState: this.cell.getState()
|
|
168
|
+
};
|
|
169
|
+
this.cellEdit.emit(editEvent);
|
|
170
|
+
setTimeout(() => {
|
|
171
|
+
this.renderEditor();
|
|
172
|
+
}, 0);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
onCellClick() {
|
|
176
|
+
// Single click now only focuses, doesn't start editing
|
|
177
|
+
// Focus is handled by parent st-table component
|
|
178
|
+
}
|
|
179
|
+
onCellDoubleClick() {
|
|
180
|
+
// Double-click starts editing regardless of EditMode (Excel-like behavior)
|
|
181
|
+
if (this.isEditable && !this.cell.isEditing()) {
|
|
182
|
+
this.startEdit();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
startEdit() {
|
|
186
|
+
const canStart = this.cell.startEdit();
|
|
187
|
+
if (canStart) {
|
|
188
|
+
const column = this.cell.getColumnConfig();
|
|
189
|
+
// Notify TableState that this cell is now editing
|
|
190
|
+
if (this.tableState && this.columnIndex !== undefined) {
|
|
191
|
+
const rowIndex = this.cell.getRowIndex();
|
|
192
|
+
if (rowIndex !== undefined) {
|
|
193
|
+
this.tableState.setEditingCell(rowIndex, this.columnIndex);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const editEvent = {
|
|
197
|
+
cell: this.cell,
|
|
198
|
+
value: this.cell.getValue(),
|
|
199
|
+
rowData: this.cell.getRowData(),
|
|
200
|
+
columnKey: column.key,
|
|
201
|
+
rowIndex: this.cell.getRowIndex(),
|
|
202
|
+
cellState: this.cell.getState()
|
|
203
|
+
};
|
|
204
|
+
this.cellEdit.emit(editEvent);
|
|
205
|
+
// Wait for Angular to render the editor container
|
|
206
|
+
setTimeout(() => {
|
|
207
|
+
this.renderEditor();
|
|
208
|
+
}, 0);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
renderEditor() {
|
|
212
|
+
if (!this.editorContainer) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const column = this.cell.getColumnConfig();
|
|
216
|
+
const editor = column.editor;
|
|
217
|
+
if (!editor) {
|
|
218
|
+
console.warn('No editor configured for column:', column.key);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const value = this.cell.getValue();
|
|
222
|
+
const container = this.editorContainer.nativeElement;
|
|
223
|
+
// Create editor context
|
|
224
|
+
const context = {
|
|
225
|
+
value,
|
|
226
|
+
rowData: this.cell.getRowData(),
|
|
227
|
+
columnKey: column.key,
|
|
228
|
+
rowIndex: this.cell.getRowIndex(),
|
|
229
|
+
onChange: (newValue) => {
|
|
230
|
+
// Trigger eager validation if enabled
|
|
231
|
+
if (this.tableConfig?.validation?.mode === 'eager') {
|
|
232
|
+
// Update cell value temporarily for validation
|
|
233
|
+
this.cell.setValue(newValue, true); // skip validation to avoid double validation
|
|
234
|
+
this.triggerEagerValidation();
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
onSave: (newValue) => {
|
|
238
|
+
this.saveEdit(newValue);
|
|
239
|
+
},
|
|
240
|
+
onCancel: () => {
|
|
241
|
+
this.cancelEdit();
|
|
242
|
+
},
|
|
243
|
+
container
|
|
244
|
+
};
|
|
245
|
+
// Call editor's edit method
|
|
246
|
+
editor.edit(context);
|
|
247
|
+
// Store cleanup callback
|
|
248
|
+
this.editorCleanup = () => {
|
|
249
|
+
if (editor.destroy) {
|
|
250
|
+
editor.destroy();
|
|
251
|
+
}
|
|
252
|
+
// Clear container
|
|
253
|
+
while (container.firstChild) {
|
|
254
|
+
container.removeChild(container.firstChild);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
saveEdit(newValue) {
|
|
259
|
+
const previousValue = this.cell.getValue();
|
|
260
|
+
const wasValid = this.cell.isValid();
|
|
261
|
+
const success = this.cell.saveEdit(newValue);
|
|
262
|
+
if (success) {
|
|
263
|
+
const column = this.cell.getColumnConfig();
|
|
264
|
+
const cellState = this.cell.getState();
|
|
265
|
+
const isValid = this.cell.isValid();
|
|
266
|
+
// Notify TableState that editing ended
|
|
267
|
+
if (this.tableState) {
|
|
268
|
+
this.tableState.clearEditingCell();
|
|
269
|
+
// Update validation state (lazy mode - on save)
|
|
270
|
+
this.updateValidationState();
|
|
271
|
+
}
|
|
272
|
+
// Emit save event
|
|
273
|
+
const saveEvent = {
|
|
274
|
+
cell: this.cell,
|
|
275
|
+
newValue: newValue,
|
|
276
|
+
previousValue: previousValue,
|
|
277
|
+
rowData: this.cell.getRowData(),
|
|
278
|
+
columnKey: column.key,
|
|
279
|
+
rowIndex: this.cell.getRowIndex(),
|
|
280
|
+
isValid: isValid,
|
|
281
|
+
validationErrors: cellState.error ? [cellState.error] : undefined,
|
|
282
|
+
cellState: cellState
|
|
283
|
+
};
|
|
284
|
+
this.cellSave.emit(saveEvent);
|
|
285
|
+
// Emit change event
|
|
286
|
+
const changeEvent = {
|
|
287
|
+
cell: this.cell,
|
|
288
|
+
oldValue: previousValue,
|
|
289
|
+
newValue: newValue,
|
|
290
|
+
rowData: this.cell.getRowData(),
|
|
291
|
+
columnKey: column.key,
|
|
292
|
+
rowIndex: this.cell.getRowIndex(),
|
|
293
|
+
wasValid: wasValid,
|
|
294
|
+
isValid: isValid,
|
|
295
|
+
cellState: cellState
|
|
296
|
+
};
|
|
297
|
+
this.cellChange.emit(changeEvent);
|
|
298
|
+
this.cleanupEditor();
|
|
299
|
+
}
|
|
300
|
+
// If validation fails, keep editing mode
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Update validation state in TableState
|
|
304
|
+
* Called on save (lazy mode) or on change (eager mode)
|
|
305
|
+
*/
|
|
306
|
+
updateValidationState() {
|
|
307
|
+
if (!this.tableState)
|
|
308
|
+
return;
|
|
309
|
+
const column = this.cell.getColumnConfig();
|
|
310
|
+
const isValid = this.cell.isValid();
|
|
311
|
+
const error = this.cell.getState().error;
|
|
312
|
+
const rowIndex = this.cell.getRowIndex();
|
|
313
|
+
// Only update if rowIndex is defined
|
|
314
|
+
if (rowIndex === undefined)
|
|
315
|
+
return;
|
|
316
|
+
this.tableState.updateCellValidation(rowIndex, column.key, isValid, error);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Trigger eager validation (on every change)
|
|
320
|
+
*/
|
|
321
|
+
triggerEagerValidation() {
|
|
322
|
+
if (!this.tableState || !this.tableConfig)
|
|
323
|
+
return;
|
|
324
|
+
const validationMode = this.tableConfig.validation?.mode || 'lazy';
|
|
325
|
+
if (validationMode !== 'eager')
|
|
326
|
+
return;
|
|
327
|
+
// Re-validate the cell
|
|
328
|
+
this.cell.validate();
|
|
329
|
+
// Update validation state
|
|
330
|
+
this.updateValidationState();
|
|
331
|
+
}
|
|
332
|
+
cancelEdit() {
|
|
333
|
+
const column = this.cell.getColumnConfig();
|
|
334
|
+
const cellState = this.cell.getState();
|
|
335
|
+
// Notify TableState that editing ended
|
|
336
|
+
if (this.tableState) {
|
|
337
|
+
this.tableState.clearEditingCell();
|
|
338
|
+
}
|
|
339
|
+
const cancelEvent = {
|
|
340
|
+
cell: this.cell,
|
|
341
|
+
value: this.cell.getValue(),
|
|
342
|
+
previousValue: cellState.previousValue,
|
|
343
|
+
rowData: this.cell.getRowData(),
|
|
344
|
+
columnKey: column.key,
|
|
345
|
+
rowIndex: this.cell.getRowIndex(),
|
|
346
|
+
cellState: cellState
|
|
347
|
+
};
|
|
348
|
+
this.cell.cancelEdit();
|
|
349
|
+
this.cellCancel.emit(cancelEvent);
|
|
350
|
+
this.cleanupEditor();
|
|
351
|
+
}
|
|
352
|
+
cleanupEditor() {
|
|
353
|
+
if (this.editorCleanup) {
|
|
354
|
+
this.editorCleanup();
|
|
355
|
+
this.editorCleanup = undefined;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
StCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
360
|
+
StCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StCellComponent, selector: "st-cell", inputs: { cell: "cell", editMode: "editMode", tableState: "tableState", tableConfig: "tableConfig", columnIndex: "columnIndex" }, outputs: { cellChange: "cellChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellSaveAndNavigate: "cellSaveAndNavigate" }, host: { listeners: { "keydown": "onCellKeyDown($event)" } }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:4px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
361
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, decorators: [{
|
|
362
|
+
type: Component,
|
|
363
|
+
args: [{ selector: 'st-cell', template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:4px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"] }]
|
|
364
|
+
}], ctorParameters: function () { return []; }, propDecorators: { cell: [{
|
|
365
|
+
type: Input
|
|
366
|
+
}], editMode: [{
|
|
367
|
+
type: Input
|
|
368
|
+
}], tableState: [{
|
|
369
|
+
type: Input
|
|
370
|
+
}], tableConfig: [{
|
|
371
|
+
type: Input
|
|
372
|
+
}], columnIndex: [{
|
|
373
|
+
type: Input
|
|
374
|
+
}], cellChange: [{
|
|
375
|
+
type: Output
|
|
376
|
+
}], cellEdit: [{
|
|
377
|
+
type: Output
|
|
378
|
+
}], cellSave: [{
|
|
379
|
+
type: Output
|
|
380
|
+
}], cellCancel: [{
|
|
381
|
+
type: Output
|
|
382
|
+
}], cellSaveAndNavigate: [{
|
|
383
|
+
type: Output
|
|
384
|
+
}], editorContainer: [{
|
|
385
|
+
type: ViewChild,
|
|
386
|
+
args: ['editorContainer', { read: ElementRef }]
|
|
387
|
+
}], onCellKeyDown: [{
|
|
388
|
+
type: HostListener,
|
|
389
|
+
args: ['keydown', ['$event']]
|
|
390
|
+
}] } });
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY2VsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtY2VsbC9zdC1jZWxsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jZWxsL3N0LWNlbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBOEIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNKLE9BQU8sRUFBa0UsUUFBUSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFTMUosTUFBTSxPQUFPLGVBQWU7SUFtQjFCO1FBakJTLGFBQVEsR0FBYSxRQUFRLENBQUMsS0FBSyxDQUFDO1FBS25DLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNqRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDN0MsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQzdDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNqRCx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBMEQsQ0FBQztJQVN4RyxDQUFDO0lBRUosUUFBUTtRQUNOLHdDQUF3QztRQUN4Qyw2RUFBNkU7UUFDN0UsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ3JELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDM0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFekMsb0NBQW9DO2dCQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtvQkFDbkQsbURBQW1EO29CQUNuRCxJQUFJLFFBQVE7d0JBQ1IsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDakYsdUJBQXVCO3dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztxQkFDckM7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYix3REFBd0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDakQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsNENBQTRDO1FBQzVDLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ3BDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE9BQU8sTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixzREFBc0Q7UUFDdEQsNERBQTREO1FBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO1lBQ2YsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3hCLE9BQU8sZUFBZSxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBR0QsYUFBYSxDQUFDLEtBQW9CO1FBQ2hDLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUMxQixPQUFPO1NBQ1I7UUFFRCxvREFBb0Q7UUFDcEQsUUFBUSxLQUFLLENBQUMsR0FBb0IsRUFBRTtZQUNsQyxLQUFLLGFBQWEsQ0FBQyxLQUFLO2dCQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3pCLGlDQUFpQztvQkFDakMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUNwQyx3Q0FBd0M7b0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQy9FO2dCQUNELGtEQUFrRDtnQkFDbEQsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLEdBQUc7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDekIsaUNBQWlDO29CQUNqQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ3BDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO29CQUN4RixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELGtEQUFrRDtnQkFDbEQsTUFBTTtZQUVSLEtBQUssYUFBYSxDQUFDLE1BQU07Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbEIsNENBQTRDO2lCQUM3QztnQkFDRCxNQUFNO1lBRVI7Z0JBQ0UsMkRBQTJEO2dCQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7d0JBQzdCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUN4QixzREFBc0Q7d0JBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ2xDO2lCQUNGO2dCQUNELE1BQU07U0FDVDtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFVBQVU7WUFDZixDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVTtZQUNmLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLEtBQW9CO1FBQzVDLG9EQUFvRDtRQUNwRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNyRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEVBQUU7WUFDWixxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxTQUFTLEdBQWtCO2dCQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU5QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDUDtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsdURBQXVEO1FBQ3ZELGdEQUFnRDtJQUNsRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsMkVBQTJFO1FBQzNFLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUUzQyxrREFBa0Q7WUFDbEQsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzVEO2FBQ0Y7WUFFRCxNQUFNLFNBQVMsR0FBa0I7Z0JBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDL0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHO2dCQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTthQUNoQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFOUIsa0RBQWtEO1lBQ2xELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNQO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsT0FBTztTQUNSO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRTdCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RCxPQUFPO1NBQ1I7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO1FBRXJELHdCQUF3QjtRQUN4QixNQUFNLE9BQU8sR0FBMkI7WUFDdEMsS0FBSztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUc7WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pDLFFBQVEsRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUMxQixzQ0FBc0M7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDbEQsK0NBQStDO29CQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyw2Q0FBNkM7b0JBQ2pGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2lCQUMvQjtZQUNILENBQUM7WUFDRCxNQUFNLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsQ0FBQztZQUNELFNBQVM7U0FDVixDQUFDO1FBRUYsNEJBQTRCO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ3hCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO1lBQ0Qsa0JBQWtCO1lBQ2xCLE9BQU8sU0FBUyxDQUFDLFVBQVUsRUFBRTtnQkFDM0IsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDN0M7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sUUFBUSxDQUFDLFFBQWE7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLElBQUksT0FBTyxFQUFFO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFcEMsdUNBQXVDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUVuQyxnREFBZ0Q7Z0JBQ2hELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQzlCO1lBRUQsa0JBQWtCO1lBQ2xCLE1BQU0sU0FBUyxHQUFrQjtnQkFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixhQUFhLEVBQUUsYUFBYTtnQkFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDakMsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUNqRSxTQUFTLEVBQUUsU0FBUzthQUNyQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFOUIsb0JBQW9CO1lBQ3BCLE1BQU0sV0FBVyxHQUFvQjtnQkFDbkMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDakMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixTQUFTLEVBQUUsU0FBUzthQUNyQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO1FBQ0QseUNBQXlDO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUU3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV6QyxxQ0FBcUM7UUFDckMsSUFBSSxRQUFRLEtBQUssU0FBUztZQUFFLE9BQU87UUFFbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FDbEMsUUFBUSxFQUNSLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsT0FBTyxFQUNQLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBRWxELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxNQUFNLENBQUM7UUFDbkUsSUFBSSxjQUFjLEtBQUssT0FBTztZQUFFLE9BQU87UUFFdkMsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFckIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2Qyx1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUNwQztRQUVELE1BQU0sV0FBVyxHQUFvQjtZQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0IsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUc7WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pDLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQzs7NEdBeGFVLGVBQWU7Z0dBQWYsZUFBZSxzZUFhWSxVQUFVLDZCQ3pCbEQsMnlCQTBCTTsyRkRkTyxlQUFlO2tCQUwzQixTQUFTOytCQUNFLFNBQVM7MEVBS1YsSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRTZDLGVBQWU7c0JBQWxFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQTBGbEQsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZWxsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NlbGwuY2xhc3MnO1xuaW1wb3J0IHsgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsRWRpdEV2ZW50LCBDZWxsU2F2ZUV2ZW50LCBDZWxsQ2hhbmdlRXZlbnQsIENlbGxDYW5jZWxFdmVudCwgRWRpdE1vZGUsIE5hdmlnYXRpb25LZXksIE5hdmlnYXRpb25EaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1jZWxsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LWNlbGwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1jZWxsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFN0Q2VsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgY2VsbCE6IENlbGw8YW55PjtcbiAgQElucHV0KCkgZWRpdE1vZGU6IEVkaXRNb2RlID0gRWRpdE1vZGUuQ0xJQ0s7XG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBASW5wdXQoKSB0YWJsZUNvbmZpZz86IFRhYmxlQ29uZmlnO1xuICBASW5wdXQoKSBjb2x1bW5JbmRleD86IG51bWJlcjtcbiAgXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEVkaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsU2F2ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENhbmNlbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbFNhdmVBbmROYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e2V2ZW50OiBLZXlib2FyZEV2ZW50LCBkaXJlY3Rpb246IE5hdmlnYXRpb25EaXJlY3Rpb259PigpO1xuICBcbiAgQFZpZXdDaGlsZCgnZWRpdG9yQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGVkaXRvckNvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG4gIFxuICBwcml2YXRlIGVkaXRvckNsZWFudXA/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZWRpdGluZ1Bvc2l0aW9uU3Vic2NyaXB0aW9uPzogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGVkaXRpbmcgcG9zaXRpb24gY2hhbmdlc1xuICAgIC8vIFdoZW4gYW5vdGhlciBjZWxsIHN0YXJ0cyBlZGl0aW5nLCBzYXZlIHRoaXMgY2VsbCBpZiBpdCdzIGN1cnJlbnRseSBlZGl0aW5nXG4gICAgaWYgKHRoaXMudGFibGVTdGF0ZSAmJiB0aGlzLmNvbHVtbkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdGluZ1Bvc2l0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZVN0YXRlLmVkaXRpbmdDZWxsUG9zaXRpb24kLnN1YnNjcmliZShwb3NpdGlvbiA9PiB7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5jZWxsLmdldFJvd0luZGV4KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB0aGlzIGNlbGwgaXMgY3VycmVudGx5IGVkaXRpbmdcbiAgICAgICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSAmJiByb3dJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQW5kIHRoZSBuZXcgZWRpdGluZyBwb3NpdGlvbiBpcyBhIGRpZmZlcmVudCBjZWxsXG4gICAgICAgICAgaWYgKHBvc2l0aW9uICYmIFxuICAgICAgICAgICAgICAocG9zaXRpb24ucm93SW5kZXggIT09IHJvd0luZGV4IHx8IHBvc2l0aW9uLmNvbHVtbkluZGV4ICE9PSB0aGlzLmNvbHVtbkluZGV4KSkge1xuICAgICAgICAgICAgLy8gRm9yY2Ugc2F2ZSB0aGlzIGNlbGxcbiAgICAgICAgICAgIHRoaXMuc2F2ZUVkaXQodGhpcy5jZWxsLmdldFZhbHVlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIElmIGNlbGwgaXMgYWxyZWFkeSBpbiBlZGl0aW5nIG1vZGUsIHJlbmRlciB0aGUgZWRpdG9yXG4gICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSAmJiB0aGlzLmVkaXRvckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXJFZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBFZGl0b3IoKTtcbiAgICBcbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGVkaXRpbmcgcG9zaXRpb24gY2hhbmdlc1xuICAgIGlmICh0aGlzLmVkaXRpbmdQb3NpdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5lZGl0aW5nUG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgcmV0dXJuIGNvbmZpZy5lZGl0YWJsZSA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCB2YWxpZGF0aW9uRXJyb3IoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBSZWFkIHZhbGlkYXRpb24gc3RhdGUgd2l0aG91dCB0cmlnZ2VyaW5nIHZhbGlkYXRpb25cbiAgICAvLyBUaGlzIHByZXZlbnRzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY2VsbC5nZXRTdGF0ZSgpO1xuICAgIFxuICAgIGlmIChzdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIHN0YXRlLmVycm9yO1xuICAgIH1cbiAgICBcbiAgICBpZiAoc3RhdGUuZXJyb3JzICYmIEFycmF5LmlzQXJyYXkoc3RhdGUuZXJyb3JzKSAmJiBzdGF0ZS5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmVycm9ycy5qb2luKCcsICcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBPbmx5IHJldHVybiBnZW5lcmljIG1lc3NhZ2UgaWYgY2VsbCBpcyBtYXJrZWQgYXMgaW52YWxpZFxuICAgIGlmICghdGhpcy5jZWxsLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuICdJbnZhbGlkIHZhbHVlJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBoYXNDZWxsVGVtcGxhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jZWxsLmdldENvbHVtbkNvbmZpZygpO1xuICAgIHJldHVybiAhIWNvbmZpZy5jZWxsVGVtcGxhdGU7XG4gIH1cblxuICBnZXQgY2VsbFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsLmdldENvbHVtbkNvbmZpZygpLmNlbGxUZW1wbGF0ZSB8fCBudWxsO1xuICB9XG5cbiAgZ2V0IHRlbXBsYXRlQ29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuY2VsbC5nZXRWYWx1ZSgpLFxuICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgIHJvd0luZGV4OiB0aGlzLmNlbGwuZ2V0Um93SW5kZXgoKVxuICAgIH07XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25DZWxsS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8vIE9ubHkgaGFuZGxlIGlmIHRoaXMgY2VsbCBpcyBmb2N1c2VkXG4gICAgaWYgKCF0aGlzLmNlbGwuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIE5hdmlnYXRpb25LZXkgZW51bSBmb3IgdHlwZS1zYWZlIGtleSBjaGVja2luZ1xuICAgIHN3aXRjaCAoZXZlbnQua2V5IGFzIE5hdmlnYXRpb25LZXkpIHtcbiAgICAgIGNhc2UgTmF2aWdhdGlvbktleS5FTlRFUjpcbiAgICAgICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSkge1xuICAgICAgICAgIC8vIFNhdmUgYW5kIGxldCBuYXZpZ2F0aW9uIGhhcHBlblxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5zYXZlRWRpdCh0aGlzLmNlbGwuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byB0cmlnZ2VyIG5hdmlnYXRpb24gZG93blxuICAgICAgICAgIHRoaXMuY2VsbFNhdmVBbmROYXZpZ2F0ZS5lbWl0KHsgZXZlbnQsIGRpcmVjdGlvbjogTmF2aWdhdGlvbkRpcmVjdGlvbi5ET1dOIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vdCBlZGl0aW5nLCBsZXQgZGlyZWN0aXZlIGhhbmRsZSBuYXZpZ2F0aW9uXG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTmF2aWdhdGlvbktleS5UQUI6XG4gICAgICAgIGlmICh0aGlzLmNlbGwuaXNFZGl0aW5nKCkpIHtcbiAgICAgICAgICAvLyBTYXZlIGFuZCBsZXQgbmF2aWdhdGlvbiBoYXBwZW5cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuc2F2ZUVkaXQodGhpcy5jZWxsLmdldFZhbHVlKCkpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gTmF2aWdhdGlvbkRpcmVjdGlvbi5MRUZUIDogTmF2aWdhdGlvbkRpcmVjdGlvbi5SSUdIVDtcbiAgICAgICAgICB0aGlzLmNlbGxTYXZlQW5kTmF2aWdhdGUuZW1pdCh7IGV2ZW50LCBkaXJlY3Rpb24gfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm90IGVkaXRpbmcsIGxldCBkaXJlY3RpdmUgaGFuZGxlIG5hdmlnYXRpb25cbiAgICAgICAgYnJlYWs7XG4gICAgICAgIFxuICAgICAgY2FzZSBOYXZpZ2F0aW9uS2V5LkVTQ0FQRTpcbiAgICAgICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7XG4gICAgICAgICAgLy8gU3RheSBmb2N1c2VkIG9uIHNhbWUgY2VsbCAobm8gbmF2aWdhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBDaGVjayBmb3IgYWxwaGFudW1lcmljIGtleXMgd2hlbiBmb2N1c2VkIGJ1dCBub3QgZWRpdGluZ1xuICAgICAgICBpZiAoIXRoaXMuY2VsbC5pc0VkaXRpbmcoKSAmJiB0aGlzLmlzQWxwaGFudW1lcmljS2V5KGV2ZW50KSkge1xuICAgICAgICAgIGlmICh0aGlzLmNhbkVkaXRWaWFLZXlib2FyZCgpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAvLyBTdGFydCBlZGl0aW5nIHdpdGggdGhlIHByZXNzZWQga2V5IGFzIGluaXRpYWwgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuc3RhcnRFZGl0V2l0aEtleShldmVudC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBFbnRlciBrZXkgY2FuIHRyaWdnZXIgZWRpdGluZ1xuICAgKiBVc2luZyBFZGl0TW9kZSBlbnVtIHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSBjYW5FZGl0VmlhRW50ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGl0YWJsZSAmJiBcbiAgICAgICAgICAgKHRoaXMuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkVOVEVSIHx8IHRoaXMuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkNMSUNLKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGtleWJvYXJkIGNhbiB0cmlnZ2VyIGVkaXRpbmcgKGZvciBhbHBoYW51bWVyaWMgYW5kIGRvdWJsZS1jbGljaylcbiAgICovXG4gIHByaXZhdGUgY2FuRWRpdFZpYUtleWJvYXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRWRpdGFibGUgJiYgXG4gICAgICAgICAgICh0aGlzLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FTlRFUiB8fCB0aGlzLmVkaXRNb2RlID09PSBFZGl0TW9kZS5DTElDSyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGtleSBpcyBhbHBoYW51bWVyaWMgKHNpbmdsZSBjaGFyYWN0ZXIpXG4gICAqL1xuICBwcml2YXRlIGlzQWxwaGFudW1lcmljS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgLy8gU2luZ2xlIGNoYXJhY3RlciBrZXlzIChsZXR0ZXJzLCBudW1iZXJzLCBzeW1ib2xzKVxuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdGFydCBlZGl0aW5nIHdpdGggYSBzcGVjaWZpYyBrZXkgYXMgdGhlIGluaXRpYWwgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgc3RhcnRFZGl0V2l0aEtleShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNhblN0YXJ0ID0gdGhpcy5jZWxsLnN0YXJ0RWRpdCgpO1xuICAgIGlmIChjYW5TdGFydCkge1xuICAgICAgLy8gUmVwbGFjZSBjdXJyZW50IHZhbHVlIHdpdGggdGhlIGtleVxuICAgICAgdGhpcy5jZWxsLnNldFZhbHVlKGtleSwgZmFsc2UpO1xuICAgICAgXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICBjb25zdCBlZGl0RXZlbnQ6IENlbGxFZGl0RXZlbnQgPSB7XG4gICAgICAgIGNlbGw6IHRoaXMuY2VsbCxcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICAgIGNlbGxTdGF0ZTogdGhpcy5jZWxsLmdldFN0YXRlKClcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxFZGl0LmVtaXQoZWRpdEV2ZW50KTtcbiAgICAgIFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyRWRpdG9yKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBvbkNlbGxDbGljaygpOiB2b2lkIHtcbiAgICAvLyBTaW5nbGUgY2xpY2sgbm93IG9ubHkgZm9jdXNlcywgZG9lc24ndCBzdGFydCBlZGl0aW5nXG4gICAgLy8gRm9jdXMgaXMgaGFuZGxlZCBieSBwYXJlbnQgc3QtdGFibGUgY29tcG9uZW50XG4gIH1cblxuICBvbkNlbGxEb3VibGVDbGljaygpOiB2b2lkIHtcbiAgICAvLyBEb3VibGUtY2xpY2sgc3RhcnRzIGVkaXRpbmcgcmVnYXJkbGVzcyBvZiBFZGl0TW9kZSAoRXhjZWwtbGlrZSBiZWhhdmlvcilcbiAgICBpZiAodGhpcy5pc0VkaXRhYmxlICYmICF0aGlzLmNlbGwuaXNFZGl0aW5nKCkpIHtcbiAgICAgIHRoaXMuc3RhcnRFZGl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVkaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY2FuU3RhcnQgPSB0aGlzLmNlbGwuc3RhcnRFZGl0KCk7XG4gICAgaWYgKGNhblN0YXJ0KSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICBcbiAgICAgIC8vIE5vdGlmeSBUYWJsZVN0YXRlIHRoYXQgdGhpcyBjZWxsIGlzIG5vdyBlZGl0aW5nXG4gICAgICBpZiAodGhpcy50YWJsZVN0YXRlICYmIHRoaXMuY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuY2VsbC5nZXRSb3dJbmRleCgpO1xuICAgICAgICBpZiAocm93SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudGFibGVTdGF0ZS5zZXRFZGl0aW5nQ2VsbChyb3dJbmRleCwgdGhpcy5jb2x1bW5JbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZWRpdEV2ZW50OiBDZWxsRWRpdEV2ZW50ID0ge1xuICAgICAgICBjZWxsOiB0aGlzLmNlbGwsXG4gICAgICAgIHZhbHVlOiB0aGlzLmNlbGwuZ2V0VmFsdWUoKSxcbiAgICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICAgIGNlbGxTdGF0ZTogdGhpcy5jZWxsLmdldFN0YXRlKClcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxFZGl0LmVtaXQoZWRpdEV2ZW50KTtcbiAgICAgIFxuICAgICAgLy8gV2FpdCBmb3IgQW5ndWxhciB0byByZW5kZXIgdGhlIGVkaXRvciBjb250YWluZXJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlckVkaXRvcigpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJFZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvckNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2VsbC5nZXRDb2x1bW5Db25maWcoKTtcbiAgICBjb25zdCBlZGl0b3IgPSBjb2x1bW4uZWRpdG9yO1xuICAgIFxuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIGVkaXRvciBjb25maWd1cmVkIGZvciBjb2x1bW46JywgY29sdW1uLmtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNlbGwuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmVkaXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIFxuICAgIC8vIENyZWF0ZSBlZGl0b3IgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PGFueT4gPSB7XG4gICAgICB2YWx1ZSxcbiAgICAgIHJvd0RhdGE6IHRoaXMuY2VsbC5nZXRSb3dEYXRhKCksXG4gICAgICBjb2x1bW5LZXk6IGNvbHVtbi5rZXksXG4gICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICBvbkNoYW5nZTogKG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVHJpZ2dlciBlYWdlciB2YWxpZGF0aW9uIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb25maWc/LnZhbGlkYXRpb24/Lm1vZGUgPT09ICdlYWdlcicpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgY2VsbCB2YWx1ZSB0ZW1wb3JhcmlseSBmb3IgdmFsaWRhdGlvblxuICAgICAgICAgIHRoaXMuY2VsbC5zZXRWYWx1ZShuZXdWYWx1ZSwgdHJ1ZSk7IC8vIHNraXAgdmFsaWRhdGlvbiB0byBhdm9pZCBkb3VibGUgdmFsaWRhdGlvblxuICAgICAgICAgIHRoaXMudHJpZ2dlckVhZ2VyVmFsaWRhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25TYXZlOiAobmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNhdmVFZGl0KG5ld1ZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH0sXG4gICAgICBjb250YWluZXJcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGwgZWRpdG9yJ3MgZWRpdCBtZXRob2RcbiAgICBlZGl0b3IuZWRpdChjb250ZXh0KTtcbiAgICBcbiAgICAvLyBTdG9yZSBjbGVhbnVwIGNhbGxiYWNrXG4gICAgdGhpcy5lZGl0b3JDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgaWYgKGVkaXRvci5kZXN0cm95KSB7XG4gICAgICAgIGVkaXRvci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBjb250YWluZXJcbiAgICAgIHdoaWxlIChjb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNhdmVFZGl0KG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5jZWxsLmdldFZhbHVlKCk7XG4gICAgY29uc3Qgd2FzVmFsaWQgPSB0aGlzLmNlbGwuaXNWYWxpZCgpO1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmNlbGwuc2F2ZUVkaXQobmV3VmFsdWUpO1xuICAgIFxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICBjb25zdCBjZWxsU3RhdGUgPSB0aGlzLmNlbGwuZ2V0U3RhdGUoKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmNlbGwuaXNWYWxpZCgpO1xuICAgICAgXG4gICAgICAvLyBOb3RpZnkgVGFibGVTdGF0ZSB0aGF0IGVkaXRpbmcgZW5kZWRcbiAgICAgIGlmICh0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0YXRlLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlIChsYXp5IG1vZGUgLSBvbiBzYXZlKVxuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbWl0IHNhdmUgZXZlbnRcbiAgICAgIGNvbnN0IHNhdmVFdmVudDogQ2VsbFNhdmVFdmVudCA9IHtcbiAgICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWUsXG4gICAgICAgIHByZXZpb3VzVmFsdWU6IHByZXZpb3VzVmFsdWUsXG4gICAgICAgIHJvd0RhdGE6IHRoaXMuY2VsbC5nZXRSb3dEYXRhKCksXG4gICAgICAgIGNvbHVtbktleTogY29sdW1uLmtleSxcbiAgICAgICAgcm93SW5kZXg6IHRoaXMuY2VsbC5nZXRSb3dJbmRleCgpLFxuICAgICAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgICAgICB2YWxpZGF0aW9uRXJyb3JzOiBjZWxsU3RhdGUuZXJyb3IgPyBbY2VsbFN0YXRlLmVycm9yXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY2VsbFN0YXRlOiBjZWxsU3RhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxTYXZlLmVtaXQoc2F2ZUV2ZW50KTtcbiAgICAgIFxuICAgICAgLy8gRW1pdCBjaGFuZ2UgZXZlbnRcbiAgICAgIGNvbnN0IGNoYW5nZUV2ZW50OiBDZWxsQ2hhbmdlRXZlbnQgPSB7XG4gICAgICAgIGNlbGw6IHRoaXMuY2VsbCxcbiAgICAgICAgb2xkVmFsdWU6IHByZXZpb3VzVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICAgIHdhc1ZhbGlkOiB3YXNWYWxpZCxcbiAgICAgICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICAgICAgY2VsbFN0YXRlOiBjZWxsU3RhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdChjaGFuZ2VFdmVudCk7XG4gICAgICBcbiAgICAgIHRoaXMuY2xlYW51cEVkaXRvcigpO1xuICAgIH1cbiAgICAvLyBJZiB2YWxpZGF0aW9uIGZhaWxzLCBrZWVwIGVkaXRpbmcgbW9kZVxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHZhbGlkYXRpb24gc3RhdGUgaW4gVGFibGVTdGF0ZVxuICAgKiBDYWxsZWQgb24gc2F2ZSAobGF6eSBtb2RlKSBvciBvbiBjaGFuZ2UgKGVhZ2VyIG1vZGUpXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZhbGlkYXRpb25TdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2VsbC5nZXRDb2x1bW5Db25maWcoKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5jZWxsLmlzVmFsaWQoKTtcbiAgICBjb25zdCBlcnJvciA9IHRoaXMuY2VsbC5nZXRTdGF0ZSgpLmVycm9yO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5jZWxsLmdldFJvd0luZGV4KCk7XG4gICAgXG4gICAgLy8gT25seSB1cGRhdGUgaWYgcm93SW5kZXggaXMgZGVmaW5lZFxuICAgIGlmIChyb3dJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgXG4gICAgdGhpcy50YWJsZVN0YXRlLnVwZGF0ZUNlbGxWYWxpZGF0aW9uKFxuICAgICAgcm93SW5kZXgsXG4gICAgICBjb2x1bW4ua2V5LFxuICAgICAgaXNWYWxpZCxcbiAgICAgIGVycm9yXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRyaWdnZXIgZWFnZXIgdmFsaWRhdGlvbiAob24gZXZlcnkgY2hhbmdlKVxuICAgKi9cbiAgcHJpdmF0ZSB0cmlnZ2VyRWFnZXJWYWxpZGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJsZVN0YXRlIHx8ICF0aGlzLnRhYmxlQ29uZmlnKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdmFsaWRhdGlvbk1vZGUgPSB0aGlzLnRhYmxlQ29uZmlnLnZhbGlkYXRpb24/Lm1vZGUgfHwgJ2xhenknO1xuICAgIGlmICh2YWxpZGF0aW9uTW9kZSAhPT0gJ2VhZ2VyJykgcmV0dXJuO1xuICAgIFxuICAgIC8vIFJlLXZhbGlkYXRlIHRoZSBjZWxsXG4gICAgdGhpcy5jZWxsLnZhbGlkYXRlKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhbGlkYXRpb24gc3RhdGVcbiAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxFZGl0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2VsbC5nZXRDb2x1bW5Db25maWcoKTtcbiAgICBjb25zdCBjZWxsU3RhdGUgPSB0aGlzLmNlbGwuZ2V0U3RhdGUoKTtcbiAgICBcbiAgICAvLyBOb3RpZnkgVGFibGVTdGF0ZSB0aGF0IGVkaXRpbmcgZW5kZWRcbiAgICBpZiAodGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLnRhYmxlU3RhdGUuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjYW5jZWxFdmVudDogQ2VsbENhbmNlbEV2ZW50ID0ge1xuICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgdmFsdWU6IHRoaXMuY2VsbC5nZXRWYWx1ZSgpLFxuICAgICAgcHJldmlvdXNWYWx1ZTogY2VsbFN0YXRlLnByZXZpb3VzVmFsdWUsXG4gICAgICByb3dEYXRhOiB0aGlzLmNlbGwuZ2V0Um93RGF0YSgpLFxuICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgcm93SW5kZXg6IHRoaXMuY2VsbC5nZXRSb3dJbmRleCgpLFxuICAgICAgY2VsbFN0YXRlOiBjZWxsU3RhdGVcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuY2VsbC5jYW5jZWxFZGl0KCk7XG4gICAgdGhpcy5jZWxsQ2FuY2VsLmVtaXQoY2FuY2VsRXZlbnQpO1xuICAgIHRoaXMuY2xlYW51cEVkaXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRvckNsZWFudXApIHtcbiAgICAgIHRoaXMuZWRpdG9yQ2xlYW51cCgpO1xuICAgICAgdGhpcy5lZGl0b3JDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInN0LWNlbGxcIiBcbiAgW25nQ2xhc3NdPVwie1xuICAgICdlZGl0aW5nJzogY2VsbC5pc0VkaXRpbmcoKSxcbiAgICAnZGlydHknOiBjZWxsLmlzRGlydHkoKSxcbiAgICAnaW52YWxpZCc6ICFjZWxsLmlzVmFsaWQoKSxcbiAgICAncmVhZG9ubHknOiAhaXNFZGl0YWJsZVxuICB9XCJcbiAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKClcIiBcbiAgKGRibGNsaWNrKT1cIm9uQ2VsbERvdWJsZUNsaWNrKClcIj5cblxuICA8IS0tIERpc3BsYXkgTW9kZSB3aXRoIFRlbXBsYXRlIFN1cHBvcnQgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbC5pc0VkaXRpbmcoKVwiPlxuICAgIDwhLS0gQ3VzdG9tIFRlbXBsYXRlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNDZWxsVGVtcGxhdGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBEZWZhdWx0IFRleHQgUmVuZGVyaW5nIC0tPlxuICAgIDxzcGFuICpuZ0lmPVwiIWhhc0NlbGxUZW1wbGF0ZVwiIGNsYXNzPVwiY2VsbC1kaXNwbGF5XCI+XG4gICAgICB7eyBjZWxsLnJlbmRlcigpIH19XG4gICAgPC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEVkaXQgTW9kZSAtLT5cbiAgPGRpdiAqbmdJZj1cImNlbGwuaXNFZGl0aW5nKClcIiBjbGFzcz1cImNlbGwtZWRpdG9yXCIgI2VkaXRvckNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Component, Output, EventEmitter, ViewChild } from '@angular/core';
|
|
2
|
+
import { CellDataType } from '../../../models/cell-types';
|
|
3
|
+
import { ColumnConfigFactory } from '../../../factories/column-config.factory';
|
|
4
|
+
import { ColumnEditorComponent } from '../../../builder/components/column-editor/column-editor.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../builder/components/column-editor/column-editor.component";
|
|
7
|
+
export class StColumnEditorModalComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.columnCreated = new EventEmitter();
|
|
10
|
+
this.cancelled = new EventEmitter();
|
|
11
|
+
this.columnIndex = -1;
|
|
12
|
+
}
|
|
13
|
+
ngOnInit() {
|
|
14
|
+
// Create a default column that will be edited
|
|
15
|
+
this.newColumn = this.createDefaultColumn();
|
|
16
|
+
}
|
|
17
|
+
ngOnDestroy() {
|
|
18
|
+
// Cleanup if needed
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a default column configuration
|
|
22
|
+
*/
|
|
23
|
+
createDefaultColumn() {
|
|
24
|
+
return ColumnConfigFactory.text('newColumn', {
|
|
25
|
+
header: 'New Column',
|
|
26
|
+
editable: true,
|
|
27
|
+
sortable: true,
|
|
28
|
+
filterable: true,
|
|
29
|
+
resizable: true,
|
|
30
|
+
hideable: true,
|
|
31
|
+
visible: true
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Trigger save from external button
|
|
36
|
+
*/
|
|
37
|
+
onSave() {
|
|
38
|
+
// Call the column editor's save method
|
|
39
|
+
if (this.columnEditor) {
|
|
40
|
+
this.columnEditor.onSave();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Handle column updates from the editor
|
|
45
|
+
*/
|
|
46
|
+
onColumnUpdated(updates) {
|
|
47
|
+
// Merge updates into the new column
|
|
48
|
+
this.newColumn = { ...this.newColumn, ...updates };
|
|
49
|
+
// Use ColumnConfigFactory to create proper column based on data type
|
|
50
|
+
let finalColumn;
|
|
51
|
+
const key = updates.key || this.newColumn.key;
|
|
52
|
+
const dataType = updates.dataType || this.newColumn.dataType;
|
|
53
|
+
switch (dataType) {
|
|
54
|
+
case CellDataType.NUMBER:
|
|
55
|
+
finalColumn = ColumnConfigFactory.number(key, this.newColumn);
|
|
56
|
+
break;
|
|
57
|
+
case CellDataType.DATE:
|
|
58
|
+
finalColumn = ColumnConfigFactory.date(key, this.newColumn);
|
|
59
|
+
break;
|
|
60
|
+
case CellDataType.BOOLEAN:
|
|
61
|
+
finalColumn = ColumnConfigFactory.boolean(key, this.newColumn);
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
finalColumn = ColumnConfigFactory.text(key, this.newColumn);
|
|
65
|
+
}
|
|
66
|
+
// Emit the created column
|
|
67
|
+
this.columnCreated.emit(finalColumn);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Handle cancel from the editor
|
|
71
|
+
*/
|
|
72
|
+
onCancel() {
|
|
73
|
+
this.cancelled.emit();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Handle backdrop click to close modal
|
|
77
|
+
*/
|
|
78
|
+
onBackdropClick(event) {
|
|
79
|
+
if (event.target === event.currentTarget) {
|
|
80
|
+
this.cancelled.emit();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Prevent event propagation from modal content
|
|
85
|
+
*/
|
|
86
|
+
onModalContentClick(event) {
|
|
87
|
+
event.stopPropagation();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
StColumnEditorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnEditorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
+
StColumnEditorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StColumnEditorModalComponent, selector: "st-column-editor-modal", outputs: { columnCreated: "columnCreated", cancelled: "cancelled" }, viewQueries: [{ propertyName: "columnEditor", first: true, predicate: ColumnEditorComponent, descendants: true }], ngImport: i0, template: "<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"modal-content\" (click)=\"onModalContentClick($event)\">\n <div class=\"modal-header\">\n <h2>Add New Column</h2>\n <button class=\"close-button\" (click)=\"onCancel()\" type=\"button\" aria-label=\"Close\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <!-- Now using the shared st-column-editor component from SharedTableComponentsModule -->\n <st-column-editor\n [column]=\"newColumn\"\n [columnIndex]=\"columnIndex\"\n (columnUpdated)=\"onColumnUpdated($event)\"\n (cancel)=\"onCancel()\">\n </st-column-editor>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSave()\">Add Column</button>\n </div>\n </div>\n</div>\n", styles: [".modal-backdrop{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:2000;animation:fadeIn .2s ease-in-out}.modal-content{background:white;border-radius:8px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;max-width:600px;max-height:90vh;width:90%;display:flex;flex-direction:column;animation:slideUp .3s cubic-bezier(.4,0,.2,1)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #e0e0e0;flex-shrink:0}.modal-header h2{margin:0;font-size:20px;font-weight:500;color:#212121}.close-button{background:none;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;border-radius:50%;color:#757575;transition:all .2s ease}.close-button:hover{background-color:#0000000a;color:#212121}.close-button:active{background-color:#00000014}.close-button:focus{outline:none;box-shadow:0 0 0 2px #1976d24d}.close-button svg{width:24px;height:24px}.modal-body{padding:0;overflow-y:auto;flex:1;min-height:0}.modal-body ::ng-deep st-column-editor{display:block}.modal-body ::ng-deep st-column-editor .column-editor{padding:0;border:none;box-shadow:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-header{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-actions{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-form{padding:24px}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 24px;border-top:1px solid #e0e0e0;flex-shrink:0;background-color:#f5f5f5}.modal-footer .btn{padding:10px 20px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.modal-footer .btn:focus{outline:none;box-shadow:0 0 0 2px #0000001a}.modal-footer .btn.btn-secondary{background-color:#fff;color:#424242;border:1px solid #d0d0d0}.modal-footer .btn.btn-secondary:hover{background-color:#f5f5f5}.modal-footer .btn.btn-secondary:active{background-color:#eee}.modal-footer .btn.btn-primary{background-color:#1976d2;color:#fff}.modal-footer .btn.btn-primary:hover{background-color:#1565c0}.modal-footer .btn.btn-primary:active{background-color:#0d47a1}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(50px)}to{opacity:1;transform:translateY(0)}}\n"], components: [{ type: i1.ColumnEditorComponent, selector: "st-column-editor", inputs: ["column", "columnIndex"], outputs: ["columnUpdated", "cancel"] }] });
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnEditorModalComponent, decorators: [{
|
|
93
|
+
type: Component,
|
|
94
|
+
args: [{ selector: 'st-column-editor-modal', template: "<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"modal-content\" (click)=\"onModalContentClick($event)\">\n <div class=\"modal-header\">\n <h2>Add New Column</h2>\n <button class=\"close-button\" (click)=\"onCancel()\" type=\"button\" aria-label=\"Close\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <!-- Now using the shared st-column-editor component from SharedTableComponentsModule -->\n <st-column-editor\n [column]=\"newColumn\"\n [columnIndex]=\"columnIndex\"\n (columnUpdated)=\"onColumnUpdated($event)\"\n (cancel)=\"onCancel()\">\n </st-column-editor>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSave()\">Add Column</button>\n </div>\n </div>\n</div>\n", styles: [".modal-backdrop{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:2000;animation:fadeIn .2s ease-in-out}.modal-content{background:white;border-radius:8px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;max-width:600px;max-height:90vh;width:90%;display:flex;flex-direction:column;animation:slideUp .3s cubic-bezier(.4,0,.2,1)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #e0e0e0;flex-shrink:0}.modal-header h2{margin:0;font-size:20px;font-weight:500;color:#212121}.close-button{background:none;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;border-radius:50%;color:#757575;transition:all .2s ease}.close-button:hover{background-color:#0000000a;color:#212121}.close-button:active{background-color:#00000014}.close-button:focus{outline:none;box-shadow:0 0 0 2px #1976d24d}.close-button svg{width:24px;height:24px}.modal-body{padding:0;overflow-y:auto;flex:1;min-height:0}.modal-body ::ng-deep st-column-editor{display:block}.modal-body ::ng-deep st-column-editor .column-editor{padding:0;border:none;box-shadow:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-header{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-actions{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-form{padding:24px}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 24px;border-top:1px solid #e0e0e0;flex-shrink:0;background-color:#f5f5f5}.modal-footer .btn{padding:10px 20px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.modal-footer .btn:focus{outline:none;box-shadow:0 0 0 2px #0000001a}.modal-footer .btn.btn-secondary{background-color:#fff;color:#424242;border:1px solid #d0d0d0}.modal-footer .btn.btn-secondary:hover{background-color:#f5f5f5}.modal-footer .btn.btn-secondary:active{background-color:#eee}.modal-footer .btn.btn-primary{background-color:#1976d2;color:#fff}.modal-footer .btn.btn-primary:hover{background-color:#1565c0}.modal-footer .btn.btn-primary:active{background-color:#0d47a1}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(50px)}to{opacity:1;transform:translateY(0)}}\n"] }]
|
|
95
|
+
}], propDecorators: { columnCreated: [{
|
|
96
|
+
type: Output
|
|
97
|
+
}], cancelled: [{
|
|
98
|
+
type: Output
|
|
99
|
+
}], columnEditor: [{
|
|
100
|
+
type: ViewChild,
|
|
101
|
+
args: [ColumnEditorComponent]
|
|
102
|
+
}] } });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLWVkaXRvci1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtY29sdW1uLWVkaXRvci1tb2RhbC9zdC1jb2x1bW4tZWRpdG9yLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jb2x1bW4tZWRpdG9yLW1vZGFsL3N0LWNvbHVtbi1lZGl0b3ItbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1FQUFtRSxDQUFDOzs7QUFPMUcsTUFBTSxPQUFPLDRCQUE0QjtJQUx6QztRQU1ZLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDakQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLL0MsZ0JBQVcsR0FBVyxDQUFDLENBQUMsQ0FBQztLQXdGMUI7SUF0RkMsUUFBUTtRQUNOLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1Qsb0JBQW9CO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQjtRQUN6QixPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0MsTUFBTSxFQUFFLFlBQVk7WUFDcEIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSix1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsT0FBOEI7UUFDNUMsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUVuRCxxRUFBcUU7UUFDckUsSUFBSSxXQUF5QixDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUU3RCxRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUN0QixXQUFXLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxJQUFJO2dCQUNwQixXQUFXLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxPQUFPO2dCQUN2QixXQUFXLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9ELE1BQU07WUFDUjtnQkFDRSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDL0Q7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLEtBQVk7UUFDMUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLEtBQVk7UUFDOUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7O3lIQTlGVSw0QkFBNEI7NkdBQTVCLDRCQUE0QixpTEFJNUIscUJBQXFCLGdEQ2ZsQyxrc0NBeUJBOzJGRGRhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx3QkFBd0I7OEJBS3hCLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFMkIsWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2x1bW5Db25maWcgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2VsbERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NlbGwtdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9jb2x1bW4tY29uZmlnLmZhY3RvcnknO1xuaW1wb3J0IHsgQ29sdW1uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYnVpbGRlci9jb21wb25lbnRzL2NvbHVtbi1lZGl0b3IvY29sdW1uLWVkaXRvci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1jb2x1bW4tZWRpdG9yLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LWNvbHVtbi1lZGl0b3ItbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1jb2x1bW4tZWRpdG9yLW1vZGFsLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3RDb2x1bW5FZGl0b3JNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQE91dHB1dCgpIGNvbHVtbkNyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbkNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIEBWaWV3Q2hpbGQoQ29sdW1uRWRpdG9yQ29tcG9uZW50KSBjb2x1bW5FZGl0b3IhOiBDb2x1bW5FZGl0b3JDb21wb25lbnQ7XG4gIFxuICBuZXdDb2x1bW4hOiBDb2x1bW5Db25maWc7XG4gIGNvbHVtbkluZGV4OiBudW1iZXIgPSAtMTtcbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgY29sdW1uIHRoYXQgd2lsbCBiZSBlZGl0ZWRcbiAgICB0aGlzLm5ld0NvbHVtbiA9IHRoaXMuY3JlYXRlRGVmYXVsdENvbHVtbigpO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbnVwIGlmIG5lZWRlZFxuICB9XG4gIFxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVmYXVsdCBjb2x1bW4gY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0Q29sdW1uKCk6IENvbHVtbkNvbmZpZyB7XG4gICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkudGV4dCgnbmV3Q29sdW1uJywge1xuICAgICAgaGVhZGVyOiAnTmV3IENvbHVtbicsXG4gICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgZmlsdGVyYWJsZTogdHJ1ZSxcbiAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgIGhpZGVhYmxlOiB0cnVlLFxuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogVHJpZ2dlciBzYXZlIGZyb20gZXh0ZXJuYWwgYnV0dG9uXG4gICAqL1xuICBvblNhdmUoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgY29sdW1uIGVkaXRvcidzIHNhdmUgbWV0aG9kXG4gICAgaWYgKHRoaXMuY29sdW1uRWRpdG9yKSB7XG4gICAgICB0aGlzLmNvbHVtbkVkaXRvci5vblNhdmUoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sdW1uIHVwZGF0ZXMgZnJvbSB0aGUgZWRpdG9yXG4gICAqL1xuICBvbkNvbHVtblVwZGF0ZWQodXBkYXRlczogUGFydGlhbDxDb2x1bW5Db25maWc+KTogdm9pZCB7XG4gICAgLy8gTWVyZ2UgdXBkYXRlcyBpbnRvIHRoZSBuZXcgY29sdW1uXG4gICAgdGhpcy5uZXdDb2x1bW4gPSB7IC4uLnRoaXMubmV3Q29sdW1uLCAuLi51cGRhdGVzIH07XG4gICAgXG4gICAgLy8gVXNlIENvbHVtbkNvbmZpZ0ZhY3RvcnkgdG8gY3JlYXRlIHByb3BlciBjb2x1bW4gYmFzZWQgb24gZGF0YSB0eXBlXG4gICAgbGV0IGZpbmFsQ29sdW1uOiBDb2x1bW5Db25maWc7XG4gICAgY29uc3Qga2V5ID0gdXBkYXRlcy5rZXkgfHwgdGhpcy5uZXdDb2x1bW4ua2V5O1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdXBkYXRlcy5kYXRhVHlwZSB8fCB0aGlzLm5ld0NvbHVtbi5kYXRhVHlwZTtcbiAgICBcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlIENlbGxEYXRhVHlwZS5OVU1CRVI6XG4gICAgICAgIGZpbmFsQ29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS5udW1iZXIoa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuREFURTpcbiAgICAgICAgZmluYWxDb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LmRhdGUoa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuQk9PTEVBTjpcbiAgICAgICAgZmluYWxDb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LmJvb2xlYW4oa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZmluYWxDb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LnRleHQoa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNyZWF0ZWQgY29sdW1uXG4gICAgdGhpcy5jb2x1bW5DcmVhdGVkLmVtaXQoZmluYWxDb2x1bW4pO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNhbmNlbCBmcm9tIHRoZSBlZGl0b3JcbiAgICovXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBiYWNrZHJvcCBjbGljayB0byBjbG9zZSBtb2RhbFxuICAgKi9cbiAgb25CYWNrZHJvcENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQcmV2ZW50IGV2ZW50IHByb3BhZ2F0aW9uIGZyb20gbW9kYWwgY29udGVudFxuICAgKi9cbiAgb25Nb2RhbENvbnRlbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wXCIgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgKGNsaWNrKT1cIm9uTW9kYWxDb250ZW50Q2xpY2soJGV2ZW50KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgIDxoMj5BZGQgTmV3IENvbHVtbjwvaDI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDwhLS0gTm93IHVzaW5nIHRoZSBzaGFyZWQgc3QtY29sdW1uLWVkaXRvciBjb21wb25lbnQgZnJvbSBTaGFyZWRUYWJsZUNvbXBvbmVudHNNb2R1bGUgLS0+XG4gICAgICA8c3QtY29sdW1uLWVkaXRvclxuICAgICAgICBbY29sdW1uXT1cIm5ld0NvbHVtblwiXG4gICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgIChjb2x1bW5VcGRhdGVkKT1cIm9uQ29sdW1uVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNhbmNlbCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L3N0LWNvbHVtbi1lZGl0b3I+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvblNhdmUoKVwiPkFkZCBDb2x1bW48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|