bways-report 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +293 -464
  2. package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
  3. package/esm2022/lib/core/index.mjs +2 -1
  4. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  5. package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
  6. package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
  16. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
  17. package/esm2022/lib/data-access/adapters/index.mjs +8 -1
  18. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  19. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
  21. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
  22. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  26. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
  27. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
  30. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
  31. package/esm2022/lib/features/designer/designer.component.mjs +43 -2
  32. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  33. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
  34. package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
  35. package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
  36. package/esm2022/lib/features/embed/index.mjs +5 -0
  37. package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
  38. package/esm2022/lib/features/index.mjs +2 -1
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
  40. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
  41. package/esm2022/lib/features/routing/index.mjs +2 -2
  42. package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
  43. package/esm2022/lib/features/routing/report-routes.mjs +42 -1
  44. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
  45. package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
  46. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
  48. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
  49. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
  50. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  51. package/esm2022/lib/primitives/components/index.mjs +2 -1
  52. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
  53. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
  54. package/esm2022/lib/provide-reporting.mjs +137 -7
  55. package/fesm2022/bways-report.mjs +4053 -840
  56. package/fesm2022/bways-report.mjs.map +1 -1
  57. package/lib/core/config/bways-report-config.d.ts +161 -0
  58. package/lib/core/index.d.ts +1 -0
  59. package/lib/core/models/report-definition.model.d.ts +16 -0
  60. package/lib/core/services/report-session-context.service.d.ts +1 -0
  61. package/lib/core/tokens/reporting-config.token.d.ts +16 -0
  62. package/lib/core/utils/data-normalization.util.d.ts +10 -0
  63. package/lib/core/utils/report-parameter.util.d.ts +18 -1
  64. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
  65. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
  66. package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
  67. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
  68. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
  69. package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -0
  71. package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
  72. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
  73. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
  74. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
  75. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
  76. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
  77. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
  78. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
  79. package/lib/features/designer/designer.component.d.ts +4 -0
  80. package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
  81. package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
  82. package/lib/features/embed/bways-report-page.component.d.ts +61 -0
  83. package/lib/features/embed/index.d.ts +4 -0
  84. package/lib/features/embed/inject-report-menu.d.ts +44 -0
  85. package/lib/features/index.d.ts +1 -0
  86. package/lib/features/persistence/services/report-store.service.d.ts +5 -0
  87. package/lib/features/routing/index.d.ts +1 -1
  88. package/lib/features/routing/models/report-route.models.d.ts +3 -0
  89. package/lib/features/routing/report-routes.d.ts +40 -0
  90. package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
  91. package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
  92. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
  93. package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
  97. package/lib/provide-reporting.d.ts +22 -6
  98. package/package.json +1 -1
