bways-report 0.1.2 → 0.1.4
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 +150 -51
- package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
- package/esm2022/lib/core/index.mjs +3 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
- package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
- package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
- package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
- package/esm2022/lib/data-access/adapters/index.mjs +8 -3
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
- package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
- package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
- package/esm2022/lib/data-access/contracts/index.mjs +2 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +24 -3
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +572 -102
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +225 -25
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +568 -12
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +238 -11
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +191 -25
- package/esm2022/lib/features/designer/designer.component.mjs +245 -27
- package/esm2022/lib/features/designer/index.mjs +4 -1
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +18 -10
- package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
- package/esm2022/lib/features/export/index.mjs +2 -2
- package/esm2022/lib/features/export/models/export.models.mjs +1 -1
- package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +239 -33
- package/esm2022/lib/features/runtime/index.mjs +2 -1
- package/esm2022/lib/features/runtime/report-execution.service.mjs +56 -0
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +423 -30
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +349 -7
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +545 -0
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
- package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
- package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
- package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +728 -74
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +30 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
- package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +145 -24
- package/fesm2022/bways-report.mjs +7797 -921
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/index.d.ts +2 -0
- package/lib/core/models/report-datasource.model.d.ts +9 -0
- package/lib/core/models/report-definition.model.d.ts +2 -0
- package/lib/core/models/report-grid.model.d.ts +67 -1
- package/lib/core/services/report-session-context.service.d.ts +6 -1
- package/lib/core/utils/data-normalization.util.d.ts +15 -0
- package/lib/core/utils/report-parameter.util.d.ts +35 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
- package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
- package/lib/data-access/adapters/index.d.ts +7 -2
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
- package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
- package/lib/data-access/contracts/api-dtos.d.ts +67 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +13 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +9 -1
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +12 -1
- package/lib/features/designer/designer.component.d.ts +11 -0
- package/lib/features/designer/index.d.ts +4 -0
- package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
- package/lib/features/designer/services/designer-state.service.d.ts +1 -1
- package/lib/features/designer/services/report-template.service.d.ts +32 -0
- package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
- package/lib/features/export/index.d.ts +2 -2
- package/lib/features/export/models/export.models.d.ts +23 -0
- package/lib/features/export/services/report-export.service.d.ts +31 -2
- package/lib/features/runtime/dynamic-renderer.component.d.ts +42 -2
- package/lib/features/runtime/index.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +16 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +171 -6
- package/lib/features/runtime/report-runtime.component.d.ts +86 -1
- package/lib/features/runtime/rpt-report.component.d.ts +69 -0
- package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
- package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/provide-reporting.d.ts +79 -26
- package/package.json +2 -1
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.js +45 -0
- package/schematics/ng-add/schema.json +17 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal, viewChild, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { ReportExportService } from '../export/services/report-export.service';
|
|
5
|
+
import { ReportRuntimeComponent } from './report-runtime.component';
|
|
6
|
+
import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
|
|
7
|
+
import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
export class RptReportComponent {
|
|
11
|
+
exportService = inject(ReportExportService);
|
|
12
|
+
persistence = inject(ReportPersistenceAdapter, { optional: true });
|
|
13
|
+
id = input(undefined);
|
|
14
|
+
report = input(null);
|
|
15
|
+
parameters = input({});
|
|
16
|
+
showExport = input(true);
|
|
17
|
+
enablePresets = input(true);
|
|
18
|
+
autoExecute = input(true);
|
|
19
|
+
rowClick = output();
|
|
20
|
+
dataLoaded = output();
|
|
21
|
+
gridStateChange = output();
|
|
22
|
+
selectionChange = output();
|
|
23
|
+
selectionChanged = output();
|
|
24
|
+
presetSaved = output();
|
|
25
|
+
presetChange = output();
|
|
26
|
+
exportRequested = output();
|
|
27
|
+
printRequested = output();
|
|
28
|
+
runtimeComponent = viewChild(ReportRuntimeComponent);
|
|
29
|
+
// Preset states
|
|
30
|
+
activePresetId = signal('default');
|
|
31
|
+
isSavePresetModalOpen = signal(false);
|
|
32
|
+
newPresetName = signal('');
|
|
33
|
+
latestGridState = signal(null);
|
|
34
|
+
customPresets = signal([]);
|
|
35
|
+
currentDefinition = computed(() => {
|
|
36
|
+
return this.report();
|
|
37
|
+
});
|
|
38
|
+
activeDefinition = computed(() => {
|
|
39
|
+
return this.report() ?? this.runtimeComponent()?.currentDefinition() ?? null;
|
|
40
|
+
});
|
|
41
|
+
recordCount = computed(() => {
|
|
42
|
+
return this.runtimeComponent()?.resultData()?.length ?? 0;
|
|
43
|
+
});
|
|
44
|
+
showToolbar = computed(() => {
|
|
45
|
+
return this.showExport() || this.enablePresets();
|
|
46
|
+
});
|
|
47
|
+
savedPresets = computed(() => {
|
|
48
|
+
const def = this.activeDefinition();
|
|
49
|
+
const initialPresets = def?.grid?.options?.presets ?? [];
|
|
50
|
+
const map = new Map();
|
|
51
|
+
for (const p of initialPresets) {
|
|
52
|
+
if (p && p.id)
|
|
53
|
+
map.set(p.id, p);
|
|
54
|
+
}
|
|
55
|
+
for (const p of this.customPresets()) {
|
|
56
|
+
if (p && p.id)
|
|
57
|
+
map.set(p.id, p);
|
|
58
|
+
}
|
|
59
|
+
return Array.from(map.values());
|
|
60
|
+
});
|
|
61
|
+
onRowActionTriggered(event) {
|
|
62
|
+
this.rowClick.emit({
|
|
63
|
+
row: event.row,
|
|
64
|
+
parameters: event.parameters,
|
|
65
|
+
action: event.action,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
onGridStateChanged(state) {
|
|
69
|
+
this.latestGridState.set(state);
|
|
70
|
+
this.gridStateChange.emit(state);
|
|
71
|
+
}
|
|
72
|
+
onSelectionChange(rows) {
|
|
73
|
+
this.selectionChange.emit(rows);
|
|
74
|
+
this.selectionChanged.emit(rows);
|
|
75
|
+
}
|
|
76
|
+
onSelectPreset(presetId) {
|
|
77
|
+
this.activePresetId.set(presetId);
|
|
78
|
+
if (presetId === 'default') {
|
|
79
|
+
this.presetChange.emit(null);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const preset = this.savedPresets().find((p) => p.id === presetId);
|
|
83
|
+
if (preset) {
|
|
84
|
+
if (preset.gridState) {
|
|
85
|
+
this.latestGridState.set(preset.gridState);
|
|
86
|
+
this.gridStateChange.emit(preset.gridState);
|
|
87
|
+
}
|
|
88
|
+
this.presetChange.emit(preset);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
confirmSavePreset() {
|
|
92
|
+
this.saveCurrentPreset();
|
|
93
|
+
}
|
|
94
|
+
exportExcel() {
|
|
95
|
+
this.onExportExcel();
|
|
96
|
+
}
|
|
97
|
+
exportCsv() {
|
|
98
|
+
this.onExportCsv();
|
|
99
|
+
}
|
|
100
|
+
print() {
|
|
101
|
+
this.onPrintReport();
|
|
102
|
+
}
|
|
103
|
+
openSavePresetModal() {
|
|
104
|
+
this.newPresetName.set('');
|
|
105
|
+
this.isSavePresetModalOpen.set(true);
|
|
106
|
+
}
|
|
107
|
+
closeSavePresetModal() {
|
|
108
|
+
this.isSavePresetModalOpen.set(false);
|
|
109
|
+
}
|
|
110
|
+
saveCurrentPreset() {
|
|
111
|
+
const name = this.newPresetName().trim();
|
|
112
|
+
if (!name)
|
|
113
|
+
return;
|
|
114
|
+
const presetId = `preset_${Date.now()}`;
|
|
115
|
+
const newPreset = {
|
|
116
|
+
id: presetId,
|
|
117
|
+
name,
|
|
118
|
+
gridState: this.latestGridState() ?? {},
|
|
119
|
+
createdAt: new Date().toISOString(),
|
|
120
|
+
};
|
|
121
|
+
const def = this.activeDefinition();
|
|
122
|
+
if (def && def.grid) {
|
|
123
|
+
if (!def.grid.options)
|
|
124
|
+
def.grid.options = {};
|
|
125
|
+
const currentPresets = def.grid.options.presets ?? [];
|
|
126
|
+
def.grid.options.presets = [...currentPresets, newPreset];
|
|
127
|
+
if (this.persistence && def.id) {
|
|
128
|
+
this.persistence.save(def).subscribe({
|
|
129
|
+
next: () => { },
|
|
130
|
+
error: () => { },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
this.customPresets.update((prev) => [...prev, newPreset]);
|
|
135
|
+
this.activePresetId.set(presetId);
|
|
136
|
+
this.presetSaved.emit({ name, preset: newPreset });
|
|
137
|
+
this.closeSavePresetModal();
|
|
138
|
+
}
|
|
139
|
+
deletePreset(presetId) {
|
|
140
|
+
if (presetId === 'default')
|
|
141
|
+
return;
|
|
142
|
+
this.customPresets.update((prev) => prev.filter((p) => p.id !== presetId));
|
|
143
|
+
const def = this.activeDefinition();
|
|
144
|
+
if (def && def.grid && def.grid.options) {
|
|
145
|
+
const current = def.grid.options.presets ?? [];
|
|
146
|
+
def.grid.options.presets = current.filter((p) => p.id !== presetId);
|
|
147
|
+
if (this.persistence && def.id) {
|
|
148
|
+
this.persistence.save(def).subscribe({
|
|
149
|
+
next: () => { },
|
|
150
|
+
error: () => { },
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (this.activePresetId() === presetId) {
|
|
155
|
+
this.onSelectPreset('default');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
onExportExcel() {
|
|
159
|
+
const data = this.runtimeComponent()?.resultData();
|
|
160
|
+
if (!data || !Array.isArray(data) || data.length === 0)
|
|
161
|
+
return;
|
|
162
|
+
const def = this.activeDefinition();
|
|
163
|
+
const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
|
|
164
|
+
this.exportService.exportExcel(data, {
|
|
165
|
+
fileName: def?.name ? `${def.name}.xls` : 'report.xls',
|
|
166
|
+
columns: cols,
|
|
167
|
+
brandedHeader: { reportTitle: def?.name },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
onExportCsv() {
|
|
171
|
+
const data = this.runtimeComponent()?.resultData();
|
|
172
|
+
if (!data || !Array.isArray(data) || data.length === 0)
|
|
173
|
+
return;
|
|
174
|
+
const def = this.activeDefinition();
|
|
175
|
+
const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
|
|
176
|
+
this.exportService.exportCsv(data, {
|
|
177
|
+
fileName: def?.name ? `${def.name}.csv` : 'report.csv',
|
|
178
|
+
columns: cols,
|
|
179
|
+
brandedHeader: { reportTitle: def?.name },
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
onPrintReport() {
|
|
183
|
+
const data = this.runtimeComponent()?.resultData();
|
|
184
|
+
if (!data || !Array.isArray(data) || data.length === 0)
|
|
185
|
+
return;
|
|
186
|
+
const def = this.activeDefinition();
|
|
187
|
+
const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
|
|
188
|
+
this.exportService.printReport(data, {
|
|
189
|
+
title: def?.name || 'Report Print Preview',
|
|
190
|
+
columns: cols,
|
|
191
|
+
brandedHeader: { reportTitle: def?.name },
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
195
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportComponent, isStandalone: true, selector: "rpt-report, rpt-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", gridStateChange: "gridStateChange", selectionChange: "selectionChange", selectionChanged: "selectionChanged", presetSaved: "presetSaved", presetChange: "presetChange", exportRequested: "exportRequested", printRequested: "printRequested" }, viewQueries: [{ propertyName: "runtimeComponent", first: true, predicate: ReportRuntimeComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
196
|
+
<div class="rpt-facade-container">
|
|
197
|
+
<!-- Top Action & Preset Bar -->
|
|
198
|
+
@if (showToolbar()) {
|
|
199
|
+
<div class="rpt-facade-toolbar">
|
|
200
|
+
<div class="rpt-toolbar-left">
|
|
201
|
+
@if (activeDefinition()?.name) {
|
|
202
|
+
<div class="rpt-report-title-badge">
|
|
203
|
+
<span class="rpt-title-dot"></span>
|
|
204
|
+
<span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
|
|
205
|
+
</div>
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
@if (recordCount() > 0) {
|
|
209
|
+
<span class="rpt-record-count-chip" title="Current dataset size">
|
|
210
|
+
<span class="rpt-chip-dot"></span>
|
|
211
|
+
<span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
|
|
212
|
+
</span>
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
<!-- Saved Views / Preset Switcher -->
|
|
216
|
+
@if (enablePresets()) {
|
|
217
|
+
<div class="rpt-preset-control">
|
|
218
|
+
<label class="rpt-preset-label">
|
|
219
|
+
<rpt-icon name="bookmark" [size]="12" />
|
|
220
|
+
<span>View:</span>
|
|
221
|
+
</label>
|
|
222
|
+
<select
|
|
223
|
+
class="rpt-preset-select"
|
|
224
|
+
[ngModel]="activePresetId()"
|
|
225
|
+
(ngModelChange)="onSelectPreset($event)"
|
|
226
|
+
aria-label="Select report view preset"
|
|
227
|
+
>
|
|
228
|
+
<option value="default">Default View</option>
|
|
229
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
230
|
+
<option [value]="preset.id">{{ preset.name }}</option>
|
|
231
|
+
}
|
|
232
|
+
</select>
|
|
233
|
+
<button
|
|
234
|
+
type="button"
|
|
235
|
+
class="rpt-btn-save-view"
|
|
236
|
+
(click)="openSavePresetModal()"
|
|
237
|
+
title="Save current grid view or manage presets"
|
|
238
|
+
>
|
|
239
|
+
<rpt-icon name="plus" [size]="11" />
|
|
240
|
+
<span>Save View</span>
|
|
241
|
+
</button>
|
|
242
|
+
</div>
|
|
243
|
+
}
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
<!-- Export Actions -->
|
|
247
|
+
@if (showExport()) {
|
|
248
|
+
<div class="rpt-toolbar-right">
|
|
249
|
+
<button
|
|
250
|
+
type="button"
|
|
251
|
+
class="rpt-export-btn rpt-export-excel"
|
|
252
|
+
(click)="onExportExcel()"
|
|
253
|
+
[disabled]="!recordCount()"
|
|
254
|
+
title="Export result table to Excel spreadsheet (.xls)"
|
|
255
|
+
>
|
|
256
|
+
<rpt-icon name="file-text" [size]="13" />
|
|
257
|
+
<span>Excel</span>
|
|
258
|
+
</button>
|
|
259
|
+
<button
|
|
260
|
+
type="button"
|
|
261
|
+
class="rpt-export-btn rpt-export-csv"
|
|
262
|
+
(click)="onExportCsv()"
|
|
263
|
+
[disabled]="!recordCount()"
|
|
264
|
+
title="Export result table to CSV file"
|
|
265
|
+
>
|
|
266
|
+
<rpt-icon name="download" [size]="13" />
|
|
267
|
+
<span>CSV</span>
|
|
268
|
+
</button>
|
|
269
|
+
<button
|
|
270
|
+
type="button"
|
|
271
|
+
class="rpt-export-btn rpt-export-print"
|
|
272
|
+
(click)="onPrintReport()"
|
|
273
|
+
[disabled]="!recordCount()"
|
|
274
|
+
title="Print report with branded layout"
|
|
275
|
+
>
|
|
276
|
+
<rpt-icon name="printer" [size]="13" />
|
|
277
|
+
<span>Print</span>
|
|
278
|
+
</button>
|
|
279
|
+
</div>
|
|
280
|
+
}
|
|
281
|
+
</div>
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
<!-- Core Runtime Engine -->
|
|
285
|
+
<rpt-report-runtime
|
|
286
|
+
#runtimeRef
|
|
287
|
+
[reportId]="id()"
|
|
288
|
+
[report]="currentDefinition()"
|
|
289
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
290
|
+
(gridStateChange)="onGridStateChanged($event)"
|
|
291
|
+
(selectionChange)="onSelectionChange($event)"
|
|
292
|
+
(exportRequested)="exportRequested.emit($event)"
|
|
293
|
+
(printRequested)="printRequested.emit($event)"
|
|
294
|
+
/>
|
|
295
|
+
|
|
296
|
+
<!-- Save View Preset Modal -->
|
|
297
|
+
@if (isSavePresetModalOpen()) {
|
|
298
|
+
<div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
|
|
299
|
+
<div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
|
|
300
|
+
<div class="rpt-modal-header">
|
|
301
|
+
<div class="rpt-modal-header-title">
|
|
302
|
+
<rpt-icon name="bookmark" [size]="16" />
|
|
303
|
+
<h4 class="rpt-modal-title">Custom View Presets</h4>
|
|
304
|
+
</div>
|
|
305
|
+
<button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
|
|
306
|
+
</div>
|
|
307
|
+
<div class="rpt-modal-body">
|
|
308
|
+
<p class="rpt-modal-hint">
|
|
309
|
+
Save your active column ordering, widths, sortings, and filters into a reusable view preset.
|
|
310
|
+
</p>
|
|
311
|
+
|
|
312
|
+
<div class="rpt-input-group">
|
|
313
|
+
<label class="rpt-field-label">New View Name</label>
|
|
314
|
+
<input
|
|
315
|
+
type="text"
|
|
316
|
+
class="rpt-modal-input"
|
|
317
|
+
placeholder="e.g. High Value Transactions - Q3"
|
|
318
|
+
[ngModel]="newPresetName()"
|
|
319
|
+
(ngModelChange)="newPresetName.set($event)"
|
|
320
|
+
(keydown.enter)="saveCurrentPreset()"
|
|
321
|
+
autofocus
|
|
322
|
+
/>
|
|
323
|
+
</div>
|
|
324
|
+
|
|
325
|
+
<!-- Existing Presets Management List -->
|
|
326
|
+
@if (savedPresets().length > 0) {
|
|
327
|
+
<div class="rpt-existing-presets">
|
|
328
|
+
<span class="rpt-existing-label">Saved Views in this report:</span>
|
|
329
|
+
<div class="rpt-presets-list">
|
|
330
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
331
|
+
<div class="rpt-preset-row">
|
|
332
|
+
<div class="rpt-preset-info">
|
|
333
|
+
<span class="rpt-preset-row-name">{{ preset.name }}</span>
|
|
334
|
+
@if (preset.id === activePresetId()) {
|
|
335
|
+
<span class="rpt-preset-active-tag">Active</span>
|
|
336
|
+
}
|
|
337
|
+
</div>
|
|
338
|
+
<button
|
|
339
|
+
type="button"
|
|
340
|
+
class="rpt-btn-del-preset"
|
|
341
|
+
(click)="deletePreset(preset.id)"
|
|
342
|
+
title="Delete view preset"
|
|
343
|
+
aria-label="Delete view preset"
|
|
344
|
+
>
|
|
345
|
+
<rpt-icon name="trash" [size]="12" />
|
|
346
|
+
</button>
|
|
347
|
+
</div>
|
|
348
|
+
}
|
|
349
|
+
</div>
|
|
350
|
+
</div>
|
|
351
|
+
}
|
|
352
|
+
</div>
|
|
353
|
+
<div class="rpt-modal-footer">
|
|
354
|
+
<button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
|
|
355
|
+
<button
|
|
356
|
+
type="button"
|
|
357
|
+
class="rpt-btn-confirm"
|
|
358
|
+
[disabled]="!newPresetName().trim()"
|
|
359
|
+
(click)="saveCurrentPreset()"
|
|
360
|
+
>
|
|
361
|
+
Save View
|
|
362
|
+
</button>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
}
|
|
366
|
+
</div>
|
|
367
|
+
`, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
368
|
+
}
|
|
369
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, decorators: [{
|
|
370
|
+
type: Component,
|
|
371
|
+
args: [{ selector: 'rpt-report, rpt-view', standalone: true, imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent], template: `
|
|
372
|
+
<div class="rpt-facade-container">
|
|
373
|
+
<!-- Top Action & Preset Bar -->
|
|
374
|
+
@if (showToolbar()) {
|
|
375
|
+
<div class="rpt-facade-toolbar">
|
|
376
|
+
<div class="rpt-toolbar-left">
|
|
377
|
+
@if (activeDefinition()?.name) {
|
|
378
|
+
<div class="rpt-report-title-badge">
|
|
379
|
+
<span class="rpt-title-dot"></span>
|
|
380
|
+
<span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
|
|
381
|
+
</div>
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
@if (recordCount() > 0) {
|
|
385
|
+
<span class="rpt-record-count-chip" title="Current dataset size">
|
|
386
|
+
<span class="rpt-chip-dot"></span>
|
|
387
|
+
<span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
|
|
388
|
+
</span>
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
<!-- Saved Views / Preset Switcher -->
|
|
392
|
+
@if (enablePresets()) {
|
|
393
|
+
<div class="rpt-preset-control">
|
|
394
|
+
<label class="rpt-preset-label">
|
|
395
|
+
<rpt-icon name="bookmark" [size]="12" />
|
|
396
|
+
<span>View:</span>
|
|
397
|
+
</label>
|
|
398
|
+
<select
|
|
399
|
+
class="rpt-preset-select"
|
|
400
|
+
[ngModel]="activePresetId()"
|
|
401
|
+
(ngModelChange)="onSelectPreset($event)"
|
|
402
|
+
aria-label="Select report view preset"
|
|
403
|
+
>
|
|
404
|
+
<option value="default">Default View</option>
|
|
405
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
406
|
+
<option [value]="preset.id">{{ preset.name }}</option>
|
|
407
|
+
}
|
|
408
|
+
</select>
|
|
409
|
+
<button
|
|
410
|
+
type="button"
|
|
411
|
+
class="rpt-btn-save-view"
|
|
412
|
+
(click)="openSavePresetModal()"
|
|
413
|
+
title="Save current grid view or manage presets"
|
|
414
|
+
>
|
|
415
|
+
<rpt-icon name="plus" [size]="11" />
|
|
416
|
+
<span>Save View</span>
|
|
417
|
+
</button>
|
|
418
|
+
</div>
|
|
419
|
+
}
|
|
420
|
+
</div>
|
|
421
|
+
|
|
422
|
+
<!-- Export Actions -->
|
|
423
|
+
@if (showExport()) {
|
|
424
|
+
<div class="rpt-toolbar-right">
|
|
425
|
+
<button
|
|
426
|
+
type="button"
|
|
427
|
+
class="rpt-export-btn rpt-export-excel"
|
|
428
|
+
(click)="onExportExcel()"
|
|
429
|
+
[disabled]="!recordCount()"
|
|
430
|
+
title="Export result table to Excel spreadsheet (.xls)"
|
|
431
|
+
>
|
|
432
|
+
<rpt-icon name="file-text" [size]="13" />
|
|
433
|
+
<span>Excel</span>
|
|
434
|
+
</button>
|
|
435
|
+
<button
|
|
436
|
+
type="button"
|
|
437
|
+
class="rpt-export-btn rpt-export-csv"
|
|
438
|
+
(click)="onExportCsv()"
|
|
439
|
+
[disabled]="!recordCount()"
|
|
440
|
+
title="Export result table to CSV file"
|
|
441
|
+
>
|
|
442
|
+
<rpt-icon name="download" [size]="13" />
|
|
443
|
+
<span>CSV</span>
|
|
444
|
+
</button>
|
|
445
|
+
<button
|
|
446
|
+
type="button"
|
|
447
|
+
class="rpt-export-btn rpt-export-print"
|
|
448
|
+
(click)="onPrintReport()"
|
|
449
|
+
[disabled]="!recordCount()"
|
|
450
|
+
title="Print report with branded layout"
|
|
451
|
+
>
|
|
452
|
+
<rpt-icon name="printer" [size]="13" />
|
|
453
|
+
<span>Print</span>
|
|
454
|
+
</button>
|
|
455
|
+
</div>
|
|
456
|
+
}
|
|
457
|
+
</div>
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
<!-- Core Runtime Engine -->
|
|
461
|
+
<rpt-report-runtime
|
|
462
|
+
#runtimeRef
|
|
463
|
+
[reportId]="id()"
|
|
464
|
+
[report]="currentDefinition()"
|
|
465
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
466
|
+
(gridStateChange)="onGridStateChanged($event)"
|
|
467
|
+
(selectionChange)="onSelectionChange($event)"
|
|
468
|
+
(exportRequested)="exportRequested.emit($event)"
|
|
469
|
+
(printRequested)="printRequested.emit($event)"
|
|
470
|
+
/>
|
|
471
|
+
|
|
472
|
+
<!-- Save View Preset Modal -->
|
|
473
|
+
@if (isSavePresetModalOpen()) {
|
|
474
|
+
<div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
|
|
475
|
+
<div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
|
|
476
|
+
<div class="rpt-modal-header">
|
|
477
|
+
<div class="rpt-modal-header-title">
|
|
478
|
+
<rpt-icon name="bookmark" [size]="16" />
|
|
479
|
+
<h4 class="rpt-modal-title">Custom View Presets</h4>
|
|
480
|
+
</div>
|
|
481
|
+
<button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
|
|
482
|
+
</div>
|
|
483
|
+
<div class="rpt-modal-body">
|
|
484
|
+
<p class="rpt-modal-hint">
|
|
485
|
+
Save your active column ordering, widths, sortings, and filters into a reusable view preset.
|
|
486
|
+
</p>
|
|
487
|
+
|
|
488
|
+
<div class="rpt-input-group">
|
|
489
|
+
<label class="rpt-field-label">New View Name</label>
|
|
490
|
+
<input
|
|
491
|
+
type="text"
|
|
492
|
+
class="rpt-modal-input"
|
|
493
|
+
placeholder="e.g. High Value Transactions - Q3"
|
|
494
|
+
[ngModel]="newPresetName()"
|
|
495
|
+
(ngModelChange)="newPresetName.set($event)"
|
|
496
|
+
(keydown.enter)="saveCurrentPreset()"
|
|
497
|
+
autofocus
|
|
498
|
+
/>
|
|
499
|
+
</div>
|
|
500
|
+
|
|
501
|
+
<!-- Existing Presets Management List -->
|
|
502
|
+
@if (savedPresets().length > 0) {
|
|
503
|
+
<div class="rpt-existing-presets">
|
|
504
|
+
<span class="rpt-existing-label">Saved Views in this report:</span>
|
|
505
|
+
<div class="rpt-presets-list">
|
|
506
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
507
|
+
<div class="rpt-preset-row">
|
|
508
|
+
<div class="rpt-preset-info">
|
|
509
|
+
<span class="rpt-preset-row-name">{{ preset.name }}</span>
|
|
510
|
+
@if (preset.id === activePresetId()) {
|
|
511
|
+
<span class="rpt-preset-active-tag">Active</span>
|
|
512
|
+
}
|
|
513
|
+
</div>
|
|
514
|
+
<button
|
|
515
|
+
type="button"
|
|
516
|
+
class="rpt-btn-del-preset"
|
|
517
|
+
(click)="deletePreset(preset.id)"
|
|
518
|
+
title="Delete view preset"
|
|
519
|
+
aria-label="Delete view preset"
|
|
520
|
+
>
|
|
521
|
+
<rpt-icon name="trash" [size]="12" />
|
|
522
|
+
</button>
|
|
523
|
+
</div>
|
|
524
|
+
}
|
|
525
|
+
</div>
|
|
526
|
+
</div>
|
|
527
|
+
}
|
|
528
|
+
</div>
|
|
529
|
+
<div class="rpt-modal-footer">
|
|
530
|
+
<button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
|
|
531
|
+
<button
|
|
532
|
+
type="button"
|
|
533
|
+
class="rpt-btn-confirm"
|
|
534
|
+
[disabled]="!newPresetName().trim()"
|
|
535
|
+
(click)="saveCurrentPreset()"
|
|
536
|
+
>
|
|
537
|
+
Save View
|
|
538
|
+
</button>
|
|
539
|
+
</div>
|
|
540
|
+
</div>
|
|
541
|
+
}
|
|
542
|
+
</div>
|
|
543
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
544
|
+
}] });
|
|
545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9ydW50aW1lL3JwdC1yZXBvcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7OztBQXdpQm5HLE1BQU0sT0FBTyxrQkFBa0I7SUFDWixhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNFLEVBQUUsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxLQUFLLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzlDLFVBQVUsR0FBRyxLQUFLLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELFVBQVUsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDbEMsYUFBYSxHQUFHLEtBQUssQ0FB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QUFFLFdBQVcsMGdDQUFFLHNCQUFzQixpVUFBRSxnQkFBZ0I7OzRGQTJoQmxFLGtCQUFrQjtrQkE5aEI5QixTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDLFlBQ3BFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEtULG1CQTRXZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkUm93Q2xpY2tBY3Rpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vZXhwb3J0L3NlcnZpY2VzL3JlcG9ydC1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IH0gZnJvbSAnLi9yZXBvcnQtcnVudGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRWaWV3UHJlc2V0IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBncmlkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmb3JtVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJlcG9ydCwgcnB0LXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVwb3J0UnVudGltZUNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1mYWNhZGUtY29udGFpbmVyXCI+XG4gICAgICA8IS0tIFRvcCBBY3Rpb24gJiBQcmVzZXQgQmFyIC0tPlxuICAgICAgQGlmIChzaG93VG9vbGJhcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZmFjYWRlLXRvb2xiYXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXRvb2xiYXItbGVmdFwiPlxuICAgICAgICAgICAgQGlmIChhY3RpdmVEZWZpbml0aW9uKCk/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1yZXBvcnQtdGl0bGUtYmFkZ2VcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC10aXRsZS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtdGl0bGUtdGV4dFwiPnt7IGFjdGl2ZURlZmluaXRpb24oKT8ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAocmVjb3JkQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcmVjb3JkLWNvdW50LWNoaXBcIiB0aXRsZT1cIkN1cnJlbnQgZGF0YXNldCBzaXplXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY2hpcC1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtdGFidWxhci1udW1zXCI+e3sgcmVjb3JkQ291bnQoKSB9fSByb3dzPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gU2F2ZWQgVmlld3MgLyBQcmVzZXQgU3dpdGNoZXIgLS0+XG4gICAgICAgICAgICBAaWYgKGVuYWJsZVByZXNldHMoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXNldC1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LXByZXNldC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJib29rbWFya1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlZpZXc6PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtcHJlc2V0LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVQcmVzZXRJZCgpXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0UHJlc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCByZXBvcnQgdmlldyBwcmVzZXRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkZWZhdWx0XCI+RGVmYXVsdCBWaWV3PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICBAZm9yIChwcmVzZXQgb2Ygc2F2ZWRQcmVzZXRzKCk7IHRyYWNrIHByZXNldC5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJwcmVzZXQuaWRcIj57eyBwcmVzZXQubmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuLXNhdmUtdmlld1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNhdmVQcmVzZXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiU2F2ZSBjdXJyZW50IGdyaWQgdmlldyBvciBtYW5hZ2UgcHJlc2V0c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2F2ZSBWaWV3PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRXhwb3J0IEFjdGlvbnMgLS0+XG4gICAgICAgICAgQGlmIChzaG93RXhwb3J0KCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdG9vbGJhci1yaWdodFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtZXhwb3J0LWJ0biBycHQtZXhwb3J0LWV4Y2VsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FeHBvcnRFeGNlbCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJlY29yZENvdW50KClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHJlc3VsdCB0YWJsZSB0byBFeGNlbCBzcHJlYWRzaGVldCAoLnhscylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJmaWxlLXRleHRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+RXhjZWw8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtZXhwb3J0LWJ0biBycHQtZXhwb3J0LWNzdlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0Q3N2KClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcmVjb3JkQ291bnQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBvcnQgcmVzdWx0IHRhYmxlIHRvIENTViBmaWxlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZG93bmxvYWRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+Q1NWPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWV4cG9ydC1idG4gcnB0LWV4cG9ydC1wcmludFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJpbnRSZXBvcnQoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFyZWNvcmRDb3VudCgpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlByaW50IHJlcG9ydCB3aXRoIGJyYW5kZWQgbGF5b3V0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicHJpbnRlclwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QcmludDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIENvcmUgUnVudGltZSBFbmdpbmUgLS0+XG4gICAgICA8cnB0LXJlcG9ydC1ydW50aW1lXG4gICAgICAgICNydW50aW1lUmVmXG4gICAgICAgIFtyZXBvcnRJZF09XCJpZCgpXCJcbiAgICAgICAgW3JlcG9ydF09XCJjdXJyZW50RGVmaW5pdGlvbigpXCJcbiAgICAgICAgKHJvd0FjdGlvblRyaWdnZXJlZCk9XCJvblJvd0FjdGlvblRyaWdnZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgKGdyaWRTdGF0ZUNoYW5nZSk9XCJvbkdyaWRTdGF0ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChleHBvcnRSZXF1ZXN0ZWQpPVwiZXhwb3J0UmVxdWVzdGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChwcmludFJlcXVlc3RlZCk9XCJwcmludFJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgLz5cblxuICAgICAgPCEtLSBTYXZlIFZpZXcgUHJlc2V0IE1vZGFsIC0tPlxuICAgICAgQGlmIChpc1NhdmVQcmVzZXRNb2RhbE9wZW4oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlU2F2ZVByZXNldE1vZGFsKClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tb2RhbC1kaWFsb2dcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsPVwiU2F2ZSBWaWV3IFByZXNldFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWhlYWRlci10aXRsZVwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImJvb2ttYXJrXCIgW3NpemVdPVwiMTZcIiAvPlxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJycHQtbW9kYWwtdGl0bGVcIj5DdXN0b20gVmlldyBQcmVzZXRzPC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtbW9kYWwtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VTYXZlUHJlc2V0TW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiPuKclTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJycHQtbW9kYWwtaGludFwiPlxuICAgICAgICAgICAgICBTYXZlIHlvdXIgYWN0aXZlIGNvbHVtbiBvcmRlcmluZywgd2lkdGhzLCBzb3J0aW5ncywgYW5kIGZpbHRlcnMgaW50byBhIHJldXNhYmxlIHZpZXcgcHJlc2V0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1maWVsZC1sYWJlbFwiPk5ldyBWaWV3IE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtbW9kYWwtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBIaWdoIFZhbHVlIFRyYW5zYWN0aW9ucyAtIFEzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJuZXdQcmVzZXROYW1lKClcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm5ld1ByZXNldE5hbWUuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVDdXJyZW50UHJlc2V0KClcIlxuICAgICAgICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRXhpc3RpbmcgUHJlc2V0cyBNYW5hZ2VtZW50IExpc3QgLS0+XG4gICAgICAgICAgICBAaWYgKHNhdmVkUHJlc2V0cygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1leGlzdGluZy1wcmVzZXRzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZXhpc3RpbmctbGFiZWxcIj5TYXZlZCBWaWV3cyBpbiB0aGlzIHJlcG9ydDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmVzZXRzLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHByZXNldCBvZiBzYXZlZFByZXNldHMoKTsgdHJhY2sgcHJlc2V0LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJlc2V0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJlc2V0LWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXByZXNldC1yb3ctbmFtZVwiPnt7IHByZXNldC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwcmVzZXQuaWQgPT09IGFjdGl2ZVByZXNldElkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcHJlc2V0LWFjdGl2ZS10YWdcIj5BY3RpdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tZGVsLXByZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUHJlc2V0KHByZXNldC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgdmlldyBwcmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSB2aWV3IHByZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1idG4tY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlU2F2ZVByZXNldE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0bi1jb25maXJtXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFuZXdQcmVzZXROYW1lKCkudHJpbSgpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVDdXJyZW50UHJlc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTYXZlIFZpZXdcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtZmFjYWRlLWNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgLnJwdC1mYWNhZGUtdG9vbGJhciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLXN1YnRsZSwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1sZywgOHB4KTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LXhzLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA0KSk7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNHB4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cbiAgICAucnB0LXRvb2xiYXItbGVmdCwgLnJwdC10b29sYmFyLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cbiAgICAucnB0LXJlcG9ydC10aXRsZS1iYWRnZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gICAgfVxuICAgIC5ycHQtdGl0bGUtZG90IHtcbiAgICAgIHdpZHRoOiA4cHg7XG4gICAgICBoZWlnaHQ6IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICB9XG4gICAgLnJwdC1yZWNvcmQtY291bnQtY2hpcCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLWZ1bGwsIDk5OTlweCk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgIH1cbiAgICAucnB0LWNoaXAtZG90IHtcbiAgICAgIHdpZHRoOiA2cHg7XG4gICAgICBoZWlnaHQ6IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICMxMGI5ODE7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LWNvbnRyb2wge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBwYWRkaW5nOiAzcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1sYWJlbCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LXNlbGVjdCB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtc20sIDRweCk7XG4gICAgICBwYWRkaW5nOiAzcHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1zZWxlY3Q6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktZm9jdXMsIHJnYmEoMzcsIDk5LCAyMzUsIDAuMjUpKTtcbiAgICB9XG4gICAgLnJwdC1idG4tc2F2ZS12aWV3IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktbGlnaHQsICNlZmY2ZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDNweCA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1zbSwgNHB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtYnRuLXNhdmUtdmlldzpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTNjNWZkO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIHBhZGRpbmc6IDVweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjQ1O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtZXhjZWwge1xuICAgICAgYmFja2dyb3VuZDogI2YwZmRmNDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBjb2xvcjogIzE1ODAzZDtcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtZXhjZWw6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICAgIGJvcmRlci1jb2xvcjogIzg2ZWZhYztcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtY3N2IHtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWNzdjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTRhM2I4O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LXByaW50IHtcbiAgICAgIGJhY2tncm91bmQ6ICNlZWYyZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzdkMmZlO1xuICAgICAgY29sb3I6ICM0MzM4Y2E7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LXByaW50OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlMGU3ZmY7XG4gICAgICBib3JkZXItY29sb3I6ICNhNWI0ZmM7XG4gICAgfVxuICAgIC8qIE1vZGFsICovXG4gICAgLnJwdC1tb2RhbC1iYWNrZHJvcCB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC40NSk7XG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTtcbiAgICAgIHotaW5kZXg6IDExMDA7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtZGlhbG9nIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB3aWR0aDogbWluKDQ2MHB4LCA5MnZ3KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBib3gtc2hhZG93OiAwIDIwcHggMjVweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSksIDAgOHB4IDEwcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB6LWluZGV4OiAxMTAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYW5pbWF0aW9uOiBycHQtbW9kYWwtcG9wIDE2MG1zIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHJwdC1tb2RhbC1wb3Age1xuICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC00NiUpIHNjYWxlKDAuOTcpOyB9XG4gICAgICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpOyB9XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogMTRweCAxOHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWhlYWRlci10aXRsZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjk1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWNsb3NlIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBmb250LXNpemU6IDEuMXJlbTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWNsb3NlOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlMmU4ZjA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1ib2R5IHtcbiAgICAgIHBhZGRpbmc6IDE4cHg7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtaGludCB7XG4gICAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbWFyZ2luOiAwIDAgMTZweCAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgfVxuICAgIC5ycHQtaW5wdXQtZ3JvdXAge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgICB9XG4gICAgLnJwdC1maWVsZC1sYWJlbCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzMzNDE1NTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDZweDtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1pbnB1dCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWlucHV0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWZvY3VzLCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KSk7XG4gICAgfVxuICAgIC5ycHQtZXhpc3RpbmctcHJlc2V0cyB7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgIH1cbiAgICAucnB0LWV4aXN0aW5nLWxhYmVsIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0cy1saXN0IHtcbiAgICAgIG1heC1oZWlnaHQ6IDE0MHB4O1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LWluZm8ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LXJvdy1uYW1lIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxZTI5M2I7XG4gICAgfVxuICAgIC5ycHQtcHJlc2V0LWFjdGl2ZS10YWcge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgICBjb2xvcjogIzFkNGVkODtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgfVxuICAgIC5ycHQtYnRuLWRlbC1wcmVzZXQge1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBjb2xvcjogIzk0YTNiODtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHBhZGRpbmc6IDRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tZGVsLXByZXNldDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgICAgY29sb3I6ICNkYzI2MjY7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGdhcDogMTBweDtcbiAgICAgIHBhZGRpbmc6IDEycHggMThweDtcbiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICB9XG4gICAgLnJwdC1idG4tY2FuY2VsIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA2cHggMTRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tY2FuY2VsOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICB9XG4gICAgLnJwdC1idG4tY29uZmlybSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgcGFkZGluZzogNnB4IDE2cHg7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAucnB0LWJ0bi1jb25maXJtOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWhvdmVyLCAjMWQ0ZWQ4KTtcbiAgICB9XG4gICAgLnJwdC1idG4tY29uZmlybTpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBScHRSZXBvcnRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0RXhwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2UgPSBpbmplY3QoUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSByZXBvcnQgPSBpbnB1dDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHBhcmFtZXRlcnMgPSBpbnB1dDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe30pO1xuICByZWFkb25seSBzaG93RXhwb3J0ID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGVuYWJsZVByZXNldHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgYXV0b0V4ZWN1dGUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICByZWFkb25seSByb3dDbGljayA9IG91dHB1dDx7XG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBhY3Rpb24/OiBHcmlkUm93Q2xpY2tBY3Rpb247XG4gIH0+KCk7XG4gIHJlYWRvbmx5IGRhdGFMb2FkZWQgPSBvdXRwdXQ8dW5rbm93bltdPigpO1xuICByZWFkb25seSBncmlkU3RhdGVDaGFuZ2UgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8YW55W10+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZWQgPSBvdXRwdXQ8YW55W10+KCk7XG4gIHJlYWRvbmx5IHByZXNldFNhdmVkID0gb3V0cHV0PHsgbmFtZTogc3RyaW5nOyBwcmVzZXQ6IFJlcG9ydFZpZXdQcmVzZXQgfT4oKTtcbiAgcmVhZG9ubHkgcHJlc2V0Q2hhbmdlID0gb3V0cHV0PFJlcG9ydFZpZXdQcmVzZXQgfCBudWxsPigpO1xuICByZWFkb25seSBleHBvcnRSZXF1ZXN0ZWQgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBwcmludFJlcXVlc3RlZCA9IG91dHB1dDxhbnk+KCk7XG5cbiAgcmVhZG9ubHkgcnVudGltZUNvbXBvbmVudCA9IHZpZXdDaGlsZChSZXBvcnRSdW50aW1lQ29tcG9uZW50KTtcblxuICAvLyBQcmVzZXQgc3RhdGVzXG4gIHJlYWRvbmx5IGFjdGl2ZVByZXNldElkID0gc2lnbmFsPHN0cmluZz4oJ2RlZmF1bHQnKTtcbiAgcmVhZG9ubHkgaXNTYXZlUHJlc2V0TW9kYWxPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbmV3UHJlc2V0TmFtZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbGF0ZXN0R3JpZFN0YXRlID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGN1c3RvbVByZXNldHMgPSBzaWduYWw8UmVwb3J0Vmlld1ByZXNldFtdPihbXSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERlZmluaXRpb24gPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydCgpO1xuICB9KTtcblxuICByZWFkb25seSBhY3RpdmVEZWZpbml0aW9uID0gY29tcHV0ZWQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQoKSA/PyB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8uY3VycmVudERlZmluaXRpb24oKSA/PyBudWxsO1xuICB9KTtcblxuICByZWFkb25seSByZWNvcmRDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpPy5sZW5ndGggPz8gMDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc2hvd1Rvb2xiYXIgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0V4cG9ydCgpIHx8IHRoaXMuZW5hYmxlUHJlc2V0cygpO1xuICB9KTtcblxuICByZWFkb25seSBzYXZlZFByZXNldHMgPSBjb21wdXRlZDxSZXBvcnRWaWV3UHJlc2V0W10+KCgpID0+IHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBpbml0aWFsUHJlc2V0cyA9ICgoZGVmPy5ncmlkPy5vcHRpb25zIGFzIGFueSk/LnByZXNldHMgYXMgUmVwb3J0Vmlld1ByZXNldFtdKSA/PyBbXTtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUmVwb3J0Vmlld1ByZXNldD4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgaW5pdGlhbFByZXNldHMpIHtcbiAgICAgIGlmIChwICYmIHAuaWQpIG1hcC5zZXQocC5pZCwgcCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLmN1c3RvbVByZXNldHMoKSkge1xuICAgICAgaWYgKHAgJiYgcC5pZCkgbWFwLnNldChwLmlkLCBwKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20obWFwLnZhbHVlcygpKTtcbiAgfSk7XG5cbiAgb25Sb3dBY3Rpb25UcmlnZ2VyZWQoZXZlbnQ6IHtcbiAgICBhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbjtcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHtcbiAgICAgIHJvdzogZXZlbnQucm93LFxuICAgICAgcGFyYW1ldGVyczogZXZlbnQucGFyYW1ldGVycyxcbiAgICAgIGFjdGlvbjogZXZlbnQuYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgb25HcmlkU3RhdGVDaGFuZ2VkKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxhdGVzdEdyaWRTdGF0ZS5zZXQoc3RhdGUpO1xuICAgIHRoaXMuZ3JpZFN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uocm93czogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHJvd3MpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHJvd3MpO1xuICB9XG5cbiAgb25TZWxlY3RQcmVzZXQocHJlc2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUHJlc2V0SWQuc2V0KHByZXNldElkKTtcbiAgICBpZiAocHJlc2V0SWQgPT09ICdkZWZhdWx0Jykge1xuICAgICAgdGhpcy5wcmVzZXRDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzZXQgPSB0aGlzLnNhdmVkUHJlc2V0cygpLmZpbmQoKHApID0+IHAuaWQgPT09IHByZXNldElkKTtcbiAgICBpZiAocHJlc2V0KSB7XG4gICAgICBpZiAocHJlc2V0LmdyaWRTdGF0ZSkge1xuICAgICAgICB0aGlzLmxhdGVzdEdyaWRTdGF0ZS5zZXQocHJlc2V0LmdyaWRTdGF0ZSk7XG4gICAgICAgIHRoaXMuZ3JpZFN0YXRlQ2hhbmdlLmVtaXQocHJlc2V0LmdyaWRTdGF0ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnByZXNldENoYW5nZS5lbWl0KHByZXNldCk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlybVNhdmVQcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlQ3VycmVudFByZXNldCgpO1xuICB9XG5cbiAgZXhwb3J0RXhjZWwoKTogdm9pZCB7XG4gICAgdGhpcy5vbkV4cG9ydEV4Y2VsKCk7XG4gIH1cblxuICBleHBvcnRDc3YoKTogdm9pZCB7XG4gICAgdGhpcy5vbkV4cG9ydENzdigpO1xuICB9XG5cbiAgcHJpbnQoKTogdm9pZCB7XG4gICAgdGhpcy5vblByaW50UmVwb3J0KCk7XG4gIH1cblxuICBvcGVuU2F2ZVByZXNldE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMubmV3UHJlc2V0TmFtZS5zZXQoJycpO1xuICAgIHRoaXMuaXNTYXZlUHJlc2V0TW9kYWxPcGVuLnNldCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlU2F2ZVByZXNldE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZlUHJlc2V0TW9kYWxPcGVuLnNldChmYWxzZSk7XG4gIH1cblxuICBzYXZlQ3VycmVudFByZXNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5uZXdQcmVzZXROYW1lKCkudHJpbSgpO1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJlc2V0SWQgPSBgcHJlc2V0XyR7RGF0ZS5ub3coKX1gO1xuICAgIGNvbnN0IG5ld1ByZXNldDogUmVwb3J0Vmlld1ByZXNldCA9IHtcbiAgICAgIGlkOiBwcmVzZXRJZCxcbiAgICAgIG5hbWUsXG4gICAgICBncmlkU3RhdGU6IHRoaXMubGF0ZXN0R3JpZFN0YXRlKCkgPz8ge30sXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGVmID0gdGhpcy5hY3RpdmVEZWZpbml0aW9uKCk7XG4gICAgaWYgKGRlZiAmJiBkZWYuZ3JpZCkge1xuICAgICAgaWYgKCFkZWYuZ3JpZC5vcHRpb25zKSBkZWYuZ3JpZC5vcHRpb25zID0ge307XG4gICAgICBjb25zdCBjdXJyZW50UHJlc2V0czogUmVwb3J0Vmlld1ByZXNldFtdID0gKGRlZi5ncmlkLm9wdGlvbnMgYXMgYW55KS5wcmVzZXRzID8/IFtdO1xuICAgICAgKGRlZi5ncmlkLm9wdGlvbnMgYXMgYW55KS5wcmVzZXRzID0gWy4uLmN1cnJlbnRQcmVzZXRzLCBuZXdQcmVzZXRdO1xuXG4gICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSAmJiBkZWYuaWQpIHtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZS5zYXZlKGRlZikuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7fSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge30sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VzdG9tUHJlc2V0cy51cGRhdGUoKHByZXYpID0+IFsuLi5wcmV2LCBuZXdQcmVzZXRdKTtcbiAgICB0aGlzLmFjdGl2ZVByZXNldElkLnNldChwcmVzZXRJZCk7XG4gICAgdGhpcy5wcmVzZXRTYXZlZC5lbWl0KHsgbmFtZSwgcHJlc2V0OiBuZXdQcmVzZXQgfSk7XG4gICAgdGhpcy5jbG9zZVNhdmVQcmVzZXRNb2RhbCgpO1xuICB9XG5cbiAgZGVsZXRlUHJlc2V0KHByZXNldElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocHJlc2V0SWQgPT09ICdkZWZhdWx0JykgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXN0b21QcmVzZXRzLnVwZGF0ZSgocHJldikgPT4gcHJldi5maWx0ZXIoKHApID0+IHAuaWQgIT09IHByZXNldElkKSk7XG5cbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBpZiAoZGVmICYmIGRlZi5ncmlkICYmIGRlZi5ncmlkLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSAoKGRlZi5ncmlkLm9wdGlvbnMgYXMgYW55KS5wcmVzZXRzIGFzIFJlcG9ydFZpZXdQcmVzZXRbXSkgPz8gW107XG4gICAgICAoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgPSBjdXJyZW50LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gcHJlc2V0SWQpO1xuXG4gICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSAmJiBkZWYuaWQpIHtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZS5zYXZlKGRlZikuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7fSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge30sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVByZXNldElkKCkgPT09IHByZXNldElkKSB7XG4gICAgICB0aGlzLm9uU2VsZWN0UHJlc2V0KCdkZWZhdWx0Jyk7XG4gICAgfVxuICB9XG5cbiAgb25FeHBvcnRFeGNlbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ydW50aW1lQ29tcG9uZW50KCk/LnJlc3VsdERhdGEoKTtcbiAgICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBjb2xzID0gZGVmPy5ncmlkPy5jb2x1bW5zLm1hcCgoYykgPT4gKHsgZmllbGQ6IGMuZmllbGQsIGhlYWRlcjogYy5sYWJlbCB9KSk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydEV4Y2VsKGRhdGEgYXMgYW55LCB7XG4gICAgICBmaWxlTmFtZTogZGVmPy5uYW1lID8gYCR7ZGVmLm5hbWV9Lnhsc2AgOiAncmVwb3J0LnhscycsXG4gICAgICBjb2x1bW5zOiBjb2xzLFxuICAgICAgYnJhbmRlZEhlYWRlcjogeyByZXBvcnRUaXRsZTogZGVmPy5uYW1lIH0sXG4gICAgfSk7XG4gIH1cblxuICBvbkV4cG9ydENzdigpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ydW50aW1lQ29tcG9uZW50KCk/LnJlc3VsdERhdGEoKTtcbiAgICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBjb2xzID0gZGVmPy5ncmlkPy5jb2x1bW5zLm1hcCgoYykgPT4gKHsgZmllbGQ6IGMuZmllbGQsIGhlYWRlcjogYy5sYWJlbCB9KSk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLmV4cG9ydENzdihkYXRhIGFzIGFueSwge1xuICAgICAgZmlsZU5hbWU6IGRlZj8ubmFtZSA/IGAke2RlZi5uYW1lfS5jc3ZgIDogJ3JlcG9ydC5jc3YnLFxuICAgICAgY29sdW1uczogY29scyxcbiAgICAgIGJyYW5kZWRIZWFkZXI6IHsgcmVwb3J0VGl0bGU6IGRlZj8ubmFtZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25QcmludFJlcG9ydCgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5ydW50aW1lQ29tcG9uZW50KCk/LnJlc3VsdERhdGEoKTtcbiAgICBpZiAoIWRhdGEgfHwgIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBjb25zdCBjb2xzID0gZGVmPy5ncmlkPy5jb2x1bW5zLm1hcCgoYykgPT4gKHsgZmllbGQ6IGMuZmllbGQsIGhlYWRlcjogYy5sYWJlbCB9KSk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLnByaW50UmVwb3J0KGRhdGEgYXMgYW55LCB7XG4gICAgICB0aXRsZTogZGVmPy5uYW1lIHx8ICdSZXBvcnQgUHJpbnQgUHJldmlldycsXG4gICAgICBjb2x1bW5zOiBjb2xzLFxuICAgICAgYnJhbmRlZEhlYWRlcjogeyByZXBvcnRUaXRsZTogZGVmPy5uYW1lIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|