angular-debug-recorder 1.0.0 → 1.0.1
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/esm2022/lib/action-list/action-list.component.mjs +161 -161
- package/esm2022/lib/debug-panel/debug-panel.component.mjs +385 -385
- package/esm2022/lib/services/rrweb-recorder.service.mjs +32 -21
- package/esm2022/lib/session-replay/session-replay.component.mjs +85 -85
- package/esm2022/lib/settings-dialog/settings-dialog.component.mjs +75 -75
- package/esm2022/lib/test-preview/test-preview.component.mjs +59 -59
- package/fesm2022/angular-debug-recorder.mjs +791 -780
- package/fesm2022/angular-debug-recorder.mjs.map +1 -1
- package/lib/services/rrweb-recorder.service.d.ts +5 -4
- package/package.json +1 -1
|
@@ -123,394 +123,394 @@ export class DebugPanelComponent {
|
|
|
123
123
|
e.preventDefault();
|
|
124
124
|
}
|
|
125
125
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DebugPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
126
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DebugPanelComponent, isStandalone: true, selector: "app-debug-panel", ngImport: i0, template: `
|
|
127
|
-
<!-- Toggle FAB -->
|
|
128
|
-
<button
|
|
129
|
-
data-debug-panel
|
|
130
|
-
class="debug-fab"
|
|
131
|
-
[class.recording]="recorder.isRecording()"
|
|
132
|
-
[class.pulse]="recorder.isRecording() && !recorder.isPaused()"
|
|
133
|
-
(click)="togglePanel()"
|
|
134
|
-
[title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
|
|
135
|
-
>
|
|
136
|
-
<span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
|
|
137
|
-
@if (recorder.isRecording() && recorder.actionCount() > 0) {
|
|
138
|
-
<span class="fab-badge">{{ recorder.actionCount() }}</span>
|
|
139
|
-
}
|
|
140
|
-
</button>
|
|
141
|
-
|
|
142
|
-
<!-- Main Panel -->
|
|
143
|
-
@if (panelOpen()) {
|
|
144
|
-
<div
|
|
145
|
-
data-debug-panel
|
|
146
|
-
class="debug-panel"
|
|
147
|
-
[class]="'pos-' + position()"
|
|
148
|
-
[style.width.px]="panelWidth()"
|
|
149
|
-
>
|
|
150
|
-
<!-- Header -->
|
|
151
|
-
<div class="panel-header" (mousedown)="startDrag($event)">
|
|
152
|
-
<div class="header-left">
|
|
153
|
-
<span class="panel-icon">🐛</span>
|
|
154
|
-
<span class="panel-title">Debug Recorder</span>
|
|
155
|
-
@if (recorder.isRecording()) {
|
|
156
|
-
<span class="rec-indicator" [class.paused]="recorder.isPaused()">
|
|
157
|
-
{{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
|
|
158
|
-
</span>
|
|
159
|
-
}
|
|
160
|
-
</div>
|
|
161
|
-
<div class="header-actions">
|
|
162
|
-
<button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
|
|
163
|
-
<button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
|
|
164
|
-
<button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
|
|
168
|
-
<!-- Session Name Input (only when not recording) -->
|
|
169
|
-
@if (!recorder.isRecording()) {
|
|
170
|
-
<div class="session-setup">
|
|
171
|
-
<input
|
|
172
|
-
data-debug-panel
|
|
173
|
-
class="session-input"
|
|
174
|
-
type="text"
|
|
175
|
-
[(ngModel)]="sessionName"
|
|
176
|
-
placeholder="Session-Name (optional)"
|
|
177
|
-
/>
|
|
178
|
-
<textarea
|
|
179
|
-
data-debug-panel
|
|
180
|
-
class="session-desc"
|
|
181
|
-
[(ngModel)]="sessionDesc"
|
|
182
|
-
placeholder="Fehlerbeschreibung..."
|
|
183
|
-
rows="2"
|
|
184
|
-
></textarea>
|
|
185
|
-
</div>
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
<!-- Recording Controls -->
|
|
189
|
-
<div class="recording-controls" data-debug-panel>
|
|
190
|
-
@if (!recorder.isRecording()) {
|
|
191
|
-
<button class="ctrl-btn start" (click)="startRecording()">
|
|
192
|
-
▶ Aufnahme starten
|
|
193
|
-
</button>
|
|
194
|
-
} @else {
|
|
195
|
-
<button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
|
|
196
|
-
{{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
|
|
197
|
-
</button>
|
|
198
|
-
<button class="ctrl-btn stop" (click)="stopRecording()">
|
|
199
|
-
⏹ Stoppen
|
|
200
|
-
</button>
|
|
201
|
-
<button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
|
|
202
|
-
🗑
|
|
203
|
-
</button>
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
@if (hasActions()) {
|
|
207
|
-
<button
|
|
208
|
-
class="ctrl-btn generate"
|
|
209
|
-
[disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
|
|
210
|
-
[title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
|
|
211
|
-
(click)="generateTest()"
|
|
212
|
-
>
|
|
213
|
-
@if (aiService.isGenerating()) {
|
|
214
|
-
<span class="spinner">⟳</span> Generiere...
|
|
215
|
-
} @else {
|
|
216
|
-
🤖 → Cypress Test
|
|
217
|
-
}
|
|
218
|
-
</button>
|
|
219
|
-
}
|
|
220
|
-
</div>
|
|
221
|
-
|
|
222
|
-
<!-- Error Banner -->
|
|
223
|
-
@if (aiService.error()) {
|
|
224
|
-
<div class="error-banner" data-debug-panel>
|
|
225
|
-
⚠️ {{ aiService.error() }}
|
|
226
|
-
</div>
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
<!-- Tabs -->
|
|
230
|
-
<div class="tab-bar" data-debug-panel>
|
|
231
|
-
<button
|
|
232
|
-
class="tab-btn"
|
|
233
|
-
[class.active]="activeTab() === 'actions'"
|
|
234
|
-
(click)="activeTab.set('actions')"
|
|
235
|
-
>
|
|
236
|
-
Aktionen
|
|
237
|
-
@if (recorder.actionCount() > 0) {
|
|
238
|
-
<span class="tab-badge">{{ recorder.actionCount() }}</span>
|
|
239
|
-
}
|
|
240
|
-
</button>
|
|
241
|
-
<button
|
|
242
|
-
class="tab-btn"
|
|
243
|
-
[class.active]="activeTab() === 'replay'"
|
|
244
|
-
(click)="activeTab.set('replay')"
|
|
245
|
-
title="rrweb Session Replay"
|
|
246
|
-
>
|
|
247
|
-
📽️ Replay
|
|
248
|
-
@if (rrweb.
|
|
249
|
-
<span class="tab-badge">{{ rrweb.
|
|
250
|
-
}
|
|
251
|
-
</button>
|
|
252
|
-
<button
|
|
253
|
-
class="tab-btn"
|
|
254
|
-
[class.active]="activeTab() === 'test'"
|
|
255
|
-
[disabled]="!aiService.lastTest()"
|
|
256
|
-
(click)="activeTab.set('test')"
|
|
257
|
-
>
|
|
258
|
-
🤖 Test
|
|
259
|
-
@if (aiService.lastTest()) {
|
|
260
|
-
<span class="tab-badge new">NEU</span>
|
|
261
|
-
}
|
|
262
|
-
</button>
|
|
263
|
-
<button
|
|
264
|
-
class="tab-btn"
|
|
265
|
-
[class.active]="activeTab() === 'sessions'"
|
|
266
|
-
[disabled]="recorder.sessions().length === 0"
|
|
267
|
-
(click)="activeTab.set('sessions')"
|
|
268
|
-
>
|
|
269
|
-
Sessions ({{ recorder.sessions().length }})
|
|
270
|
-
</button>
|
|
271
|
-
</div>
|
|
272
|
-
|
|
273
|
-
<!-- Tab Content -->
|
|
274
|
-
<div class="tab-content">
|
|
275
|
-
@if (activeTab() === 'actions') {
|
|
276
|
-
<app-action-list
|
|
277
|
-
[session]="recorder.currentSession()"
|
|
278
|
-
(removeAction)="recorder.removeAction($event)"
|
|
279
|
-
(addNote)="recorder.addNote($event.id, $event.note)"
|
|
280
|
-
/>
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
@if (activeTab() === 'replay') {
|
|
284
|
-
<app-session-replay />
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
@if (activeTab() === 'test') {
|
|
288
|
-
<app-test-preview [test]="aiService.lastTest()" />
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
@if (activeTab() === 'sessions') {
|
|
292
|
-
<div class="sessions-list">
|
|
293
|
-
@for (session of recorder.sessions(); track session.id) {
|
|
294
|
-
<div class="session-card">
|
|
295
|
-
<div class="session-card-header">
|
|
296
|
-
<span class="session-name">{{ session.name }}</span>
|
|
297
|
-
<span class="session-meta">{{ session.actions.length }} Aktionen</span>
|
|
298
|
-
</div>
|
|
299
|
-
<div class="session-card-actions">
|
|
300
|
-
<button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
|
|
301
|
-
<button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
|
|
302
|
-
</div>
|
|
303
|
-
</div>
|
|
304
|
-
}
|
|
305
|
-
</div>
|
|
306
|
-
}
|
|
307
|
-
</div>
|
|
308
|
-
|
|
309
|
-
<!-- Resize Handle -->
|
|
310
|
-
<div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
|
|
311
|
-
</div>
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
<!-- Settings Dialog -->
|
|
315
|
-
@if (showSettings()) {
|
|
316
|
-
<app-settings-dialog (close)="showSettings.set(false)" />
|
|
317
|
-
}
|
|
126
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DebugPanelComponent, isStandalone: true, selector: "app-debug-panel", ngImport: i0, template: `
|
|
127
|
+
<!-- Toggle FAB -->
|
|
128
|
+
<button
|
|
129
|
+
data-debug-panel
|
|
130
|
+
class="debug-fab"
|
|
131
|
+
[class.recording]="recorder.isRecording()"
|
|
132
|
+
[class.pulse]="recorder.isRecording() && !recorder.isPaused()"
|
|
133
|
+
(click)="togglePanel()"
|
|
134
|
+
[title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
|
|
135
|
+
>
|
|
136
|
+
<span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
|
|
137
|
+
@if (recorder.isRecording() && recorder.actionCount() > 0) {
|
|
138
|
+
<span class="fab-badge">{{ recorder.actionCount() }}</span>
|
|
139
|
+
}
|
|
140
|
+
</button>
|
|
141
|
+
|
|
142
|
+
<!-- Main Panel -->
|
|
143
|
+
@if (panelOpen()) {
|
|
144
|
+
<div
|
|
145
|
+
data-debug-panel
|
|
146
|
+
class="debug-panel"
|
|
147
|
+
[class]="'pos-' + position()"
|
|
148
|
+
[style.width.px]="panelWidth()"
|
|
149
|
+
>
|
|
150
|
+
<!-- Header -->
|
|
151
|
+
<div class="panel-header" (mousedown)="startDrag($event)">
|
|
152
|
+
<div class="header-left">
|
|
153
|
+
<span class="panel-icon">🐛</span>
|
|
154
|
+
<span class="panel-title">Debug Recorder</span>
|
|
155
|
+
@if (recorder.isRecording()) {
|
|
156
|
+
<span class="rec-indicator" [class.paused]="recorder.isPaused()">
|
|
157
|
+
{{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
|
|
158
|
+
</span>
|
|
159
|
+
}
|
|
160
|
+
</div>
|
|
161
|
+
<div class="header-actions">
|
|
162
|
+
<button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
|
|
163
|
+
<button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
|
|
164
|
+
<button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<!-- Session Name Input (only when not recording) -->
|
|
169
|
+
@if (!recorder.isRecording()) {
|
|
170
|
+
<div class="session-setup">
|
|
171
|
+
<input
|
|
172
|
+
data-debug-panel
|
|
173
|
+
class="session-input"
|
|
174
|
+
type="text"
|
|
175
|
+
[(ngModel)]="sessionName"
|
|
176
|
+
placeholder="Session-Name (optional)"
|
|
177
|
+
/>
|
|
178
|
+
<textarea
|
|
179
|
+
data-debug-panel
|
|
180
|
+
class="session-desc"
|
|
181
|
+
[(ngModel)]="sessionDesc"
|
|
182
|
+
placeholder="Fehlerbeschreibung..."
|
|
183
|
+
rows="2"
|
|
184
|
+
></textarea>
|
|
185
|
+
</div>
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
<!-- Recording Controls -->
|
|
189
|
+
<div class="recording-controls" data-debug-panel>
|
|
190
|
+
@if (!recorder.isRecording()) {
|
|
191
|
+
<button class="ctrl-btn start" (click)="startRecording()">
|
|
192
|
+
▶ Aufnahme starten
|
|
193
|
+
</button>
|
|
194
|
+
} @else {
|
|
195
|
+
<button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
|
|
196
|
+
{{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
|
|
197
|
+
</button>
|
|
198
|
+
<button class="ctrl-btn stop" (click)="stopRecording()">
|
|
199
|
+
⏹ Stoppen
|
|
200
|
+
</button>
|
|
201
|
+
<button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
|
|
202
|
+
🗑
|
|
203
|
+
</button>
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@if (hasActions()) {
|
|
207
|
+
<button
|
|
208
|
+
class="ctrl-btn generate"
|
|
209
|
+
[disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
|
|
210
|
+
[title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
|
|
211
|
+
(click)="generateTest()"
|
|
212
|
+
>
|
|
213
|
+
@if (aiService.isGenerating()) {
|
|
214
|
+
<span class="spinner">⟳</span> Generiere...
|
|
215
|
+
} @else {
|
|
216
|
+
🤖 → Cypress Test
|
|
217
|
+
}
|
|
218
|
+
</button>
|
|
219
|
+
}
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<!-- Error Banner -->
|
|
223
|
+
@if (aiService.error()) {
|
|
224
|
+
<div class="error-banner" data-debug-panel>
|
|
225
|
+
⚠️ {{ aiService.error() }}
|
|
226
|
+
</div>
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
<!-- Tabs -->
|
|
230
|
+
<div class="tab-bar" data-debug-panel>
|
|
231
|
+
<button
|
|
232
|
+
class="tab-btn"
|
|
233
|
+
[class.active]="activeTab() === 'actions'"
|
|
234
|
+
(click)="activeTab.set('actions')"
|
|
235
|
+
>
|
|
236
|
+
Aktionen
|
|
237
|
+
@if (recorder.actionCount() > 0) {
|
|
238
|
+
<span class="tab-badge">{{ recorder.actionCount() }}</span>
|
|
239
|
+
}
|
|
240
|
+
</button>
|
|
241
|
+
<button
|
|
242
|
+
class="tab-btn"
|
|
243
|
+
[class.active]="activeTab() === 'replay'"
|
|
244
|
+
(click)="activeTab.set('replay')"
|
|
245
|
+
title="rrweb Session Replay"
|
|
246
|
+
>
|
|
247
|
+
📽️ Replay
|
|
248
|
+
@if (rrweb.eventCount() > 0) {
|
|
249
|
+
<span class="tab-badge">{{ rrweb.eventCount() }}</span>
|
|
250
|
+
}
|
|
251
|
+
</button>
|
|
252
|
+
<button
|
|
253
|
+
class="tab-btn"
|
|
254
|
+
[class.active]="activeTab() === 'test'"
|
|
255
|
+
[disabled]="!aiService.lastTest()"
|
|
256
|
+
(click)="activeTab.set('test')"
|
|
257
|
+
>
|
|
258
|
+
🤖 Test
|
|
259
|
+
@if (aiService.lastTest()) {
|
|
260
|
+
<span class="tab-badge new">NEU</span>
|
|
261
|
+
}
|
|
262
|
+
</button>
|
|
263
|
+
<button
|
|
264
|
+
class="tab-btn"
|
|
265
|
+
[class.active]="activeTab() === 'sessions'"
|
|
266
|
+
[disabled]="recorder.sessions().length === 0"
|
|
267
|
+
(click)="activeTab.set('sessions')"
|
|
268
|
+
>
|
|
269
|
+
Sessions ({{ recorder.sessions().length }})
|
|
270
|
+
</button>
|
|
271
|
+
</div>
|
|
272
|
+
|
|
273
|
+
<!-- Tab Content -->
|
|
274
|
+
<div class="tab-content">
|
|
275
|
+
@if (activeTab() === 'actions') {
|
|
276
|
+
<app-action-list
|
|
277
|
+
[session]="recorder.currentSession()"
|
|
278
|
+
(removeAction)="recorder.removeAction($event)"
|
|
279
|
+
(addNote)="recorder.addNote($event.id, $event.note)"
|
|
280
|
+
/>
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
@if (activeTab() === 'replay') {
|
|
284
|
+
<app-session-replay />
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
@if (activeTab() === 'test') {
|
|
288
|
+
<app-test-preview [test]="aiService.lastTest()" />
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
@if (activeTab() === 'sessions') {
|
|
292
|
+
<div class="sessions-list">
|
|
293
|
+
@for (session of recorder.sessions(); track session.id) {
|
|
294
|
+
<div class="session-card">
|
|
295
|
+
<div class="session-card-header">
|
|
296
|
+
<span class="session-name">{{ session.name }}</span>
|
|
297
|
+
<span class="session-meta">{{ session.actions.length }} Aktionen</span>
|
|
298
|
+
</div>
|
|
299
|
+
<div class="session-card-actions">
|
|
300
|
+
<button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
|
|
301
|
+
<button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
|
|
302
|
+
</div>
|
|
303
|
+
</div>
|
|
304
|
+
}
|
|
305
|
+
</div>
|
|
306
|
+
}
|
|
307
|
+
</div>
|
|
308
|
+
|
|
309
|
+
<!-- Resize Handle -->
|
|
310
|
+
<div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
|
|
311
|
+
</div>
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
<!-- Settings Dialog -->
|
|
315
|
+
@if (showSettings()) {
|
|
316
|
+
<app-settings-dialog (close)="showSettings.set(false)" />
|
|
317
|
+
}
|
|
318
318
|
`, isInline: true, styles: [".debug-fab{bottom:24px;right:24px;z-index:99999;width:52px;height:52px;border-radius:50%;border:none;background:#1e293b;color:#fff;font-size:22px;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 20px #0006;transition:transform .2s,background .2s;position:fixed}.debug-fab:hover{transform:scale(1.1);background:#334155}.debug-fab.recording{background:#dc2626}.debug-fab.pulse{animation:fabPulse 1.5s ease-in-out infinite}@keyframes fabPulse{0%,to{box-shadow:0 4px 20px #dc262666}50%{box-shadow:0 4px 30px #dc2626e6,0 0 0 8px #dc262626}}.fab-badge{position:absolute;top:-4px;right:-4px;background:#f59e0b;color:#000;font-size:10px;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px}.debug-panel{position:fixed;z-index:99998;width:420px;max-height:80vh;background:#0f172a;color:#e2e8f0;border-radius:12px;border:1px solid #1e3a5f;box-shadow:0 25px 60px #0009;display:flex;flex-direction:column;font-family:Segoe UI,system-ui,sans-serif;font-size:13px;overflow:hidden}.pos-bottom-right{bottom:88px;right:24px}.pos-bottom-left{bottom:88px;left:24px}.pos-top-right{top:24px;right:24px}.pos-top-left{top:24px;left:24px}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#1e293b;border-bottom:1px solid #334155;cursor:move;-webkit-user-select:none;user-select:none;flex-shrink:0}.header-left{display:flex;align-items:center;gap:8px}.panel-icon{font-size:16px}.panel-title{font-weight:600;font-size:14px;color:#f1f5f9}.rec-indicator{font-size:10px;font-weight:700;color:#ef4444;background:#ef444426;padding:2px 7px;border-radius:4px;animation:blink 1s step-end infinite}.rec-indicator.paused{color:#f59e0b;background:#f59e0b26;animation:none}@keyframes blink{50%{opacity:.4}}.header-actions{display:flex;gap:4px}.icon-btn{background:none;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;font-size:14px;line-height:1;transition:color .15s,background .15s}.icon-btn:hover{color:#f1f5f9;background:#334155}.session-setup{padding:10px 14px;border-bottom:1px solid #1e293b;display:flex;flex-direction:column;gap:6px;flex-shrink:0}.session-input,.session-desc{background:#1e293b;border:1px solid #334155;color:#e2e8f0;border-radius:6px;padding:6px 10px;font-size:12px;width:100%;box-sizing:border-box;resize:vertical}.session-input:focus,.session-desc:focus{outline:none;border-color:#3b82f6}.recording-controls{display:flex;gap:6px;padding:10px 14px;border-bottom:1px solid #1e293b;flex-wrap:wrap;flex-shrink:0}.ctrl-btn{border:none;border-radius:6px;padding:6px 14px;font-size:12px;font-weight:600;cursor:pointer;transition:filter .15s,transform .1s;display:flex;align-items:center;gap:5px}.ctrl-btn:hover:not(:disabled){filter:brightness(1.15);transform:translateY(-1px)}.ctrl-btn:active:not(:disabled){transform:translateY(0)}.ctrl-btn:disabled{opacity:.5;cursor:not-allowed}.ctrl-btn.start{background:#16a34a;color:#fff}.ctrl-btn.stop{background:#dc2626;color:#fff}.ctrl-btn.pause{background:#d97706;color:#fff}.ctrl-btn.generate{background:#7c3aed;color:#fff;flex:1;justify-content:center}.ctrl-btn.clear{background:#374151;color:#9ca3af;padding:6px 10px}.spinner{display:inline-block;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error-banner{background:#dc262626;border-left:3px solid #dc2626;color:#fca5a5;padding:8px 14px;font-size:12px;flex-shrink:0}.tab-bar{display:flex;border-bottom:1px solid #1e293b;flex-shrink:0}.tab-btn{flex:1;background:none;border:none;color:#64748b;padding:8px 4px;font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;border-bottom:2px solid transparent;transition:color .15s}.tab-btn:hover:not(:disabled){color:#cbd5e1}.tab-btn.active{color:#60a5fa;border-bottom-color:#3b82f6}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.tab-badge{background:#334155;color:#94a3b8;font-size:10px;padding:1px 5px;border-radius:3px}.tab-badge.new{background:#7c3aed;color:#e9d5ff}.tab-content{overflow-y:auto;flex:1;min-height:0}.tab-content::-webkit-scrollbar{width:5px}.tab-content::-webkit-scrollbar-track{background:transparent}.tab-content::-webkit-scrollbar-thumb{background:#334155;border-radius:3px}.sessions-list{padding:10px 14px;display:flex;flex-direction:column;gap:8px}.session-card{background:#1e293b;border:1px solid #334155;border-radius:8px;padding:10px}.session-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.session-name{font-weight:600;color:#f1f5f9;font-size:13px}.session-meta{font-size:11px;color:#64748b}.session-card-actions{display:flex;gap:6px}.sm-btn{background:#334155;border:none;color:#cbd5e1;padding:4px 10px;border-radius:5px;font-size:11px;cursor:pointer;transition:background .15s}.sm-btn:hover{background:#475569}.sm-btn.danger{color:#fca5a5}.sm-btn.danger:hover{background:#dc262633}.resize-handle{text-align:center;color:#334155;cursor:ns-resize;font-size:16px;padding:2px;flex-shrink:0;background:#0f172a;-webkit-user-select:none;user-select:none}.resize-handle:hover{color:#64748b}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.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: ActionListComponent, selector: "app-action-list", inputs: ["session"], outputs: ["removeAction", "addNote"] }, { kind: "component", type: TestPreviewComponent, selector: "app-test-preview", inputs: ["test"] }, { kind: "component", type: SettingsDialogComponent, selector: "app-settings-dialog", outputs: ["close"] }, { kind: "component", type: SessionReplayComponent, selector: "app-session-replay" }] }); }
|
|
319
319
|
}
|
|
320
320
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DebugPanelComponent, decorators: [{
|
|
321
321
|
type: Component,
|
|
322
|
-
args: [{ selector: 'app-debug-panel', standalone: true, imports: [CommonModule, FormsModule, ActionListComponent, TestPreviewComponent, SettingsDialogComponent, SessionReplayComponent], template: `
|
|
323
|
-
<!-- Toggle FAB -->
|
|
324
|
-
<button
|
|
325
|
-
data-debug-panel
|
|
326
|
-
class="debug-fab"
|
|
327
|
-
[class.recording]="recorder.isRecording()"
|
|
328
|
-
[class.pulse]="recorder.isRecording() && !recorder.isPaused()"
|
|
329
|
-
(click)="togglePanel()"
|
|
330
|
-
[title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
|
|
331
|
-
>
|
|
332
|
-
<span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
|
|
333
|
-
@if (recorder.isRecording() && recorder.actionCount() > 0) {
|
|
334
|
-
<span class="fab-badge">{{ recorder.actionCount() }}</span>
|
|
335
|
-
}
|
|
336
|
-
</button>
|
|
337
|
-
|
|
338
|
-
<!-- Main Panel -->
|
|
339
|
-
@if (panelOpen()) {
|
|
340
|
-
<div
|
|
341
|
-
data-debug-panel
|
|
342
|
-
class="debug-panel"
|
|
343
|
-
[class]="'pos-' + position()"
|
|
344
|
-
[style.width.px]="panelWidth()"
|
|
345
|
-
>
|
|
346
|
-
<!-- Header -->
|
|
347
|
-
<div class="panel-header" (mousedown)="startDrag($event)">
|
|
348
|
-
<div class="header-left">
|
|
349
|
-
<span class="panel-icon">🐛</span>
|
|
350
|
-
<span class="panel-title">Debug Recorder</span>
|
|
351
|
-
@if (recorder.isRecording()) {
|
|
352
|
-
<span class="rec-indicator" [class.paused]="recorder.isPaused()">
|
|
353
|
-
{{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
|
|
354
|
-
</span>
|
|
355
|
-
}
|
|
356
|
-
</div>
|
|
357
|
-
<div class="header-actions">
|
|
358
|
-
<button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
|
|
359
|
-
<button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
|
|
360
|
-
<button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
|
|
361
|
-
</div>
|
|
362
|
-
</div>
|
|
363
|
-
|
|
364
|
-
<!-- Session Name Input (only when not recording) -->
|
|
365
|
-
@if (!recorder.isRecording()) {
|
|
366
|
-
<div class="session-setup">
|
|
367
|
-
<input
|
|
368
|
-
data-debug-panel
|
|
369
|
-
class="session-input"
|
|
370
|
-
type="text"
|
|
371
|
-
[(ngModel)]="sessionName"
|
|
372
|
-
placeholder="Session-Name (optional)"
|
|
373
|
-
/>
|
|
374
|
-
<textarea
|
|
375
|
-
data-debug-panel
|
|
376
|
-
class="session-desc"
|
|
377
|
-
[(ngModel)]="sessionDesc"
|
|
378
|
-
placeholder="Fehlerbeschreibung..."
|
|
379
|
-
rows="2"
|
|
380
|
-
></textarea>
|
|
381
|
-
</div>
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
<!-- Recording Controls -->
|
|
385
|
-
<div class="recording-controls" data-debug-panel>
|
|
386
|
-
@if (!recorder.isRecording()) {
|
|
387
|
-
<button class="ctrl-btn start" (click)="startRecording()">
|
|
388
|
-
▶ Aufnahme starten
|
|
389
|
-
</button>
|
|
390
|
-
} @else {
|
|
391
|
-
<button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
|
|
392
|
-
{{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
|
|
393
|
-
</button>
|
|
394
|
-
<button class="ctrl-btn stop" (click)="stopRecording()">
|
|
395
|
-
⏹ Stoppen
|
|
396
|
-
</button>
|
|
397
|
-
<button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
|
|
398
|
-
🗑
|
|
399
|
-
</button>
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
@if (hasActions()) {
|
|
403
|
-
<button
|
|
404
|
-
class="ctrl-btn generate"
|
|
405
|
-
[disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
|
|
406
|
-
[title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
|
|
407
|
-
(click)="generateTest()"
|
|
408
|
-
>
|
|
409
|
-
@if (aiService.isGenerating()) {
|
|
410
|
-
<span class="spinner">⟳</span> Generiere...
|
|
411
|
-
} @else {
|
|
412
|
-
🤖 → Cypress Test
|
|
413
|
-
}
|
|
414
|
-
</button>
|
|
415
|
-
}
|
|
416
|
-
</div>
|
|
417
|
-
|
|
418
|
-
<!-- Error Banner -->
|
|
419
|
-
@if (aiService.error()) {
|
|
420
|
-
<div class="error-banner" data-debug-panel>
|
|
421
|
-
⚠️ {{ aiService.error() }}
|
|
422
|
-
</div>
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
<!-- Tabs -->
|
|
426
|
-
<div class="tab-bar" data-debug-panel>
|
|
427
|
-
<button
|
|
428
|
-
class="tab-btn"
|
|
429
|
-
[class.active]="activeTab() === 'actions'"
|
|
430
|
-
(click)="activeTab.set('actions')"
|
|
431
|
-
>
|
|
432
|
-
Aktionen
|
|
433
|
-
@if (recorder.actionCount() > 0) {
|
|
434
|
-
<span class="tab-badge">{{ recorder.actionCount() }}</span>
|
|
435
|
-
}
|
|
436
|
-
</button>
|
|
437
|
-
<button
|
|
438
|
-
class="tab-btn"
|
|
439
|
-
[class.active]="activeTab() === 'replay'"
|
|
440
|
-
(click)="activeTab.set('replay')"
|
|
441
|
-
title="rrweb Session Replay"
|
|
442
|
-
>
|
|
443
|
-
📽️ Replay
|
|
444
|
-
@if (rrweb.
|
|
445
|
-
<span class="tab-badge">{{ rrweb.
|
|
446
|
-
}
|
|
447
|
-
</button>
|
|
448
|
-
<button
|
|
449
|
-
class="tab-btn"
|
|
450
|
-
[class.active]="activeTab() === 'test'"
|
|
451
|
-
[disabled]="!aiService.lastTest()"
|
|
452
|
-
(click)="activeTab.set('test')"
|
|
453
|
-
>
|
|
454
|
-
🤖 Test
|
|
455
|
-
@if (aiService.lastTest()) {
|
|
456
|
-
<span class="tab-badge new">NEU</span>
|
|
457
|
-
}
|
|
458
|
-
</button>
|
|
459
|
-
<button
|
|
460
|
-
class="tab-btn"
|
|
461
|
-
[class.active]="activeTab() === 'sessions'"
|
|
462
|
-
[disabled]="recorder.sessions().length === 0"
|
|
463
|
-
(click)="activeTab.set('sessions')"
|
|
464
|
-
>
|
|
465
|
-
Sessions ({{ recorder.sessions().length }})
|
|
466
|
-
</button>
|
|
467
|
-
</div>
|
|
468
|
-
|
|
469
|
-
<!-- Tab Content -->
|
|
470
|
-
<div class="tab-content">
|
|
471
|
-
@if (activeTab() === 'actions') {
|
|
472
|
-
<app-action-list
|
|
473
|
-
[session]="recorder.currentSession()"
|
|
474
|
-
(removeAction)="recorder.removeAction($event)"
|
|
475
|
-
(addNote)="recorder.addNote($event.id, $event.note)"
|
|
476
|
-
/>
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
@if (activeTab() === 'replay') {
|
|
480
|
-
<app-session-replay />
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
@if (activeTab() === 'test') {
|
|
484
|
-
<app-test-preview [test]="aiService.lastTest()" />
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
@if (activeTab() === 'sessions') {
|
|
488
|
-
<div class="sessions-list">
|
|
489
|
-
@for (session of recorder.sessions(); track session.id) {
|
|
490
|
-
<div class="session-card">
|
|
491
|
-
<div class="session-card-header">
|
|
492
|
-
<span class="session-name">{{ session.name }}</span>
|
|
493
|
-
<span class="session-meta">{{ session.actions.length }} Aktionen</span>
|
|
494
|
-
</div>
|
|
495
|
-
<div class="session-card-actions">
|
|
496
|
-
<button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
|
|
497
|
-
<button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
|
|
498
|
-
</div>
|
|
499
|
-
</div>
|
|
500
|
-
}
|
|
501
|
-
</div>
|
|
502
|
-
}
|
|
503
|
-
</div>
|
|
504
|
-
|
|
505
|
-
<!-- Resize Handle -->
|
|
506
|
-
<div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
|
|
507
|
-
</div>
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
<!-- Settings Dialog -->
|
|
511
|
-
@if (showSettings()) {
|
|
512
|
-
<app-settings-dialog (close)="showSettings.set(false)" />
|
|
513
|
-
}
|
|
322
|
+
args: [{ selector: 'app-debug-panel', standalone: true, imports: [CommonModule, FormsModule, ActionListComponent, TestPreviewComponent, SettingsDialogComponent, SessionReplayComponent], template: `
|
|
323
|
+
<!-- Toggle FAB -->
|
|
324
|
+
<button
|
|
325
|
+
data-debug-panel
|
|
326
|
+
class="debug-fab"
|
|
327
|
+
[class.recording]="recorder.isRecording()"
|
|
328
|
+
[class.pulse]="recorder.isRecording() && !recorder.isPaused()"
|
|
329
|
+
(click)="togglePanel()"
|
|
330
|
+
[title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
|
|
331
|
+
>
|
|
332
|
+
<span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
|
|
333
|
+
@if (recorder.isRecording() && recorder.actionCount() > 0) {
|
|
334
|
+
<span class="fab-badge">{{ recorder.actionCount() }}</span>
|
|
335
|
+
}
|
|
336
|
+
</button>
|
|
337
|
+
|
|
338
|
+
<!-- Main Panel -->
|
|
339
|
+
@if (panelOpen()) {
|
|
340
|
+
<div
|
|
341
|
+
data-debug-panel
|
|
342
|
+
class="debug-panel"
|
|
343
|
+
[class]="'pos-' + position()"
|
|
344
|
+
[style.width.px]="panelWidth()"
|
|
345
|
+
>
|
|
346
|
+
<!-- Header -->
|
|
347
|
+
<div class="panel-header" (mousedown)="startDrag($event)">
|
|
348
|
+
<div class="header-left">
|
|
349
|
+
<span class="panel-icon">🐛</span>
|
|
350
|
+
<span class="panel-title">Debug Recorder</span>
|
|
351
|
+
@if (recorder.isRecording()) {
|
|
352
|
+
<span class="rec-indicator" [class.paused]="recorder.isPaused()">
|
|
353
|
+
{{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
|
|
354
|
+
</span>
|
|
355
|
+
}
|
|
356
|
+
</div>
|
|
357
|
+
<div class="header-actions">
|
|
358
|
+
<button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
|
|
359
|
+
<button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
|
|
360
|
+
<button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
|
|
364
|
+
<!-- Session Name Input (only when not recording) -->
|
|
365
|
+
@if (!recorder.isRecording()) {
|
|
366
|
+
<div class="session-setup">
|
|
367
|
+
<input
|
|
368
|
+
data-debug-panel
|
|
369
|
+
class="session-input"
|
|
370
|
+
type="text"
|
|
371
|
+
[(ngModel)]="sessionName"
|
|
372
|
+
placeholder="Session-Name (optional)"
|
|
373
|
+
/>
|
|
374
|
+
<textarea
|
|
375
|
+
data-debug-panel
|
|
376
|
+
class="session-desc"
|
|
377
|
+
[(ngModel)]="sessionDesc"
|
|
378
|
+
placeholder="Fehlerbeschreibung..."
|
|
379
|
+
rows="2"
|
|
380
|
+
></textarea>
|
|
381
|
+
</div>
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
<!-- Recording Controls -->
|
|
385
|
+
<div class="recording-controls" data-debug-panel>
|
|
386
|
+
@if (!recorder.isRecording()) {
|
|
387
|
+
<button class="ctrl-btn start" (click)="startRecording()">
|
|
388
|
+
▶ Aufnahme starten
|
|
389
|
+
</button>
|
|
390
|
+
} @else {
|
|
391
|
+
<button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
|
|
392
|
+
{{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
|
|
393
|
+
</button>
|
|
394
|
+
<button class="ctrl-btn stop" (click)="stopRecording()">
|
|
395
|
+
⏹ Stoppen
|
|
396
|
+
</button>
|
|
397
|
+
<button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
|
|
398
|
+
🗑
|
|
399
|
+
</button>
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
@if (hasActions()) {
|
|
403
|
+
<button
|
|
404
|
+
class="ctrl-btn generate"
|
|
405
|
+
[disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
|
|
406
|
+
[title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
|
|
407
|
+
(click)="generateTest()"
|
|
408
|
+
>
|
|
409
|
+
@if (aiService.isGenerating()) {
|
|
410
|
+
<span class="spinner">⟳</span> Generiere...
|
|
411
|
+
} @else {
|
|
412
|
+
🤖 → Cypress Test
|
|
413
|
+
}
|
|
414
|
+
</button>
|
|
415
|
+
}
|
|
416
|
+
</div>
|
|
417
|
+
|
|
418
|
+
<!-- Error Banner -->
|
|
419
|
+
@if (aiService.error()) {
|
|
420
|
+
<div class="error-banner" data-debug-panel>
|
|
421
|
+
⚠️ {{ aiService.error() }}
|
|
422
|
+
</div>
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
<!-- Tabs -->
|
|
426
|
+
<div class="tab-bar" data-debug-panel>
|
|
427
|
+
<button
|
|
428
|
+
class="tab-btn"
|
|
429
|
+
[class.active]="activeTab() === 'actions'"
|
|
430
|
+
(click)="activeTab.set('actions')"
|
|
431
|
+
>
|
|
432
|
+
Aktionen
|
|
433
|
+
@if (recorder.actionCount() > 0) {
|
|
434
|
+
<span class="tab-badge">{{ recorder.actionCount() }}</span>
|
|
435
|
+
}
|
|
436
|
+
</button>
|
|
437
|
+
<button
|
|
438
|
+
class="tab-btn"
|
|
439
|
+
[class.active]="activeTab() === 'replay'"
|
|
440
|
+
(click)="activeTab.set('replay')"
|
|
441
|
+
title="rrweb Session Replay"
|
|
442
|
+
>
|
|
443
|
+
📽️ Replay
|
|
444
|
+
@if (rrweb.eventCount() > 0) {
|
|
445
|
+
<span class="tab-badge">{{ rrweb.eventCount() }}</span>
|
|
446
|
+
}
|
|
447
|
+
</button>
|
|
448
|
+
<button
|
|
449
|
+
class="tab-btn"
|
|
450
|
+
[class.active]="activeTab() === 'test'"
|
|
451
|
+
[disabled]="!aiService.lastTest()"
|
|
452
|
+
(click)="activeTab.set('test')"
|
|
453
|
+
>
|
|
454
|
+
🤖 Test
|
|
455
|
+
@if (aiService.lastTest()) {
|
|
456
|
+
<span class="tab-badge new">NEU</span>
|
|
457
|
+
}
|
|
458
|
+
</button>
|
|
459
|
+
<button
|
|
460
|
+
class="tab-btn"
|
|
461
|
+
[class.active]="activeTab() === 'sessions'"
|
|
462
|
+
[disabled]="recorder.sessions().length === 0"
|
|
463
|
+
(click)="activeTab.set('sessions')"
|
|
464
|
+
>
|
|
465
|
+
Sessions ({{ recorder.sessions().length }})
|
|
466
|
+
</button>
|
|
467
|
+
</div>
|
|
468
|
+
|
|
469
|
+
<!-- Tab Content -->
|
|
470
|
+
<div class="tab-content">
|
|
471
|
+
@if (activeTab() === 'actions') {
|
|
472
|
+
<app-action-list
|
|
473
|
+
[session]="recorder.currentSession()"
|
|
474
|
+
(removeAction)="recorder.removeAction($event)"
|
|
475
|
+
(addNote)="recorder.addNote($event.id, $event.note)"
|
|
476
|
+
/>
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
@if (activeTab() === 'replay') {
|
|
480
|
+
<app-session-replay />
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
@if (activeTab() === 'test') {
|
|
484
|
+
<app-test-preview [test]="aiService.lastTest()" />
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
@if (activeTab() === 'sessions') {
|
|
488
|
+
<div class="sessions-list">
|
|
489
|
+
@for (session of recorder.sessions(); track session.id) {
|
|
490
|
+
<div class="session-card">
|
|
491
|
+
<div class="session-card-header">
|
|
492
|
+
<span class="session-name">{{ session.name }}</span>
|
|
493
|
+
<span class="session-meta">{{ session.actions.length }} Aktionen</span>
|
|
494
|
+
</div>
|
|
495
|
+
<div class="session-card-actions">
|
|
496
|
+
<button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
|
|
497
|
+
<button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
|
|
498
|
+
</div>
|
|
499
|
+
</div>
|
|
500
|
+
}
|
|
501
|
+
</div>
|
|
502
|
+
}
|
|
503
|
+
</div>
|
|
504
|
+
|
|
505
|
+
<!-- Resize Handle -->
|
|
506
|
+
<div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
|
|
507
|
+
</div>
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
<!-- Settings Dialog -->
|
|
511
|
+
@if (showSettings()) {
|
|
512
|
+
<app-settings-dialog (close)="showSettings.set(false)" />
|
|
513
|
+
}
|
|
514
514
|
`, styles: [".debug-fab{bottom:24px;right:24px;z-index:99999;width:52px;height:52px;border-radius:50%;border:none;background:#1e293b;color:#fff;font-size:22px;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 20px #0006;transition:transform .2s,background .2s;position:fixed}.debug-fab:hover{transform:scale(1.1);background:#334155}.debug-fab.recording{background:#dc2626}.debug-fab.pulse{animation:fabPulse 1.5s ease-in-out infinite}@keyframes fabPulse{0%,to{box-shadow:0 4px 20px #dc262666}50%{box-shadow:0 4px 30px #dc2626e6,0 0 0 8px #dc262626}}.fab-badge{position:absolute;top:-4px;right:-4px;background:#f59e0b;color:#000;font-size:10px;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px}.debug-panel{position:fixed;z-index:99998;width:420px;max-height:80vh;background:#0f172a;color:#e2e8f0;border-radius:12px;border:1px solid #1e3a5f;box-shadow:0 25px 60px #0009;display:flex;flex-direction:column;font-family:Segoe UI,system-ui,sans-serif;font-size:13px;overflow:hidden}.pos-bottom-right{bottom:88px;right:24px}.pos-bottom-left{bottom:88px;left:24px}.pos-top-right{top:24px;right:24px}.pos-top-left{top:24px;left:24px}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#1e293b;border-bottom:1px solid #334155;cursor:move;-webkit-user-select:none;user-select:none;flex-shrink:0}.header-left{display:flex;align-items:center;gap:8px}.panel-icon{font-size:16px}.panel-title{font-weight:600;font-size:14px;color:#f1f5f9}.rec-indicator{font-size:10px;font-weight:700;color:#ef4444;background:#ef444426;padding:2px 7px;border-radius:4px;animation:blink 1s step-end infinite}.rec-indicator.paused{color:#f59e0b;background:#f59e0b26;animation:none}@keyframes blink{50%{opacity:.4}}.header-actions{display:flex;gap:4px}.icon-btn{background:none;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;font-size:14px;line-height:1;transition:color .15s,background .15s}.icon-btn:hover{color:#f1f5f9;background:#334155}.session-setup{padding:10px 14px;border-bottom:1px solid #1e293b;display:flex;flex-direction:column;gap:6px;flex-shrink:0}.session-input,.session-desc{background:#1e293b;border:1px solid #334155;color:#e2e8f0;border-radius:6px;padding:6px 10px;font-size:12px;width:100%;box-sizing:border-box;resize:vertical}.session-input:focus,.session-desc:focus{outline:none;border-color:#3b82f6}.recording-controls{display:flex;gap:6px;padding:10px 14px;border-bottom:1px solid #1e293b;flex-wrap:wrap;flex-shrink:0}.ctrl-btn{border:none;border-radius:6px;padding:6px 14px;font-size:12px;font-weight:600;cursor:pointer;transition:filter .15s,transform .1s;display:flex;align-items:center;gap:5px}.ctrl-btn:hover:not(:disabled){filter:brightness(1.15);transform:translateY(-1px)}.ctrl-btn:active:not(:disabled){transform:translateY(0)}.ctrl-btn:disabled{opacity:.5;cursor:not-allowed}.ctrl-btn.start{background:#16a34a;color:#fff}.ctrl-btn.stop{background:#dc2626;color:#fff}.ctrl-btn.pause{background:#d97706;color:#fff}.ctrl-btn.generate{background:#7c3aed;color:#fff;flex:1;justify-content:center}.ctrl-btn.clear{background:#374151;color:#9ca3af;padding:6px 10px}.spinner{display:inline-block;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error-banner{background:#dc262626;border-left:3px solid #dc2626;color:#fca5a5;padding:8px 14px;font-size:12px;flex-shrink:0}.tab-bar{display:flex;border-bottom:1px solid #1e293b;flex-shrink:0}.tab-btn{flex:1;background:none;border:none;color:#64748b;padding:8px 4px;font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;border-bottom:2px solid transparent;transition:color .15s}.tab-btn:hover:not(:disabled){color:#cbd5e1}.tab-btn.active{color:#60a5fa;border-bottom-color:#3b82f6}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.tab-badge{background:#334155;color:#94a3b8;font-size:10px;padding:1px 5px;border-radius:3px}.tab-badge.new{background:#7c3aed;color:#e9d5ff}.tab-content{overflow-y:auto;flex:1;min-height:0}.tab-content::-webkit-scrollbar{width:5px}.tab-content::-webkit-scrollbar-track{background:transparent}.tab-content::-webkit-scrollbar-thumb{background:#334155;border-radius:3px}.sessions-list{padding:10px 14px;display:flex;flex-direction:column;gap:8px}.session-card{background:#1e293b;border:1px solid #334155;border-radius:8px;padding:10px}.session-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.session-name{font-weight:600;color:#f1f5f9;font-size:13px}.session-meta{font-size:11px;color:#64748b}.session-card-actions{display:flex;gap:6px}.sm-btn{background:#334155;border:none;color:#cbd5e1;padding:4px 10px;border-radius:5px;font-size:11px;cursor:pointer;transition:background .15s}.sm-btn:hover{background:#475569}.sm-btn.danger{color:#fca5a5}.sm-btn.danger:hover{background:#dc262633}.resize-handle{text-align:center;color:#334155;cursor:ns-resize;font-size:16px;padding:2px;flex-shrink:0;background:#0f172a;-webkit-user-select:none;user-select:none}.resize-handle:hover{color:#64748b}\n"] }]
|
|
515
515
|
}] });
|
|
516
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVidWctcmVjb3JkZXIvc3JjL2xpYi9kZWJ1Zy1wYW5lbC9kZWJ1Zy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQXVjcEYsTUFBTSxPQUFPLG1CQUFtQjtJQWxjaEM7UUFtY0UsYUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXJDLGNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLE1BQU0sQ0FBVyxTQUFTLENBQUMsQ0FBQztRQUN4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QVcsRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxzQkFBc0IsQ0FBQyxZQUN0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ01UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBzaWduYWwsIGNvbXB1dGVkLCBpbmplY3QsIE9uSW5pdCwgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JlY29yZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWlHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWktZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnJ3ZWJSZWNvcmRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ycndlYi1yZWNvcmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlY29yZGluZ1Nlc3Npb24gfSBmcm9tICcuLi9tb2RlbHMvcmVjb3JkZWQtYWN0aW9uLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkxpc3RDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tbGlzdC9hY3Rpb24tbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGVzdFByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi90ZXN0LXByZXZpZXcvdGVzdC1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3NldHRpbmdzLWRpYWxvZy9zZXR0aW5ncy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFNlc3Npb25SZXBsYXlDb21wb25lbnQgfSBmcm9tICcuLi9zZXNzaW9uLXJlcGxheS9zZXNzaW9uLXJlcGxheS5jb21wb25lbnQnO1xuXG50eXBlIFBhbmVsVGFiID0gJ2FjdGlvbnMnIHwgJ3Rlc3QnIHwgJ3Nlc3Npb25zJyB8ICdyZXBsYXknO1xudHlwZSBQYW5lbFBvc2l0aW9uID0gJ2JvdHRvbS1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAndG9wLWxlZnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGVidWctcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQWN0aW9uTGlzdENvbXBvbmVudCwgVGVzdFByZXZpZXdDb21wb25lbnQsIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50LCBTZXNzaW9uUmVwbGF5Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIFRvZ2dsZSBGQUIgLS0+XG4gICAgPGJ1dHRvblxuICAgICAgZGF0YS1kZWJ1Zy1wYW5lbFxuICAgICAgY2xhc3M9XCJkZWJ1Zy1mYWJcIlxuICAgICAgW2NsYXNzLnJlY29yZGluZ109XCJyZWNvcmRlci5pc1JlY29yZGluZygpXCJcbiAgICAgIFtjbGFzcy5wdWxzZV09XCJyZWNvcmRlci5pc1JlY29yZGluZygpICYmICFyZWNvcmRlci5pc1BhdXNlZCgpXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgpXCJcbiAgICAgIFt0aXRsZV09XCJwYW5lbE9wZW4oKSA/ICdEZWJ1ZyBQYW5lbCBzY2hsaWXDn2VuJyA6ICdEZWJ1ZyBQYW5lbCDDtmZmbmVuJ1wiXG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmYWItaWNvblwiPnt7IHJlY29yZGVyLmlzUmVjb3JkaW5nKCkgPyAn4o+6JyA6ICfwn5CbJyB9fTwvc3Bhbj5cbiAgICAgIEBpZiAocmVjb3JkZXIuaXNSZWNvcmRpbmcoKSAmJiByZWNvcmRlci5hY3Rpb25Db3VudCgpID4gMCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cImZhYi1iYWRnZVwiPnt7IHJlY29yZGVyLmFjdGlvbkNvdW50KCkgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIE1haW4gUGFuZWwgLS0+XG4gICAgQGlmIChwYW5lbE9wZW4oKSkge1xuICAgICAgPGRpdlxuICAgICAgICBkYXRhLWRlYnVnLXBhbmVsXG4gICAgICAgIGNsYXNzPVwiZGVidWctcGFuZWxcIlxuICAgICAgICBbY2xhc3NdPVwiJ3Bvcy0nICsgcG9zaXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwYW5lbFdpZHRoKClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRlclwiIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZWwtaWNvblwiPvCfkJs8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmVsLXRpdGxlXCI+RGVidWcgUmVjb3JkZXI8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKHJlY29yZGVyLmlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWMtaW5kaWNhdG9yXCIgW2NsYXNzLnBhdXNlZF09XCJyZWNvcmRlci5pc1BhdXNlZCgpXCI+XG4gICAgICAgICAgICAgICAge3sgcmVjb3JkZXIuaXNQYXVzZWQoKSA/ICfij7ggUEFVU0VEJyA6ICfij7ogUkVDJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkVpbnN0ZWxsdW5nZW5cIiAoY2xpY2spPVwic2hvd1NldHRpbmdzLnNldCh0cnVlKVwiPuKame+4jzwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJQb3NpdGlvbiB3ZWNoc2VsblwiIChjbGljayk9XCJjeWNsZVBvc2l0aW9uKClcIj7wn5OMPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIlNjaGxpZcOfZW5cIiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiPuKclTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNlc3Npb24gTmFtZSBJbnB1dCAob25seSB3aGVuIG5vdCByZWNvcmRpbmcpIC0tPlxuICAgICAgICBAaWYgKCFyZWNvcmRlci5pc1JlY29yZGluZygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc2V0dXBcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBkYXRhLWRlYnVnLXBhbmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZXNzaW9uTmFtZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2Vzc2lvbi1OYW1lIChvcHRpb25hbClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBkYXRhLWRlYnVnLXBhbmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1kZXNjXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZXNzaW9uRGVzY1wiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmVobGVyYmVzY2hyZWlidW5nLi4uXCJcbiAgICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFJlY29yZGluZyBDb250cm9scyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZGluZy1jb250cm9sc1wiIGRhdGEtZGVidWctcGFuZWw+XG4gICAgICAgICAgQGlmICghcmVjb3JkZXIuaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIHN0YXJ0XCIgKGNsaWNrKT1cInN0YXJ0UmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAg4pa2IEF1Zm5haG1lIHN0YXJ0ZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIHBhdXNlXCIgKGNsaWNrKT1cInJlY29yZGVyLnBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAge3sgcmVjb3JkZXIuaXNQYXVzZWQoKSA/ICfilrYgRm9ydHNldHplbicgOiAn4o+4IFBhdXNlJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3RybC1idG4gc3RvcFwiIChjbGljayk9XCJzdG9wUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAg4o+5IFN0b3BwZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIGNsZWFyXCIgdGl0bGU9XCJBa3Rpb25lbiBsw7ZzY2hlblwiIChjbGljayk9XCJyZWNvcmRlci5jbGVhckN1cnJlbnRTZXNzaW9uKClcIj5cbiAgICAgICAgICAgICAg8J+XkVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChoYXNBY3Rpb25zKCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJjdHJsLWJ0biBnZW5lcmF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhaVNlcnZpY2UuaXNHZW5lcmF0aW5nKCkgfHwgIWFpU2VydmljZS53ZWJob29rVXJsKClcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIWFpU2VydmljZS53ZWJob29rVXJsKCkgPyAnV2ViaG9vay1VUkwgaW4gRWluc3RlbGx1bmdlbiBlaW50cmFnZW4nIDogJ0N5cHJlc3MgVGVzdCBnZW5lcmllcmVuJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVRlc3QoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoYWlTZXJ2aWNlLmlzR2VuZXJhdGluZygpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyXCI+4p+zPC9zcGFuPiBHZW5lcmllcmUuLi5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAg8J+kliDihpIgQ3lwcmVzcyBUZXN0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBFcnJvciBCYW5uZXIgLS0+XG4gICAgICAgIEBpZiAoYWlTZXJ2aWNlLmVycm9yKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItYmFubmVyXCIgZGF0YS1kZWJ1Zy1wYW5lbD5cbiAgICAgICAgICAgIOKaoO+4jyB7eyBhaVNlcnZpY2UuZXJyb3IoKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhclwiIGRhdGEtZGVidWctcGFuZWw+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBBa3Rpb25lblxuICAgICAgICAgICAgQGlmIChyZWNvcmRlci5hY3Rpb25Db3VudCgpID4gMCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi1iYWRnZVwiPnt7IHJlY29yZGVyLmFjdGlvbkNvdW50KCkgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBsYXknXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVUYWIuc2V0KCdyZXBsYXknKVwiXG4gICAgICAgICAgICB0aXRsZT1cInJyd2ViIFNlc3Npb24gUmVwbGF5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDwn5O977iPIFJlcGxheVxuICAgICAgICAgICAgQGlmIChycndlYi5ldmVudHMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlXCI+e3sgcnJ3ZWIuZXZlbnRzKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAndGVzdCdcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhaVNlcnZpY2UubGFzdFRlc3QoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgndGVzdCcpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDwn6SWIFRlc3RcbiAgICAgICAgICAgIEBpZiAoYWlTZXJ2aWNlLmxhc3RUZXN0KCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWItYmFkZ2UgbmV3XCI+TkVVPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnc2Vzc2lvbnMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWNvcmRlci5zZXNzaW9ucygpLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnc2Vzc2lvbnMnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2Vzc2lvbnMgKHt7IHJlY29yZGVyLnNlc3Npb25zKCkubGVuZ3RoIH19KVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhYiBDb250ZW50IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIj5cbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnYWN0aW9ucycpIHtcbiAgICAgICAgICAgIDxhcHAtYWN0aW9uLWxpc3RcbiAgICAgICAgICAgICAgW3Nlc3Npb25dPVwicmVjb3JkZXIuY3VycmVudFNlc3Npb24oKVwiXG4gICAgICAgICAgICAgIChyZW1vdmVBY3Rpb24pPVwicmVjb3JkZXIucmVtb3ZlQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAoYWRkTm90ZSk9XCJyZWNvcmRlci5hZGROb3RlKCRldmVudC5pZCwgJGV2ZW50Lm5vdGUpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3JlcGxheScpIHtcbiAgICAgICAgICAgIDxhcHAtc2Vzc2lvbi1yZXBsYXkgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAndGVzdCcpIHtcbiAgICAgICAgICAgIDxhcHAtdGVzdC1wcmV2aWV3IFt0ZXN0XT1cImFpU2VydmljZS5sYXN0VGVzdCgpXCIgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnc2Vzc2lvbnMnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbnMtbGlzdFwiPlxuICAgICAgICAgICAgICBAZm9yIChzZXNzaW9uIG9mIHJlY29yZGVyLnNlc3Npb25zKCk7IHRyYWNrIHNlc3Npb24uaWQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tbmFtZVwiPnt7IHNlc3Npb24ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLW1ldGFcIj57eyBzZXNzaW9uLmFjdGlvbnMubGVuZ3RoIH19IEFrdGlvbmVuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNtLWJ0blwiIChjbGljayk9XCJsb2FkQW5kR2VuZXJhdGUoc2Vzc2lvbilcIj7wn6SWIE5ldSBnZW5lcmllcmVuPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzbS1idG4gZGFuZ2VyXCIgKGNsaWNrKT1cInJlY29yZGVyLmRlbGV0ZVNlc3Npb24oc2Vzc2lvbi5pZClcIj7wn5eRPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc2l6ZSBIYW5kbGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQpXCI+4qC/PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIFNldHRpbmdzIERpYWxvZyAtLT5cbiAgICBAaWYgKHNob3dTZXR0aW5ncygpKSB7XG4gICAgICA8YXBwLXNldHRpbmdzLWRpYWxvZyAoY2xvc2UpPVwic2hvd1NldHRpbmdzLnNldChmYWxzZSlcIiAvPlxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5kZWJ1Zy1mYWIge1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgYm90dG9tOiAyNHB4O1xuICAgICAgcmlnaHQ6IDI0cHg7XG4gICAgICB6LWluZGV4OiA5OTk5OTtcbiAgICAgIHdpZHRoOiA1MnB4O1xuICAgICAgaGVpZ2h0OiA1MnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIGZvbnQtc2l6ZTogMjJweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC40KTtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzLCBiYWNrZ3JvdW5kIDAuMnM7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgfVxuICAgIC5kZWJ1Zy1mYWI6aG92ZXIgeyB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7IGJhY2tncm91bmQ6ICMzMzQxNTU7IH1cbiAgICAuZGVidWctZmFiLnJlY29yZGluZyB7IGJhY2tncm91bmQ6ICNkYzI2MjY7IH1cbiAgICAuZGVidWctZmFiLnB1bHNlIHsgYW5pbWF0aW9uOiBmYWJQdWxzZSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9XG4gICAgQGtleWZyYW1lcyBmYWJQdWxzZSB7XG4gICAgICAwJSwgMTAwJSB7IGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSgyMjAsMzgsMzgsMC40KTsgfVxuICAgICAgNTAlIHsgYm94LXNoYWRvdzogMCA0cHggMzBweCByZ2JhKDIyMCwzOCwzOCwwLjkpLCAwIDAgMCA4cHggcmdiYSgyMjAsMzgsMzgsMC4xNSk7IH1cbiAgICB9XG4gICAgLmZhYi1iYWRnZSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IC00cHg7XG4gICAgICByaWdodDogLTRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmNTllMGI7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBtaW4td2lkdGg6IDE4cHg7XG4gICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogMCA0cHg7XG4gICAgfVxuXG4gICAgLmRlYnVnLXBhbmVsIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHotaW5kZXg6IDk5OTk4O1xuICAgICAgd2lkdGg6IDQyMHB4O1xuICAgICAgbWF4LWhlaWdodDogODB2aDtcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XG4gICAgICBjb2xvcjogI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMWUzYTVmO1xuICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDYwcHggcmdiYSgwLDAsMCwwLjYpO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmO1xuICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLnBvcy1ib3R0b20tcmlnaHQgeyBib3R0b206IDg4cHg7IHJpZ2h0OiAyNHB4OyB9XG4gICAgLnBvcy1ib3R0b20tbGVmdCAgeyBib3R0b206IDg4cHg7IGxlZnQ6IDI0cHg7IH1cbiAgICAucG9zLXRvcC1yaWdodCAgICB7IHRvcDogMjRweDsgcmlnaHQ6IDI0cHg7IH1cbiAgICAucG9zLXRvcC1sZWZ0ICAgICB7IHRvcDogMjRweDsgbGVmdDogMjRweDsgfVxuXG4gICAgLnBhbmVsLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzNDE1NTtcbiAgICAgIGN1cnNvcjogbW92ZTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5oZWFkZXItbGVmdCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyB9XG4gICAgLnBhbmVsLWljb24geyBmb250LXNpemU6IDE2cHg7IH1cbiAgICAucGFuZWwtdGl0bGUgeyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjZjFmNWY5OyB9XG4gICAgLnJlYy1pbmRpY2F0b3Ige1xuICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjZWY0NDQ0O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksNjgsNjgsMC4xNSk7XG4gICAgICBwYWRkaW5nOiAycHggN3B4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgYW5pbWF0aW9uOiBibGluayAxcyBzdGVwLWVuZCBpbmZpbml0ZTtcbiAgICB9XG4gICAgLnJlYy1pbmRpY2F0b3IucGF1c2VkIHsgY29sb3I6ICNmNTllMGI7IGJhY2tncm91bmQ6IHJnYmEoMjQ1LDE1OCwxMSwwLjE1KTsgYW5pbWF0aW9uOiBub25lOyB9XG4gICAgQGtleWZyYW1lcyBibGluayB7IDUwJSB7IG9wYWNpdHk6IDAuNDsgfSB9XG4gICAgLmhlYWRlci1hY3Rpb25zIHsgZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7IH1cbiAgICAuaWNvbi1idG4ge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiAjOTRhM2I4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgcGFkZGluZzogNHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1cztcbiAgICB9XG4gICAgLmljb24tYnRuOmhvdmVyIHsgY29sb3I6ICNmMWY1Zjk7IGJhY2tncm91bmQ6ICMzMzQxNTU7IH1cblxuICAgIC5zZXNzaW9uLXNldHVwIHtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuc2Vzc2lvbi1pbnB1dCwgLnNlc3Npb24tZGVzYyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMWUyOTNiO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzNDE1NTtcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICByZXNpemU6IHZlcnRpY2FsO1xuICAgIH1cbiAgICAuc2Vzc2lvbi1pbnB1dDpmb2N1cywgLnNlc3Npb24tZGVzYzpmb2N1cyB7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjM2I4MmY2O1xuICAgIH1cblxuICAgIC5yZWNvcmRpbmctY29udHJvbHMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxZTI5M2I7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmN0cmwtYnRuIHtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCAxNHB4O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGZpbHRlciAwLjE1cywgdHJhbnNmb3JtIDAuMXM7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgIH1cbiAgICAuY3RybC1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgeyBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsgfVxuICAgIC5jdHJsLWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cbiAgICAuY3RybC1idG46ZGlzYWJsZWQgeyBvcGFjaXR5OiAwLjU7IGN1cnNvcjogbm90LWFsbG93ZWQ7IH1cbiAgICAuY3RybC1idG4uc3RhcnQgICAgeyBiYWNrZ3JvdW5kOiAjMTZhMzRhOyBjb2xvcjogI2ZmZjsgfVxuICAgIC5jdHJsLWJ0bi5zdG9wICAgICB7IGJhY2tncm91bmQ6ICNkYzI2MjY7IGNvbG9yOiAjZmZmOyB9XG4gICAgLmN0cmwtYnRuLnBhdXNlICAgIHsgYmFja2dyb3VuZDogI2Q5NzcwNjsgY29sb3I6ICNmZmY7IH1cbiAgICAuY3RybC1idG4uZ2VuZXJhdGUgeyBiYWNrZ3JvdW5kOiAjN2MzYWVkOyBjb2xvcjogI2ZmZjsgZmxleDogMTsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH1cbiAgICAuY3RybC1idG4uY2xlYXIgICAgeyBiYWNrZ3JvdW5kOiAjMzc0MTUxOyBjb2xvcjogIzljYTNhZjsgcGFkZGluZzogNnB4IDEwcHg7IH1cbiAgICAuc3Bpbm5lciB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOyB9XG4gICAgQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH1cblxuICAgIC5lcnJvci1iYW5uZXIge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyMjAsMzgsMzgsMC4xNSk7XG4gICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkYzI2MjY7XG4gICAgICBjb2xvcjogI2ZjYTVhNTtcbiAgICAgIHBhZGRpbmc6IDhweCAxNHB4O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnRhYi1iYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC50YWItYnRuIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXM7XG4gICAgfVxuICAgIC50YWItYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgY29sb3I6ICNjYmQ1ZTE7IH1cbiAgICAudGFiLWJ0bi5hY3RpdmUgeyBjb2xvcjogIzYwYTVmYTsgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzNiODJmNjsgfVxuICAgIC50YWItYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9XG4gICAgLnRhYi1iYWRnZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIH1cbiAgICAudGFiLWJhZGdlLm5ldyB7IGJhY2tncm91bmQ6ICM3YzNhZWQ7IGNvbG9yOiAjZTlkNWZmOyB9XG5cbiAgICAudGFiLWNvbnRlbnQge1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cbiAgICAudGFiLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDVweDsgfVxuICAgIC50YWItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuICAgIC50YWItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiAjMzM0MTU1OyBib3JkZXItcmFkaXVzOiAzcHg7IH1cblxuICAgIC5zZXNzaW9ucy1saXN0IHsgcGFkZGluZzogMTBweCAxNHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfVxuICAgIC5zZXNzaW9uLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzQxNTU7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgICAuc2Vzc2lvbi1jYXJkLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICB9XG4gICAgLnNlc3Npb24tbmFtZSB7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjZjFmNWY5OyBmb250LXNpemU6IDEzcHg7IH1cbiAgICAuc2Vzc2lvbi1tZXRhIHsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogIzY0NzQ4YjsgfVxuICAgIC5zZXNzaW9uLWNhcmQtYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyB9XG4gICAgLnNtLWJ0biB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICNjYmQ1ZTE7XG4gICAgICBwYWRkaW5nOiA0cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgfVxuICAgIC5zbS1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAjNDc1NTY5OyB9XG4gICAgLnNtLWJ0bi5kYW5nZXIgeyBjb2xvcjogI2ZjYTVhNTsgfVxuICAgIC5zbS1idG4uZGFuZ2VyOmhvdmVyIHsgYmFja2dyb3VuZDogcmdiYSgyMjAsMzgsMzgsMC4yKTsgfVxuXG4gICAgLnJlc2l6ZS1oYW5kbGUge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIHBhZGRpbmc6IDJweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYmFja2dyb3VuZDogIzBmMTcyYTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICAucmVzaXplLWhhbmRsZTpob3ZlciB7IGNvbG9yOiAjNjQ3NDhiOyB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBEZWJ1Z1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICByZWNvcmRlciA9IGluamVjdChSZWNvcmRlclNlcnZpY2UpO1xuICBhaVNlcnZpY2UgPSBpbmplY3QoQWlHZW5lcmF0b3JTZXJ2aWNlKTtcbiAgcnJ3ZWIgPSBpbmplY3QoUnJ3ZWJSZWNvcmRlclNlcnZpY2UpO1xuXG4gIHBhbmVsT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIGFjdGl2ZVRhYiA9IHNpZ25hbDxQYW5lbFRhYj4oJ2FjdGlvbnMnKTtcbiAgcG9zaXRpb24gPSBzaWduYWw8UGFuZWxQb3NpdGlvbj4oJ2JvdHRvbS1yaWdodCcpO1xuICBwYW5lbFdpZHRoID0gc2lnbmFsKDQyMCk7XG4gIHNob3dTZXR0aW5ncyA9IHNpZ25hbChmYWxzZSk7XG4gIHNlc3Npb25OYW1lID0gJyc7XG4gIHNlc3Npb25EZXNjID0gJyc7XG5cbiAgaGFzQWN0aW9ucyA9IGNvbXB1dGVkKFxuICAgICgpID0+ICh0aGlzLnJlY29yZGVyLmN1cnJlbnRTZXNzaW9uKCk/LmFjdGlvbnMubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICAgICh0aGlzLnJlY29yZGVyLnNlc3Npb25zKCkubGVuZ3RoID4gMClcbiAgKTtcblxuICBwcml2YXRlIHJlc2l6aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzaXplU3RhcnRZID0gMDtcbiAgcHJpdmF0ZSByZXNpemVTdGFydEggPSAwO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEtleWJvYXJkIHNob3J0Y3V0OiBDdHJsK1NoaWZ0K0RcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVIb3RrZXkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlSG90a2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSG90a2V5ID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZS5jdHJsS2V5ICYmIGUuc2hpZnRLZXkgJiYgZS5rZXkgPT09ICdEJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy50b2dnbGVQYW5lbCgpO1xuICAgIH1cbiAgICBpZiAoZS5jdHJsS2V5ICYmIGUuc2hpZnRLZXkgJiYgZS5rZXkgPT09ICdSJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMucmVjb3JkZXIuaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5lbE9wZW4udXBkYXRlKHYgPT4gIXYpO1xuICAgIGlmICh0aGlzLnBhbmVsT3BlbigpICYmICF0aGlzLnJlY29yZGVyLmN1cnJlbnRTZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpO1xuICAgIH1cbiAgfVxuXG4gIGN5Y2xlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb25zOiBQYW5lbFBvc2l0aW9uW10gPSBbJ2JvdHRvbS1yaWdodCcsICdib3R0b20tbGVmdCcsICd0b3AtcmlnaHQnLCAndG9wLWxlZnQnXTtcbiAgICBjb25zdCBpZHggPSBwb3NpdGlvbnMuaW5kZXhPZih0aGlzLnBvc2l0aW9uKCkpO1xuICAgIHRoaXMucG9zaXRpb24uc2V0KHBvc2l0aW9uc1soaWR4ICsgMSkgJSBwb3NpdGlvbnMubGVuZ3RoXSk7XG4gIH1cblxuICBzdGFydFJlY29yZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKFxuICAgICAgdGhpcy5zZXNzaW9uTmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICB0aGlzLnNlc3Npb25EZXNjIHx8IHVuZGVmaW5lZFxuICAgICk7XG4gICAgLy8gU3RhcnQgcnJ3ZWIgaW4gcGFyYWxsZWwgZm9yIHZpc3VhbCByZXBsYXlcbiAgICB0aGlzLnJyd2ViLnN0YXJ0UmVjb3JkaW5nKCk7XG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KCdhY3Rpb25zJyk7XG4gIH1cblxuICBzdG9wUmVjb3JkaW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoKTtcbiAgICB0aGlzLnJyd2ViLnN0b3BSZWNvcmRpbmcoKTtcbiAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgdGhpcy5hY3RpdmVUYWIuc2V0KCdhY3Rpb25zJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGVUZXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlY29yZGVyLmN1cnJlbnRTZXNzaW9uKCkgPz8gdGhpcy5yZWNvcmRlci5zZXNzaW9ucygpLmF0KC0xKTtcbiAgICBpZiAoIXNlc3Npb24pIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmFpU2VydmljZS5nZW5lcmF0ZUN5cHJlc3NUZXN0KHNlc3Npb24pO1xuICAgIHRoaXMuYWN0aXZlVGFiLnNldCgndGVzdCcpO1xuICB9XG5cbiAgYXN5bmMgbG9hZEFuZEdlbmVyYXRlKHNlc3Npb246IFJlY29yZGluZ1Nlc3Npb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmFpU2VydmljZS5nZW5lcmF0ZUN5cHJlc3NUZXN0KHNlc3Npb24pO1xuICAgIHRoaXMuYWN0aXZlVGFiLnNldCgndGVzdCcpO1xuICB9XG5cbiAgLy8gRHJhZyB0byByZXBvc2l0aW9uXG4gIHN0YXJ0RHJhZyhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnYnV0dG9uJykpIHJldHVybjtcbiAgICBjb25zdCBwYW5lbCA9IChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQhO1xuICAgIGNvbnN0IHN0YXJ0WCA9IGUuY2xpZW50WCAtIHBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgY29uc3Qgc3RhcnRZID0gZS5jbGllbnRZIC0gcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gYCR7ZXYuY2xpZW50WCAtIHN0YXJ0WH1weGA7XG4gICAgICBwYW5lbC5zdHlsZS50b3AgID0gYCR7ZXYuY2xpZW50WSAtIHN0YXJ0WX1weGA7XG4gICAgICBwYW5lbC5zdHlsZS5yaWdodCA9ICdhdXRvJztcbiAgICAgIHBhbmVsLnN0eWxlLmJvdHRvbSA9ICdhdXRvJztcbiAgICB9O1xuICAgIGNvbnN0IG9uVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gIH1cblxuICAvLyBSZXNpemUgaGVpZ2h0XG4gIHN0YXJ0UmVzaXplKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lbCA9IChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQhO1xuICAgIHRoaXMucmVzaXplU3RhcnRZID0gZS5jbGllbnRZO1xuICAgIHRoaXMucmVzaXplU3RhcnRIID0gcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXdIID0gTWF0aC5tYXgoMjUwLCB0aGlzLnJlc2l6ZVN0YXJ0SCArIChldi5jbGllbnRZIC0gdGhpcy5yZXNpemVTdGFydFkpKTtcbiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IGAke25ld0h9cHhgO1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cbiJdfQ==
|
|
516
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVidWctcmVjb3JkZXIvc3JjL2xpYi9kZWJ1Zy1wYW5lbC9kZWJ1Zy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQXVjcEYsTUFBTSxPQUFPLG1CQUFtQjtJQWxjaEM7UUFtY0UsYUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXJDLGNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLE1BQU0sQ0FBVyxTQUFTLENBQUMsQ0FBQztRQUN4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QVcsRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxzQkFBc0IsQ0FBQyxZQUN0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ01UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIHNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSZWNvcmRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZWNvcmRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWlHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWktZ2VuZXJhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBScndlYlJlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Jyd2ViLXJlY29yZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZWNvcmRpbmdTZXNzaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlY29yZGVkLWFjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IEFjdGlvbkxpc3RDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tbGlzdC9hY3Rpb24tbGlzdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZXN0UHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uL3Rlc3QtcHJldmlldy90ZXN0LXByZXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2V0dGluZ3NEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9zZXR0aW5ncy1kaWFsb2cvc2V0dGluZ3MtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlc3Npb25SZXBsYXlDb21wb25lbnQgfSBmcm9tICcuLi9zZXNzaW9uLXJlcGxheS9zZXNzaW9uLXJlcGxheS5jb21wb25lbnQnO1xyXG5cclxudHlwZSBQYW5lbFRhYiA9ICdhY3Rpb25zJyB8ICd0ZXN0JyB8ICdzZXNzaW9ucycgfCAncmVwbGF5JztcclxudHlwZSBQYW5lbFBvc2l0aW9uID0gJ2JvdHRvbS1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAndG9wLWxlZnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZGVidWctcGFuZWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEFjdGlvbkxpc3RDb21wb25lbnQsIFRlc3RQcmV2aWV3Q29tcG9uZW50LCBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudCwgU2Vzc2lvblJlcGxheUNvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDwhLS0gVG9nZ2xlIEZBQiAtLT5cclxuICAgIDxidXR0b25cclxuICAgICAgZGF0YS1kZWJ1Zy1wYW5lbFxyXG4gICAgICBjbGFzcz1cImRlYnVnLWZhYlwiXHJcbiAgICAgIFtjbGFzcy5yZWNvcmRpbmddPVwicmVjb3JkZXIuaXNSZWNvcmRpbmcoKVwiXHJcbiAgICAgIFtjbGFzcy5wdWxzZV09XCJyZWNvcmRlci5pc1JlY29yZGluZygpICYmICFyZWNvcmRlci5pc1BhdXNlZCgpXCJcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIlxyXG4gICAgICBbdGl0bGVdPVwicGFuZWxPcGVuKCkgPyAnRGVidWcgUGFuZWwgc2NobGllw59lbicgOiAnRGVidWcgUGFuZWwgw7ZmZm5lbidcIlxyXG4gICAgPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImZhYi1pY29uXCI+e3sgcmVjb3JkZXIuaXNSZWNvcmRpbmcoKSA/ICfij7onIDogJ/CfkJsnIH19PC9zcGFuPlxyXG4gICAgICBAaWYgKHJlY29yZGVyLmlzUmVjb3JkaW5nKCkgJiYgcmVjb3JkZXIuYWN0aW9uQ291bnQoKSA+IDApIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhYi1iYWRnZVwiPnt7IHJlY29yZGVyLmFjdGlvbkNvdW50KCkgfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gTWFpbiBQYW5lbCAtLT5cclxuICAgIEBpZiAocGFuZWxPcGVuKCkpIHtcclxuICAgICAgPGRpdlxyXG4gICAgICAgIGRhdGEtZGVidWctcGFuZWxcclxuICAgICAgICBjbGFzcz1cImRlYnVnLXBhbmVsXCJcclxuICAgICAgICBbY2xhc3NdPVwiJ3Bvcy0nICsgcG9zaXRpb24oKVwiXHJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInBhbmVsV2lkdGgoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGVyXCIgKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZWwtaWNvblwiPvCfkJs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5EZWJ1ZyBSZWNvcmRlcjwvc3Bhbj5cclxuICAgICAgICAgICAgQGlmIChyZWNvcmRlci5pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWMtaW5kaWNhdG9yXCIgW2NsYXNzLnBhdXNlZF09XCJyZWNvcmRlci5pc1BhdXNlZCgpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZWNvcmRlci5pc1BhdXNlZCgpID8gJ+KPuCBQQVVTRUQnIDogJ+KPuiBSRUMnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkVpbnN0ZWxsdW5nZW5cIiAoY2xpY2spPVwic2hvd1NldHRpbmdzLnNldCh0cnVlKVwiPuKame+4jzwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIlBvc2l0aW9uIHdlY2hzZWxuXCIgKGNsaWNrKT1cImN5Y2xlUG9zaXRpb24oKVwiPvCfk4w8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJTY2hsaWXDn2VuXCIgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIj7inJU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNlc3Npb24gTmFtZSBJbnB1dCAob25seSB3aGVuIG5vdCByZWNvcmRpbmcpIC0tPlxyXG4gICAgICAgIEBpZiAoIXJlY29yZGVyLmlzUmVjb3JkaW5nKCkpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXNldHVwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIGRhdGEtZGVidWctcGFuZWxcclxuICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24taW5wdXRcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlc3Npb25OYW1lXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlc3Npb24tTmFtZSAob3B0aW9uYWwpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgZGF0YS1kZWJ1Zy1wYW5lbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1kZXNjXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlc3Npb25EZXNjXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZlaGxlcmJlc2NocmVpYnVuZy4uLlwiXHJcbiAgICAgICAgICAgICAgcm93cz1cIjJcIlxyXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBSZWNvcmRpbmcgQ29udHJvbHMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZGluZy1jb250cm9sc1wiIGRhdGEtZGVidWctcGFuZWw+XHJcbiAgICAgICAgICBAaWYgKCFyZWNvcmRlci5pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjdHJsLWJ0biBzdGFydFwiIChjbGljayk9XCJzdGFydFJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAg4pa2IEF1Zm5haG1lIHN0YXJ0ZW5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIHBhdXNlXCIgKGNsaWNrKT1cInJlY29yZGVyLnBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICB7eyByZWNvcmRlci5pc1BhdXNlZCgpID8gJ+KWtiBGb3J0c2V0emVuJyA6ICfij7ggUGF1c2UnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3RybC1idG4gc3RvcFwiIChjbGljayk9XCJzdG9wUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICDij7kgU3RvcHBlblxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIGNsZWFyXCIgdGl0bGU9XCJBa3Rpb25lbiBsw7ZzY2hlblwiIChjbGljayk9XCJyZWNvcmRlci5jbGVhckN1cnJlbnRTZXNzaW9uKClcIj5cclxuICAgICAgICAgICAgICDwn5eRXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEBpZiAoaGFzQWN0aW9ucygpKSB7XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cImN0cmwtYnRuIGdlbmVyYXRlXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWlTZXJ2aWNlLmlzR2VuZXJhdGluZygpIHx8ICFhaVNlcnZpY2Uud2ViaG9va1VybCgpXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIWFpU2VydmljZS53ZWJob29rVXJsKCkgPyAnV2ViaG9vay1VUkwgaW4gRWluc3RlbGx1bmdlbiBlaW50cmFnZW4nIDogJ0N5cHJlc3MgVGVzdCBnZW5lcmllcmVuJ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImdlbmVyYXRlVGVzdCgpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEBpZiAoYWlTZXJ2aWNlLmlzR2VuZXJhdGluZygpKSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXJcIj7in7M8L3NwYW4+IEdlbmVyaWVyZS4uLlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAg8J+kliDihpIgQ3lwcmVzcyBUZXN0XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBFcnJvciBCYW5uZXIgLS0+XHJcbiAgICAgICAgQGlmIChhaVNlcnZpY2UuZXJyb3IoKSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLWJhbm5lclwiIGRhdGEtZGVidWctcGFuZWw+XHJcbiAgICAgICAgICAgIOKaoO+4jyB7eyBhaVNlcnZpY2UuZXJyb3IoKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIFRhYnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXJcIiBkYXRhLWRlYnVnLXBhbmVsPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxyXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnYWN0aW9ucydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgQWt0aW9uZW5cclxuICAgICAgICAgICAgQGlmIChyZWNvcmRlci5hY3Rpb25Db3VudCgpID4gMCkge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlXCI+e3sgcmVjb3JkZXIuYWN0aW9uQ291bnQoKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBsYXknXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZVRhYi5zZXQoJ3JlcGxheScpXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJycndlYiBTZXNzaW9uIFJlcGxheVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIPCfk73vuI8gUmVwbGF5XHJcbiAgICAgICAgICAgIEBpZiAocnJ3ZWIuZXZlbnRDb3VudCgpID4gMCkge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlXCI+e3sgcnJ3ZWIuZXZlbnRDb3VudCgpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3Rlc3QnXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhaVNlcnZpY2UubGFzdFRlc3QoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVUYWIuc2V0KCd0ZXN0JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICDwn6SWIFRlc3RcclxuICAgICAgICAgICAgQGlmIChhaVNlcnZpY2UubGFzdFRlc3QoKSkge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlIG5ld1wiPk5FVTwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdzZXNzaW9ucydcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkZXIuc2Vzc2lvbnMoKS5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnc2Vzc2lvbnMnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFNlc3Npb25zICh7eyByZWNvcmRlci5zZXNzaW9ucygpLmxlbmd0aCB9fSlcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFRhYiBDb250ZW50IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiPlxyXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ2FjdGlvbnMnKSB7XHJcbiAgICAgICAgICAgIDxhcHAtYWN0aW9uLWxpc3RcclxuICAgICAgICAgICAgICBbc2Vzc2lvbl09XCJyZWNvcmRlci5jdXJyZW50U2Vzc2lvbigpXCJcclxuICAgICAgICAgICAgICAocmVtb3ZlQWN0aW9uKT1cInJlY29yZGVyLnJlbW92ZUFjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoYWRkTm90ZSk9XCJyZWNvcmRlci5hZGROb3RlKCRldmVudC5pZCwgJGV2ZW50Lm5vdGUpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncmVwbGF5Jykge1xyXG4gICAgICAgICAgICA8YXBwLXNlc3Npb24tcmVwbGF5IC8+XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3Rlc3QnKSB7XHJcbiAgICAgICAgICAgIDxhcHAtdGVzdC1wcmV2aWV3IFt0ZXN0XT1cImFpU2VydmljZS5sYXN0VGVzdCgpXCIgLz5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnc2Vzc2lvbnMnKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9ucy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgQGZvciAoc2Vzc2lvbiBvZiByZWNvcmRlci5zZXNzaW9ucygpOyB0cmFjayBzZXNzaW9uLmlkKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLW5hbWVcIj57eyBzZXNzaW9uLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLW1ldGFcIj57eyBzZXNzaW9uLmFjdGlvbnMubGVuZ3RoIH19IEFrdGlvbmVuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNtLWJ0blwiIChjbGljayk9XCJsb2FkQW5kR2VuZXJhdGUoc2Vzc2lvbilcIj7wn6SWIE5ldSBnZW5lcmllcmVuPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNtLWJ0biBkYW5nZXJcIiAoY2xpY2spPVwicmVjb3JkZXIuZGVsZXRlU2Vzc2lvbihzZXNzaW9uLmlkKVwiPvCfl5E8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlc2l6ZSBIYW5kbGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cInN0YXJ0UmVzaXplKCRldmVudClcIj7ioL88L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBTZXR0aW5ncyBEaWFsb2cgLS0+XHJcbiAgICBAaWYgKHNob3dTZXR0aW5ncygpKSB7XHJcbiAgICAgIDxhcHAtc2V0dGluZ3MtZGlhbG9nIChjbG9zZSk9XCJzaG93U2V0dGluZ3Muc2V0KGZhbHNlKVwiIC8+XHJcbiAgICB9XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuZGVidWctZmFiIHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICBib3R0b206IDI0cHg7XHJcbiAgICAgIHJpZ2h0OiAyNHB4O1xyXG4gICAgICB6LWluZGV4OiA5OTk5OTtcclxuICAgICAgd2lkdGg6IDUycHg7XHJcbiAgICAgIGhlaWdodDogNTJweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgICAgZm9udC1zaXplOiAyMnB4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC40KTtcclxuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMsIGJhY2tncm91bmQgMC4ycztcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgfVxyXG4gICAgLmRlYnVnLWZhYjpob3ZlciB7IHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgYmFja2dyb3VuZDogIzMzNDE1NTsgfVxyXG4gICAgLmRlYnVnLWZhYi5yZWNvcmRpbmcgeyBiYWNrZ3JvdW5kOiAjZGMyNjI2OyB9XHJcbiAgICAuZGVidWctZmFiLnB1bHNlIHsgYW5pbWF0aW9uOiBmYWJQdWxzZSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9XHJcbiAgICBAa2V5ZnJhbWVzIGZhYlB1bHNlIHtcclxuICAgICAgMCUsIDEwMCUgeyBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMjIwLDM4LDM4LDAuNCk7IH1cclxuICAgICAgNTAlIHsgYm94LXNoYWRvdzogMCA0cHggMzBweCByZ2JhKDIyMCwzOCwzOCwwLjkpLCAwIDAgMCA4cHggcmdiYSgyMjAsMzgsMzgsMC4xNSk7IH1cclxuICAgIH1cclxuICAgIC5mYWItYmFkZ2Uge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogLTRweDtcclxuICAgICAgcmlnaHQ6IC00cHg7XHJcbiAgICAgIGJhY2tncm91bmQ6ICNmNTllMGI7XHJcbiAgICAgIGNvbG9yOiAjMDAwO1xyXG4gICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgIG1pbi13aWR0aDogMThweDtcclxuICAgICAgaGVpZ2h0OiAxOHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA5cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiAwIDRweDtcclxuICAgIH1cclxuXHJcbiAgICAuZGVidWctcGFuZWwge1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgIHotaW5kZXg6IDk5OTk4O1xyXG4gICAgICB3aWR0aDogNDIwcHg7XHJcbiAgICAgIG1heC1oZWlnaHQ6IDgwdmg7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XHJcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMWUzYTVmO1xyXG4gICAgICBib3gtc2hhZG93OiAwIDI1cHggNjBweCByZ2JhKDAsMCwwLDAuNik7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIH1cclxuICAgIC5wb3MtYm90dG9tLXJpZ2h0IHsgYm90dG9tOiA4OHB4OyByaWdodDogMjRweDsgfVxyXG4gICAgLnBvcy1ib3R0b20tbGVmdCAgeyBib3R0b206IDg4cHg7IGxlZnQ6IDI0cHg7IH1cclxuICAgIC5wb3MtdG9wLXJpZ2h0ICAgIHsgdG9wOiAyNHB4OyByaWdodDogMjRweDsgfVxyXG4gICAgLnBvcy10b3AtbGVmdCAgICAgeyB0b3A6IDI0cHg7IGxlZnQ6IDI0cHg7IH1cclxuXHJcbiAgICAucGFuZWwtaGVhZGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzM0MTU1O1xyXG4gICAgICBjdXJzb3I6IG1vdmU7XHJcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuICAgIC5oZWFkZXItbGVmdCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyB9XHJcbiAgICAucGFuZWwtaWNvbiB7IGZvbnQtc2l6ZTogMTZweDsgfVxyXG4gICAgLnBhbmVsLXRpdGxlIHsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2YxZjVmOTsgfVxyXG4gICAgLnJlYy1pbmRpY2F0b3Ige1xyXG4gICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgIGNvbG9yOiAjZWY0NDQ0O1xyXG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSw2OCw2OCwwLjE1KTtcclxuICAgICAgcGFkZGluZzogMnB4IDdweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgICBhbmltYXRpb246IGJsaW5rIDFzIHN0ZXAtZW5kIGluZmluaXRlO1xyXG4gICAgfVxyXG4gICAgLnJlYy1pbmRpY2F0b3IucGF1c2VkIHsgY29sb3I6ICNmNTllMGI7IGJhY2tncm91bmQ6IHJnYmEoMjQ1LDE1OCwxMSwwLjE1KTsgYW5pbWF0aW9uOiBub25lOyB9XHJcbiAgICBAa2V5ZnJhbWVzIGJsaW5rIHsgNTAlIHsgb3BhY2l0eTogMC40OyB9IH1cclxuICAgIC5oZWFkZXItYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyB9XHJcbiAgICAuaWNvbi1idG4ge1xyXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGNvbG9yOiAjOTRhM2I4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDRweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1cztcclxuICAgIH1cclxuICAgIC5pY29uLWJ0bjpob3ZlciB7IGNvbG9yOiAjZjFmNWY5OyBiYWNrZ3JvdW5kOiAjMzM0MTU1OyB9XHJcblxyXG4gICAgLnNlc3Npb24tc2V0dXAge1xyXG4gICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBnYXA6IDZweDtcclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICB9XHJcbiAgICAuc2Vzc2lvbi1pbnB1dCwgLnNlc3Npb24tZGVzYyB7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzQxNTU7XHJcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICByZXNpemU6IHZlcnRpY2FsO1xyXG4gICAgfVxyXG4gICAgLnNlc3Npb24taW5wdXQ6Zm9jdXMsIC5zZXNzaW9uLWRlc2M6Zm9jdXMge1xyXG4gICAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgICBib3JkZXItY29sb3I6ICMzYjgyZjY7XHJcbiAgICB9XHJcblxyXG4gICAgLnJlY29yZGluZy1jb250cm9scyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGdhcDogNnB4O1xyXG4gICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xyXG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgfVxyXG4gICAgLmN0cmwtYnRuIHtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDZweCAxNHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogZmlsdGVyIDAuMTVzLCB0cmFuc2Zvcm0gMC4xcztcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiA1cHg7XHJcbiAgICB9XHJcbiAgICAuY3RybC1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgeyBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsgfVxyXG4gICAgLmN0cmwtYnRuOmFjdGl2ZTpub3QoOmRpc2FibGVkKSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4gICAgLmN0cmwtYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC41OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9XHJcbiAgICAuY3RybC1idG4uc3RhcnQgICAgeyBiYWNrZ3JvdW5kOiAjMTZhMzRhOyBjb2xvcjogI2ZmZjsgfVxyXG4gICAgLmN0cmwtYnRuLnN0b3AgICAgIHsgYmFja2dyb3VuZDogI2RjMjYyNjsgY29sb3I6ICNmZmY7IH1cclxuICAgIC5jdHJsLWJ0bi5wYXVzZSAgICB7IGJhY2tncm91bmQ6ICNkOTc3MDY7IGNvbG9yOiAjZmZmOyB9XHJcbiAgICAuY3RybC1idG4uZ2VuZXJhdGUgeyBiYWNrZ3JvdW5kOiAjN2MzYWVkOyBjb2xvcjogI2ZmZjsgZmxleDogMTsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH1cclxuICAgIC5jdHJsLWJ0bi5jbGVhciAgICB7IGJhY2tncm91bmQ6ICMzNzQxNTE7IGNvbG9yOiAjOWNhM2FmOyBwYWRkaW5nOiA2cHggMTBweDsgfVxyXG4gICAgLnNwaW5uZXIgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsgfVxyXG4gICAgQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH1cclxuXHJcbiAgICAuZXJyb3ItYmFubmVyIHtcclxuICAgICAgYmFja2dyb3VuZDogcmdiYSgyMjAsMzgsMzgsMC4xNSk7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RjMjYyNjtcclxuICAgICAgY29sb3I6ICNmY2E1YTU7XHJcbiAgICAgIHBhZGRpbmc6IDhweCAxNHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWItYmFyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxZTI5M2I7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgfVxyXG4gICAgLnRhYi1idG4ge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xyXG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGdhcDogNXB4O1xyXG4gICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzO1xyXG4gICAgfVxyXG4gICAgLnRhYi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgeyBjb2xvcjogI2NiZDVlMTsgfVxyXG4gICAgLnRhYi1idG4uYWN0aXZlIHsgY29sb3I6ICM2MGE1ZmE7IGJvcmRlci1ib3R0b20tY29sb3I6ICMzYjgyZjY7IH1cclxuICAgIC50YWItYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9XHJcbiAgICAudGFiLWJhZGdlIHtcclxuICAgICAgYmFja2dyb3VuZDogIzMzNDE1NTtcclxuICAgICAgY29sb3I6ICM5NGEzYjg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgICAgcGFkZGluZzogMXB4IDVweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgfVxyXG4gICAgLnRhYi1iYWRnZS5uZXcgeyBiYWNrZ3JvdW5kOiAjN2MzYWVkOyBjb2xvcjogI2U5ZDVmZjsgfVxyXG5cclxuICAgIC50YWItY29udGVudCB7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XHJcbiAgICB9XHJcbiAgICAudGFiLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDVweDsgfVxyXG4gICAgLnRhYi1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XHJcbiAgICAudGFiLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsgYmFja2dyb3VuZDogIzMzNDE1NTsgYm9yZGVyLXJhZGl1czogM3B4OyB9XHJcblxyXG4gICAgLnNlc3Npb25zLWxpc3QgeyBwYWRkaW5nOiAxMHB4IDE0cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB9XHJcbiAgICAuc2Vzc2lvbi1jYXJkIHtcclxuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzNDE1NTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgfVxyXG4gICAgLnNlc3Npb24tY2FyZC1oZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcclxuICAgIH1cclxuICAgIC5zZXNzaW9uLW5hbWUgeyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogI2YxZjVmOTsgZm9udC1zaXplOiAxM3B4OyB9XHJcbiAgICAuc2Vzc2lvbi1tZXRhIHsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogIzY0NzQ4YjsgfVxyXG4gICAgLnNlc3Npb24tY2FyZC1hY3Rpb25zIHsgZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7IH1cclxuICAgIC5zbS1idG4ge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGNvbG9yOiAjY2JkNWUxO1xyXG4gICAgICBwYWRkaW5nOiA0cHggMTBweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgICBmb250LXNpemU6IDExcHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cztcclxuICAgIH1cclxuICAgIC5zbS1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAjNDc1NTY5OyB9XHJcbiAgICAuc20tYnRuLmRhbmdlciB7IGNvbG9yOiAjZmNhNWE1OyB9XHJcbiAgICAuc20tYnRuLmRhbmdlcjpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMjIwLDM4LDM4LDAuMik7IH1cclxuXHJcbiAgICAucmVzaXplLWhhbmRsZSB7XHJcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgICAgY29sb3I6ICMzMzQxNTU7XHJcbiAgICAgIGN1cnNvcjogbnMtcmVzaXplO1xyXG4gICAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDJweDtcclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XHJcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgfVxyXG4gICAgLnJlc2l6ZS1oYW5kbGU6aG92ZXIgeyBjb2xvcjogIzY0NzQ4YjsgfVxyXG4gIGBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVidWdQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICByZWNvcmRlciA9IGluamVjdChSZWNvcmRlclNlcnZpY2UpO1xyXG4gIGFpU2VydmljZSA9IGluamVjdChBaUdlbmVyYXRvclNlcnZpY2UpO1xyXG4gIHJyd2ViID0gaW5qZWN0KFJyd2ViUmVjb3JkZXJTZXJ2aWNlKTtcclxuXHJcbiAgcGFuZWxPcGVuID0gc2lnbmFsKGZhbHNlKTtcclxuICBhY3RpdmVUYWIgPSBzaWduYWw8UGFuZWxUYWI+KCdhY3Rpb25zJyk7XHJcbiAgcG9zaXRpb24gPSBzaWduYWw8UGFuZWxQb3NpdGlvbj4oJ2JvdHRvbS1yaWdodCcpO1xyXG4gIHBhbmVsV2lkdGggPSBzaWduYWwoNDIwKTtcclxuICBzaG93U2V0dGluZ3MgPSBzaWduYWwoZmFsc2UpO1xyXG4gIHNlc3Npb25OYW1lID0gJyc7XHJcbiAgc2Vzc2lvbkRlc2MgPSAnJztcclxuXHJcbiAgaGFzQWN0aW9ucyA9IGNvbXB1dGVkKFxyXG4gICAgKCkgPT4gKHRoaXMucmVjb3JkZXIuY3VycmVudFNlc3Npb24oKT8uYWN0aW9ucy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICAgICAodGhpcy5yZWNvcmRlci5zZXNzaW9ucygpLmxlbmd0aCA+IDApXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSByZXNpemluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVzaXplU3RhcnRZID0gMDtcclxuICBwcml2YXRlIHJlc2l6ZVN0YXJ0SCA9IDA7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gS2V5Ym9hcmQgc2hvcnRjdXQ6IEN0cmwrU2hpZnQrRFxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlSG90a2V5KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlSG90a2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSG90a2V5ID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgIGlmIChlLmN0cmxLZXkgJiYgZS5zaGlmdEtleSAmJiBlLmtleSA9PT0gJ0QnKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy50b2dnbGVQYW5lbCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnUicpIHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBpZiAodGhpcy5yZWNvcmRlci5pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhbmVsT3Blbi51cGRhdGUodiA9PiAhdik7XHJcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4oKSAmJiAhdGhpcy5yZWNvcmRlci5jdXJyZW50U2Vzc2lvbigpKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3ljbGVQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uczogUGFuZWxQb3NpdGlvbltdID0gWydib3R0b20tcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAndG9wLXJpZ2h0JywgJ3RvcC1sZWZ0J107XHJcbiAgICBjb25zdCBpZHggPSBwb3NpdGlvbnMuaW5kZXhPZih0aGlzLnBvc2l0aW9uKCkpO1xyXG4gICAgdGhpcy5wb3NpdGlvbi5zZXQocG9zaXRpb25zWyhpZHggKyAxKSAlIHBvc2l0aW9ucy5sZW5ndGhdKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0UmVjb3JkaW5nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWNvcmRlci5zdGFydFJlY29yZGluZyhcclxuICAgICAgdGhpcy5zZXNzaW9uTmFtZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHRoaXMuc2Vzc2lvbkRlc2MgfHwgdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gICAgLy8gU3RhcnQgcnJ3ZWIgaW4gcGFyYWxsZWwgZm9yIHZpc3VhbCByZXBsYXlcclxuICAgIHRoaXMucnJ3ZWIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgIHRoaXMuYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpO1xyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgIHRoaXMucnJ3ZWIuc3RvcFJlY29yZGluZygpO1xyXG4gICAgaWYgKHNlc3Npb24pIHtcclxuICAgICAgdGhpcy5hY3RpdmVUYWIuc2V0KCdhY3Rpb25zJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZW5lcmF0ZVRlc3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5yZWNvcmRlci5jdXJyZW50U2Vzc2lvbigpID8/IHRoaXMucmVjb3JkZXIuc2Vzc2lvbnMoKS5hdCgtMSk7XHJcbiAgICBpZiAoIXNlc3Npb24pIHJldHVybjtcclxuICAgIGF3YWl0IHRoaXMuYWlTZXJ2aWNlLmdlbmVyYXRlQ3lwcmVzc1Rlc3Qoc2Vzc2lvbik7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQoJ3Rlc3QnKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRBbmRHZW5lcmF0ZShzZXNzaW9uOiBSZWNvcmRpbmdTZXNzaW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmFpU2VydmljZS5nZW5lcmF0ZUN5cHJlc3NUZXN0KHNlc3Npb24pO1xyXG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KCd0ZXN0Jyk7XHJcbiAgfVxyXG5cclxuICAvLyBEcmFnIHRvIHJlcG9zaXRpb25cclxuICBzdGFydERyYWcoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnYnV0dG9uJykpIHJldHVybjtcclxuICAgIGNvbnN0IHBhbmVsID0gKGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudCE7XHJcbiAgICBjb25zdCBzdGFydFggPSBlLmNsaWVudFggLSBwYW5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgY29uc3Qgc3RhcnRZID0gZS5jbGllbnRZIC0gcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG5cclxuICAgIGNvbnN0IG9uTW92ZSA9IChldjogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gYCR7ZXYuY2xpZW50WCAtIHN0YXJ0WH1weGA7XHJcbiAgICAgIHBhbmVsLnN0eWxlLnRvcCAgPSBgJHtldi5jbGllbnRZIC0gc3RhcnRZfXB4YDtcclxuICAgICAgcGFuZWwuc3R5bGUucmlnaHQgPSAnYXV0byc7XHJcbiAgICAgIHBhbmVsLnN0eWxlLmJvdHRvbSA9ICdhdXRvJztcclxuICAgIH07XHJcbiAgICBjb25zdCBvblVwID0gKCkgPT4ge1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XHJcbiAgICB9O1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcclxuICB9XHJcblxyXG4gIC8vIFJlc2l6ZSBoZWlnaHRcclxuICBzdGFydFJlc2l6ZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBwYW5lbCA9IChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQhO1xyXG4gICAgdGhpcy5yZXNpemVTdGFydFkgPSBlLmNsaWVudFk7XHJcbiAgICB0aGlzLnJlc2l6ZVN0YXJ0SCA9IHBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuXHJcbiAgICBjb25zdCBvbk1vdmUgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgbmV3SCA9IE1hdGgubWF4KDI1MCwgdGhpcy5yZXNpemVTdGFydEggKyAoZXYuY2xpZW50WSAtIHRoaXMucmVzaXplU3RhcnRZKSk7XHJcbiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IGAke25ld0h9cHhgO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IG9uVXAgPSAoKSA9PiB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcclxuICAgIH07XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxufVxyXG4iXX0=
|