@@ -0,0 +1,433 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, signal, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { RouterModule } from '@angular/router';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
6
+ import { injectReportMenu, injectReportMenuGroups } from './inject-report-menu';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ import * as i2 from "@angular/forms";
10
+ /**
11
+ * Drop-in menu component for bways-report.
12
+ *
13
+ * Automatically displays saved and published report pages from the backend or storage.
14
+ *
15
+ * Usage:
16
+ * ```html
17
+ * <!-- Sidebar navigation -->
18
+ * <bways-report-menu variant="sidebar" />
19
+ *
20
+ * <!-- Horizontal navigation bar -->
21
+ * <bways-report-menu variant="navbar" />
22
+ *
23
+ * <!-- Header dropdown button -->
24
+ * <bways-report-menu variant="dropdown" />
25
+ * ```
26
+ */
27
+ export class BwaysReportMenuComponent {
28
+ variant = input('sidebar');
29
+ basePath = input(undefined);
30
+ title = input('Reports');
31
+ showIcons = input(true);
32
+ allowSearch = input(false);
33
+ includeDrafts = input(false);
34
+ searchQuery = signal('');
35
+ isOpen = signal(false);
36
+ collapsedGroups = signal(new Set());
37
+ rawMenu = injectReportMenu();
38
+ rawGroups = injectReportMenuGroups();
39
+ totalItems = computed(() => this.rawMenu().length);
40
+ filteredFlatItems = computed(() => {
41
+ const q = this.searchQuery().trim().toLowerCase();
42
+ const items = this.rawMenu();
43
+ if (!q)
44
+ return items;
45
+ return items.filter((item) => item.name.toLowerCase().includes(q) ||
46
+ item.category.toLowerCase().includes(q) ||
47
+ item.slug.toLowerCase().includes(q));
48
+ });
49
+ filteredGroups = computed(() => {
50
+ const q = this.searchQuery().trim().toLowerCase();
51
+ const groups = this.rawGroups();
52
+ if (!q)
53
+ return groups;
54
+ return groups
55
+ .map((g) => ({
56
+ ...g,
57
+ items: g.items.filter((item) => item.name.toLowerCase().includes(q) ||
58
+ item.category.toLowerCase().includes(q) ||
59
+ item.slug.toLowerCase().includes(q)),
60
+ }))
61
+ .filter((g) => g.items.length > 0);
62
+ });
63
+ isGroupCollapsed(category) {
64
+ return this.collapsedGroups().has(category);
65
+ }
66
+ toggleGroup(category) {
67
+ const set = new Set(this.collapsedGroups());
68
+ if (set.has(category)) {
69
+ set.delete(category);
70
+ }
71
+ else {
72
+ set.add(category);
73
+ }
74
+ this.collapsedGroups.set(set);
75
+ }
76
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
77
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BwaysReportMenuComponent, isStandalone: true, selector: "bways-report-menu", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, showIcons: { classPropertyName: "showIcons", publicName: "showIcons", isSignal: true, isRequired: false, transformFunction: null }, allowSearch: { classPropertyName: "allowSearch", publicName: "allowSearch", isSignal: true, isRequired: false, transformFunction: null }, includeDrafts: { classPropertyName: "includeDrafts", publicName: "includeDrafts", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
78
+ <!-- ═══════════════ SIDEBAR VARIANT ═══════════════ -->
79
+ @if (variant() === 'sidebar') {
80
+ <nav class="rpt-menu-sidebar" [attr.aria-label]="title()">
81
+ @if (title()) {
82
+ <div class="rpt-menu-sidebar-header">
83
+ <div class="rpt-menu-header-left">
84
+ <rpt-icon name="file-text" [size]="16" class="rpt-menu-header-icon" />
85
+ <span class="rpt-menu-title">{{ title() }}</span>
86
+ </div>
87
+ <span class="rpt-menu-count-badge">{{ totalItems() }}</span>
88
+ </div>
89
+ }
90
+
91
+ @if (allowSearch()) {
92
+ <div class="rpt-menu-search-box">
93
+ <rpt-icon name="search" [size]="13" class="rpt-search-icon" />
94
+ <input
95
+ type="text"
96
+ class="rpt-search-input"
97
+ placeholder="Search reports..."
98
+ [ngModel]="searchQuery()"
99
+ (ngModelChange)="searchQuery.set($event)"
100
+ />
101
+ @if (searchQuery()) {
102
+ <button
103
+ type="button"
104
+ class="rpt-search-clear"
105
+ (click)="searchQuery.set('')"
106
+ aria-label="Clear search"
107
+ >
108
+ &times;
109
+ </button>
110
+ }
111
+ </div>
112
+ }
113
+
114
+ @if (filteredGroups().length === 0) {
115
+ <div class="rpt-menu-empty">
116
+ <p>No reports found.</p>
117
+ </div>
118
+ } @else {
119
+ <div class="rpt-menu-groups-container">
120
+ @for (group of filteredGroups(); track group.category) {
121
+ <div class="rpt-menu-group">
122
+ @if (filteredGroups().length > 1 || group.category !== 'General') {
123
+ <div
124
+ class="rpt-group-heading"
125
+ (click)="toggleGroup(group.category)"
126
+ role="button"
127
+ tabindex="0"
128
+ >
129
+ <span class="rpt-group-title">{{ group.displayName }}</span>
130
+ <rpt-icon
131
+ [name]="isGroupCollapsed(group.category) ? 'chevron-right' : 'chevron-down'"
132
+ [size]="12"
133
+ class="rpt-group-arrow"
134
+ />
135
+ </div>
136
+ }
137
+
138
+ @if (!isGroupCollapsed(group.category)) {
139
+ <ul class="rpt-group-items">
140
+ @for (item of group.items; track item.slug) {
141
+ <li class="rpt-item-row">
142
+ <a
143
+ [routerLink]="item.route"
144
+ routerLinkActive="rpt-active-link"
145
+ class="rpt-menu-link"
146
+ [title]="item.name"
147
+ >
148
+ @if (showIcons()) {
149
+ <rpt-icon
150
+ [name]="item.icon || 'file-text'"
151
+ [size]="15"
152
+ class="rpt-item-icon"
153
+ />
154
+ }
155
+ <span class="rpt-item-text">{{ item.name }}</span>
156
+ @if (item.isDraft) {
157
+ <span class="rpt-draft-chip">draft</span>
158
+ }
159
+ </a>
160
+ </li>
161
+ }
162
+ </ul>
163
+ }
164
+ </div>
165
+ }
166
+ </div>
167
+ }
168
+ </nav>
169
+ }
170
+
171
+ <!-- ═══════════════ NAVBAR VARIANT ═══════════════ -->
172
+ @else if (variant() === 'navbar') {
173
+ <nav class="rpt-menu-navbar" [attr.aria-label]="title()">
174
+ <ul class="rpt-navbar-list">
175
+ @for (item of filteredFlatItems(); track item.slug) {
176
+ <li class="rpt-navbar-item">
177
+ <a
178
+ [routerLink]="item.route"
179
+ routerLinkActive="rpt-active-link"
180
+ class="rpt-navbar-link"
181
+ [title]="item.name"
182
+ >
183
+ @if (showIcons()) {
184
+ <rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
185
+ }
186
+ <span>{{ item.name }}</span>
187
+ </a>
188
+ </li>
189
+ }
190
+ </ul>
191
+ </nav>
192
+ }
193
+
194
+ <!-- ═══════════════ DROPDOWN VARIANT ═══════════════ -->
195
+ @else if (variant() === 'dropdown') {
196
+ <div class="rpt-menu-dropdown-wrapper">
197
+ <button
198
+ type="button"
199
+ class="rpt-dropdown-trigger"
200
+ (click)="isOpen.set(!isOpen())"
201
+ [attr.aria-expanded]="isOpen()"
202
+ >
203
+ <rpt-icon name="file-text" [size]="15" />
204
+ <span>{{ title() }}</span>
205
+ <rpt-icon
206
+ [name]="isOpen() ? 'chevron-down' : 'chevron-down'"
207
+ [size]="12"
208
+ class="rpt-trigger-arrow"
209
+ />
210
+ </button>
211
+
212
+ @if (isOpen()) {
213
+ <div class="rpt-dropdown-backdrop" (click)="isOpen.set(false)"></div>
214
+ <div class="rpt-dropdown-panel" role="menu">
215
+ @if (allowSearch()) {
216
+ <div class="rpt-dropdown-search">
217
+ <input
218
+ type="text"
219
+ class="rpt-dropdown-search-input"
220
+ placeholder="Filter reports..."
221
+ [ngModel]="searchQuery()"
222
+ (ngModelChange)="searchQuery.set($event)"
223
+ (click)="$event.stopPropagation()"
224
+ />
225
+ </div>
226
+ }
227
+
228
+ <div class="rpt-dropdown-items-list">
229
+ @for (item of filteredFlatItems(); track item.slug) {
230
+ <a
231
+ [routerLink]="item.route"
232
+ class="rpt-dropdown-item"
233
+ (click)="isOpen.set(false)"
234
+ role="menuitem"
235
+ >
236
+ @if (showIcons()) {
237
+ <rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
238
+ }
239
+ <span class="rpt-dropdown-item-name">{{ item.name }}</span>
240
+ @if (item.category && item.category !== 'General') {
241
+ <span class="rpt-dropdown-item-cat">{{ item.category }}</span>
242
+ }
243
+ </a>
244
+ } @empty {
245
+ <div class="rpt-dropdown-empty">No reports available</div>
246
+ }
247
+ </div>
248
+ </div>
249
+ }
250
+ </div>
251
+ }
252
+ `, isInline: true, styles: [":host{display:block;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);--rpt-menu-bg: var(--rpt-surface-bg, #ffffff);--rpt-menu-text: var(--rpt-text-color, #1e293b);--rpt-menu-text-muted: var(--rpt-text-muted, #64748b);--rpt-menu-hover-bg: var(--rpt-bg-subtle, #f1f5f9);--rpt-menu-active-bg: var(--rpt-primary-light, #eff6ff);--rpt-menu-active-text: var(--rpt-primary, #2563eb);--rpt-menu-border: var(--rpt-border-color, #e2e8f0)}.rpt-menu-sidebar{display:flex;flex-direction:column;width:100%;box-sizing:border-box;background:var(--rpt-menu-bg)}.rpt-menu-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-menu-header-left{display:flex;align-items:center;gap:8px}.rpt-menu-header-icon{color:var(--rpt-menu-active-text)}.rpt-menu-title{font-size:.8125rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-menu-text-muted)}.rpt-menu-count-badge{font-size:.6875rem;font-weight:600;background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text-muted);padding:1px 6px;border-radius:9999px}.rpt-menu-search-box{position:relative;padding:8px 12px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-search-icon{position:absolute;left:20px;top:50%;transform:translateY(-50%);color:var(--rpt-menu-text-muted)}.rpt-search-input{width:100%;box-sizing:border-box;padding:6px 26px 6px 28px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:6px;outline:none;background:#f8fafc;color:var(--rpt-menu-text);transition:all .15s ease}.rpt-search-input:focus{background:#fff;border-color:var(--rpt-menu-active-text);box-shadow:0 0 0 2px #2563eb26}.rpt-search-clear{position:absolute;right:18px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--rpt-menu-text-muted);cursor:pointer;font-size:1rem;padding:0}.rpt-menu-groups-container{display:flex;flex-direction:column;padding:6px 0;gap:4px}.rpt-menu-group{display:flex;flex-direction:column}.rpt-group-heading{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;font-size:.725rem;font-weight:600;color:var(--rpt-menu-text-muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s ease}.rpt-group-heading:hover{color:var(--rpt-menu-text)}.rpt-group-items{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:2px}.rpt-item-row{padding:0 8px}.rpt-menu-link{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-menu-link:hover{background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text)}.rpt-menu-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-item-icon{color:var(--rpt-menu-text-muted);flex-shrink:0}.rpt-menu-link.rpt-active-link .rpt-item-icon{color:var(--rpt-menu-active-text)}.rpt-item-text{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-draft-chip{font-size:.625rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef3c7;color:#92400e;text-transform:uppercase}.rpt-menu-empty{padding:24px 16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}.rpt-menu-navbar{display:flex;align-items:center;width:100%}.rpt-navbar-list{display:flex;align-items:center;gap:4px;list-style:none;padding:0;margin:0}.rpt-navbar-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-navbar-link:hover{background:var(--rpt-menu-hover-bg)}.rpt-navbar-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-menu-dropdown-wrapper{position:relative;display:inline-block}.rpt-dropdown-trigger{display:inline-flex;align-items:center;gap:7px;padding:7px 14px;border-radius:6px;border:1px solid var(--rpt-menu-border);background:var(--rpt-menu-bg);color:var(--rpt-menu-text);font-size:.835rem;font-weight:500;cursor:pointer;transition:all .15s ease}.rpt-dropdown-trigger:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-backdrop{position:fixed;inset:0;z-index:99}.rpt-dropdown-panel{position:absolute;top:calc(100% + 4px);left:0;min-width:240px;max-width:320px;max-height:380px;background:#fff;border:1px solid var(--rpt-menu-border);border-radius:8px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:100;overflow-y:auto;display:flex;flex-direction:column}.rpt-dropdown-search{padding:8px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-dropdown-search-input{width:100%;box-sizing:border-box;padding:6px 10px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:4px;outline:none}.rpt-dropdown-items-list{padding:4px 0;display:flex;flex-direction:column}.rpt-dropdown-item{display:flex;align-items:center;gap:8px;padding:8px 12px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;transition:background .15s ease}.rpt-dropdown-item:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-dropdown-item-cat{font-size:.6875rem;color:var(--rpt-menu-text-muted);background:var(--rpt-menu-hover-bg);padding:1px 6px;border-radius:4px}.rpt-dropdown-empty{padding:16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
253
+ }
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportMenuComponent, decorators: [{
255
+ type: Component,
256
+ args: [{ selector: 'bways-report-menu', standalone: true, imports: [CommonModule, RouterModule, FormsModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
257
+ <!-- ═══════════════ SIDEBAR VARIANT ═══════════════ -->
258
+ @if (variant() === 'sidebar') {
259
+ <nav class="rpt-menu-sidebar" [attr.aria-label]="title()">
260
+ @if (title()) {
261
+ <div class="rpt-menu-sidebar-header">
262
+ <div class="rpt-menu-header-left">
263
+ <rpt-icon name="file-text" [size]="16" class="rpt-menu-header-icon" />
264
+ <span class="rpt-menu-title">{{ title() }}</span>
265
+ </div>
266
+ <span class="rpt-menu-count-badge">{{ totalItems() }}</span>
267
+ </div>
268
+ }
269
+
270
+ @if (allowSearch()) {
271
+ <div class="rpt-menu-search-box">
272
+ <rpt-icon name="search" [size]="13" class="rpt-search-icon" />
273
+ <input
274
+ type="text"
275
+ class="rpt-search-input"
276
+ placeholder="Search reports..."
277
+ [ngModel]="searchQuery()"
278
+ (ngModelChange)="searchQuery.set($event)"
279
+ />
280
+ @if (searchQuery()) {
281
+ <button
282
+ type="button"
283
+ class="rpt-search-clear"
284
+ (click)="searchQuery.set('')"
285
+ aria-label="Clear search"
286
+ >
287
+ &times;
288
+ </button>
289
+ }
290
+ </div>
291
+ }
292
+
293
+ @if (filteredGroups().length === 0) {
294
+ <div class="rpt-menu-empty">
295
+ <p>No reports found.</p>
296
+ </div>
297
+ } @else {
298
+ <div class="rpt-menu-groups-container">
299
+ @for (group of filteredGroups(); track group.category) {
300
+ <div class="rpt-menu-group">
301
+ @if (filteredGroups().length > 1 || group.category !== 'General') {
302
+ <div
303
+ class="rpt-group-heading"
304
+ (click)="toggleGroup(group.category)"
305
+ role="button"
306
+ tabindex="0"
307
+ >
308
+ <span class="rpt-group-title">{{ group.displayName }}</span>
309
+ <rpt-icon
310
+ [name]="isGroupCollapsed(group.category) ? 'chevron-right' : 'chevron-down'"
311
+ [size]="12"
312
+ class="rpt-group-arrow"
313
+ />
314
+ </div>
315
+ }
316
+
317
+ @if (!isGroupCollapsed(group.category)) {
318
+ <ul class="rpt-group-items">
319
+ @for (item of group.items; track item.slug) {
320
+ <li class="rpt-item-row">
321
+ <a
322
+ [routerLink]="item.route"
323
+ routerLinkActive="rpt-active-link"
324
+ class="rpt-menu-link"
325
+ [title]="item.name"
326
+ >
327
+ @if (showIcons()) {
328
+ <rpt-icon
329
+ [name]="item.icon || 'file-text'"
330
+ [size]="15"
331
+ class="rpt-item-icon"
332
+ />
333
+ }
334
+ <span class="rpt-item-text">{{ item.name }}</span>
335
+ @if (item.isDraft) {
336
+ <span class="rpt-draft-chip">draft</span>
337
+ }
338
+ </a>
339
+ </li>
340
+ }
341
+ </ul>
342
+ }
343
+ </div>
344
+ }
345
+ </div>
346
+ }
347
+ </nav>
348
+ }
349
+
350
+ <!-- ═══════════════ NAVBAR VARIANT ═══════════════ -->
351
+ @else if (variant() === 'navbar') {
352
+ <nav class="rpt-menu-navbar" [attr.aria-label]="title()">
353
+ <ul class="rpt-navbar-list">
354
+ @for (item of filteredFlatItems(); track item.slug) {
355
+ <li class="rpt-navbar-item">
356
+ <a
357
+ [routerLink]="item.route"
358
+ routerLinkActive="rpt-active-link"
359
+ class="rpt-navbar-link"
360
+ [title]="item.name"
361
+ >
362
+ @if (showIcons()) {
363
+ <rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
364
+ }
365
+ <span>{{ item.name }}</span>
366
+ </a>
367
+ </li>
368
+ }
369
+ </ul>
370
+ </nav>
371
+ }
372
+
373
+ <!-- ═══════════════ DROPDOWN VARIANT ═══════════════ -->
374
+ @else if (variant() === 'dropdown') {
375
+ <div class="rpt-menu-dropdown-wrapper">
376
+ <button
377
+ type="button"
378
+ class="rpt-dropdown-trigger"
379
+ (click)="isOpen.set(!isOpen())"
380
+ [attr.aria-expanded]="isOpen()"
381
+ >
382
+ <rpt-icon name="file-text" [size]="15" />
383
+ <span>{{ title() }}</span>
384
+ <rpt-icon
385
+ [name]="isOpen() ? 'chevron-down' : 'chevron-down'"
386
+ [size]="12"
387
+ class="rpt-trigger-arrow"
388
+ />
389
+ </button>
390
+
391
+ @if (isOpen()) {
392
+ <div class="rpt-dropdown-backdrop" (click)="isOpen.set(false)"></div>
393
+ <div class="rpt-dropdown-panel" role="menu">
394
+ @if (allowSearch()) {
395
+ <div class="rpt-dropdown-search">
396
+ <input
397
+ type="text"
398
+ class="rpt-dropdown-search-input"
399
+ placeholder="Filter reports..."
400
+ [ngModel]="searchQuery()"
401
+ (ngModelChange)="searchQuery.set($event)"
402
+ (click)="$event.stopPropagation()"
403
+ />
404
+ </div>
405
+ }
406
+
407
+ <div class="rpt-dropdown-items-list">
408
+ @for (item of filteredFlatItems(); track item.slug) {
409
+ <a
410
+ [routerLink]="item.route"
411
+ class="rpt-dropdown-item"
412
+ (click)="isOpen.set(false)"
413
+ role="menuitem"
414
+ >
415
+ @if (showIcons()) {
416
+ <rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
417
+ }
418
+ <span class="rpt-dropdown-item-name">{{ item.name }}</span>
419
+ @if (item.category && item.category !== 'General') {
420
+ <span class="rpt-dropdown-item-cat">{{ item.category }}</span>
421
+ }
422
+ </a>
423
+ } @empty {
424
+ <div class="rpt-dropdown-empty">No reports available</div>
425
+ }
426
+ </div>
427
+ </div>
428
+ }
429
+ </div>
430
+ }
431
+ `, styles: [":host{display:block;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);--rpt-menu-bg: var(--rpt-surface-bg, #ffffff);--rpt-menu-text: var(--rpt-text-color, #1e293b);--rpt-menu-text-muted: var(--rpt-text-muted, #64748b);--rpt-menu-hover-bg: var(--rpt-bg-subtle, #f1f5f9);--rpt-menu-active-bg: var(--rpt-primary-light, #eff6ff);--rpt-menu-active-text: var(--rpt-primary, #2563eb);--rpt-menu-border: var(--rpt-border-color, #e2e8f0)}.rpt-menu-sidebar{display:flex;flex-direction:column;width:100%;box-sizing:border-box;background:var(--rpt-menu-bg)}.rpt-menu-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-menu-header-left{display:flex;align-items:center;gap:8px}.rpt-menu-header-icon{color:var(--rpt-menu-active-text)}.rpt-menu-title{font-size:.8125rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-menu-text-muted)}.rpt-menu-count-badge{font-size:.6875rem;font-weight:600;background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text-muted);padding:1px 6px;border-radius:9999px}.rpt-menu-search-box{position:relative;padding:8px 12px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-search-icon{position:absolute;left:20px;top:50%;transform:translateY(-50%);color:var(--rpt-menu-text-muted)}.rpt-search-input{width:100%;box-sizing:border-box;padding:6px 26px 6px 28px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:6px;outline:none;background:#f8fafc;color:var(--rpt-menu-text);transition:all .15s ease}.rpt-search-input:focus{background:#fff;border-color:var(--rpt-menu-active-text);box-shadow:0 0 0 2px #2563eb26}.rpt-search-clear{position:absolute;right:18px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--rpt-menu-text-muted);cursor:pointer;font-size:1rem;padding:0}.rpt-menu-groups-container{display:flex;flex-direction:column;padding:6px 0;gap:4px}.rpt-menu-group{display:flex;flex-direction:column}.rpt-group-heading{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;font-size:.725rem;font-weight:600;color:var(--rpt-menu-text-muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s ease}.rpt-group-heading:hover{color:var(--rpt-menu-text)}.rpt-group-items{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:2px}.rpt-item-row{padding:0 8px}.rpt-menu-link{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-menu-link:hover{background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text)}.rpt-menu-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-item-icon{color:var(--rpt-menu-text-muted);flex-shrink:0}.rpt-menu-link.rpt-active-link .rpt-item-icon{color:var(--rpt-menu-active-text)}.rpt-item-text{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-draft-chip{font-size:.625rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef3c7;color:#92400e;text-transform:uppercase}.rpt-menu-empty{padding:24px 16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}.rpt-menu-navbar{display:flex;align-items:center;width:100%}.rpt-navbar-list{display:flex;align-items:center;gap:4px;list-style:none;padding:0;margin:0}.rpt-navbar-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-navbar-link:hover{background:var(--rpt-menu-hover-bg)}.rpt-navbar-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-menu-dropdown-wrapper{position:relative;display:inline-block}.rpt-dropdown-trigger{display:inline-flex;align-items:center;gap:7px;padding:7px 14px;border-radius:6px;border:1px solid var(--rpt-menu-border);background:var(--rpt-menu-bg);color:var(--rpt-menu-text);font-size:.835rem;font-weight:500;cursor:pointer;transition:all .15s ease}.rpt-dropdown-trigger:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-backdrop{position:fixed;inset:0;z-index:99}.rpt-dropdown-panel{position:absolute;top:calc(100% + 4px);left:0;min-width:240px;max-width:320px;max-height:380px;background:#fff;border:1px solid var(--rpt-menu-border);border-radius:8px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:100;overflow-y:auto;display:flex;flex-direction:column}.rpt-dropdown-search{padding:8px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-dropdown-search-input{width:100%;box-sizing:border-box;padding:6px 10px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:4px;outline:none}.rpt-dropdown-items-list{padding:4px 0;display:flex;flex-direction:column}.rpt-dropdown-item{display:flex;align-items:center;gap:8px;padding:8px 12px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;transition:background .15s ease}.rpt-dropdown-item:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-dropdown-item-cat{font-size:.6875rem;color:var(--rpt-menu-text-muted);background:var(--rpt-menu-hover-bg);padding:1px 6px;border-radius:4px}.rpt-dropdown-empty{padding:16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}\n"] }]
432
+ }] });
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYndheXMtcmVwb3J0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZW1iZWQvYndheXMtcmVwb3J0LW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFFUixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBS2hGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBb2hCSCxNQUFNLE9BQU8sd0JBQXdCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQW9CLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLFFBQVEsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELEtBQUssR0FBRyxLQUFLLENBQVMsU0FBUyxDQUFDLENBQUM7SUFDakMsU0FBUyxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNqQyxXQUFXLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLGFBQWEsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFdEMsV0FBVyxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLGVBQWUsR0FBRyxNQUFNLENBQWMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdCLFNBQVMsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO0lBRTdDLFVBQVUsR0FBRyxRQUFRLENBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTNELGlCQUFpQixHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQzNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQ2pCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN0QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFTSxjQUFjLEdBQUcsUUFBUSxDQUFvQixHQUFHLEVBQUU7UUFDekQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sTUFBTSxDQUFDO1FBRXRCLE9BQU8sTUFBTTthQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNYLEdBQUcsQ0FBQztZQUNKLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDdEM7U0FDRixDQUFDLENBQUM7YUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7d0dBM0RVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLDgyQkE5Z0J6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStLVCxpaUxBakxTLFlBQVksOEJBQUUsWUFBWSxnZkFBRSxXQUFXLCttQkFBRSxnQkFBZ0I7OzRGQWdoQnhELHdCQUF3QjtrQkFuaEJwQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFDbkQsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStLVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgaW5qZWN0UmVwb3J0TWVudSwgaW5qZWN0UmVwb3J0TWVudUdyb3VwcyB9IGZyb20gJy4vaW5qZWN0LXJlcG9ydC1tZW51JztcbmltcG9ydCB7IFJlcG9ydE1lbnVHcm91cCwgUmVwb3J0TWVudUl0ZW0gfSBmcm9tICcuLi9yb3V0aW5nL21vZGVscy9yZXBvcnQtcm91dGUubW9kZWxzJztcblxuZXhwb3J0IHR5cGUgUmVwb3J0TWVudVZhcmlhbnQgPSAnc2lkZWJhcicgfCAnbmF2YmFyJyB8ICdkcm9wZG93bic7XG5cbi8qKlxuICogRHJvcC1pbiBtZW51IGNvbXBvbmVudCBmb3IgYndheXMtcmVwb3J0LlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZGlzcGxheXMgc2F2ZWQgYW5kIHB1Ymxpc2hlZCByZXBvcnQgcGFnZXMgZnJvbSB0aGUgYmFja2VuZCBvciBzdG9yYWdlLlxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPCEtLSBTaWRlYmFyIG5hdmlnYXRpb24gLS0+XG4gKiA8YndheXMtcmVwb3J0LW1lbnUgdmFyaWFudD1cInNpZGViYXJcIiAvPlxuICpcbiAqIDwhLS0gSG9yaXpvbnRhbCBuYXZpZ2F0aW9uIGJhciAtLT5cbiAqIDxid2F5cy1yZXBvcnQtbWVudSB2YXJpYW50PVwibmF2YmFyXCIgLz5cbiAqXG4gKiA8IS0tIEhlYWRlciBkcm9wZG93biBidXR0b24gLS0+XG4gKiA8YndheXMtcmVwb3J0LW1lbnUgdmFyaWFudD1cImRyb3Bkb3duXCIgLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdid2F5cy1yZXBvcnQtbWVudScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJvdXRlck1vZHVsZSwgRm9ybXNNb2R1bGUsIFJwdEljb25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBTSURFQkFSIFZBUklBTlQg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIEBpZiAodmFyaWFudCgpID09PSAnc2lkZWJhcicpIHtcbiAgICAgIDxuYXYgY2xhc3M9XCJycHQtbWVudS1zaWRlYmFyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aXRsZSgpXCI+XG4gICAgICAgIEBpZiAodGl0bGUoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbWVudS1zaWRlYmFyLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tZW51LWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZmlsZS10ZXh0XCIgW3NpemVdPVwiMTZcIiBjbGFzcz1cInJwdC1tZW51LWhlYWRlci1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtbWVudS10aXRsZVwiPnt7IHRpdGxlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LW1lbnUtY291bnQtYmFkZ2VcIj57eyB0b3RhbEl0ZW1zKCkgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGFsbG93U2VhcmNoKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1lbnUtc2VhcmNoLWJveFwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzZWFyY2hcIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwicnB0LXNlYXJjaC1pY29uXCIgLz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHJlcG9ydHMuLi5cIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hRdWVyeSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoUXVlcnkuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIEBpZiAoc2VhcmNoUXVlcnkoKSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtc2VhcmNoLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoUXVlcnkuc2V0KCcnKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAmdGltZXM7XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZEdyb3VwcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbWVudS1lbXB0eVwiPlxuICAgICAgICAgICAgPHA+Tm8gcmVwb3J0cyBmb3VuZC48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbWVudS1ncm91cHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICBAZm9yIChncm91cCBvZiBmaWx0ZXJlZEdyb3VwcygpOyB0cmFjayBncm91cC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1lbnUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGZpbHRlcmVkR3JvdXBzKCkubGVuZ3RoID4gMSB8fCBncm91cC5jYXRlZ29yeSAhPT0gJ0dlbmVyYWwnKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWdyb3VwLWhlYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlR3JvdXAoZ3JvdXAuY2F0ZWdvcnkpXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWdyb3VwLXRpdGxlXCI+e3sgZ3JvdXAuZGlzcGxheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImlzR3JvdXBDb2xsYXBzZWQoZ3JvdXAuY2F0ZWdvcnkpID8gJ2NoZXZyb24tcmlnaHQnIDogJ2NoZXZyb24tZG93bidcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1ncm91cC1hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKCFpc0dyb3VwQ29sbGFwc2VkKGdyb3VwLmNhdGVnb3J5KSkge1xuICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwicnB0LWdyb3VwLWl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZ3JvdXAuaXRlbXM7IHRyYWNrIGl0ZW0uc2x1Zykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInJwdC1pdGVtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXRlbS5yb3V0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJycHQtYWN0aXZlLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1tZW51LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93SWNvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5pY29uIHx8ICdmaWxlLXRleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWl0ZW0taWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1pdGVtLXRleHRcIj57eyBpdGVtLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pc0RyYWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZHJhZnQtY2hpcFwiPmRyYWZ0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L25hdj5cbiAgICB9XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBOQVZCQVIgVkFSSUFOVCDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgQGVsc2UgaWYgKHZhcmlhbnQoKSA9PT0gJ25hdmJhcicpIHtcbiAgICAgIDxuYXYgY2xhc3M9XCJycHQtbWVudS1uYXZiYXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRpdGxlKClcIj5cbiAgICAgICAgPHVsIGNsYXNzPVwicnB0LW5hdmJhci1saXN0XCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWx0ZXJlZEZsYXRJdGVtcygpOyB0cmFjayBpdGVtLnNsdWcpIHtcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cInJwdC1uYXZiYXItaXRlbVwiPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVcIlxuICAgICAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJycHQtYWN0aXZlLWxpbmtcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LW5hdmJhci1saW5rXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ljb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJpdGVtLmljb24gfHwgJ2ZpbGUtdGV4dCdcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG4gICAgICA8L25hdj5cbiAgICB9XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBEUk9QRE9XTiBWQVJJQU5UIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAtLT5cbiAgICBAZWxzZSBpZiAodmFyaWFudCgpID09PSAnZHJvcGRvd24nKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LW1lbnUtZHJvcGRvd24td3JhcHBlclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJycHQtZHJvcGRvd24tdHJpZ2dlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImlzT3Blbi5zZXQoIWlzT3BlbigpKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImZpbGUtdGV4dFwiIFtzaXplXT1cIjE1XCIgLz5cbiAgICAgICAgICA8c3Bhbj57eyB0aXRsZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDxycHQtaWNvblxuICAgICAgICAgICAgW25hbWVdPVwiaXNPcGVuKCkgPyAnY2hldnJvbi1kb3duJyA6ICdjaGV2cm9uLWRvd24nXCJcbiAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgIGNsYXNzPVwicnB0LXRyaWdnZXItYXJyb3dcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIEBpZiAoaXNPcGVuKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWRyb3Bkb3duLWJhY2tkcm9wXCIgKGNsaWNrKT1cImlzT3Blbi5zZXQoZmFsc2UpXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcm9wZG93bi1wYW5lbFwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgICAgICBAaWYgKGFsbG93U2VhcmNoKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcm9wZG93bi1zZWFyY2hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWRyb3Bkb3duLXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciByZXBvcnRzLi4uXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFF1ZXJ5KClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoUXVlcnkuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJvcGRvd24taXRlbXMtbGlzdFwiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpbHRlcmVkRmxhdEl0ZW1zKCk7IHRyYWNrIGl0ZW0uc2x1Zykge1xuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnJvdXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93SWNvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiaXRlbS5pY29uIHx8ICdmaWxlLXRleHQnXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZHJvcGRvd24taXRlbS1uYW1lXCI+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmNhdGVnb3J5ICYmIGl0ZW0uY2F0ZWdvcnkgIT09ICdHZW5lcmFsJykge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1kcm9wZG93bi1pdGVtLWNhdFwiPnt7IGl0ZW0uY2F0ZWdvcnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcm9wZG93bi1lbXB0eVwiPk5vIHJlcG9ydHMgYXZhaWxhYmxlPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIHNhbnMtc2VyaWYpO1xuICAgICAgLS1ycHQtbWVudS1iZzogdmFyKC0tcnB0LXN1cmZhY2UtYmcsICNmZmZmZmYpO1xuICAgICAgLS1ycHQtbWVudS10ZXh0OiB2YXIoLS1ycHQtdGV4dC1jb2xvciwgIzFlMjkzYik7XG4gICAgICAtLXJwdC1tZW51LXRleHQtbXV0ZWQ6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIC0tcnB0LW1lbnUtaG92ZXItYmc6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmMWY1ZjkpO1xuICAgICAgLS1ycHQtbWVudS1hY3RpdmUtYmc6IHZhcigtLXJwdC1wcmltYXJ5LWxpZ2h0LCAjZWZmNmZmKTtcbiAgICAgIC0tcnB0LW1lbnUtYWN0aXZlLXRleHQ6IHZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIC0tcnB0LW1lbnUtYm9yZGVyOiB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICB9XG5cbiAgICAvKiDilIDilIDilIAgU0lERUJBUiBTVFlMRVMg4pSA4pSA4pSAICovXG4gICAgLnJwdC1tZW51LXNpZGViYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1iZyk7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LXNpZGViYXItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWhlYWRlci1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWhlYWRlci1pY29uIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS1hY3RpdmUtdGV4dCk7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1jb3VudC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjg3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1ob3Zlci1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dC1tdXRlZCk7XG4gICAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1zZWFyY2gtYm94IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgfVxuXG4gICAgLnJwdC1zZWFyY2gtaWNvbiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBsZWZ0OiAyMHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dC1tdXRlZCk7XG4gICAgfVxuXG4gICAgLnJwdC1zZWFyY2gtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZzogNnB4IDI2cHggNnB4IDI4cHg7XG4gICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0KTtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtc2VhcmNoLWlucHV0OmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1tZW51LWFjdGl2ZS10ZXh0KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE1KTtcbiAgICB9XG5cbiAgICAucnB0LXNlYXJjaC1jbGVhciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogMThweDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0LW11dGVkKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWdyb3Vwcy1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBwYWRkaW5nOiA2cHggMDtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB9XG5cbiAgICAucnB0LWdyb3VwLWhlYWRpbmcge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiA2cHggMTRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1ncm91cC1oZWFkaW5nOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0KTtcbiAgICB9XG5cbiAgICAucnB0LWdyb3VwLWl0ZW1zIHtcbiAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDJweDtcbiAgICB9XG5cbiAgICAucnB0LWl0ZW0tcm93IHtcbiAgICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1saW5rIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA5cHg7XG4gICAgICBwYWRkaW5nOiA3cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0KTtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIGZvbnQtc2l6ZTogMC44MzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWxpbms6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LW1lbnUtaG92ZXItYmcpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQpO1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1saW5rLnJwdC1hY3RpdmUtbGluayB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1hY3RpdmUtYmcpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LWFjdGl2ZS10ZXh0KTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuXG4gICAgLnJwdC1pdGVtLWljb24ge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWxpbmsucnB0LWFjdGl2ZS1saW5rIC5ycHQtaXRlbS1pY29uIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS1hY3RpdmUtdGV4dCk7XG4gICAgfVxuXG4gICAgLnJwdC1pdGVtLXRleHQge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgLnJwdC1kcmFmdC1jaGlwIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWYzYzc7XG4gICAgICBjb2xvcjogIzkyNDAwZTtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWVtcHR5IHtcbiAgICAgIHBhZGRpbmc6IDI0cHggMTZweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0LW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgIH1cblxuICAgIC8qIOKUgOKUgOKUgCBOQVZCQVIgU1RZTEVTIOKUgOKUgOKUgCAqL1xuICAgIC5ycHQtbWVudS1uYXZiYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAucnB0LW5hdmJhci1saXN0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG5cbiAgICAucnB0LW5hdmJhci1saW5rIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDEycHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dCk7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBmb250LXNpemU6IDAuODM1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtbmF2YmFyLWxpbms6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LW1lbnUtaG92ZXItYmcpO1xuICAgIH1cblxuICAgIC5ycHQtbmF2YmFyLWxpbmsucnB0LWFjdGl2ZS1saW5rIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1tZW51LWFjdGl2ZS1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtYWN0aXZlLXRleHQpO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG5cbiAgICAvKiDilIDilIDilIAgRFJPUERPV04gU1RZTEVTIOKUgOKUgOKUgCAqL1xuICAgIC5ycHQtbWVudS1kcm9wZG93bi13cmFwcGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG5cbiAgICAucnB0LWRyb3Bkb3duLXRyaWdnZXIge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA3cHg7XG4gICAgICBwYWRkaW5nOiA3cHggMTRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dCk7XG4gICAgICBmb250LXNpemU6IDAuODM1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24tdHJpZ2dlcjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1ob3Zlci1iZyk7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1iYWNrZHJvcCB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICBpbnNldDogMDtcbiAgICAgIHotaW5kZXg6IDk5O1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24tcGFuZWwge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpO1xuICAgICAgbGVmdDogMDtcbiAgICAgIG1pbi13aWR0aDogMjQwcHg7XG4gICAgICBtYXgtd2lkdGg6IDMyMHB4O1xuICAgICAgbWF4LWhlaWdodDogMzgwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LW1lbnUtYm9yZGVyKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDRweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB6LWluZGV4OiAxMDA7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1zZWFyY2gge1xuICAgICAgcGFkZGluZzogOHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1zZWFyY2gtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24taXRlbXMtbGlzdCB7XG4gICAgICBwYWRkaW5nOiA0cHggMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24taXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dCk7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBmb250LXNpemU6IDAuODM1cmVtO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24taXRlbTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1ob3Zlci1iZyk7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1pdGVtLW5hbWUge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1pdGVtLWNhdCB7XG4gICAgICBmb250LXNpemU6IDAuNjg3NXJlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0LW11dGVkKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1tZW51LWhvdmVyLWJnKTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1lbXB0eSB7XG4gICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgQndheXNSZXBvcnRNZW51Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdmFyaWFudCA9IGlucHV0PFJlcG9ydE1lbnVWYXJpYW50Pignc2lkZWJhcicpO1xuICByZWFkb25seSBiYXNlUGF0aCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCdSZXBvcnRzJyk7XG4gIHJlYWRvbmx5IHNob3dJY29ucyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBhbGxvd1NlYXJjaCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaW5jbHVkZURyYWZ0cyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBzZWFyY2hRdWVyeSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY29sbGFwc2VkR3JvdXBzID0gc2lnbmFsPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmF3TWVudSA9IGluamVjdFJlcG9ydE1lbnUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSByYXdHcm91cHMgPSBpbmplY3RSZXBvcnRNZW51R3JvdXBzKCk7XG5cbiAgcmVhZG9ubHkgdG90YWxJdGVtcyA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5yYXdNZW51KCkubGVuZ3RoKTtcblxuICByZWFkb25seSBmaWx0ZXJlZEZsYXRJdGVtcyA9IGNvbXB1dGVkPFJlcG9ydE1lbnVJdGVtW10+KCgpID0+IHtcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hRdWVyeSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5yYXdNZW51KCk7XG4gICAgaWYgKCFxKSByZXR1cm4gaXRlbXM7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fFxuICAgICAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHxcbiAgICAgICAgaXRlbS5zbHVnLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBmaWx0ZXJlZEdyb3VwcyA9IGNvbXB1dGVkPFJlcG9ydE1lbnVHcm91cFtdPigoKSA9PiB7XG4gICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoUXVlcnkoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBncm91cHMgPSB0aGlzLnJhd0dyb3VwcygpO1xuICAgIGlmICghcSkgcmV0dXJuIGdyb3VwcztcblxuICAgIHJldHVybiBncm91cHNcbiAgICAgIC5tYXAoKGcpID0+ICh7XG4gICAgICAgIC4uLmcsXG4gICAgICAgIGl0ZW1zOiBnLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8XG4gICAgICAgICAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHxcbiAgICAgICAgICAgIGl0ZW0uc2x1Zy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKGcpID0+IGcuaXRlbXMubGVuZ3RoID4gMCk7XG4gIH0pO1xuXG4gIGlzR3JvdXBDb2xsYXBzZWQoY2F0ZWdvcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbGxhcHNlZEdyb3VwcygpLmhhcyhjYXRlZ29yeSk7XG4gIH1cblxuICB0b2dnbGVHcm91cChjYXRlZ29yeTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLmNvbGxhcHNlZEdyb3VwcygpKTtcbiAgICBpZiAoc2V0LmhhcyhjYXRlZ29yeSkpIHtcbiAgICAgIHNldC5kZWxldGUoY2F0ZWdvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQuYWRkKGNhdGVnb3J5KTtcbiAgICB9XG4gICAgdGhpcy5jb2xsYXBzZWRHcm91cHMuc2V0KHNldCk7XG4gIH1cbn1cbiJdfQ==