bways-report 0.1.3 → 0.1.5
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/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/index.mjs +2 -1
- package/esm2022/lib/core/services/report-storage.service.mjs +63 -0
- package/esm2022/lib/core/tokens/index.mjs +2 -1
- package/esm2022/lib/core/tokens/storage.token.mjs +128 -0
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +16 -44
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +5 -352
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +6 -1011
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +66 -683
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +3 -789
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +14 -480
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +88 -25
- package/esm2022/lib/features/designer/designer.component.mjs +194 -65
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +11 -3
- package/esm2022/lib/features/runtime/report-execution.service.mjs +1 -9
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +223 -24
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +11 -3
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +11 -3
- package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
- package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
- package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +3 -3
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +4 -422
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +23 -1
- package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
- package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
- package/fesm2022/bways-report.mjs +2094 -5139
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/models/report-grid.model.d.ts +23 -1
- package/lib/core/services/index.d.ts +1 -0
- package/lib/core/services/report-storage.service.d.ts +26 -0
- package/lib/core/tokens/index.d.ts +2 -0
- package/lib/core/tokens/storage.token.d.ts +48 -0
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +1 -0
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +9 -0
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +4 -1
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +5 -1
- package/lib/features/designer/designer.component.d.ts +6 -0
- package/lib/features/runtime/dynamic-renderer.component.d.ts +4 -1
- package/lib/features/runtime/report-grid-bridge.component.d.ts +47 -4
- package/lib/features/runtime/report-runtime.component.d.ts +4 -1
- package/lib/features/runtime/rpt-report.component.d.ts +4 -1
- package/package.json +9 -1
package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, inject, signal, } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, output, signal, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { DesignerStateService } from '../../services/designer-state.service';
|
|
4
4
|
import { ComponentRegistry } from '../../../../core/registry/component-registry';
|
|
@@ -26,6 +26,7 @@ export class PropertyEditorComponent {
|
|
|
26
26
|
definition = this.designerState.definition;
|
|
27
27
|
activeTab = this.designerState.activeTab;
|
|
28
28
|
selectedComponent = this.designerState.selectedComponent;
|
|
29
|
+
collapseRequested = output();
|
|
29
30
|
maxColumns = computed(() => this.definition().layout.columns || 12);
|
|
30
31
|
allComponents = computed(() => this.definition().components);
|
|
31
32
|
propertySchema = computed(() => {
|
|
@@ -44,6 +45,12 @@ export class PropertyEditorComponent {
|
|
|
44
45
|
deselect() {
|
|
45
46
|
this.designerState.selectComponent(null);
|
|
46
47
|
}
|
|
48
|
+
duplicateComponent(id) {
|
|
49
|
+
this.designerState.duplicateComponent(id);
|
|
50
|
+
}
|
|
51
|
+
deleteComponent(id) {
|
|
52
|
+
this.designerState.removeComponent(id);
|
|
53
|
+
}
|
|
47
54
|
updateComp(field, value) {
|
|
48
55
|
const comp = this.selectedComponent();
|
|
49
56
|
if (comp) {
|
|
@@ -107,6 +114,9 @@ export class PropertyEditorComponent {
|
|
|
107
114
|
pageSize: 25,
|
|
108
115
|
showRowNumbers: true,
|
|
109
116
|
showFooter: true,
|
|
117
|
+
sideBar: true,
|
|
118
|
+
globalSearch: true,
|
|
119
|
+
statusBar: true,
|
|
110
120
|
},
|
|
111
121
|
};
|
|
112
122
|
this.designerState.updateGridSettings(defaultGrid);
|
|
@@ -284,245 +294,7 @@ export class PropertyEditorComponent {
|
|
|
284
294
|
return comp.validation?.required ? 'Required' : 'Optional';
|
|
285
295
|
}
|
|
286
296
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
287
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", ngImport: i0, template: `
|
|
288
|
-
<div class="editor-container">
|
|
289
|
-
<!-- Editor Header & Tabs -->
|
|
290
|
-
<div class="editor-tabs">
|
|
291
|
-
<button
|
|
292
|
-
type="button"
|
|
293
|
-
class="tab-btn"
|
|
294
|
-
[class.active]="activeTab() === 'properties'"
|
|
295
|
-
(click)="setTab('properties')"
|
|
296
|
-
[disabled]="!selectedComponent()"
|
|
297
|
-
>
|
|
298
|
-
<rpt-icon name="edit" [size]="13" />
|
|
299
|
-
<span>Properties</span>
|
|
300
|
-
</button>
|
|
301
|
-
<button
|
|
302
|
-
type="button"
|
|
303
|
-
class="tab-btn"
|
|
304
|
-
[class.active]="activeTab() === 'report'"
|
|
305
|
-
(click)="setTab('report')"
|
|
306
|
-
>
|
|
307
|
-
<rpt-icon name="design" [size]="13" />
|
|
308
|
-
<span>Layout</span>
|
|
309
|
-
</button>
|
|
310
|
-
<button
|
|
311
|
-
type="button"
|
|
312
|
-
class="tab-btn"
|
|
313
|
-
[class.active]="activeTab() === 'grid'"
|
|
314
|
-
(click)="setTab('grid')"
|
|
315
|
-
>
|
|
316
|
-
<rpt-icon name="table" [size]="13" />
|
|
317
|
-
<span>Grid</span>
|
|
318
|
-
</button>
|
|
319
|
-
</div>
|
|
320
|
-
|
|
321
|
-
<!-- Editor Body -->
|
|
322
|
-
<div class="editor-body">
|
|
323
|
-
<!-- 1. COMPONENT PROPERTIES TAB -->
|
|
324
|
-
@if (activeTab() === 'properties') {
|
|
325
|
-
@if (selectedComponent(); as comp) {
|
|
326
|
-
<div class="component-sections-wrapper">
|
|
327
|
-
<!-- Component Identifier Header (Pinned at Top) -->
|
|
328
|
-
<div class="comp-badge-header">
|
|
329
|
-
<div class="badge-title">
|
|
330
|
-
<span class="badge-type">{{ comp.type }}</span>
|
|
331
|
-
<span class="badge-id">{{ comp.id }}</span>
|
|
332
|
-
</div>
|
|
333
|
-
<button type="button" class="btn-deselect" (click)="deselect()" title="Deselect component">
|
|
334
|
-
<rpt-icon name="close" [size]="13" />
|
|
335
|
-
</button>
|
|
336
|
-
</div>
|
|
337
|
-
|
|
338
|
-
<!-- Accordion Container -->
|
|
339
|
-
<div class="property-accordion">
|
|
340
|
-
<!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->
|
|
341
|
-
@if (comp.type === 'dropdown') {
|
|
342
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('datasource')">
|
|
343
|
-
<button
|
|
344
|
-
type="button"
|
|
345
|
-
class="accordion-header"
|
|
346
|
-
(click)="toggleSection('datasource')"
|
|
347
|
-
title="Toggle Options Data Source section"
|
|
348
|
-
>
|
|
349
|
-
<div class="header-left">
|
|
350
|
-
<rpt-icon name="database" [size]="14" />
|
|
351
|
-
<span class="header-title">Options Data Source</span>
|
|
352
|
-
<span class="header-badge">{{ getDatasourceBadge(comp) }}</span>
|
|
353
|
-
</div>
|
|
354
|
-
<div class="header-right">
|
|
355
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
356
|
-
</div>
|
|
357
|
-
</button>
|
|
358
|
-
@if (isSectionExpanded('datasource')) {
|
|
359
|
-
<div class="accordion-content">
|
|
360
|
-
<rpt-property-editor-datasource
|
|
361
|
-
[comp]="comp"
|
|
362
|
-
[allComponents]="allComponents()"
|
|
363
|
-
(updateDataSource)="updateCompDataSource(comp.id, $event)"
|
|
364
|
-
(updateProperty)="updateProp(comp.id, $event.key, $event.value)"
|
|
365
|
-
/>
|
|
366
|
-
</div>
|
|
367
|
-
}
|
|
368
|
-
</div>
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
<!-- BUTTON ACTION ACCORDION (FIRST for Button) -->
|
|
372
|
-
@if (comp.type === 'button') {
|
|
373
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('action')">
|
|
374
|
-
<button
|
|
375
|
-
type="button"
|
|
376
|
-
class="accordion-header"
|
|
377
|
-
(click)="toggleSection('action')"
|
|
378
|
-
title="Toggle Button Action section"
|
|
379
|
-
>
|
|
380
|
-
<div class="header-left">
|
|
381
|
-
<rpt-icon name="lightning" [size]="14" />
|
|
382
|
-
<span class="header-title">Button Action</span>
|
|
383
|
-
<span class="header-badge">{{ getActionBadge(comp) }}</span>
|
|
384
|
-
</div>
|
|
385
|
-
<div class="header-right">
|
|
386
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
387
|
-
</div>
|
|
388
|
-
</button>
|
|
389
|
-
@if (isSectionExpanded('action')) {
|
|
390
|
-
<div class="accordion-content">
|
|
391
|
-
<rpt-property-editor-action
|
|
392
|
-
[comp]="comp"
|
|
393
|
-
(updateProperty)="updateProp(comp.id, $event.key, $event.value)"
|
|
394
|
-
/>
|
|
395
|
-
</div>
|
|
396
|
-
}
|
|
397
|
-
</div>
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
<!-- 2. GENERAL PROPERTIES ACCORDION -->
|
|
401
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('general')">
|
|
402
|
-
<button
|
|
403
|
-
type="button"
|
|
404
|
-
class="accordion-header"
|
|
405
|
-
(click)="toggleSection('general')"
|
|
406
|
-
title="Toggle General Properties section"
|
|
407
|
-
>
|
|
408
|
-
<div class="header-left">
|
|
409
|
-
<rpt-icon name="edit" [size]="14" />
|
|
410
|
-
<span class="header-title">General Properties</span>
|
|
411
|
-
@if (comp.label) {
|
|
412
|
-
<span class="header-badge">{{ comp.label }}</span>
|
|
413
|
-
}
|
|
414
|
-
</div>
|
|
415
|
-
<div class="header-right">
|
|
416
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
417
|
-
</div>
|
|
418
|
-
</button>
|
|
419
|
-
@if (isSectionExpanded('general')) {
|
|
420
|
-
<div class="accordion-content">
|
|
421
|
-
<rpt-property-editor-general
|
|
422
|
-
[comp]="comp"
|
|
423
|
-
[propertySchema]="propertySchema()"
|
|
424
|
-
(update)="updateComp($event.field, $event.value)"
|
|
425
|
-
(updateProperty)="updateProp(comp.id, $event.key, $event.value)"
|
|
426
|
-
(deselect)="deselect()"
|
|
427
|
-
/>
|
|
428
|
-
</div>
|
|
429
|
-
}
|
|
430
|
-
</div>
|
|
431
|
-
|
|
432
|
-
<!-- 3. LAYOUT & GRID ACCORDION -->
|
|
433
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('layout')">
|
|
434
|
-
<button
|
|
435
|
-
type="button"
|
|
436
|
-
class="accordion-header"
|
|
437
|
-
(click)="toggleSection('layout')"
|
|
438
|
-
title="Toggle Layout & Dimensions section"
|
|
439
|
-
>
|
|
440
|
-
<div class="header-left">
|
|
441
|
-
<rpt-icon name="design" [size]="14" />
|
|
442
|
-
<span class="header-title">Layout & Grid</span>
|
|
443
|
-
<span class="header-badge">{{ getLayoutBadge(comp) }}</span>
|
|
444
|
-
</div>
|
|
445
|
-
<div class="header-right">
|
|
446
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
447
|
-
</div>
|
|
448
|
-
</button>
|
|
449
|
-
@if (isSectionExpanded('layout')) {
|
|
450
|
-
<div class="accordion-content">
|
|
451
|
-
<rpt-property-editor-layout
|
|
452
|
-
[comp]="comp"
|
|
453
|
-
[maxColumns]="maxColumns()"
|
|
454
|
-
(updateLayout)="updateLayout($event.key, $event.value)"
|
|
455
|
-
(updateHeight)="updateComponentHeight($event)"
|
|
456
|
-
(resetDimensions)="resetComponentDimensions(comp.id, comp.type)"
|
|
457
|
-
/>
|
|
458
|
-
</div>
|
|
459
|
-
}
|
|
460
|
-
</div>
|
|
461
|
-
|
|
462
|
-
<!-- 4. VALIDATION ACCORDION -->
|
|
463
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('validation')">
|
|
464
|
-
<button
|
|
465
|
-
type="button"
|
|
466
|
-
class="accordion-header"
|
|
467
|
-
(click)="toggleSection('validation')"
|
|
468
|
-
title="Toggle Validation Rules section"
|
|
469
|
-
>
|
|
470
|
-
<div class="header-left">
|
|
471
|
-
<rpt-icon name="check" [size]="14" />
|
|
472
|
-
<span class="header-title">Validation Rules</span>
|
|
473
|
-
<span class="header-badge">{{ getValidationBadge(comp) }}</span>
|
|
474
|
-
</div>
|
|
475
|
-
<div class="header-right">
|
|
476
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
477
|
-
</div>
|
|
478
|
-
</button>
|
|
479
|
-
@if (isSectionExpanded('validation')) {
|
|
480
|
-
<div class="accordion-content">
|
|
481
|
-
<rpt-property-editor-validation
|
|
482
|
-
[comp]="comp"
|
|
483
|
-
(updateValidation)="updateValidation($event.key, $event.value)"
|
|
484
|
-
/>
|
|
485
|
-
</div>
|
|
486
|
-
}
|
|
487
|
-
</div>
|
|
488
|
-
</div>
|
|
489
|
-
</div>
|
|
490
|
-
} @else {
|
|
491
|
-
<div class="empty-selection">
|
|
492
|
-
<div class="empty-icon-wrap">
|
|
493
|
-
<rpt-icon name="cursor" [size]="24" color="#64748b" />
|
|
494
|
-
</div>
|
|
495
|
-
<p class="empty-text">Select a component on the canvas to configure its properties.</p>
|
|
496
|
-
</div>
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
<!-- 2. REPORT SETTINGS TAB -->
|
|
501
|
-
@if (activeTab() === 'report') {
|
|
502
|
-
<rpt-property-editor-report
|
|
503
|
-
[definition]="definition()"
|
|
504
|
-
(updateReport)="updateReport($event.field, $event.value)"
|
|
505
|
-
(updateLayout)="updateLayoutProp($event.field, $event.value)"
|
|
506
|
-
/>
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
<!-- 3. RESULT GRID SETTINGS TAB -->
|
|
510
|
-
@if (activeTab() === 'grid') {
|
|
511
|
-
<rpt-property-editor-grid
|
|
512
|
-
[grid]="definition().grid"
|
|
513
|
-
(addGrid)="addResultGrid()"
|
|
514
|
-
(removeGrid)="removeResultGrid()"
|
|
515
|
-
(addColumn)="addColumn()"
|
|
516
|
-
(autoDetectColumns)="autoDetectGridColumns()"
|
|
517
|
-
(removeColumn)="removeColumn($event)"
|
|
518
|
-
(updateColumn)="updateColumn($event.index, $event.field, $event.value)"
|
|
519
|
-
(updateOption)="updateGridOption($event.field, $event.value)"
|
|
520
|
-
(updateRowClickAction)="updateGridRowClickAction($event)"
|
|
521
|
-
/>
|
|
522
|
-
}
|
|
523
|
-
</div>
|
|
524
|
-
</div>
|
|
525
|
-
`, isInline: true, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.btn-deselect{background:none;border:none;display:flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
297
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: " <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->\n @if (comp.type === 'dropdown') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
526
298
|
}
|
|
527
299
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, decorators: [{
|
|
528
300
|
type: Component,
|
|
@@ -536,244 +308,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
536
308
|
PropertyEditorReportComponent,
|
|
537
309
|
PropertyEditorDatasourceComponent,
|
|
538
310
|
PropertyEditorActionComponent,
|
|
539
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
540
|
-
<div class="editor-container">
|
|
541
|
-
<!-- Editor Header & Tabs -->
|
|
542
|
-
<div class="editor-tabs">
|
|
543
|
-
<button
|
|
544
|
-
type="button"
|
|
545
|
-
class="tab-btn"
|
|
546
|
-
[class.active]="activeTab() === 'properties'"
|
|
547
|
-
(click)="setTab('properties')"
|
|
548
|
-
[disabled]="!selectedComponent()"
|
|
549
|
-
>
|
|
550
|
-
<rpt-icon name="edit" [size]="13" />
|
|
551
|
-
<span>Properties</span>
|
|
552
|
-
</button>
|
|
553
|
-
<button
|
|
554
|
-
type="button"
|
|
555
|
-
class="tab-btn"
|
|
556
|
-
[class.active]="activeTab() === 'report'"
|
|
557
|
-
(click)="setTab('report')"
|
|
558
|
-
>
|
|
559
|
-
<rpt-icon name="design" [size]="13" />
|
|
560
|
-
<span>Layout</span>
|
|
561
|
-
</button>
|
|
562
|
-
<button
|
|
563
|
-
type="button"
|
|
564
|
-
class="tab-btn"
|
|
565
|
-
[class.active]="activeTab() === 'grid'"
|
|
566
|
-
(click)="setTab('grid')"
|
|
567
|
-
>
|
|
568
|
-
<rpt-icon name="table" [size]="13" />
|
|
569
|
-
<span>Grid</span>
|
|
570
|
-
</button>
|
|
571
|
-
</div>
|
|
572
|
-
|
|
573
|
-
<!-- Editor Body -->
|
|
574
|
-
<div class="editor-body">
|
|
575
|
-
<!-- 1. COMPONENT PROPERTIES TAB -->
|
|
576
|
-
@if (activeTab() === 'properties') {
|
|
577
|
-
@if (selectedComponent(); as comp) {
|
|
578
|
-
<div class="component-sections-wrapper">
|
|
579
|
-
<!-- Component Identifier Header (Pinned at Top) -->
|
|
580
|
-
<div class="comp-badge-header">
|
|
581
|
-
<div class="badge-title">
|
|
582
|
-
<span class="badge-type">{{ comp.type }}</span>
|
|
583
|
-
<span class="badge-id">{{ comp.id }}</span>
|
|
584
|
-
</div>
|
|
585
|
-
<button type="button" class="btn-deselect" (click)="deselect()" title="Deselect component">
|
|
586
|
-
<rpt-icon name="close" [size]="13" />
|
|
587
|
-
</button>
|
|
588
|
-
</div>
|
|
589
|
-
|
|
590
|
-
<!-- Accordion Container -->
|
|
591
|
-
<div class="property-accordion">
|
|
592
|
-
<!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->
|
|
593
|
-
@if (comp.type === 'dropdown') {
|
|
594
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('datasource')">
|
|
595
|
-
<button
|
|
596
|
-
type="button"
|
|
597
|
-
class="accordion-header"
|
|
598
|
-
(click)="toggleSection('datasource')"
|
|
599
|
-
title="Toggle Options Data Source section"
|
|
600
|
-
>
|
|
601
|
-
<div class="header-left">
|
|
602
|
-
<rpt-icon name="database" [size]="14" />
|
|
603
|
-
<span class="header-title">Options Data Source</span>
|
|
604
|
-
<span class="header-badge">{{ getDatasourceBadge(comp) }}</span>
|
|
605
|
-
</div>
|
|
606
|
-
<div class="header-right">
|
|
607
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
608
|
-
</div>
|
|
609
|
-
</button>
|
|
610
|
-
@if (isSectionExpanded('datasource')) {
|
|
611
|
-
<div class="accordion-content">
|
|
612
|
-
<rpt-property-editor-datasource
|
|
613
|
-
[comp]="comp"
|
|
614
|
-
[allComponents]="allComponents()"
|
|
615
|
-
(updateDataSource)="updateCompDataSource(comp.id, $event)"
|
|
616
|
-
(updateProperty)="updateProp(comp.id, $event.key, $event.value)"
|
|
617
|
-
/>
|
|
618
|
-
</div>
|
|
619
|
-
}
|
|
620
|
-
</div>
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
<!-- BUTTON ACTION ACCORDION (FIRST for Button) -->
|
|
624
|
-
@if (comp.type === 'button') {
|
|
625
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('action')">
|
|
626
|
-
<button
|
|
627
|
-
type="button"
|
|
628
|
-
class="accordion-header"
|
|
629
|
-
(click)="toggleSection('action')"
|
|
630
|
-
title="Toggle Button Action section"
|
|
631
|
-
>
|
|
632
|
-
<div class="header-left">
|
|
633
|
-
<rpt-icon name="lightning" [size]="14" />
|
|
634
|
-
<span class="header-title">Button Action</span>
|
|
635
|
-
<span class="header-badge">{{ getActionBadge(comp) }}</span>
|
|
636
|
-
</div>
|
|
637
|
-
<div class="header-right">
|
|
638
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
639
|
-
</div>
|
|
640
|
-
</button>
|
|
641
|
-
@if (isSectionExpanded('action')) {
|
|
642
|
-
<div class="accordion-content">
|
|
643
|
-
<rpt-property-editor-action
|
|
644
|
-
[comp]="comp"
|
|
645
|
-
(updateProperty)="updateProp(comp.id, $event.key, $event.value)"
|
|
646
|
-
/>
|
|
647
|
-
</div>
|
|
648
|
-
}
|
|
649
|
-
</div>
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
<!-- 2. GENERAL PROPERTIES ACCORDION -->
|
|
653
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('general')">
|
|
654
|
-
<button
|
|
655
|
-
type="button"
|
|
656
|
-
class="accordion-header"
|
|
657
|
-
(click)="toggleSection('general')"
|
|
658
|
-
title="Toggle General Properties section"
|
|
659
|
-
>
|
|
660
|
-
<div class="header-left">
|
|
661
|
-
<rpt-icon name="edit" [size]="14" />
|
|
662
|
-
<span class="header-title">General Properties</span>
|
|
663
|
-
@if (comp.label) {
|
|
664
|
-
<span class="header-badge">{{ comp.label }}</span>
|
|
665
|
-
}
|
|
666
|
-
</div>
|
|
667
|
-
<div class="header-right">
|
|
668
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
669
|
-
</div>
|
|
670
|
-
</button>
|
|
671
|
-
@if (isSectionExpanded('general')) {
|
|
672
|
-
<div class="accordion-content">
|
|
673
|
-
<rpt-property-editor-general
|
|
674
|
-
[comp]="comp"
|
|
675
|
-
[propertySchema]="propertySchema()"
|
|
676
|
-
(update)="updateComp($event.field, $event.value)"
|
|
677
|
-
(updateProperty)="updateProp(comp.id, $event.key, $event.value)"
|
|
678
|
-
(deselect)="deselect()"
|
|
679
|
-
/>
|
|
680
|
-
</div>
|
|
681
|
-
}
|
|
682
|
-
</div>
|
|
683
|
-
|
|
684
|
-
<!-- 3. LAYOUT & GRID ACCORDION -->
|
|
685
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('layout')">
|
|
686
|
-
<button
|
|
687
|
-
type="button"
|
|
688
|
-
class="accordion-header"
|
|
689
|
-
(click)="toggleSection('layout')"
|
|
690
|
-
title="Toggle Layout & Dimensions section"
|
|
691
|
-
>
|
|
692
|
-
<div class="header-left">
|
|
693
|
-
<rpt-icon name="design" [size]="14" />
|
|
694
|
-
<span class="header-title">Layout & Grid</span>
|
|
695
|
-
<span class="header-badge">{{ getLayoutBadge(comp) }}</span>
|
|
696
|
-
</div>
|
|
697
|
-
<div class="header-right">
|
|
698
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
699
|
-
</div>
|
|
700
|
-
</button>
|
|
701
|
-
@if (isSectionExpanded('layout')) {
|
|
702
|
-
<div class="accordion-content">
|
|
703
|
-
<rpt-property-editor-layout
|
|
704
|
-
[comp]="comp"
|
|
705
|
-
[maxColumns]="maxColumns()"
|
|
706
|
-
(updateLayout)="updateLayout($event.key, $event.value)"
|
|
707
|
-
(updateHeight)="updateComponentHeight($event)"
|
|
708
|
-
(resetDimensions)="resetComponentDimensions(comp.id, comp.type)"
|
|
709
|
-
/>
|
|
710
|
-
</div>
|
|
711
|
-
}
|
|
712
|
-
</div>
|
|
713
|
-
|
|
714
|
-
<!-- 4. VALIDATION ACCORDION -->
|
|
715
|
-
<div class="accordion-item" [class.is-expanded]="isSectionExpanded('validation')">
|
|
716
|
-
<button
|
|
717
|
-
type="button"
|
|
718
|
-
class="accordion-header"
|
|
719
|
-
(click)="toggleSection('validation')"
|
|
720
|
-
title="Toggle Validation Rules section"
|
|
721
|
-
>
|
|
722
|
-
<div class="header-left">
|
|
723
|
-
<rpt-icon name="check" [size]="14" />
|
|
724
|
-
<span class="header-title">Validation Rules</span>
|
|
725
|
-
<span class="header-badge">{{ getValidationBadge(comp) }}</span>
|
|
726
|
-
</div>
|
|
727
|
-
<div class="header-right">
|
|
728
|
-
<rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
|
|
729
|
-
</div>
|
|
730
|
-
</button>
|
|
731
|
-
@if (isSectionExpanded('validation')) {
|
|
732
|
-
<div class="accordion-content">
|
|
733
|
-
<rpt-property-editor-validation
|
|
734
|
-
[comp]="comp"
|
|
735
|
-
(updateValidation)="updateValidation($event.key, $event.value)"
|
|
736
|
-
/>
|
|
737
|
-
</div>
|
|
738
|
-
}
|
|
739
|
-
</div>
|
|
740
|
-
</div>
|
|
741
|
-
</div>
|
|
742
|
-
} @else {
|
|
743
|
-
<div class="empty-selection">
|
|
744
|
-
<div class="empty-icon-wrap">
|
|
745
|
-
<rpt-icon name="cursor" [size]="24" color="#64748b" />
|
|
746
|
-
</div>
|
|
747
|
-
<p class="empty-text">Select a component on the canvas to configure its properties.</p>
|
|
748
|
-
</div>
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
<!-- 2. REPORT SETTINGS TAB -->
|
|
753
|
-
@if (activeTab() === 'report') {
|
|
754
|
-
<rpt-property-editor-report
|
|
755
|
-
[definition]="definition()"
|
|
756
|
-
(updateReport)="updateReport($event.field, $event.value)"
|
|
757
|
-
(updateLayout)="updateLayoutProp($event.field, $event.value)"
|
|
758
|
-
/>
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
<!-- 3. RESULT GRID SETTINGS TAB -->
|
|
762
|
-
@if (activeTab() === 'grid') {
|
|
763
|
-
<rpt-property-editor-grid
|
|
764
|
-
[grid]="definition().grid"
|
|
765
|
-
(addGrid)="addResultGrid()"
|
|
766
|
-
(removeGrid)="removeResultGrid()"
|
|
767
|
-
(addColumn)="addColumn()"
|
|
768
|
-
(autoDetectColumns)="autoDetectGridColumns()"
|
|
769
|
-
(removeColumn)="removeColumn($event)"
|
|
770
|
-
(updateColumn)="updateColumn($event.index, $event.field, $event.value)"
|
|
771
|
-
(updateOption)="updateGridOption($event.field, $event.value)"
|
|
772
|
-
(updateRowClickAction)="updateGridRowClickAction($event)"
|
|
773
|
-
/>
|
|
774
|
-
}
|
|
775
|
-
</div>
|
|
776
|
-
</div>
|
|
777
|
-
`, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.btn-deselect{background:none;border:none;display:flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
|
|
311
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: " <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->\n @if (comp.type === 'dropdown') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>", styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
|
|
778
312
|
}] });
|
|
779
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBcUIsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUlqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUtuRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7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dmN4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThPVCw4NEhBelBDLFlBQVksK0JBQ1osZ0JBQWdCLHVHQUNoQiw4QkFBOEIsK0pBQzlCLDZCQUE2QixxS0FDN0IsaUNBQWlDLDRIQUNqQywyQkFBMkIscU9BQzNCLDZCQUE2QiwwSUFDN0IsaUNBQWlDLCtKQUNqQyw2QkFBNkI7OzRGQTBjcEIsdUJBQXVCO2tCQXRkbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osZ0JBQWdCO3dCQUNoQiw4QkFBOEI7d0JBQzlCLDZCQUE2Qjt3QkFDN0IsaUNBQWlDO3dCQUNqQywyQkFBMkI7d0JBQzNCLDZCQUE2Qjt3QkFDN0IsaUNBQWlDO3dCQUNqQyw2QkFBNkI7cUJBQzlCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOE9UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZXNpZ25lckFjdGl2ZVRhYiwgRGVzaWduZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZXNpZ25lci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9jb21wb25lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHsgUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9wcm9wZXJ0eS1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudExheW91dERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtbGF5b3V0Lm1vZGVsJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EZWZpbml0aW9uLCBHcmlkUm93Q2xpY2tBY3Rpb24sIFJlcG9ydEdyaWREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckdlbmVyYWxDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1nZW5lcmFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckxheW91dENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWxheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JWYWxpZGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItdmFsaWRhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1yZXBvcnQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yRGF0YXNvdXJjZUNvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yQWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItYWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhU291cmNlRGVmaW5pdGlvbixcbiAgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgaHVtYW5pemVJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9pZGVudGlmaWVyLWh1bWFuaXplcic7XG5cbi8qKlxuICogUHJvcGVydHkgRWRpdG9yIGNvb3JkaW5hdG9yIGNvbXBvbmVudC5cbiAqXG4gKiBEZWNvbXBvc2VkIGludG8gZm9jdXNlZCBjaGlsZCBwcmVzZW50YXRpb25hbCBjb21wb25lbnRzIHBlciBSdWxlIDE4ICYgMTkgKENvbXBvc2l0aW9uIE92ZXIgR2lhbnQgQ29tcG9uZW50cylcbiAqIGFuZCBSdWxlIDMyIChBdm9pZCBHb2QgQ29tcG9uZW50cykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wcm9wZXJ0eS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJwdEljb25Db21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JHZW5lcmFsQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yTGF5b3V0Q29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yVmFsaWRhdGlvbkNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckdyaWRDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JSZXBvcnRDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JEYXRhc291cmNlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yQWN0aW9uQ29tcG9uZW50LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPCEtLSBFZGl0b3IgSGVhZGVyICYgVGFicyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItdGFic1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAncHJvcGVydGllcydcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUYWIoJ3Byb3BlcnRpZXMnKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZENvbXBvbmVudCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZWRpdFwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5Qcm9wZXJ0aWVzPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3JlcG9ydCdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUYWIoJ3JlcG9ydCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZGVzaWduXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPkxheW91dDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdncmlkJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRhYignZ3JpZCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidGFibGVcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+R3JpZDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFZGl0b3IgQm9keSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItYm9keVwiPlxuICAgICAgICA8IS0tIDEuIENPTVBPTkVOVCBQUk9QRVJUSUVTIFRBQiAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnRpZXMnKSB7XG4gICAgICAgICAgQGlmIChzZWxlY3RlZENvbXBvbmVudCgpOyBhcyBjb21wKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXNlY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPCEtLSBDb21wb25lbnQgSWRlbnRpZmllciBIZWFkZXIgKFBpbm5lZCBhdCBUb3ApIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcC1iYWRnZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtdHlwZVwiPnt7IGNvbXAudHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtaWRcIj57eyBjb21wLmlkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWRlc2VsZWN0XCIgKGNsaWNrKT1cImRlc2VsZWN0KClcIiB0aXRsZT1cIkRlc2VsZWN0IGNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjbG9zZVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBBY2NvcmRpb24gQ29udGFpbmVyIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktYWNjb3JkaW9uXCI+XG4gICAgICAgICAgICAgICAgPCEtLSAxLiBPUFRJT05TIERBVEEgU09VUkNFIEFDQ09SRElPTiAoRklSU1QgZm9yIERyb3Bkb3duKSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbXAudHlwZSA9PT0gJ2Ryb3Bkb3duJykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCdkYXRhc291cmNlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2RhdGFzb3VyY2UnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgT3B0aW9ucyBEYXRhIFNvdXJjZSBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJkYXRhYmFzZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+T3B0aW9ucyBEYXRhIFNvdXJjZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWJhZGdlXCI+e3sgZ2V0RGF0YXNvdXJjZUJhZGdlKGNvbXApIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImFjY29yZGlvbi1jaGV2cm9uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWN0aW9uRXhwYW5kZWQoJ2RhdGFzb3VyY2UnKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItZGF0YXNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcF09XCJjb21wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbENvbXBvbmVudHNdPVwiYWxsQ29tcG9uZW50cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZURhdGFTb3VyY2UpPVwidXBkYXRlQ29tcERhdGFTb3VyY2UoY29tcC5pZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVQcm9wZXJ0eSk9XCJ1cGRhdGVQcm9wKGNvbXAuaWQsICRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBCVVRUT04gQUNUSU9OIEFDQ09SRElPTiAoRklSU1QgZm9yIEJ1dHRvbikgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb21wLnR5cGUgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2FjdGlvbicpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdhY3Rpb24nKVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgQnV0dG9uIEFjdGlvbiBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJsaWdodG5pbmdcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkJ1dHRvbiBBY3Rpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldEFjdGlvbkJhZGdlKGNvbXApIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImFjY29yZGlvbi1jaGV2cm9uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWN0aW9uRXhwYW5kZWQoJ2FjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVQcm9wZXJ0eSk9XCJ1cGRhdGVQcm9wKGNvbXAuaWQsICRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSAyLiBHRU5FUkFMIFBST1BFUlRJRVMgQUNDT1JESU9OIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnZ2VuZXJhbCcpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignZ2VuZXJhbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgR2VuZXJhbCBQcm9wZXJ0aWVzIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5HZW5lcmFsIFByb3BlcnRpZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjb21wLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGNvbXAubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImFjY29yZGlvbi1jaGV2cm9uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWN0aW9uRXhwYW5kZWQoJ2dlbmVyYWwnKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1nZW5lcmFsXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcF09XCJjb21wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eVNjaGVtYV09XCJwcm9wZXJ0eVNjaGVtYSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGUpPVwidXBkYXRlQ29tcCgkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZVByb3BlcnR5KT1cInVwZGF0ZVByb3AoY29tcC5pZCwgJGV2ZW50LmtleSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVzZWxlY3QpPVwiZGVzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDMuIExBWU9VVCAmIEdSSUQgQUNDT1JESU9OIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnbGF5b3V0JylcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdsYXlvdXQnKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIExheW91dCAmIERpbWVuc2lvbnMgc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZGVzaWduXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+TGF5b3V0ICYgR3JpZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldExheW91dEJhZGdlKGNvbXApIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImFjY29yZGlvbi1jaGV2cm9uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWN0aW9uRXhwYW5kZWQoJ2xheW91dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWxheW91dFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4Q29sdW1uc109XCJtYXhDb2x1bW5zKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZUxheW91dCk9XCJ1cGRhdGVMYXlvdXQoJGV2ZW50LmtleSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlSGVpZ2h0KT1cInVwZGF0ZUNvbXBvbmVudEhlaWdodCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNldERpbWVuc2lvbnMpPVwicmVzZXRDb21wb25lbnREaW1lbnNpb25zKGNvbXAuaWQsIGNvbXAudHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSA0LiBWQUxJREFUSU9OIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ3ZhbGlkYXRpb24nKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ3ZhbGlkYXRpb24nKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIFZhbGlkYXRpb24gUnVsZXMgc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5WYWxpZGF0aW9uIFJ1bGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWJhZGdlXCI+e3sgZ2V0VmFsaWRhdGlvbkJhZGdlKGNvbXApIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cImFjY29yZGlvbi1jaGV2cm9uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXNTZWN0aW9uRXhwYW5kZWQoJ3ZhbGlkYXRpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci12YWxpZGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcF09XCJjb21wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVWYWxpZGF0aW9uKT1cInVwZGF0ZVZhbGlkYXRpb24oJGV2ZW50LmtleSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc2VsZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1pY29uLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImN1cnNvclwiIFtzaXplXT1cIjI0XCIgY29sb3I9XCIjNjQ3NDhiXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZW1wdHktdGV4dFwiPlNlbGVjdCBhIGNvbXBvbmVudCBvbiB0aGUgY2FudmFzIHRvIGNvbmZpZ3VyZSBpdHMgcHJvcGVydGllcy48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDIuIFJFUE9SVCBTRVRUSU5HUyBUQUIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdyZXBvcnQnKSB7XG4gICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItcmVwb3J0XG4gICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJkZWZpbml0aW9uKClcIlxuICAgICAgICAgICAgKHVwZGF0ZVJlcG9ydCk9XCJ1cGRhdGVSZXBvcnQoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh1cGRhdGVMYXlvdXQpPVwidXBkYXRlTGF5b3V0UHJvcCgkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIDMuIFJFU1VMVCBHUklEIFNFVFRJTkdTIFRBQiAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ2dyaWQnKSB7XG4gICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItZ3JpZFxuICAgICAgICAgICAgW2dyaWRdPVwiZGVmaW5pdGlvbigpLmdyaWRcIlxuICAgICAgICAgICAgKGFkZEdyaWQpPVwiYWRkUmVzdWx0R3JpZCgpXCJcbiAgICAgICAgICAgIChyZW1vdmVHcmlkKT1cInJlbW92ZVJlc3VsdEdyaWQoKVwiXG4gICAgICAgICAgICAoYWRkQ29sdW1uKT1cImFkZENvbHVtbigpXCJcbiAgICAgICAgICAgIChhdXRvRGV0ZWN0Q29sdW1ucyk9XCJhdXRvRGV0ZWN0R3JpZENvbHVtbnMoKVwiXG4gICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1cInJlbW92ZUNvbHVtbigkZXZlbnQpXCJcbiAgICAgICAgICAgICh1cGRhdGVDb2x1bW4pPVwidXBkYXRlQ29sdW1uKCRldmVudC5pbmRleCwgJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh1cGRhdGVPcHRpb24pPVwidXBkYXRlR3JpZE9wdGlvbigkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHVwZGF0ZVJvd0NsaWNrQWN0aW9uKT1cInVwZGF0ZUdyaWRSb3dDbGlja0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5lZGl0b3ItY29udGFpbmVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgICAuZWRpdG9yLXRhYnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgIH1cbiAgICAudGFiLWJ0biB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIHBhZGRpbmc6IDEycHggOHB4O1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAudGFiLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgIH1cbiAgICAudGFiLWJ0bi5hY3RpdmUge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgfVxuICAgIC50YWItYnRuOmRpc2FibGVkIHtcbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5lZGl0b3ItYm9keSB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICB9XG4gICAgLmNvbXBvbmVudC1zZWN0aW9ucy13cmFwcGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgIH1cbiAgICAuY29tcC1iYWRnZS1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLCAjZjhmYWZjKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgIH1cbiAgICAuYmFkZ2UtdGl0bGUge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIC5iYWRnZS10eXBlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgIH1cbiAgICAuYmFkZ2UtaWQge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM5NGEzYjgpO1xuICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICB9XG4gICAgLmJ0bi1kZXNlbGVjdCB7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJ0bi1kZXNlbGVjdDpob3ZlciB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgIH1cbiAgICAucHJvcGVydHktYWNjb3JkaW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWl0ZW0ge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBlYXNlO1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWl0ZW0uaXMtZXhwYW5kZWQge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjY2JkNWUxO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taGVhZGVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taGVhZGVyOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taXRlbS5pcy1leHBhbmRlZCAuYWNjb3JkaW9uLWhlYWRlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgIH1cbiAgICAuaGVhZGVyLWxlZnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICAgIC5oZWFkZXItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuICAgIC5oZWFkZXItYmFkZ2Uge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgbWF4LXdpZHRoOiAxMjBweDtcbiAgICB9XG4gICAgLmhlYWRlci1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWNoZXZyb24ge1xuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDIwMG1zIGVhc2U7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taXRlbS5pcy1leHBhbmRlZCAuYWNjb3JkaW9uLWNoZXZyb24ge1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5hY2NvcmRpb24tY29udGVudCAuZ3JvdXAtdGl0bGUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5hY2NvcmRpb24tY29udGVudCAuY29tcC1iYWRnZS1oZWFkZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLmVtcHR5LXNlbGVjdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDYwcHggMjBweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5lbXB0eS1pY29uLXdyYXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogNTJweDtcbiAgICAgIGhlaWdodDogNTJweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgfVxuICAgIC5lbXB0eS10ZXh0IHtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgICAgIG1heC13aWR0aDogMjIwcHg7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJ5QWRhcHRlciA9IGluamVjdChSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSB0aGlzLmRlc2lnbmVyU3RhdGUuZGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gdGhpcy5kZXNpZ25lclN0YXRlLmFjdGl2ZVRhYjtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0ZWRDb21wb25lbnQ7XG5cbiAgcmVhZG9ubHkgbWF4Q29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGVmaW5pdGlvbigpLmxheW91dC5jb2x1bW5zIHx8IDEyKTtcbiAgcmVhZG9ubHkgYWxsQ29tcG9uZW50cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMpO1xuXG4gIHJlYWRvbmx5IHByb3BlcnR5U2NoZW1hID0gY29tcHV0ZWQ8UHJvcGVydHlEZWZpbml0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmICghY29tcCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoY29tcC50eXBlKTtcbiAgICByZXR1cm4gbWV0YT8ucHJvcGVydHlTY2hlbWEgPz8gW107XG4gIH0pO1xuXG4gIHNldFRhYih0YWI6IERlc2lnbmVyQWN0aXZlVGFiKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNldEFjdGl2ZVRhYih0YWIpO1xuICB9XG5cbiAgdXBkYXRlQ29tcERhdGFTb3VyY2UoaWQ6IHN0cmluZywgZGF0YVNvdXJjZTogQ29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGlkLCB7IGRhdGFTb3VyY2UgfSk7XG4gIH1cblxuICBkZXNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0Q29tcG9uZW50KG51bGwpO1xuICB9XG5cbiAgdXBkYXRlQ29tcChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoY29tcC5pZCwgeyBbZmllbGRdOiB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVQcm9wKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnRQcm9wZXJ0eShpZCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICB1cGRhdGVMYXlvdXQoa2V5OiBrZXlvZiBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnRMYXlvdXQoY29tcC5pZCwgeyBba2V5XTogdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29tcG9uZW50SGVpZ2h0KHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICBjb25zdCBoZWlnaHQgPSAhdmFsIHx8IHZhbCA9PT0gJ2F1dG8nIHx8ICF2YWwudHJpbSgpID8gdW5kZWZpbmVkIDogdmFsLnRyaW0oKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50TGF5b3V0KGNvbXAuaWQsIHtcbiAgICAgIGhlaWdodCxcbiAgICAgIG1pbkhlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRDb21wb25lbnREaW1lbnNpb25zKGlkOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRTcGFuID0gdHlwZSA9PT0gJ2J1dHRvbicgPyAyIDogNDtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50TGF5b3V0KGlkLCB7XG4gICAgICBjb2x1bW5TcGFuOiBkZWZhdWx0U3BhbixcbiAgICAgIGhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgbWluSGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgICB3aWR0aDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlVmFsaWRhdGlvbihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb25zdCBuZXh0VmFsaWRhdGlvbiA9IHsgLi4uKGNvbXAudmFsaWRhdGlvbiA/PyB7fSksIFtrZXldOiB2YWx1ZSB9O1xuICAgICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudChjb21wLmlkLCB7IHZhbGlkYXRpb246IG5leHRWYWxpZGF0aW9uIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJlcG9ydChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlUmVwb3J0U2V0dGluZ3MoeyBba2V5XTogdmFsdWUgfSk7XG4gIH1cblxuICB1cGRhdGVMYXlvdXRQcm9wKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSB0aGlzLmRlZmluaXRpb24oKS5sYXlvdXQ7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZVJlcG9ydFNldHRpbmdzKHtcbiAgICAgIGxheW91dDogeyAuLi5jdXJyZW50TGF5b3V0LCBba2V5XTogdmFsdWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFJlc3VsdEdyaWQoKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmdEcyA9IHRoaXMuZGVmaW5pdGlvbigpLmRhdGFTb3VyY2VzWzBdO1xuICAgIGNvbnN0IGRlZmF1bHRHcmlkOiBSZXBvcnRHcmlkRGVmaW5pdGlvbiA9IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogZXhpc3RpbmdEcz8uaWQgPz8gJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGZpZWxkOiAnaWQnLCBsYWJlbDogJ0lEJywgZGF0YVR5cGU6ICdudW1iZXInLCB2aXNpYmxlOiB0cnVlLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgICB7IGZpZWxkOiAnbmFtZScsIGxhYmVsOiAnTmFtZScsIGRhdGFUeXBlOiAnc3RyaW5nJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIF0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhZ2luYXRpb246IHRydWUsXG4gICAgICAgIHBhZ2VTaXplOiAyNSxcbiAgICAgICAgc2hvd1Jvd051bWJlcnM6IHRydWUsXG4gICAgICAgIHNob3dGb290ZXI6IHRydWUsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyhkZWZhdWx0R3JpZCk7XG4gIH1cblxuICByZW1vdmVSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3ModW5kZWZpbmVkKTtcbiAgfVxuXG4gIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZCA/PyB7XG4gICAgICBkYXRhU291cmNlSWQ6ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgY29sQ291bnQgPSBjdXJyZW50LmNvbHVtbnMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBuZXdDb2w6IEdyaWRDb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgZmllbGQ6IGBmaWVsZF8ke2NvbENvdW50fWAsXG4gICAgICBsYWJlbDogYENvbHVtbiAke2NvbENvdW50fWAsXG4gICAgICBkYXRhVHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBjb2x1bW5zOiBbLi4uY3VycmVudC5jb2x1bW5zLCBuZXdDb2xdLFxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQ29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBuZXh0Q29scyA9IFsuLi5jdXJyZW50LmNvbHVtbnNdO1xuICAgIG5leHRDb2xzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgY29sdW1uczogbmV4dENvbHMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW4oaW5kZXg6IG51bWJlciwgZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBuZXh0Q29scyA9IGN1cnJlbnQuY29sdW1ucy5tYXAoKGMsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYywgW2ZpZWxkXTogdmFsdWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNvbHVtbnM6IG5leHRDb2xzLFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlR3JpZE9wdGlvbihmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkID8/IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW10sXG4gICAgfTtcbiAgICBjb25zdCBuZXh0T3B0aW9ucyA9IHsgLi4uKGN1cnJlbnQub3B0aW9ucyA/PyB7fSksIFtmaWVsZF06IHZhbHVlIH07XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgb3B0aW9uczogbmV4dE9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVHcmlkUm93Q2xpY2tBY3Rpb24oYWN0aW9uOiBHcmlkUm93Q2xpY2tBY3Rpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICByb3dDbGlja0FjdGlvbjogYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgYXV0b0RldGVjdEdyaWRDb2x1bW5zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNjb3ZlcnlBZGFwdGVyKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50R3JpZCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQ7XG4gICAgbGV0IHRhcmdldEVudGl0eSA9ICcnO1xuICAgIGxldCB0YXJnZXRUeXBlOiAndGFibGUnIHwgJ3N0b3JlZF9wcm9jZWR1cmUnID0gJ3N0b3JlZF9wcm9jZWR1cmUnO1xuXG4gICAgY29uc3QgZ3JpZERzID0gdGhpcy5kZWZpbml0aW9uKCkuZGF0YVNvdXJjZXM/LmZpbmQoKGQpID0+IGQuaWQgPT09IGN1cnJlbnRHcmlkPy5kYXRhU291cmNlSWQpO1xuICAgIGlmIChncmlkRHMgJiYgZ3JpZERzLmVuZHBvaW50KSB7XG4gICAgICB0YXJnZXRFbnRpdHkgPSBncmlkRHMuZW5kcG9pbnQ7XG4gICAgICBpZiAoZ3JpZERzLm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgdGFyZ2V0VHlwZSA9ICd0YWJsZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXBXaXRoRW50aXR5ID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmRhdGFTb3VyY2U/LmVudGl0eU5hbWUpO1xuICAgICAgaWYgKGNvbXBXaXRoRW50aXR5Py5kYXRhU291cmNlPy5lbnRpdHlOYW1lKSB7XG4gICAgICAgIHRhcmdldEVudGl0eSA9IGNvbXBXaXRoRW50aXR5LmRhdGFTb3VyY2UuZW50aXR5TmFtZTtcbiAgICAgICAgaWYgKGNvbXBXaXRoRW50aXR5LmRhdGFTb3VyY2Uuc291cmNlVHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgIHRhcmdldFR5cGUgPSAndGFibGUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRFbnRpdHkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1Byb3BlcnR5RWRpdG9yXSBObyBwcm9jZWR1cmUgb3IgdGFibGUgZW50aXR5IGZvdW5kIHRvIGF1dG8tZGV0ZWN0IGNvbHVtbnMgZnJvbS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2NvdmVyeUFkYXB0ZXIuZ2V0Q29sdW1ucyh0YXJnZXRFbnRpdHksICdkYm8nLCB0YXJnZXRUeXBlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGNvbHMpID0+IHtcbiAgICAgICAgaWYgKCFjb2xzIHx8IGNvbHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1hcHBlZENvbHM6IEdyaWRDb2x1bW5EZWZpbml0aW9uW10gPSBjb2xzLm1hcCgoYykgPT4gKHtcbiAgICAgICAgICBmaWVsZDogYy5maWVsZCxcbiAgICAgICAgICBsYWJlbDogaHVtYW5pemVJZGVudGlmaWVyKGMubGFiZWwgfHwgYy5maWVsZCksXG4gICAgICAgICAgZGF0YVR5cGU6IChjLmRhdGFUeXBlIGFzIGFueSkgfHwgJ3N0cmluZycsXG4gICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBhbGlnbjogYy5kYXRhVHlwZSA9PT0gJ251bWJlcicgPyAncmlnaHQnIDogJ2xlZnQnLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAgICAgLi4uKGN1cnJlbnRHcmlkID8/IHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2VJZDogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgb3B0aW9uczogeyBwYWdpbmF0aW9uOiB0cnVlLCBwYWdlU2l6ZTogMjUsIHNob3dSb3dOdW1iZXJzOiB0cnVlLCBzaG93Rm9vdGVyOiB0cnVlIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgY29sdW1uczogbWFwcGVkQ29scyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tQcm9wZXJ0eUVkaXRvcl0gQXV0by1kZXRlY3QgY29sdW1ucyBmYWlsZWQ6JywgZXJyKSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRvbmx5IGV4cGFuZGVkU2VjdGlvbnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHtcbiAgICBkYXRhc291cmNlOiB0cnVlLFxuICAgIGFjdGlvbjogdHJ1ZSxcbiAgICBnZW5lcmFsOiB0cnVlLFxuICAgIGxheW91dDogZmFsc2UsXG4gICAgdmFsaWRhdGlvbjogZmFsc2UsXG4gIH0pO1xuXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFNlY3Rpb25zLnVwZGF0ZSgocHJldikgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBbc2VjdGlvbl06ICFwcmV2W3NlY3Rpb25dLFxuICAgIH0pKTtcbiAgfVxuXG4gIGlzU2VjdGlvbkV4cGFuZGVkKHNlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZXhwYW5kZWRTZWN0aW9ucygpW3NlY3Rpb25dO1xuICB9XG5cbiAgZ2V0QWN0aW9uQmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgYWN0ID0gKGNvbXAucHJvcGVydGllcz8uWydhY3Rpb24nXSBhcyBzdHJpbmcpIHx8ICdleGVjdXRlLXJlcG9ydCc7XG4gICAgc3dpdGNoIChhY3QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUtcmVwb3J0JzpcbiAgICAgICAgcmV0dXJuICdSdW4gUmVwb3J0JztcbiAgICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICAgICAgcmV0dXJuICdSZXNldCBGb3JtJztcbiAgICAgIGNhc2UgJ2V4cG9ydCc6IHtcbiAgICAgICAgY29uc3QgZm10ID0gKChjb21wLnByb3BlcnRpZXM/LlsnYWN0aW9uUGFyYW1zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5bJ2Zvcm1hdCddIGFzIHN0cmluZykgfHwgJ2V4Y2VsJztcbiAgICAgICAgcmV0dXJuIGBFeHBvcnQgKCR7Zm10LnRvVXBwZXJDYXNlKCl9KWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcmludC1yZXBvcnQnOlxuICAgICAgICByZXR1cm4gJ1ByaW50ICguUnB0KSc7XG4gICAgICBjYXNlICduYXZpZ2F0ZSc6XG4gICAgICAgIHJldHVybiAnTmF2aWdhdGUnO1xuICAgICAgY2FzZSAnY3VzdG9tLWV2ZW50JzpcbiAgICAgICAgcmV0dXJuICdDdXN0b20gRXZlbnQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFjdDtcbiAgICB9XG4gIH1cblxuICBnZXREYXRhc291cmNlQmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgZHMgPSBjb21wLmRhdGFTb3VyY2U7XG4gICAgaWYgKCFkcyB8fCBkcy5zb3VyY2VUeXBlID09PSAnc3RhdGljJykgcmV0dXJuICdTdGF0aWMgTGlzdCc7XG4gICAgaWYgKGRzLnNvdXJjZVR5cGUgPT09ICd0YWJsZScgfHwgZHMuZW50aXR5TmFtZSkge1xuICAgICAgcmV0dXJuIGRzLmVudGl0eU5hbWUgPyBgVGFibGU6ICR7ZHMuZW50aXR5TmFtZX1gIDogJ1RhYmxlIC8gVmlldyc7XG4gICAgfVxuICAgIGlmIChkcy5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJykge1xuICAgICAgcmV0dXJuIGRzLmVudGl0eU5hbWUgPyBgU1A6ICR7ZHMuZW50aXR5TmFtZX1gIDogJ1N0b3JlZCBQcm9jJztcbiAgICB9XG4gICAgcmV0dXJuICdTdGF0aWMgTGlzdCc7XG4gIH1cblxuICBnZXRMYXlvdXRCYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFuID0gY29tcC5sYXlvdXQ/LmNvbHVtblNwYW4gfHwgKGNvbXAudHlwZSA9PT0gJ2J1dHRvbicgPyAyIDogNCk7XG4gICAgcmV0dXJuIGAke3NwYW59LyR7dGhpcy5tYXhDb2x1bW5zKCl9IGNvbHNgO1xuICB9XG5cbiAgZ2V0VmFsaWRhdGlvbkJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb21wLnZhbGlkYXRpb24/LnJlcXVpcmVkID8gJ1JlcXVpcmVkJyA6ICdPcHRpb25hbCc7XG4gIH1cbn1cbiJdfQ==
|
|
313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Byb3BlcnR5LWVkaXRvci9wcm9wZXJ0eS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXFCLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFJakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDN0YsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdD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O1FBQ2hFLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQStCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBK0I7UUFDaEQsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDN0QsQ0FBQzt3R0E3U1UsdUJBQXVCOzRGQUF2Qix1QkFBdUIsb0lDckRwQyxpMlhBK1FVLHVoSkR4T04sWUFBWSwrQkFDWixnQkFBZ0IsdUdBQ2hCLDhCQUE4QiwrSkFDOUIsNkJBQTZCLHFLQUM3QixpQ0FBaUMsNEhBQ2pDLDJCQUEyQixxT0FDM0IsNkJBQTZCLDBJQUM3QixpQ0FBaUMsK0pBQ2pDLDZCQUE2Qjs7NEZBTXBCLHVCQUF1QjtrQkFsQm5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsOEJBQThCO3dCQUM5Qiw2QkFBNkI7d0JBQzdCLGlDQUFpQzt3QkFDakMsMkJBQTJCO3dCQUMzQiw2QkFBNkI7d0JBQzdCLGlDQUFpQzt3QkFDakMsNkJBQTZCO3FCQUM5QixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZXNpZ25lckFjdGl2ZVRhYiwgRGVzaWduZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZXNpZ25lci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9jb21wb25lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHsgUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9wcm9wZXJ0eS1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudExheW91dERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtbGF5b3V0Lm1vZGVsJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EZWZpbml0aW9uLCBHcmlkUm93Q2xpY2tBY3Rpb24sIFJlcG9ydEdyaWREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckdlbmVyYWxDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1nZW5lcmFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckxheW91dENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWxheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JWYWxpZGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItdmFsaWRhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1yZXBvcnQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yRGF0YXNvdXJjZUNvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2UuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yQWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItYWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhU291cmNlRGVmaW5pdGlvbixcbiAgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgaHVtYW5pemVJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9pZGVudGlmaWVyLWh1bWFuaXplcic7XG5cbi8qKlxuICogUHJvcGVydHkgRWRpdG9yIGNvb3JkaW5hdG9yIGNvbXBvbmVudC5cbiAqXG4gKiBEZWNvbXBvc2VkIGludG8gZm9jdXNlZCBjaGlsZCBwcmVzZW50YXRpb25hbCBjb21wb25lbnRzIHBlciBSdWxlIDE4ICYgMTkgKENvbXBvc2l0aW9uIE92ZXIgR2lhbnQgQ29tcG9uZW50cylcbiAqIGFuZCBSdWxlIDMyIChBdm9pZCBHb2QgQ29tcG9uZW50cykuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1wcm9wZXJ0eS1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJwdEljb25Db21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JHZW5lcmFsQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yTGF5b3V0Q29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yVmFsaWRhdGlvbkNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckdyaWRDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JSZXBvcnRDb21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JEYXRhc291cmNlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yQWN0aW9uQ29tcG9uZW50LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wcm9wZXJ0eS1lZGl0b3IuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJ5QWRhcHRlciA9IGluamVjdChSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSB0aGlzLmRlc2lnbmVyU3RhdGUuZGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gdGhpcy5kZXNpZ25lclN0YXRlLmFjdGl2ZVRhYjtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0ZWRDb21wb25lbnQ7XG5cbiAgcmVhZG9ubHkgY29sbGFwc2VSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBtYXhDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0LmNvbHVtbnMgfHwgMTIpO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cyk7XG5cbiAgcmVhZG9ubHkgcHJvcGVydHlTY2hlbWEgPSBjb21wdXRlZDxQcm9wZXJ0eURlZmluaXRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm4gW107XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucmVnaXN0cnkucmVzb2x2ZShjb21wLnR5cGUpO1xuICAgIHJldHVybiBtZXRhPy5wcm9wZXJ0eVNjaGVtYSA/PyBbXTtcbiAgfSk7XG5cbiAgc2V0VGFiKHRhYjogRGVzaWduZXJBY3RpdmVUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0QWN0aXZlVGFiKHRhYik7XG4gIH1cblxuICB1cGRhdGVDb21wRGF0YVNvdXJjZShpZDogc3RyaW5nLCBkYXRhU291cmNlOiBDb21wb25lbnREYXRhU291cmNlRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoaWQsIHsgZGF0YVNvdXJjZSB9KTtcbiAgfVxuXG4gIGRlc2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gIH1cblxuICBkdXBsaWNhdGVDb21wb25lbnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5kdXBsaWNhdGVDb21wb25lbnQoaWQpO1xuICB9XG5cbiAgZGVsZXRlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUucmVtb3ZlQ29tcG9uZW50KGlkKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXAoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGNvbXAuaWQsIHsgW2ZpZWxkXTogdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUHJvcChpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50UHJvcGVydHkoaWQsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0KGtleToga2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50TGF5b3V0KGNvbXAuaWQsIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbXBvbmVudEhlaWdodCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm47XG4gICAgY29uc3QgaGVpZ2h0ID0gIXZhbCB8fCB2YWwgPT09ICdhdXRvJyB8fCAhdmFsLnRyaW0oKSA/IHVuZGVmaW5lZCA6IHZhbC50cmltKCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChjb21wLmlkLCB7XG4gICAgICBoZWlnaHQsXG4gICAgICBtaW5IZWlnaHQ6IGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0U3BhbiA9IHR5cGUgPT09ICdidXR0b24nID8gMiA6IDQ7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChpZCwge1xuICAgICAgY29sdW1uU3BhbjogZGVmYXVsdFNwYW4sXG4gICAgICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIG1pbkhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVZhbGlkYXRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgbmV4dFZhbGlkYXRpb24gPSB7IC4uLihjb21wLnZhbGlkYXRpb24gPz8ge30pLCBba2V5XTogdmFsdWUgfTtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoY29tcC5pZCwgeyB2YWxpZGF0aW9uOiBuZXh0VmFsaWRhdGlvbiB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVSZXBvcnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZVJlcG9ydFNldHRpbmdzKHsgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0UHJvcChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVSZXBvcnRTZXR0aW5ncyh7XG4gICAgICBsYXlvdXQ6IHsgLi4uY3VycmVudExheW91dCwgW2tleV06IHZhbHVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBhZGRSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlc1swXTtcbiAgICBjb25zdCBkZWZhdWx0R3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICBkYXRhU291cmNlSWQ6IGV4aXN0aW5nRHM/LmlkID8/ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ2lkJywgbGFiZWw6ICdJRCcsIGRhdGFUeXBlOiAnbnVtYmVyJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBkYXRhVHlwZTogJ3N0cmluZycsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIHNob3dSb3dOdW1iZXJzOiB0cnVlLFxuICAgICAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICAgICAgICBzaWRlQmFyOiB0cnVlLFxuICAgICAgICBnbG9iYWxTZWFyY2g6IHRydWUsXG4gICAgICAgIHN0YXR1c0JhcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKGRlZmF1bHRHcmlkKTtcbiAgfVxuXG4gIHJlbW92ZVJlc3VsdEdyaWQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh1bmRlZmluZWQpO1xuICB9XG5cbiAgYWRkQ29sdW1uKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkID8/IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW10sXG4gICAgfTtcbiAgICBjb25zdCBjb2xDb3VudCA9IGN1cnJlbnQuY29sdW1ucy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IG5ld0NvbDogR3JpZENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICBmaWVsZDogYGZpZWxkXyR7Y29sQ291bnR9YCxcbiAgICAgIGxhYmVsOiBgQ29sdW1uICR7Y29sQ291bnR9YCxcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNvbHVtbnM6IFsuLi5jdXJyZW50LmNvbHVtbnMsIG5ld0NvbF0sXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRDb2xzID0gWy4uLmN1cnJlbnQuY29sdW1uc107XG4gICAgbmV4dENvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBjb2x1bW5zOiBuZXh0Q29scyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbihpbmRleDogbnVtYmVyLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRDb2xzID0gY3VycmVudC5jb2x1bW5zLm1hcCgoYywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4geyAuLi5jLCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgY29sdW1uczogbmV4dENvbHMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVHcmlkT3B0aW9uKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQgPz8ge1xuICAgICAgZGF0YVNvdXJjZUlkOiAnZGVmYXVsdCcsXG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IG5leHRPcHRpb25zID0geyAuLi4oY3VycmVudC5vcHRpb25zID8/IHt9KSwgW2ZpZWxkXTogdmFsdWUgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBvcHRpb25zOiBuZXh0T3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRSb3dDbGlja0FjdGlvbihhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHJvd0NsaWNrQWN0aW9uOiBhY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBhdXRvRGV0ZWN0R3JpZENvbHVtbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2NvdmVyeUFkYXB0ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBsZXQgdGFyZ2V0RW50aXR5ID0gJyc7XG4gICAgbGV0IHRhcmdldFR5cGU6ICd0YWJsZScgfCAnc3RvcmVkX3Byb2NlZHVyZScgPSAnc3RvcmVkX3Byb2NlZHVyZSc7XG5cbiAgICBjb25zdCBncmlkRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlcz8uZmluZCgoZCkgPT4gZC5pZCA9PT0gY3VycmVudEdyaWQ/LmRhdGFTb3VyY2VJZCk7XG4gICAgaWYgKGdyaWREcyAmJiBncmlkRHMuZW5kcG9pbnQpIHtcbiAgICAgIHRhcmdldEVudGl0eSA9IGdyaWREcy5lbmRwb2ludDtcbiAgICAgIGlmIChncmlkRHMubWV0aG9kID09PSAnR0VUJykge1xuICAgICAgICB0YXJnZXRUeXBlID0gJ3RhYmxlJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcFdpdGhFbnRpdHkgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLmZpbmQoKGMpID0+IGMuZGF0YVNvdXJjZT8uZW50aXR5TmFtZSk7XG4gICAgICBpZiAoY29tcFdpdGhFbnRpdHk/LmRhdGFTb3VyY2U/LmVudGl0eU5hbWUpIHtcbiAgICAgICAgdGFyZ2V0RW50aXR5ID0gY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5lbnRpdHlOYW1lO1xuICAgICAgICBpZiAoY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgdGFyZ2V0VHlwZSA9ICd0YWJsZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldEVudGl0eSkge1xuICAgICAgY29uc29sZS53YXJuKCdbUHJvcGVydHlFZGl0b3JdIE5vIHByb2NlZHVyZSBvciB0YWJsZSBlbnRpdHkgZm91bmQgdG8gYXV0by1kZXRlY3QgY29sdW1ucyBmcm9tLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY292ZXJ5QWRhcHRlci5nZXRDb2x1bW5zKHRhcmdldEVudGl0eSwgJ2RibycsIHRhcmdldFR5cGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoY29scykgPT4ge1xuICAgICAgICBpZiAoIWNvbHMgfHwgY29scy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3QgbWFwcGVkQ29sczogR3JpZENvbHVtbkRlZmluaXRpb25bXSA9IGNvbHMubWFwKChjKSA9PiAoe1xuICAgICAgICAgIGZpZWxkOiBjLmZpZWxkLFxuICAgICAgICAgIGxhYmVsOiBodW1hbml6ZUlkZW50aWZpZXIoYy5sYWJlbCB8fCBjLmZpZWxkKSxcbiAgICAgICAgICBkYXRhVHlwZTogKGMuZGF0YVR5cGUgYXMgYW55KSB8fCAnc3RyaW5nJyxcbiAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgIGFsaWduOiBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/ICdyaWdodCcgOiAnbGVmdCcsXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgICAgICAuLi4oY3VycmVudEdyaWQgPz8ge1xuICAgICAgICAgICAgZGF0YVNvdXJjZUlkOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICBvcHRpb25zOiB7IHBhZ2luYXRpb246IHRydWUsIHBhZ2VTaXplOiAyNSwgc2hvd1Jvd051bWJlcnM6IHRydWUsIHNob3dGb290ZXI6IHRydWUgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjb2x1bW5zOiBtYXBwZWRDb2xzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignW1Byb3BlcnR5RWRpdG9yXSBBdXRvLWRldGVjdCBjb2x1bW5zIGZhaWxlZDonLCBlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZXhwYW5kZWRTZWN0aW9ucyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe1xuICAgIGRhdGFzb3VyY2U6IHRydWUsXG4gICAgYWN0aW9uOiB0cnVlLFxuICAgIGdlbmVyYWw6IHRydWUsXG4gICAgbGF5b3V0OiBmYWxzZSxcbiAgICB2YWxpZGF0aW9uOiBmYWxzZSxcbiAgfSk7XG5cbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkU2VjdGlvbnMudXBkYXRlKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtzZWN0aW9uXTogIXByZXZbc2VjdGlvbl0sXG4gICAgfSkpO1xuICB9XG5cbiAgaXNTZWN0aW9uRXhwYW5kZWQoc2VjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFNlY3Rpb25zKClbc2VjdGlvbl07XG4gIH1cblxuICBnZXRBY3Rpb25CYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhY3QgPSAoY29tcC5wcm9wZXJ0aWVzPy5bJ2FjdGlvbiddIGFzIHN0cmluZykgfHwgJ2V4ZWN1dGUtcmVwb3J0JztcbiAgICBzd2l0Y2ggKGFjdCkge1xuICAgICAgY2FzZSAnZXhlY3V0ZS1yZXBvcnQnOlxuICAgICAgICByZXR1cm4gJ1J1biBSZXBvcnQnO1xuICAgICAgY2FzZSAncmVzZXQnOlxuICAgICAgICByZXR1cm4gJ1Jlc2V0IEZvcm0nO1xuICAgICAgY2FzZSAnZXhwb3J0Jzoge1xuICAgICAgICBjb25zdCBmbXQgPSAoKGNvbXAucHJvcGVydGllcz8uWydhY3Rpb25QYXJhbXMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LlsnZm9ybWF0J10gYXMgc3RyaW5nKSB8fCAnZXhjZWwnO1xuICAgICAgICByZXR1cm4gYEV4cG9ydCAoJHtmbXQudG9VcHBlckNhc2UoKX0pYDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ByaW50LXJlcG9ydCc6XG4gICAgICAgIHJldHVybiAnUHJpbnQgKC5ScHQpJztcbiAgICAgIGNhc2UgJ25hdmlnYXRlJzpcbiAgICAgICAgcmV0dXJuICdOYXZpZ2F0ZSc7XG4gICAgICBjYXNlICdjdXN0b20tZXZlbnQnOlxuICAgICAgICByZXR1cm4gJ0N1c3RvbSBFdmVudCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0O1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGFzb3VyY2VCYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBkcyA9IGNvbXAuZGF0YVNvdXJjZTtcbiAgICBpZiAoIWRzIHx8IGRzLnNvdXJjZVR5cGUgPT09ICdzdGF0aWMnKSByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgICBpZiAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5lbnRpdHlOYW1lKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBUYWJsZTogJHtkcy5lbnRpdHlOYW1lfWAgOiAnVGFibGUgLyBWaWV3JztcbiAgICB9XG4gICAgaWYgKGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBTUDogJHtkcy5lbnRpdHlOYW1lfWAgOiAnU3RvcmVkIFByb2MnO1xuICAgIH1cbiAgICByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgfVxuXG4gIGdldExheW91dEJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYW4gPSBjb21wLmxheW91dD8uY29sdW1uU3BhbiB8fCAoY29tcC50eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KTtcbiAgICByZXR1cm4gYCR7c3Bhbn0vJHt0aGlzLm1heENvbHVtbnMoKX0gY29sc2A7XG4gIH1cblxuICBnZXRWYWxpZGF0aW9uQmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXAudmFsaWRhdGlvbj8ucmVxdWlyZWQgPyAnUmVxdWlyZWQnIDogJ09wdGlvbmFsJztcbiAgfVxufVxuIiwiICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCI+XG4gICAgICA8IS0tIEVkaXRvciBIZWFkZXIgJiBUYWJzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVkaXRvci10YWJzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdwcm9wZXJ0aWVzJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRhYigncHJvcGVydGllcycpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkQ29tcG9uZW50KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPlByb3BlcnRpZXM8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAncmVwb3J0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRhYigncmVwb3J0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJkZXNpZ25cIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+TGF5b3V0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdncmlkJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5HcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj48L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuIGJ0bi1jb2xsYXBzZS1pbnNwZWN0b3JcIlxuICAgICAgICAgIChjbGljayk9XCJjb2xsYXBzZVJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAgIHRpdGxlPVwiQ29sbGFwc2UgUHJvcGVydHkgRWRpdG9yXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29sbGFwc2UgUHJvcGVydHkgRWRpdG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1yaWdodFwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBFZGl0b3IgQm9keSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItYm9keVwiPlxuICAgICAgICA8IS0tIDEuIENPTVBPTkVOVCBQUk9QRVJUSUVTIFRBQiAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnRpZXMnKSB7XG4gICAgICAgICAgQGlmIChzZWxlY3RlZENvbXBvbmVudCgpOyBhcyBjb21wKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXNlY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPCEtLSBDb21wb25lbnQgSWRlbnRpZmllciBIZWFkZXIgKFBpbm5lZCBhdCBUb3ApIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcC1iYWRnZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtdHlwZVwiPnt7IGNvbXAudHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtaWRcIj57eyBjb21wLmlkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZS1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYmFkZ2UtYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImR1cGxpY2F0ZUNvbXBvbmVudChjb21wLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRHVwbGljYXRlIGNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY29weVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYmFkZ2UtYWN0aW9uIGJ0bi1iYWRnZS1kZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ29tcG9uZW50KGNvbXAuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZGVzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRGVzZWxlY3QgY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjbG9zZVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBDb250YWluZXIgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1hY2NvcmRpb25cIj5cbiAgICAgICAgICAgICAgICA8IS0tIDEuIE9QVElPTlMgREFUQSBTT1VSQ0UgQUNDT1JESU9OIChGSVJTVCBmb3IgRHJvcGRvd24pIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29tcC50eXBlID09PSAnZHJvcGRvd24nKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2RhdGFzb3VyY2UnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignZGF0YXNvdXJjZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBPcHRpb25zIERhdGEgU291cmNlIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRhdGFiYXNlXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5PcHRpb25zIERhdGEgU291cmNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXREYXRhc291cmNlQmFkZ2UoY29tcCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd25cIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwiYWNjb3JkaW9uLWNoZXZyb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpc1NlY3Rpb25FeHBhbmRlZCgnZGF0YXNvdXJjZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1kYXRhc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxsQ29tcG9uZW50c109XCJhbGxDb21wb25lbnRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlRGF0YVNvdXJjZSk9XCJ1cGRhdGVDb21wRGF0YVNvdXJjZShjb21wLmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZVByb3BlcnR5KT1cInVwZGF0ZVByb3AoY29tcC5pZCwgJGV2ZW50LmtleSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIEJVVFRPTiBBQ1RJT04gQUNDT1JESU9OIChGSVJTVCBmb3IgQnV0dG9uKSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbXAudHlwZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnYWN0aW9uJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2FjdGlvbicpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBCdXR0b24gQWN0aW9uIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImxpZ2h0bmluZ1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+QnV0dG9uIEFjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWJhZGdlXCI+e3sgZ2V0QWN0aW9uQmFkZ2UoY29tcCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd25cIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwiYWNjb3JkaW9uLWNoZXZyb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpc1NlY3Rpb25FeHBhbmRlZCgnYWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcF09XCJjb21wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZVByb3BlcnR5KT1cInVwZGF0ZVByb3AoY29tcC5pZCwgJGV2ZW50LmtleSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIDIuIEdFTkVSQUwgUFJPUEVSVElFUyBBQ0NPUkRJT04gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCdnZW5lcmFsJylcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdnZW5lcmFsJylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBHZW5lcmFsIFByb3BlcnRpZXMgc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZWRpdFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkdlbmVyYWwgUHJvcGVydGllczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbXAubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWJhZGdlXCI+e3sgY29tcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd25cIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwiYWNjb3JkaW9uLWNoZXZyb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc1NlY3Rpb25FeHBhbmRlZCgnZ2VuZXJhbCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWdlbmVyYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5U2NoZW1hXT1cInByb3BlcnR5U2NoZW1hKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSk9XCJ1cGRhdGVDb21wKCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZXNlbGVjdCk9XCJkZXNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gMy4gTEFZT1VUICYgR1JJRCBBQ0NPUkRJT04gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCdsYXlvdXQnKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2xheW91dCcpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgTGF5b3V0ICYgRGltZW5zaW9ucyBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJkZXNpZ25cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5MYXlvdXQgJiBHcmlkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWJhZGdlXCI+e3sgZ2V0TGF5b3V0QmFkZ2UoY29tcCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd25cIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwiYWNjb3JkaW9uLWNoZXZyb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc1NlY3Rpb25FeHBhbmRlZCgnbGF5b3V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItbGF5b3V0XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcF09XCJjb21wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhDb2x1bW5zXT1cIm1heENvbHVtbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlTGF5b3V0KT1cInVwZGF0ZUxheW91dCgkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVIZWlnaHQpPVwidXBkYXRlQ29tcG9uZW50SGVpZ2h0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc2V0RGltZW5zaW9ucyk9XCJyZXNldENvbXBvbmVudERpbWVuc2lvbnMoY29tcC5pZCwgY29tcC50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDQuIFZBTElEQVRJT04gQUNDT1JESU9OIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgndmFsaWRhdGlvbicpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbigndmFsaWRhdGlvbicpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgVmFsaWRhdGlvbiBSdWxlcyBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPlZhbGlkYXRpb24gUnVsZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRWYWxpZGF0aW9uQmFkZ2UoY29tcCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd25cIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwiYWNjb3JkaW9uLWNoZXZyb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgQGlmIChpc1NlY3Rpb25FeHBhbmRlZCgndmFsaWRhdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLXZhbGlkYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZVZhbGlkYXRpb24pPVwidXBkYXRlVmFsaWRhdGlvbigkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWljb24td3JhcFwiPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY3Vyc29yXCIgW3NpemVdPVwiMjRcIiBjb2xvcj1cIiM2NDc0OGJcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJlbXB0eS10ZXh0XCI+U2VsZWN0IGEgY29tcG9uZW50IG9uIHRoZSBjYW52YXMgdG8gY29uZmlndXJlIGl0cyBwcm9wZXJ0aWVzLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gMi4gUkVQT1JUIFNFVFRJTkdTIFRBQiAtLT5cbiAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3JlcG9ydCcpIHtcbiAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1yZXBvcnRcbiAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRlZmluaXRpb24oKVwiXG4gICAgICAgICAgICAodXBkYXRlUmVwb3J0KT1cInVwZGF0ZVJlcG9ydCgkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHVwZGF0ZUxheW91dCk9XCJ1cGRhdGVMYXlvdXRQcm9wKCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gMy4gUkVTVUxUIEdSSUQgU0VUVElOR1MgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnZ3JpZCcpIHtcbiAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1ncmlkXG4gICAgICAgICAgICBbZ3JpZF09XCJkZWZpbml0aW9uKCkuZ3JpZFwiXG4gICAgICAgICAgICAoYWRkR3JpZCk9XCJhZGRSZXN1bHRHcmlkKClcIlxuICAgICAgICAgICAgKHJlbW92ZUdyaWQpPVwicmVtb3ZlUmVzdWx0R3JpZCgpXCJcbiAgICAgICAgICAgIChhZGRDb2x1bW4pPVwiYWRkQ29sdW1uKClcIlxuICAgICAgICAgICAgKGF1dG9EZXRlY3RDb2x1bW5zKT1cImF1dG9EZXRlY3RHcmlkQ29sdW1ucygpXCJcbiAgICAgICAgICAgIChyZW1vdmVDb2x1bW4pPVwicmVtb3ZlQ29sdW1uKCRldmVudClcIlxuICAgICAgICAgICAgKHVwZGF0ZUNvbHVtbik9XCJ1cGRhdGVDb2x1bW4oJGV2ZW50LmluZGV4LCAkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHVwZGF0ZU9wdGlvbik9XCJ1cGRhdGVHcmlkT3B0aW9uKCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodXBkYXRlUm93Q2xpY2tBY3Rpb24pPVwidXBkYXRlR3JpZFJvd0NsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiJdfQ==
|