@tolle_/tolle-ui 18.2.28 → 18.2.30
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/accordion-item.component.mjs +5 -11
- package/esm2022/lib/accordion.component.mjs +4 -9
- package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
- package/esm2022/lib/alert-dialog.component.mjs +44 -59
- package/esm2022/lib/alert.component.mjs +5 -11
- package/esm2022/lib/aspect-ratio.component.mjs +119 -0
- package/esm2022/lib/attachment.component.mjs +334 -0
- package/esm2022/lib/avatar-fallback.component.mjs +3 -3
- package/esm2022/lib/avatar.component.mjs +4 -9
- package/esm2022/lib/badge.component.mjs +4 -9
- package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
- package/esm2022/lib/breadcrumb.component.mjs +3 -3
- package/esm2022/lib/bubble.component.mjs +301 -0
- package/esm2022/lib/button.component.mjs +5 -11
- package/esm2022/lib/calendar.component.mjs +5 -11
- package/esm2022/lib/card.component.mjs +14 -43
- package/esm2022/lib/carousel/carousel.component.mjs +5 -12
- package/esm2022/lib/chain-of-thought.component.mjs +380 -0
- package/esm2022/lib/chart-pie.component.mjs +386 -0
- package/esm2022/lib/chart.component.mjs +1146 -0
- package/esm2022/lib/chart.service.mjs +555 -0
- package/esm2022/lib/checkbox.component.mjs +5 -11
- package/esm2022/lib/checkpoint.component.mjs +134 -0
- package/esm2022/lib/collapsible.component.mjs +4 -11
- package/esm2022/lib/combobox.component.mjs +372 -0
- package/esm2022/lib/command-dialog.component.mjs +164 -0
- package/esm2022/lib/command.component.mjs +514 -0
- package/esm2022/lib/command.service.mjs +130 -0
- package/esm2022/lib/confirmation.component.mjs +219 -0
- package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
- package/esm2022/lib/context-menu.component.mjs +460 -0
- package/esm2022/lib/context-menu.service.mjs +121 -0
- package/esm2022/lib/context.component.mjs +377 -0
- package/esm2022/lib/conversation.component.mjs +442 -0
- package/esm2022/lib/country-selector.component.mjs +5 -11
- package/esm2022/lib/data-table.component.mjs +63 -12
- package/esm2022/lib/date-picker.component.mjs +251 -198
- package/esm2022/lib/date-range-picker.component.mjs +224 -116
- package/esm2022/lib/date-time-picker.component.mjs +506 -0
- package/esm2022/lib/direction.component.mjs +79 -0
- package/esm2022/lib/dropdown-item.component.mjs +3 -3
- package/esm2022/lib/dropdown-label.component.mjs +3 -3
- package/esm2022/lib/dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/dropdown-separator.component.mjs +3 -3
- package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
- package/esm2022/lib/empty-state.component.mjs +4 -9
- package/esm2022/lib/field.component.mjs +394 -0
- package/esm2022/lib/hover-card.component.mjs +6 -16
- package/esm2022/lib/inline-citation.component.mjs +263 -0
- package/esm2022/lib/input-group.component.mjs +418 -0
- package/esm2022/lib/input.component.mjs +5 -11
- package/esm2022/lib/item.component.mjs +243 -0
- package/esm2022/lib/kbd.component.mjs +82 -0
- package/esm2022/lib/label.component.mjs +4 -9
- package/esm2022/lib/marker.component.mjs +135 -0
- package/esm2022/lib/masked-input.component.mjs +5 -11
- package/esm2022/lib/menubar.component.mjs +683 -0
- package/esm2022/lib/message-scroller.component.mjs +353 -0
- package/esm2022/lib/message-scroller.service.mjs +157 -0
- package/esm2022/lib/message.component.mjs +228 -0
- package/esm2022/lib/model-selector.component.mjs +310 -0
- package/esm2022/lib/multi-select.component.mjs +155 -72
- package/esm2022/lib/native-select.component.mjs +201 -0
- package/esm2022/lib/navigation-menu.component.mjs +642 -0
- package/esm2022/lib/otp-group.component.mjs +3 -3
- package/esm2022/lib/otp-slot.component.mjs +4 -9
- package/esm2022/lib/otp.component.mjs +5 -11
- package/esm2022/lib/pagination.component.mjs +7 -10
- package/esm2022/lib/plan.component.mjs +335 -0
- package/esm2022/lib/popover-content.component.mjs +4 -9
- package/esm2022/lib/popover.component.mjs +15 -13
- package/esm2022/lib/progress.component.mjs +4 -9
- package/esm2022/lib/prompt-input.component.mjs +526 -0
- package/esm2022/lib/queue.component.mjs +280 -0
- package/esm2022/lib/radio-group.component.mjs +6 -13
- package/esm2022/lib/radio-item.component.mjs +4 -9
- package/esm2022/lib/range-calendar.component.mjs +5 -11
- package/esm2022/lib/reasoning.component.mjs +335 -0
- package/esm2022/lib/resizable.component.mjs +219 -0
- package/esm2022/lib/segment.component.mjs +17 -7
- package/esm2022/lib/select-group.component.mjs +4 -8
- package/esm2022/lib/select-item.component.mjs +4 -9
- package/esm2022/lib/select-separator.component.mjs +4 -8
- package/esm2022/lib/select.component.mjs +133 -49
- package/esm2022/lib/separator.component.mjs +4 -9
- package/esm2022/lib/sheet.component.mjs +38 -56
- package/esm2022/lib/shimmer.component.mjs +84 -0
- package/esm2022/lib/sidebar.component.mjs +11 -1
- package/esm2022/lib/skeleton.component.mjs +4 -9
- package/esm2022/lib/sources.component.mjs +452 -0
- package/esm2022/lib/spinner.component.mjs +68 -0
- package/esm2022/lib/suggestion.component.mjs +207 -0
- package/esm2022/lib/switch.component.mjs +5 -11
- package/esm2022/lib/table.component.mjs +213 -0
- package/esm2022/lib/tabs.component.mjs +4 -11
- package/esm2022/lib/tag-input.component.mjs +5 -11
- package/esm2022/lib/task.component.mjs +359 -0
- package/esm2022/lib/textarea.component.mjs +5 -11
- package/esm2022/lib/theme.service.mjs +17 -6
- package/esm2022/lib/time-picker.component.mjs +923 -0
- package/esm2022/lib/toast.service.mjs +3 -2
- package/esm2022/lib/toaster.component.mjs +76 -39
- package/esm2022/lib/toggle-group.component.mjs +4 -9
- package/esm2022/lib/toggle.component.mjs +5 -11
- package/esm2022/lib/tool.component.mjs +462 -0
- package/esm2022/lib/typography.component.mjs +83 -0
- package/esm2022/lib/utils/color.mjs +140 -19
- package/esm2022/public-api.mjs +61 -1
- package/fesm2022/tolle-ui.mjs +16457 -1024
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog.component.d.ts +10 -2
- package/lib/aspect-ratio.component.d.ts +20 -0
- package/lib/attachment.component.d.ts +101 -0
- package/lib/bubble.component.d.ts +112 -0
- package/lib/chain-of-thought.component.d.ts +166 -0
- package/lib/chart-pie.component.d.ts +108 -0
- package/lib/chart.component.d.ts +369 -0
- package/lib/chart.service.d.ts +222 -0
- package/lib/checkpoint.component.d.ts +51 -0
- package/lib/combobox.component.d.ts +90 -0
- package/lib/command-dialog.component.d.ts +53 -0
- package/lib/command.component.d.ts +189 -0
- package/lib/command.service.d.ts +67 -0
- package/lib/confirmation.component.d.ts +70 -0
- package/lib/context-menu-trigger.directive.d.ts +12 -0
- package/lib/context-menu.component.d.ts +41 -0
- package/lib/context-menu.service.d.ts +38 -0
- package/lib/context.component.d.ts +134 -0
- package/lib/conversation.component.d.ts +165 -0
- package/lib/data-table.component.d.ts +27 -1
- package/lib/date-picker.component.d.ts +72 -11
- package/lib/date-range-picker.component.d.ts +63 -6
- package/lib/date-time-picker.component.d.ts +119 -0
- package/lib/direction.component.d.ts +45 -0
- package/lib/field.component.d.ts +201 -0
- package/lib/inline-citation.component.d.ts +103 -0
- package/lib/input-group.component.d.ts +150 -0
- package/lib/item.component.d.ts +154 -0
- package/lib/kbd.component.d.ts +50 -0
- package/lib/marker.component.d.ts +58 -0
- package/lib/menubar.component.d.ts +247 -0
- package/lib/message-scroller.component.d.ts +159 -0
- package/lib/message-scroller.service.d.ts +73 -0
- package/lib/message.component.d.ts +128 -0
- package/lib/model-selector.component.d.ts +103 -0
- package/lib/multi-select.component.d.ts +66 -14
- package/lib/native-select.component.d.ts +57 -0
- package/lib/navigation-menu.component.d.ts +230 -0
- package/lib/plan.component.d.ts +120 -0
- package/lib/popover.component.d.ts +1 -0
- package/lib/prompt-input.component.d.ts +194 -0
- package/lib/queue.component.d.ts +106 -0
- package/lib/reasoning.component.d.ts +127 -0
- package/lib/resizable.component.d.ts +43 -0
- package/lib/segment.component.d.ts +13 -3
- package/lib/select.component.d.ts +37 -5
- package/lib/sheet.component.d.ts +3 -0
- package/lib/shimmer.component.d.ts +38 -0
- package/lib/sidebar.component.d.ts +2 -0
- package/lib/sources.component.d.ts +156 -0
- package/lib/spinner.component.d.ts +29 -0
- package/lib/suggestion.component.d.ts +96 -0
- package/lib/table.component.d.ts +106 -0
- package/lib/task.component.d.ts +151 -0
- package/lib/theme.service.d.ts +9 -0
- package/lib/time-picker.component.d.ts +243 -0
- package/lib/toast.service.d.ts +3 -1
- package/lib/toaster.component.d.ts +26 -9
- package/lib/tool.component.d.ts +158 -0
- package/lib/typography.component.d.ts +32 -0
- package/lib/utils/color.d.ts +19 -5
- package/package.json +1 -1
- package/public-api.d.ts +50 -0
- package/registry/docs-content.json +8497 -1553
- package/registry/llms-full.txt +2679 -318
- package/registry/llms.txt +43 -4
- package/registry/manifest.json +9093 -1739
- package/registry/r/accordion-item.json +1 -1
- package/registry/r/accordion.json +1 -1
- package/registry/r/alert-dialog-dynamic.json +1 -1
- package/registry/r/alert-dialog.json +1 -1
- package/registry/r/alert.json +1 -1
- package/registry/r/attachment.json +23 -0
- package/registry/r/avatar-fallback.json +1 -1
- package/registry/r/avatar.json +1 -1
- package/registry/r/badge.json +1 -1
- package/registry/r/breadcrumb-item.json +1 -1
- package/registry/r/breadcrumb-link.json +1 -1
- package/registry/r/breadcrumb-separator.json +1 -1
- package/registry/r/breadcrumb.json +1 -1
- package/registry/r/bubble.json +23 -0
- package/registry/r/button.json +1 -1
- package/registry/r/calendar.json +1 -1
- package/registry/r/card.json +1 -1
- package/registry/r/carousel.json +1 -1
- package/registry/r/chain-of-thought.json +23 -0
- package/registry/r/chart-pie.json +30 -0
- package/registry/r/chart.json +28 -0
- package/registry/r/checkbox.json +1 -1
- package/registry/r/checkpoint.json +23 -0
- package/registry/r/collapsible.json +1 -1
- package/registry/r/combobox.json +31 -0
- package/registry/r/command-dialog.json +21 -0
- package/registry/r/command.json +26 -0
- package/registry/r/confirmation.json +23 -0
- package/registry/r/context.json +26 -0
- package/registry/r/conversation.json +23 -0
- package/registry/r/country-selector.json +1 -1
- package/registry/r/data-table.json +1 -1
- package/registry/r/date-picker.json +4 -4
- package/registry/r/date-range-picker.json +3 -3
- package/registry/r/date-time-picker.json +28 -0
- package/registry/r/direction.json +16 -0
- package/registry/r/dropdown-item.json +1 -1
- package/registry/r/dropdown-label.json +1 -1
- package/registry/r/dropdown-menu.json +1 -1
- package/registry/r/dropdown-separator.json +1 -1
- package/registry/r/dropdown-trigger.json +1 -1
- package/registry/r/empty-state.json +1 -1
- package/registry/r/field.json +23 -0
- package/registry/r/hover-card.json +1 -1
- package/registry/r/inline-citation.json +26 -0
- package/registry/r/input-group.json +23 -0
- package/registry/r/input.json +1 -1
- package/registry/r/item.json +23 -0
- package/registry/r/kbd.json +23 -0
- package/registry/r/label.json +1 -1
- package/registry/r/marker.json +23 -0
- package/registry/r/masked-input.json +1 -1
- package/registry/r/menubar.json +24 -0
- package/registry/r/message-scroller.json +26 -0
- package/registry/r/message.json +23 -0
- package/registry/r/model-selector.json +32 -0
- package/registry/r/multi-select.json +2 -2
- package/registry/r/native-select.json +23 -0
- package/registry/r/navigation-menu.json +24 -0
- package/registry/r/otp-group.json +1 -1
- package/registry/r/otp-slot.json +1 -1
- package/registry/r/otp.json +1 -1
- package/registry/r/pagination.json +3 -2
- package/registry/r/plan.json +23 -0
- package/registry/r/popover-content.json +1 -1
- package/registry/r/popover.json +1 -1
- package/registry/r/progress.json +1 -1
- package/registry/r/prompt-input.json +23 -0
- package/registry/r/queue.json +23 -0
- package/registry/r/radio-group.json +1 -1
- package/registry/r/radio-item.json +1 -1
- package/registry/r/range-calendar.json +1 -1
- package/registry/r/reasoning.json +23 -0
- package/registry/r/segment.json +1 -1
- package/registry/r/select-group.json +1 -1
- package/registry/r/select-item.json +1 -1
- package/registry/r/select-separator.json +1 -1
- package/registry/r/select.json +4 -3
- package/registry/r/separator.json +1 -1
- package/registry/r/sheet.json +1 -1
- package/registry/r/shimmer.json +23 -0
- package/registry/r/sidebar.json +1 -1
- package/registry/r/skeleton.json +1 -1
- package/registry/r/sources.json +23 -0
- package/registry/r/spinner.json +23 -0
- package/registry/r/suggestion.json +23 -0
- package/registry/r/switch.json +1 -1
- package/registry/r/table.json +21 -0
- package/registry/r/tabs.json +1 -1
- package/registry/r/tag-input.json +1 -1
- package/registry/r/task.json +23 -0
- package/registry/r/textarea.json +1 -1
- package/registry/r/time-picker.json +24 -0
- package/registry/r/toaster.json +2 -2
- package/registry/r/toggle-group.json +1 -1
- package/registry/r/toggle.json +1 -1
- package/registry/r/tool.json +23 -0
- package/registry/r/typography.json +23 -0
- package/registry/registry.json +915 -22
- package/theme.css +109 -8
|
@@ -370,22 +370,17 @@ export class RangeCalendarComponent {
|
|
|
370
370
|
</div>
|
|
371
371
|
</ng-container>
|
|
372
372
|
</div>
|
|
373
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
373
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
374
374
|
}
|
|
375
375
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RangeCalendarComponent, decorators: [{
|
|
376
376
|
type: Component,
|
|
377
|
-
args: [{
|
|
378
|
-
selector: 'tolle-range-calendar',
|
|
379
|
-
standalone: true,
|
|
380
|
-
imports: [CommonModule],
|
|
381
|
-
providers: [
|
|
377
|
+
args: [{ selector: 'tolle-range-calendar', standalone: true, imports: [CommonModule], providers: [
|
|
382
378
|
{
|
|
383
379
|
provide: NG_VALUE_ACCESSOR,
|
|
384
380
|
useExisting: forwardRef(() => RangeCalendarComponent),
|
|
385
381
|
multi: true
|
|
386
382
|
}
|
|
387
|
-
],
|
|
388
|
-
template: `
|
|
383
|
+
], template: `
|
|
389
384
|
<div [class]="cn('text-popover-foreground inline-block min-w-fit', bordered ? 'p-3 border rounded-md bg-background shadow-sm' : '', class)">
|
|
390
385
|
|
|
391
386
|
<!-- ===== Multi-month view (side-by-side, shared range) ===== -->
|
|
@@ -488,8 +483,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
488
483
|
</div>
|
|
489
484
|
</ng-container>
|
|
490
485
|
</div>
|
|
491
|
-
|
|
492
|
-
}]
|
|
486
|
+
`, styles: [":host{display:block}\n"] }]
|
|
493
487
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { class: [{
|
|
494
488
|
type: Input
|
|
495
489
|
}], disablePastDates: [{
|
|
@@ -501,4 +495,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
501
495
|
}], rangeSelect: [{
|
|
502
496
|
type: Output
|
|
503
497
|
}] } });
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9yYW5nZS1jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN2RCxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUMvQyxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUF1SGhDLE1BQU0sT0FBTyxzQkFBc0I7SUE2QmI7SUFBZ0M7SUE1QjNDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDbEM7a0VBQzhEO0lBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIscUVBQXFFO0lBQzVELGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbEIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyxtQ0FBbUM7SUFFMUYsV0FBVyxHQUE4QixNQUFNLENBQUM7SUFDaEQsUUFBUSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFNUIsa0JBQWtC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Ozs7Ozs7Ozs7O0dBdUdUO2lCQUNGOytHQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgYWRkRGF5cywgYWRkTW9udGhzLCBzdWJNb250aHMsIHN0YXJ0T2ZNb250aCwgZW5kT2ZNb250aCxcbiAgc3RhcnRPZldlZWssIGVuZE9mV2VlaywgZWFjaERheU9mSW50ZXJ2YWwsIGlzU2FtZU1vbnRoLFxuICBpc1NhbWVEYXksIGlzVG9kYXksIHNldE1vbnRoLCBzZXRZZWFyLCBhZGRZZWFycywgc3ViWWVhcnMsXG4gIGlzQmVmb3JlLCBzdGFydE9mRGF5LCBpc1dpdGhpbkludGVydmFsLCBmb3JtYXRcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7RGF0ZVJhbmdlfSBmcm9tICcuL3R5cGVzL2RhdGUtcmFuZ2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1yYW5nZS1jYWxlbmRhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhbmdlQ2FsZW5kYXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY24oJ3RleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGlubGluZS1ibG9jayBtaW4tdy1maXQnLCBib3JkZXJlZCA/ICdwLTMgYm9yZGVyIHJvdW5kZWQtbWQgYmctYmFja2dyb3VuZCBzaGFkb3ctc20nIDogJycsIGNsYXNzKVwiPlxuXG4gICAgICA8IS0tID09PT09IE11bHRpLW1vbnRoIHZpZXcgKHNpZGUtYnktc2lkZSwgc2hhcmVkIHJhbmdlKSA9PT09PSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJudW1iZXJPZk1vbnRocyA+IDFcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgc206ZmxleC1yb3dcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbSBvZiB2aXNpYmxlTW9udGhzOyBsZXQgaWR4ID0gaW5kZXhcIiBjbGFzcz1cInNwYWNlLXktMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHQtMSBwYi0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaWR4ID09PSAwXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcmV2KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlkeCAhPT0gMFwiIGNsYXNzPVwiaC03IHctN1wiPjwvc3Bhbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gZm9udC1zZW1pYm9sZFwiPnt7IG0ubGFiZWwgfX08L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlkeCA9PT0gdmlzaWJsZU1vbnRocy5sZW5ndGggLSAxXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJuZXh0KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIiBhcmlhLWxhYmVsPVwiTmV4dCBtb250aFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInJpLWFycm93LXJpZ2h0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlkeCAhPT0gdmlzaWJsZU1vbnRocy5sZW5ndGggLSAxXCIgY2xhc3M9XCJoLTcgdy03XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMVwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiIGNsYXNzPVwidGV4dC1bMC44cmVtXSB0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9udC1ub3JtYWwgdGV4dC1jZW50ZXIgdy05XCI+e3sgZGF5IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgcm9sZT1cImdyaWRcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMVwiIChrZXlkb3duKT1cIm9uR3JpZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0ZSBvZiBtLmRheXNcIj5cbiAgICAgICAgICAgICAgPCEtLSBPbmx5IHRoZSBtb250aCdzIG93biBkYXlzIGFyZSByZW5kZXJlZDsgYWRqYWNlbnQtbW9udGggZGF5cyBhcmVcbiAgICAgICAgICAgICAgICAgICBibGFuayBzcGFjZXJzIHNvIGVhY2ggY2FsZW5kYXIgaW4gYSBtdWx0aS1tb250aCB2aWV3IGlzIHNlbGYtY29udGFpbmVkLiAtLT5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDdXJyZW50TW9udGgoZGF0ZSwgbS5kYXRlKTsgZWxzZSBwYWRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kYXRlXT1cImZtdEtleShkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihkYXRlIHwgZGF0ZTonZnVsbERhdGUnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldERheUNsYXNzKGRhdGUsIG0uZGF0ZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZGF0ZSB8IGRhdGU6ICdkJyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwYWQ+PHNwYW4gY2xhc3M9XCJoLTkgdy05XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSA9PT09PSBTaW5nbGUtbW9udGggdmlldyAod2l0aCBtb250aCAvIHllYXIgcXVpY2sgcGlja2VycykgPT09PT0gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtYmVyT2ZNb250aHMgPD0gMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTEgcGItNCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldFZpZXcoJ21vbnRoJylcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsIGN1cnJlbnRWaWV3ID09PSAnbW9udGgnID8gJ2JnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kJyA6ICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgICAgICAgIHt7IHZpZXdEYXRlIHwgZGF0ZTogJ01NTU0nIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWaWV3KCd5ZWFyJylcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsIGN1cnJlbnRWaWV3ID09PSAneWVhcicgPyAnYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQnIDogJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJylcIj5cbiAgICAgICAgICAgICAge3sgdmlld0RhdGUgfCBkYXRlOiAneXl5eScgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcmV2KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIj48aSBjbGFzcz1cInJpLWFycm93LWxlZnQtcy1saW5lIHRleHQtbGdcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dCgpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIk5leHQgbW9udGhcIj48aSBjbGFzcz1cInJpLWFycm93LXJpZ2h0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdkYXRlJ1wiIGNsYXNzPVwic3BhY2UteS0yIGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC15LTEgdy1mdWxsXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlzXCIgY2xhc3M9XCJ0ZXh0LVswLjhyZW1dIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb250LW5vcm1hbCB0ZXh0LWNlbnRlciB3LTlcIj5cbiAgICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiByb2xlPVwiZ3JpZFwiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xIHctZnVsbFwiIChrZXlkb3duKT1cIm9uR3JpZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0ZSBvZiBkYXlzSW5Nb250aFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRhdGVdPVwiZm10S2V5KGRhdGUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZGF0ZSB8IGRhdGU6J2Z1bGxEYXRlJylcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXRlKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnZXREYXlDbGFzcyhkYXRlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdtb250aCdcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgdy02NCBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdE1vbnRoKGkpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbigndGV4dC1zbSBweS0yLjUgcm91bmRlZC1tZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsIGkgPT09IHZpZXdEYXRlLmdldE1vbnRoKCkgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJylcIj5cbiAgICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ3llYXInXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMiByb3VuZGVkLW1kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJywgeWVhciA9PT0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKSA/ICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyA6ICcnKVwiPlxuICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIFJhbmdlQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBASW5wdXQoKSBkaXNhYmxlUGFzdERhdGVzID0gZmFsc2U7XG4gIC8qKiBSZW5kZXJzIHRoZSBjYWxlbmRhcidzIG93biBib3JkZXIvYmFja2dyb3VuZC9zaGFkb3cuIFNldCBgZmFsc2VgIGluc2lkZSBhXG4gICAqIGNhcmQvcG9wb3ZlciB0aGF0IGFscmVhZHkgcHJvdmlkZXMgY2hyb21lLiBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIGJvcmRlcmVkID0gdHJ1ZTtcbiAgLyoqIE51bWJlciBvZiBjb25zZWN1dGl2ZSBtb250aHMgcmVuZGVyZWQgc2lkZSBieSBzaWRlLiBAZGVmYXVsdCAxICovXG4gIEBJbnB1dCgpIG51bWJlck9mTW9udGhzID0gMTtcbiAgQE91dHB1dCgpIHJhbmdlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7IC8vIEVtaXRzIHdoZW5ldmVyIHNlbGVjdGlvbiBjaGFuZ2VzXG5cbiAgY3VycmVudFZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF0ZSc7XG4gIHZpZXdEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICAvLyBUaGUgUmFuZ2UgVmFsdWVcbiAgdmFsdWU6IERhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gIHdlZWtEYXlzID0gWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddO1xuICBkYXlzSW5Nb250aDogRGF0ZVtdID0gW107XG4gIC8qKiBHcmlkcyBmb3IgZWFjaCB2aXNpYmxlIG1vbnRoIChtdWx0aS1tb250aCB2aWV3KS4gKi9cbiAgdmlzaWJsZU1vbnRoczogeyBkYXRlOiBEYXRlOyBkYXlzOiBEYXRlW107IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG4gIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG5cbiAgbmF2QnRuQ2xhc3MgPSBjbignaC03IHctNyBiZy10cmFuc3BhcmVudCBwLTAgb3BhY2l0eS01MCBob3ZlcjpvcGFjaXR5LTEwMCBib3JkZXIgYm9yZGVyLWlucHV0IHJvdW5kZWQtbWQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1hbGwgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcnKTtcblxuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZVJhbmdlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBSZWJ1aWxkIHRoZSBtb250aCBncmlkcyB3aGVuIHRoZSB2aXNpYmxlLW1vbnRoIGNvdW50IGNoYW5nZXMgYWZ0ZXIgaW5pdFxuICAgIC8vIChlLmcuIGEgYFtudW1iZXJPZk1vbnRoc11gIHRvZ2dsZSksIHNvIHNpbmdsZSDih4QgbXVsdGktbW9udGggaXMgcmVhY3RpdmUuXG4gICAgaWYgKGNoYW5nZXNbJ251bWJlck9mTW9udGhzJ10gJiYgIWNoYW5nZXNbJ251bWJlck9mTW9udGhzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIERhdGUgR2VuZXJhdGlvbiBMb2dpYyAoU2FtZSBhcyBDYWxlbmRhcikgLS0tXG4gIGdlbmVyYXRlRGF5cygpIHtcbiAgICBjb25zdCBzdGFydCA9IHN0YXJ0T2ZXZWVrKHN0YXJ0T2ZNb250aCh0aGlzLnZpZXdEYXRlKSk7XG4gICAgY29uc3QgZW5kID0gZW5kT2ZXZWVrKGVuZE9mTW9udGgodGhpcy52aWV3RGF0ZSkpO1xuICAgIHRoaXMuZGF5c0luTW9udGggPSBlYWNoRGF5T2ZJbnRlcnZhbCh7IHN0YXJ0LCBlbmQgfSk7XG5cbiAgICAvLyBNdWx0aS1tb250aCBncmlkczogdmlld0RhdGUgaXMgdGhlIGxlZnRtb3N0IG1vbnRoLCB0aGVuIE4tMSBjb25zZWN1dGl2ZS5cbiAgICBjb25zdCBjb3VudCA9IE1hdGgubWF4KDEsIHRoaXMubnVtYmVyT2ZNb250aHMpO1xuICAgIHRoaXMudmlzaWJsZU1vbnRocyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBtb250aERhdGUgPSBhZGRNb250aHModGhpcy52aWV3RGF0ZSwgaSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRlOiBtb250aERhdGUsXG4gICAgICAgIGRheXM6IGVhY2hEYXlPZkludGVydmFsKHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKHN0YXJ0T2ZNb250aChtb250aERhdGUpKSwgZW5kOiBlbmRPZldlZWsoZW5kT2ZNb250aChtb250aERhdGUpKSB9KSxcbiAgICAgICAgbGFiZWw6IGZvcm1hdChtb250aERhdGUsICdNTU1NIHl5eXknKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZVllYXJzKCkge1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHRoaXMueWVhcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNiB9LCAoXywgaSkgPT4gY3VycmVudFllYXIgLSA2ICsgaSk7XG4gIH1cblxuICBzZXRWaWV3KHZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicpIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmlldztcbiAgICBpZiAodmlldyA9PT0gJ3llYXInKSB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdkYXRlJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1Yk1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxNik7XG4gICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMTYpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIFJhbmdlIFNlbGVjdGlvbiBMb2dpYyAtLS1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLnZhbHVlO1xuXG4gICAgLy8gMS4gSWYgc3RhcnQgZXhpc3RzIGJ1dCBlbmQgZG9lc24ndFxuICAgIGlmIChzdGFydCAmJiAhZW5kKSB7XG4gICAgICBpZiAoaXNCZWZvcmUoZGF0ZSwgc3RhcnQpKSB7XG4gICAgICAgIC8vIFVzZXIgY2xpY2tlZCBlYXJsaWVyIGRhdGUgLT4gUmVzZXQgc3RhcnRcbiAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IGRhdGUsIGVuZDogbnVsbCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlciBjbGlja2VkIGxhdGVyIGRhdGUgLT4gQ29tcGxldGUgcmFuZ2VcbiAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQsIGVuZDogZGF0ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyAyLiBJZiBuZWl0aGVyIGV4aXN0IE9SIGJvdGggZXhpc3QgKHJlc2V0KVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IGRhdGUsIGVuZDogbnVsbCB9O1xuICAgIH1cblxuICAgIC8vIE9ubHkgcmUtYW5jaG9yIHRoZSB2aWV3IHdoZW4gdGhlIGNsaWNrZWQgZGF5IGlzbid0IGFscmVhZHkgb24gYSB2aXNpYmxlIG1vbnRoXG4gICAgLy8gKHNvIGNsaWNraW5nIHRoZSByaWdodC1oYW5kIG1vbnRoIGluIGEgMi1tb250aCB2aWV3IGRvZXNuJ3QganVtcCB0aGUgY2FsZW5kYXIpLlxuICAgIGNvbnN0IG9uVmlzaWJsZU1vbnRoID0gdGhpcy52aXNpYmxlTW9udGhzLnNvbWUoKG0pID0+IGlzU2FtZU1vbnRoKGRhdGUsIG0uZGF0ZSkpO1xuICAgIGlmICghb25WaXNpYmxlTW9udGgpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdGFydE9mTW9udGgoZGF0ZSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5yYW5nZVNlbGVjdC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICAvLyAtLS0gR3JpZCBrZXlib2FyZCBuYXZpZ2F0aW9uIChkYXRlIHZpZXcgb25seSkgLS0tXG5cbiAgLyoqXG4gICAqIEFycm93IGtleXMgbW92ZSBieSBkYXkvd2VlaywgSG9tZS9FbmQgdG8gd2VlayBlZGdlcywgUGFnZVVwL1BhZ2VEb3duIGJ5XG4gICAqIG1vbnRoLiBFbnRlci9TcGFjZSBhcmUgbGVmdCB0byB0aGUgbmF0aXZlIGRheSA8YnV0dG9uPi4gVGhlIGZvY3VzZWQgZGF5IGlzXG4gICAqIHJlYWQgZnJvbSBpdHMgYGRhdGEtZGF0ZWAga2V5LCBzbyBuYXZpZ2F0aW9uIGlzIGluZGVwZW5kZW50IG9mIGdyaWQgbGF5b3V0XG4gICAqIChhZGphY2VudC1tb250aCBkYXlzIGFyZW4ndCByZW5kZXJlZCBpbiB0aGUgbXVsdGktbW9udGggdmlldykuXG4gICAqL1xuICBvbkdyaWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMubnVtYmVyT2ZNb250aHMgPD0gMSAmJiB0aGlzLmN1cnJlbnRWaWV3ICE9PSAnZGF0ZScpIHJldHVybjtcblxuICAgIGNvbnN0IGtleSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJyk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5rZXlUb0RhdGUoa2V5KTtcblxuICAgIGxldCBuZXh0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIC0xKTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzogbmV4dCA9IGFkZERheXMoY3VycmVudCwgMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIC03KTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCA3KTsgYnJlYWs7XG4gICAgICBjYXNlICdIb21lJzogbmV4dCA9IHN0YXJ0T2ZXZWVrKGN1cnJlbnQpOyBicmVhaztcbiAgICAgIGNhc2UgJ0VuZCc6IG5leHQgPSBlbmRPZldlZWsoY3VycmVudCk7IGJyZWFrO1xuICAgICAgY2FzZSAnUGFnZVVwJzogbmV4dCA9IHN1Yk1vbnRocyhjdXJyZW50LCAxKTsgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlRG93bic6IG5leHQgPSBhZGRNb250aHMoY3VycmVudCwgMSk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5mb2N1c0RheShuZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEYXkoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYFtkYXRhLWRhdGU9XCIke3RoaXMuZm10S2V5KGRhdGUpfVwiXWA7XG4gICAgbGV0IGJ0biA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKGJ0bikgeyBidG4uZm9jdXMoKTsgcmV0dXJuOyB9XG5cbiAgICAvLyBUYXJnZXQgZGF5IGlzbid0IGN1cnJlbnRseSByZW5kZXJlZCDihpIgcGFnZSB0aGUgdmlldyB0b3dhcmQgaXQsIHRoZW4gcmV0cnkuXG4gICAgaWYgKHRoaXMubnVtYmVyT2ZNb250aHMgPiAxKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gaXNCZWZvcmUoZGF0ZSwgdGhpcy52aXNpYmxlTW9udGhzWzBdLmRhdGUpXG4gICAgICAgID8gc3ViTW9udGhzKHRoaXMudmlld0RhdGUsIDEpXG4gICAgICAgIDogYWRkTW9udGhzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3RhcnRPZk1vbnRoKGRhdGUpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBidG4gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGJ0bj8uZm9jdXMoKTtcbiAgfVxuXG4gIHNlbGVjdE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudmlld0RhdGUgPSBzZXRNb250aCh0aGlzLnZpZXdEYXRlLCBtb250aEluZGV4KTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gIH1cblxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xuICAgIHRoaXMudmlld0RhdGUgPSBzZXRZZWFyKHRoaXMudmlld0RhdGUsIHllYXIpO1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSAnZGF0ZSc7XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgfVxuXG4gIC8vIC0tLSBWaXN1YWwgU3R5bGluZyBmb3IgUmFuZ2UgLS0tXG5cbiAgaXNTZWxlY3RlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLnZhbHVlO1xuICAgIHJldHVybiAhISgoc3RhcnQgJiYgaXNTYW1lRGF5KGRhdGUsIHN0YXJ0KSkgfHwgKGVuZCAmJiBpc1NhbWVEYXkoZGF0ZSwgZW5kKSkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBgZGF0ZWAgYmVsb25ncyB0byBgcmVmTW9udGhgICh1c2VkIHRvIGJsYW5rIG91dCBhZGphY2VudC1tb250aCBjZWxscykuICovXG4gIGlzQ3VycmVudE1vbnRoKGRhdGU6IERhdGUsIHJlZk1vbnRoOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2FtZU1vbnRoKGRhdGUsIHJlZk1vbnRoKTtcbiAgfVxuXG4gIC8qKiBTdGFibGUsIHRpbWV6b25lLXNhZmUgYGRhdGEtZGF0ZWAga2V5IHVzZWQgdG8gbG9jYXRlIGRheSBidXR0b25zIGZvciBmb2N1cy4gKi9cbiAgZm10S2V5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgJ3l5eXktTU0tZGQnKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9EYXRlKGtleTogc3RyaW5nKTogRGF0ZSB7XG4gICAgY29uc3QgW3ksIG0sIGRdID0ga2V5LnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcbiAgfVxuXG4gIGdldERheUNsYXNzKGRhdGU6IERhdGUsIHJlZk1vbnRoOiBEYXRlID0gdGhpcy52aWV3RGF0ZSkge1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCBpc091dHNpZGUgPSAhaXNTYW1lTW9udGgoZGF0ZSwgcmVmTW9udGgpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpO1xuXG4gICAgLy8gUmFuZ2UgQ2hlY2tzXG4gICAgY29uc3QgaXNTdGFydCA9IHN0YXJ0ICYmIGlzU2FtZURheShkYXRlLCBzdGFydCk7XG4gICAgY29uc3QgaXNFbmQgPSBlbmQgJiYgaXNTYW1lRGF5KGRhdGUsIGVuZCk7XG4gICAgY29uc3QgaXNJbnNpZGUgPSBzdGFydCAmJiBlbmQgJiYgaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgY29uc3QgaXNUb2RheURhdGUgPSBpc1RvZGF5KGRhdGUpO1xuXG4gICAgcmV0dXJuIGNuKFxuICAgICAgLy8gQmFzZTogaC05IHctOSwgYnV0IHdlIHJlbW92ZSBtYXJnaW5zL3JvdW5kaW5nIGZvciB0aGUgJ3N0cmlwJyBlZmZlY3RcbiAgICAgICdoLTkgdy05IHAtMCBmb250LW5vcm1hbCB0ZXh0LXNtIHRyYW5zaXRpb24tYWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJlbGF0aXZlIHotMTAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcnLFxuXG4gICAgICAvLyBEZWZhdWx0IFN0YXRlIChOb3Qgc2VsZWN0ZWQsIE5vdCBkaXNhYmxlZClcbiAgICAgICFpc0luc2lkZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgIWlzRGlzYWJsZWQgJiYgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBUaGUgXCJDYXBzXCI6IFN0YXJ0IGFuZCBFbmRcbiAgICAgIChpc1N0YXJ0IHx8IGlzRW5kKSAmJiAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGZvY3VzOmJnLXByaW1hcnkgZm9jdXM6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuXG4gICAgICAvLyBUaGUgXCJTdHJpcFwiOiBEYXRlcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmRcbiAgICAgIGlzSW5zaWRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50IHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1ub25lJyxcblxuICAgICAgLy8gQ29ubmVjdGluZyB0aGUgQ2FwcyB0byB0aGUgU3RyaXAgKFJlY3Rhbmd1bGFyIGluc2lkZSBlZGdlcylcbiAgICAgIGlzU3RhcnQgJiYgZW5kICYmICdyb3VuZGVkLWwtbWQgcm91bmRlZC1yLW5vbmUnLFxuICAgICAgaXNFbmQgJiYgc3RhcnQgJiYgJ3JvdW5kZWQtci1tZCByb3VuZGVkLWwtbm9uZScsXG4gICAgICAvLyBJZiBubyBlbmQgZGF0ZSB5ZXQsIFN0YXJ0IHNob3VsZCBiZSBmdWxseSByb3VuZGVkXG4gICAgICBpc1N0YXJ0ICYmICFlbmQgJiYgJ3JvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBNdXRlZC9EaXNhYmxlZCBsb2dpY1xuICAgICAgIWlzSW5zaWRlICYmIGlzVG9kYXlEYXRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50LzUwIHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1tZCcsXG4gICAgICAoaXNPdXRzaWRlIHx8IGlzRGlzYWJsZWQpICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICBpc0Rpc2FibGVkICYmICdjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgKTtcbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGFzdERhdGVzID8gaXNCZWZvcmUoZGF0ZSwgc3RhcnRPZkRheShuZXcgRGF0ZSgpKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLSBDVkEgSW1wbGVtZW50YXRpb24gLS0tXG4gIHdyaXRlVmFsdWUodmFsOiBEYXRlUmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICAgIGlmICh2YWwuc3RhcnQpIHRoaXMudmlld0RhdGUgPSB2YWwuc3RhcnQ7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG59XG4iXX0=
|
|
498
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9yYW5nZS1jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN2RCxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUMvQyxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUF3SGhDLE1BQU0sT0FBTyxzQkFBc0I7SUE2QmI7SUFBZ0M7SUE1QjNDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDbEM7a0VBQzhEO0lBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIscUVBQXFFO0lBQzVELGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbEIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyxtQ0FBbUM7SUFFMUYsV0FBVyxHQUE4QixNQUFNLENBQUM7SUFDaEQsUUFBUSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFNUIsa0JBQWtC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O2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIGZvcndhcmRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZERheXMsIGFkZE1vbnRocywgc3ViTW9udGhzLCBzdGFydE9mTW9udGgsIGVuZE9mTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLCBlbmRPZldlZWssIGVhY2hEYXlPZkludGVydmFsLCBpc1NhbWVNb250aCxcbiAgaXNTYW1lRGF5LCBpc1RvZGF5LCBzZXRNb250aCwgc2V0WWVhciwgYWRkWWVhcnMsIHN1YlllYXJzLFxuICBpc0JlZm9yZSwgc3RhcnRPZkRheSwgaXNXaXRoaW5JbnRlcnZhbCwgZm9ybWF0XG59IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5pbXBvcnQge0RhdGVSYW5nZX0gZnJvbSAnLi90eXBlcy9kYXRlLXJhbmdlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtcmFuZ2UtY2FsZW5kYXInLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYW5nZUNhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNuKCd0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBpbmxpbmUtYmxvY2sgbWluLXctZml0JywgYm9yZGVyZWQgPyAncC0zIGJvcmRlciByb3VuZGVkLW1kIGJnLWJhY2tncm91bmQgc2hhZG93LXNtJyA6ICcnLCBjbGFzcylcIj5cblxuICAgICAgPCEtLSA9PT09PSBNdWx0aS1tb250aCB2aWV3IChzaWRlLWJ5LXNpZGUsIHNoYXJlZCByYW5nZSkgPT09PT0gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVyT2ZNb250aHMgPiAxXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG0gb2YgdmlzaWJsZU1vbnRoczsgbGV0IGlkeCA9IGluZGV4XCIgY2xhc3M9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTEgcGItMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlkeCA9PT0gMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIG1vbnRoXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicmktYXJyb3ctbGVmdC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpZHggIT09IDBcIiBjbGFzcz1cImgtNyB3LTdcIj48L3NwYW4+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGRcIj57eyBtLmxhYmVsIH19PC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpZHggPT09IHZpc2libGVNb250aHMubGVuZ3RoIC0gMVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dCgpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIk5leHQgbW9udGhcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hcnJvdy1yaWdodC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpZHggIT09IHZpc2libGVNb250aHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiaC03IHctN1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC15LTFcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIiBjbGFzcz1cInRleHQtWzAuOHJlbV0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvbnQtbm9ybWFsIHRleHQtY2VudGVyIHctOVwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHJvbGU9XCJncmlkXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC15LTFcIiAoa2V5ZG93bik9XCJvbkdyaWRLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGUgb2YgbS5kYXlzXCI+XG4gICAgICAgICAgICAgIDwhLS0gT25seSB0aGUgbW9udGgncyBvd24gZGF5cyBhcmUgcmVuZGVyZWQ7IGFkamFjZW50LW1vbnRoIGRheXMgYXJlXG4gICAgICAgICAgICAgICAgICAgYmxhbmsgc3BhY2VycyBzbyBlYWNoIGNhbGVuZGFyIGluIGEgbXVsdGktbW9udGggdmlldyBpcyBzZWxmLWNvbnRhaW5lZC4gLS0+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzQ3VycmVudE1vbnRoKGRhdGUsIG0uZGF0ZSk7IGVsc2UgcGFkXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF0ZV09XCJmbXRLZXkoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZGF0ZSB8IGRhdGU6J2Z1bGxEYXRlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRhdGUpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXREYXlDbGFzcyhkYXRlLCBtLmRhdGUpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGFkPjxzcGFuIGNsYXNzPVwiaC05IHctOVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gPT09PT0gU2luZ2xlLW1vbnRoIHZpZXcgKHdpdGggbW9udGggLyB5ZWFyIHF1aWNrIHBpY2tlcnMpID09PT09IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm51bWJlck9mTW9udGhzIDw9IDFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwdC0xIHBiLTQgZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWaWV3KCdtb250aCcpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0xIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMnLCBjdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/ICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCcgOiAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnKVwiPlxuICAgICAgICAgICAgICB7eyB2aWV3RGF0ZSB8IGRhdGU6ICdNTU1NJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2V0VmlldygneWVhcicpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0xIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMnLCBjdXJyZW50VmlldyA9PT0gJ3llYXInID8gJ2JnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kJyA6ICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgICAgICAgIHt7IHZpZXdEYXRlIHwgZGF0ZTogJ3l5eXknIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIG1vbnRoXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm5leHQoKVwiIFtjbGFzc109XCJuYXZCdG5DbGFzc1wiIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1yaWdodC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnZGF0ZSdcIiBjbGFzcz1cInNwYWNlLXktMiBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xIHctZnVsbFwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiIGNsYXNzPVwidGV4dC1bMC44cmVtXSB0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9udC1ub3JtYWwgdGV4dC1jZW50ZXIgdy05XCI+XG4gICAgICAgICAgICAgIHt7IGRheSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgcm9sZT1cImdyaWRcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMSB3LWZ1bGxcIiAoa2V5ZG93bik9XCJvbkdyaWRLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF5c0luTW9udGhcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kYXRlXT1cImZtdEtleShkYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGRhdGUgfCBkYXRlOidmdWxsRGF0ZScpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF0ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0RGF5Q2xhc3MoZGF0ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBkYXRlIHwgZGF0ZTogJ2QnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnbW9udGgnXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3RNb250aChpKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMi41IHJvdW5kZWQtbWQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMnLCBpID09PSB2aWV3RGF0ZS5nZXRNb250aCgpID8gJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQnIDogJycpXCI+XG4gICAgICAgICAgICB7eyBtb250aCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICd5ZWFyJ1wiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNCBnYXAtMiB3LTY0IGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIHB5LTIgcm91bmRlZC1tZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsIHllYXIgPT09IHZpZXdEYXRlLmdldEZ1bGxZZWFyKCkgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJylcIj5cbiAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZVBhc3REYXRlcyA9IGZhbHNlO1xuICAvKiogUmVuZGVycyB0aGUgY2FsZW5kYXIncyBvd24gYm9yZGVyL2JhY2tncm91bmQvc2hhZG93LiBTZXQgYGZhbHNlYCBpbnNpZGUgYVxuICAgKiBjYXJkL3BvcG92ZXIgdGhhdCBhbHJlYWR5IHByb3ZpZGVzIGNocm9tZS4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBib3JkZXJlZCA9IHRydWU7XG4gIC8qKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbW9udGhzIHJlbmRlcmVkIHNpZGUgYnkgc2lkZS4gQGRlZmF1bHQgMSAqL1xuICBASW5wdXQoKSBudW1iZXJPZk1vbnRocyA9IDE7XG4gIEBPdXRwdXQoKSByYW5nZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpOyAvLyBFbWl0cyB3aGVuZXZlciBzZWxlY3Rpb24gY2hhbmdlc1xuXG4gIGN1cnJlbnRWaWV3OiAnZGF0ZScgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RhdGUnO1xuICB2aWV3RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgLy8gVGhlIFJhbmdlIFZhbHVlXG4gIHZhbHVlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICB3ZWVrRGF5cyA9IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXTtcbiAgZGF5c0luTW9udGg6IERhdGVbXSA9IFtdO1xuICAvKiogR3JpZHMgZm9yIGVhY2ggdmlzaWJsZSBtb250aCAobXVsdGktbW9udGggdmlldykuICovXG4gIHZpc2libGVNb250aHM6IHsgZGF0ZTogRGF0ZTsgZGF5czogRGF0ZVtdOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gIG5hdkJ0bkNsYXNzID0gY24oJ2gtNyB3LTcgYmctdHJhbnNwYXJlbnQgcC0wIG9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAgYm9yZGVyIGJvcmRlci1pbnB1dCByb3VuZGVkLW1kIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tYWxsIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyk7XG5cbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIG9uQ2hhbmdlOiAodmFsdWU6IERhdGVSYW5nZSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcm90ZWN0ZWQgY24gPSBjbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gUmVidWlsZCB0aGUgbW9udGggZ3JpZHMgd2hlbiB0aGUgdmlzaWJsZS1tb250aCBjb3VudCBjaGFuZ2VzIGFmdGVyIGluaXRcbiAgICAvLyAoZS5nLiBhIGBbbnVtYmVyT2ZNb250aHNdYCB0b2dnbGUpLCBzbyBzaW5nbGUg4oeEIG11bHRpLW1vbnRoIGlzIHJlYWN0aXZlLlxuICAgIGlmIChjaGFuZ2VzWydudW1iZXJPZk1vbnRocyddICYmICFjaGFuZ2VzWydudW1iZXJPZk1vbnRocyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBEYXRlIEdlbmVyYXRpb24gTG9naWMgKFNhbWUgYXMgQ2FsZW5kYXIpIC0tLVxuICBnZW5lcmF0ZURheXMoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzdGFydE9mV2VlayhzdGFydE9mTW9udGgodGhpcy52aWV3RGF0ZSkpO1xuICAgIGNvbnN0IGVuZCA9IGVuZE9mV2VlayhlbmRPZk1vbnRoKHRoaXMudmlld0RhdGUpKTtcbiAgICB0aGlzLmRheXNJbk1vbnRoID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0pO1xuXG4gICAgLy8gTXVsdGktbW9udGggZ3JpZHM6IHZpZXdEYXRlIGlzIHRoZSBsZWZ0bW9zdCBtb250aCwgdGhlbiBOLTEgY29uc2VjdXRpdmUuXG4gICAgY29uc3QgY291bnQgPSBNYXRoLm1heCgxLCB0aGlzLm51bWJlck9mTW9udGhzKTtcbiAgICB0aGlzLnZpc2libGVNb250aHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4ge1xuICAgICAgY29uc3QgbW9udGhEYXRlID0gYWRkTW9udGhzKHRoaXMudmlld0RhdGUsIGkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogbW9udGhEYXRlLFxuICAgICAgICBkYXlzOiBlYWNoRGF5T2ZJbnRlcnZhbCh7IHN0YXJ0OiBzdGFydE9mV2VlayhzdGFydE9mTW9udGgobW9udGhEYXRlKSksIGVuZDogZW5kT2ZXZWVrKGVuZE9mTW9udGgobW9udGhEYXRlKSkgfSksXG4gICAgICAgIGxhYmVsOiBmb3JtYXQobW9udGhEYXRlLCAnTU1NTSB5eXl5JyksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVZZWFycygpIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGkpID0+IGN1cnJlbnRZZWFyIC0gNiArIGkpO1xuICB9XG5cbiAgc2V0Vmlldyh2aWV3OiAnZGF0ZScgfCAnbW9udGgnIHwgJ3llYXInKSB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgaWYgKHZpZXcgPT09ICd5ZWFyJykgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICBwcmV2KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3ViWWVhcnModGhpcy52aWV3RGF0ZSwgMTYpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3ViWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkTW9udGhzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZFllYXJzKHRoaXMudmlld0RhdGUsIDE2KTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZFllYXJzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBSYW5nZSBTZWxlY3Rpb24gTG9naWMgLS0tXG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcblxuICAgIC8vIDEuIElmIHN0YXJ0IGV4aXN0cyBidXQgZW5kIGRvZXNuJ3RcbiAgICBpZiAoc3RhcnQgJiYgIWVuZCkge1xuICAgICAgaWYgKGlzQmVmb3JlKGRhdGUsIHN0YXJ0KSkge1xuICAgICAgICAvLyBVc2VyIGNsaWNrZWQgZWFybGllciBkYXRlIC0+IFJlc2V0IHN0YXJ0XG4gICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiBkYXRlLCBlbmQ6IG51bGwgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZXIgY2xpY2tlZCBsYXRlciBkYXRlIC0+IENvbXBsZXRlIHJhbmdlXG4gICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0LCBlbmQ6IGRhdGUgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gMi4gSWYgbmVpdGhlciBleGlzdCBPUiBib3RoIGV4aXN0IChyZXNldClcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiBkYXRlLCBlbmQ6IG51bGwgfTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHJlLWFuY2hvciB0aGUgdmlldyB3aGVuIHRoZSBjbGlja2VkIGRheSBpc24ndCBhbHJlYWR5IG9uIGEgdmlzaWJsZSBtb250aFxuICAgIC8vIChzbyBjbGlja2luZyB0aGUgcmlnaHQtaGFuZCBtb250aCBpbiBhIDItbW9udGggdmlldyBkb2Vzbid0IGp1bXAgdGhlIGNhbGVuZGFyKS5cbiAgICBjb25zdCBvblZpc2libGVNb250aCA9IHRoaXMudmlzaWJsZU1vbnRocy5zb21lKChtKSA9PiBpc1NhbWVNb250aChkYXRlLCBtLmRhdGUpKTtcbiAgICBpZiAoIW9uVmlzaWJsZU1vbnRoKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3RhcnRPZk1vbnRoKGRhdGUpO1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMucmFuZ2VTZWxlY3QuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgLy8gLS0tIEdyaWQga2V5Ym9hcmQgbmF2aWdhdGlvbiAoZGF0ZSB2aWV3IG9ubHkpIC0tLVxuXG4gIC8qKlxuICAgKiBBcnJvdyBrZXlzIG1vdmUgYnkgZGF5L3dlZWssIEhvbWUvRW5kIHRvIHdlZWsgZWRnZXMsIFBhZ2VVcC9QYWdlRG93biBieVxuICAgKiBtb250aC4gRW50ZXIvU3BhY2UgYXJlIGxlZnQgdG8gdGhlIG5hdGl2ZSBkYXkgPGJ1dHRvbj4uIFRoZSBmb2N1c2VkIGRheSBpc1xuICAgKiByZWFkIGZyb20gaXRzIGBkYXRhLWRhdGVgIGtleSwgc28gbmF2aWdhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBncmlkIGxheW91dFxuICAgKiAoYWRqYWNlbnQtbW9udGggZGF5cyBhcmVuJ3QgcmVuZGVyZWQgaW4gdGhlIG11bHRpLW1vbnRoIHZpZXcpLlxuICAgKi9cbiAgb25HcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzIDw9IDEgJiYgdGhpcy5jdXJyZW50VmlldyAhPT0gJ2RhdGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBrZXkgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMua2V5VG9EYXRlKGtleSk7XG5cbiAgICBsZXQgbmV4dDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCAtMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIDEpOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCAtNyk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzogbmV4dCA9IGFkZERheXMoY3VycmVudCwgNyk7IGJyZWFrO1xuICAgICAgY2FzZSAnSG9tZSc6IG5leHQgPSBzdGFydE9mV2VlayhjdXJyZW50KTsgYnJlYWs7XG4gICAgICBjYXNlICdFbmQnOiBuZXh0ID0gZW5kT2ZXZWVrKGN1cnJlbnQpOyBicmVhaztcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6IG5leHQgPSBzdWJNb250aHMoY3VycmVudCwgMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnUGFnZURvd24nOiBuZXh0ID0gYWRkTW9udGhzKGN1cnJlbnQsIDEpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZm9jdXNEYXkobmV4dCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRGF5KGRhdGU6IERhdGUpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGBbZGF0YS1kYXRlPVwiJHt0aGlzLmZtdEtleShkYXRlKX1cIl1gO1xuICAgIGxldCBidG4gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChidG4pIHsgYnRuLmZvY3VzKCk7IHJldHVybjsgfVxuXG4gICAgLy8gVGFyZ2V0IGRheSBpc24ndCBjdXJyZW50bHkgcmVuZGVyZWQg4oaSIHBhZ2UgdGhlIHZpZXcgdG93YXJkIGl0LCB0aGVuIHJldHJ5LlxuICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzID4gMSkge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGlzQmVmb3JlKGRhdGUsIHRoaXMudmlzaWJsZU1vbnRoc1swXS5kYXRlKVxuICAgICAgICA/IHN1Yk1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKVxuICAgICAgICA6IGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN0YXJ0T2ZNb250aChkYXRlKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgYnRuID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBidG4/LmZvY3VzKCk7XG4gIH1cblxuICBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc2V0TW9udGgodGhpcy52aWV3RGF0ZSwgbW9udGhJbmRleCk7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9ICdkYXRlJztcbiAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICB9XG5cbiAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc2V0WWVhcih0aGlzLnZpZXdEYXRlLCB5ZWFyKTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gIH1cblxuICAvLyAtLS0gVmlzdWFsIFN0eWxpbmcgZm9yIFJhbmdlIC0tLVxuXG4gIGlzU2VsZWN0ZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcbiAgICByZXR1cm4gISEoKHN0YXJ0ICYmIGlzU2FtZURheShkYXRlLCBzdGFydCkpIHx8IChlbmQgJiYgaXNTYW1lRGF5KGRhdGUsIGVuZCkpKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYGRhdGVgIGJlbG9uZ3MgdG8gYHJlZk1vbnRoYCAodXNlZCB0byBibGFuayBvdXQgYWRqYWNlbnQtbW9udGggY2VsbHMpLiAqL1xuICBpc0N1cnJlbnRNb250aChkYXRlOiBEYXRlLCByZWZNb250aDogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NhbWVNb250aChkYXRlLCByZWZNb250aCk7XG4gIH1cblxuICAvKiogU3RhYmxlLCB0aW1lem9uZS1zYWZlIGBkYXRhLWRhdGVgIGtleSB1c2VkIHRvIGxvY2F0ZSBkYXkgYnV0dG9ucyBmb3IgZm9jdXMuICovXG4gIGZtdEtleShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvRGF0ZShrZXk6IHN0cmluZyk6IERhdGUge1xuICAgIGNvbnN0IFt5LCBtLCBkXSA9IGtleS5zcGxpdCgnLScpLm1hcChOdW1iZXIpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gIH1cblxuICBnZXREYXlDbGFzcyhkYXRlOiBEYXRlLCByZWZNb250aDogRGF0ZSA9IHRoaXMudmlld0RhdGUpIHtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMudmFsdWU7XG4gICAgY29uc3QgaXNPdXRzaWRlID0gIWlzU2FtZU1vbnRoKGRhdGUsIHJlZk1vbnRoKTtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKTtcblxuICAgIC8vIFJhbmdlIENoZWNrc1xuICAgIGNvbnN0IGlzU3RhcnQgPSBzdGFydCAmJiBpc1NhbWVEYXkoZGF0ZSwgc3RhcnQpO1xuICAgIGNvbnN0IGlzRW5kID0gZW5kICYmIGlzU2FtZURheShkYXRlLCBlbmQpO1xuICAgIGNvbnN0IGlzSW5zaWRlID0gc3RhcnQgJiYgZW5kICYmIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgeyBzdGFydCwgZW5kIH0pO1xuICAgIGNvbnN0IGlzVG9kYXlEYXRlID0gaXNUb2RheShkYXRlKTtcblxuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2U6IGgtOSB3LTksIGJ1dCB3ZSByZW1vdmUgbWFyZ2lucy9yb3VuZGluZyBmb3IgdGhlICdzdHJpcCcgZWZmZWN0XG4gICAgICAnaC05IHctOSBwLTAgZm9udC1ub3JtYWwgdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByZWxhdGl2ZSB6LTEwIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyxcblxuICAgICAgLy8gRGVmYXVsdCBTdGF0ZSAoTm90IHNlbGVjdGVkLCBOb3QgZGlzYWJsZWQpXG4gICAgICAhaXNJbnNpZGUgJiYgIWlzU3RhcnQgJiYgIWlzRW5kICYmICFpc0Rpc2FibGVkICYmICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByb3VuZGVkLW1kJyxcblxuICAgICAgLy8gVGhlIFwiQ2Fwc1wiOiBTdGFydCBhbmQgRW5kXG4gICAgICAoaXNTdGFydCB8fCBpc0VuZCkgJiYgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeSBob3Zlcjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBmb2N1czpiZy1wcmltYXJ5IGZvY3VzOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcblxuICAgICAgLy8gVGhlIFwiU3RyaXBcIjogRGF0ZXMgYmV0d2VlbiBzdGFydCBhbmQgZW5kXG4gICAgICBpc0luc2lkZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgJ2JnLWFjY2VudCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbm9uZScsXG5cbiAgICAgIC8vIENvbm5lY3RpbmcgdGhlIENhcHMgdG8gdGhlIFN0cmlwIChSZWN0YW5ndWxhciBpbnNpZGUgZWRnZXMpXG4gICAgICBpc1N0YXJ0ICYmIGVuZCAmJiAncm91bmRlZC1sLW1kIHJvdW5kZWQtci1ub25lJyxcbiAgICAgIGlzRW5kICYmIHN0YXJ0ICYmICdyb3VuZGVkLXItbWQgcm91bmRlZC1sLW5vbmUnLFxuICAgICAgLy8gSWYgbm8gZW5kIGRhdGUgeWV0LCBTdGFydCBzaG91bGQgYmUgZnVsbHkgcm91bmRlZFxuICAgICAgaXNTdGFydCAmJiAhZW5kICYmICdyb3VuZGVkLW1kJyxcblxuICAgICAgLy8gTXV0ZWQvRGlzYWJsZWQgbG9naWNcbiAgICAgICFpc0luc2lkZSAmJiBpc1RvZGF5RGF0ZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgJ2JnLWFjY2VudC81MCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQnLFxuICAgICAgKGlzT3V0c2lkZSB8fCBpc0Rpc2FibGVkKSAmJiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG9wYWNpdHktNTAnLFxuICAgICAgaXNEaXNhYmxlZCAmJiAnY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVBhc3REYXRlcyA/IGlzQmVmb3JlKGRhdGUsIHN0YXJ0T2ZEYXkobmV3IERhdGUoKSkpIDogZmFsc2U7XG4gIH1cblxuICAvLyAtLS0gQ1ZBIEltcGxlbWVudGF0aW9uIC0tLVxuICB3cml0ZVZhbHVlKHZhbDogRGF0ZVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgICBpZiAodmFsLnN0YXJ0KSB0aGlzLnZpZXdEYXRlID0gdmFsLnN0YXJ0O1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH1cbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxufVxuIl19
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Injectable, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
4
|
+
import { skip } from 'rxjs/operators';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import { cn } from './utils/cn';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
/**
|
|
10
|
+
* Coordinates a `tolle-reasoning` with its trigger and content.
|
|
11
|
+
*
|
|
12
|
+
* The trigger and content are OnPush children, so the open/streaming/duration
|
|
13
|
+
* state they render from is published here rather than read off the parent.
|
|
14
|
+
*
|
|
15
|
+
* Provided on `ReasoningComponent`, so each trace gets its own instance.
|
|
16
|
+
*/
|
|
17
|
+
export class ReasoningService {
|
|
18
|
+
openSource = new BehaviorSubject(false);
|
|
19
|
+
/** Emits whether the trace is expanded. */
|
|
20
|
+
open$ = this.openSource.asObservable();
|
|
21
|
+
streamingSource = new BehaviorSubject(false);
|
|
22
|
+
/** Emits whether the model is still producing the trace. */
|
|
23
|
+
streaming$ = this.streamingSource.asObservable();
|
|
24
|
+
durationSource = new BehaviorSubject(0);
|
|
25
|
+
/** Emits how long the model spent reasoning, in seconds. */
|
|
26
|
+
duration$ = this.durationSource.asObservable();
|
|
27
|
+
/** True while the trace is expanded. */
|
|
28
|
+
get open() {
|
|
29
|
+
return this.openSource.value;
|
|
30
|
+
}
|
|
31
|
+
setOpen(value) {
|
|
32
|
+
if (this.openSource.value !== value)
|
|
33
|
+
this.openSource.next(value);
|
|
34
|
+
}
|
|
35
|
+
toggle() {
|
|
36
|
+
this.setOpen(!this.openSource.value);
|
|
37
|
+
}
|
|
38
|
+
setStreaming(value) {
|
|
39
|
+
if (this.streamingSource.value !== value)
|
|
40
|
+
this.streamingSource.next(value);
|
|
41
|
+
}
|
|
42
|
+
setDuration(value) {
|
|
43
|
+
if (this.durationSource.value !== value)
|
|
44
|
+
this.durationSource.next(value);
|
|
45
|
+
}
|
|
46
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
47
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningService });
|
|
48
|
+
}
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningService, decorators: [{
|
|
50
|
+
type: Injectable
|
|
51
|
+
}] });
|
|
52
|
+
const reasoningVariants = cva('flex w-full flex-col gap-2', {
|
|
53
|
+
variants: {
|
|
54
|
+
size: {
|
|
55
|
+
sm: 'text-xs',
|
|
56
|
+
default: 'text-sm',
|
|
57
|
+
lg: 'text-base',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
defaultVariants: {
|
|
61
|
+
size: 'default',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* A collapsible view of the model's reasoning, collapsed by default.
|
|
66
|
+
*
|
|
67
|
+
* While `streaming` is true the trigger reads "Thinking…"; once it finishes the
|
|
68
|
+
* trigger reports how long the model thought, using `duration`.
|
|
69
|
+
*
|
|
70
|
+
* Compose it from `tolle-reasoning-trigger` and `tolle-reasoning-content`.
|
|
71
|
+
* @new
|
|
72
|
+
*/
|
|
73
|
+
export class ReasoningComponent {
|
|
74
|
+
/** Whether the trace is expanded. @default false */
|
|
75
|
+
open = false;
|
|
76
|
+
/** True while the model is still producing the trace. @default false */
|
|
77
|
+
streaming = false;
|
|
78
|
+
/** Seconds the model spent reasoning, shown once streaming finishes. @default 0 */
|
|
79
|
+
duration = 0;
|
|
80
|
+
/** Text scale of the trace. @default 'default' */
|
|
81
|
+
size = 'default';
|
|
82
|
+
/** Extra Tailwind classes merged onto the trace via `cn()` (last-wins). */
|
|
83
|
+
class = '';
|
|
84
|
+
/** Emitted with the new state whenever the trace is expanded or collapsed. */
|
|
85
|
+
openChange = new EventEmitter();
|
|
86
|
+
service = inject(ReasoningService);
|
|
87
|
+
cdr = inject(ChangeDetectorRef);
|
|
88
|
+
subscriptions = new Subscription();
|
|
89
|
+
/** True while an `open` input is being pushed into the service. */
|
|
90
|
+
applyingInput = false;
|
|
91
|
+
ngOnInit() {
|
|
92
|
+
this.sync();
|
|
93
|
+
// `skip(1)` drops the BehaviorSubject's current value so simply mounting
|
|
94
|
+
// the component never emits a spurious `openChange`.
|
|
95
|
+
this.subscriptions.add(this.service.open$.pipe(skip(1)).subscribe((open) => {
|
|
96
|
+
this.open = open;
|
|
97
|
+
this.cdr.markForCheck();
|
|
98
|
+
// Only user-driven toggles are worth reporting; echoing a change the
|
|
99
|
+
// parent just made would fight a `[(open)]` binding.
|
|
100
|
+
if (!this.applyingInput)
|
|
101
|
+
this.openChange.emit(open);
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
ngOnChanges(changes) {
|
|
105
|
+
if (changes['open'])
|
|
106
|
+
this.applyInput(this.open);
|
|
107
|
+
this.service.setStreaming(this.streaming);
|
|
108
|
+
this.service.setDuration(this.duration);
|
|
109
|
+
// A bound `class` input is written through Angular's styling path,
|
|
110
|
+
// which does not mark an OnPush view dirty on its own.
|
|
111
|
+
this.cdr.markForCheck();
|
|
112
|
+
}
|
|
113
|
+
applyInput(open) {
|
|
114
|
+
this.applyingInput = true;
|
|
115
|
+
try {
|
|
116
|
+
this.service.setOpen(open);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
this.applyingInput = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
ngOnDestroy() {
|
|
123
|
+
this.subscriptions.unsubscribe();
|
|
124
|
+
}
|
|
125
|
+
get computedClass() {
|
|
126
|
+
return cn(reasoningVariants({ size: this.size }), this.class);
|
|
127
|
+
}
|
|
128
|
+
sync() {
|
|
129
|
+
this.service.setOpen(this.open);
|
|
130
|
+
this.service.setStreaming(this.streaming);
|
|
131
|
+
this.service.setDuration(this.duration);
|
|
132
|
+
}
|
|
133
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
134
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ReasoningComponent, isStandalone: true, selector: "tolle-reasoning", inputs: { open: "open", streaming: "streaming", duration: "duration", size: "size", class: "class" }, outputs: { openChange: "openChange" }, providers: [ReasoningService], usesOnChanges: true, ngImport: i0, template: `
|
|
135
|
+
<div [class]="computedClass" [attr.data-state]="open ? 'open' : 'closed'">
|
|
136
|
+
<ng-content></ng-content>
|
|
137
|
+
</div>
|
|
138
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
139
|
+
}
|
|
140
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningComponent, decorators: [{
|
|
141
|
+
type: Component,
|
|
142
|
+
args: [{ selector: 'tolle-reasoning', standalone: true, imports: [CommonModule], providers: [ReasoningService], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
143
|
+
<div [class]="computedClass" [attr.data-state]="open ? 'open' : 'closed'">
|
|
144
|
+
<ng-content></ng-content>
|
|
145
|
+
</div>
|
|
146
|
+
`, styles: [":host{display:block}\n"] }]
|
|
147
|
+
}], propDecorators: { open: [{
|
|
148
|
+
type: Input
|
|
149
|
+
}], streaming: [{
|
|
150
|
+
type: Input
|
|
151
|
+
}], duration: [{
|
|
152
|
+
type: Input
|
|
153
|
+
}], size: [{
|
|
154
|
+
type: Input
|
|
155
|
+
}], class: [{
|
|
156
|
+
type: Input
|
|
157
|
+
}], openChange: [{
|
|
158
|
+
type: Output
|
|
159
|
+
}] } });
|
|
160
|
+
/**
|
|
161
|
+
* Toggle for a `tolle-reasoning`. Shows a live "Thinking…" label while the
|
|
162
|
+
* trace is streaming and the elapsed thinking time once it is done.
|
|
163
|
+
*/
|
|
164
|
+
export class ReasoningTriggerComponent {
|
|
165
|
+
/**
|
|
166
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
167
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
168
|
+
* rendering the class it was born with.
|
|
169
|
+
*/
|
|
170
|
+
ngOnChanges() {
|
|
171
|
+
this.cdr.markForCheck();
|
|
172
|
+
}
|
|
173
|
+
/** Remixicon class shown before the label. @default 'ri-brain-line' */
|
|
174
|
+
icon = 'ri-brain-line';
|
|
175
|
+
/** Label shown while the trace is streaming. @default 'Thinking…' */
|
|
176
|
+
thinkingLabel = 'Thinking…';
|
|
177
|
+
/** Label used when the trace finished without a measured duration. @default 'Thought for a few seconds' */
|
|
178
|
+
fallbackLabel = 'Thought for a few seconds';
|
|
179
|
+
/** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). */
|
|
180
|
+
class = '';
|
|
181
|
+
service = inject(ReasoningService);
|
|
182
|
+
cdr = inject(ChangeDetectorRef);
|
|
183
|
+
subscriptions = new Subscription();
|
|
184
|
+
open = false;
|
|
185
|
+
streaming = false;
|
|
186
|
+
duration = 0;
|
|
187
|
+
ngOnInit() {
|
|
188
|
+
this.subscriptions.add(this.service.open$.subscribe((open) => {
|
|
189
|
+
this.open = open;
|
|
190
|
+
this.cdr.markForCheck();
|
|
191
|
+
}));
|
|
192
|
+
this.subscriptions.add(this.service.streaming$.subscribe((streaming) => {
|
|
193
|
+
this.streaming = streaming;
|
|
194
|
+
this.cdr.markForCheck();
|
|
195
|
+
}));
|
|
196
|
+
this.subscriptions.add(this.service.duration$.subscribe((duration) => {
|
|
197
|
+
this.duration = duration;
|
|
198
|
+
this.cdr.markForCheck();
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
ngOnDestroy() {
|
|
202
|
+
this.subscriptions.unsubscribe();
|
|
203
|
+
}
|
|
204
|
+
/** "Thinking…" while streaming, otherwise how long the model thought. */
|
|
205
|
+
get label() {
|
|
206
|
+
if (this.streaming)
|
|
207
|
+
return this.thinkingLabel;
|
|
208
|
+
if (!this.duration || this.duration < 1)
|
|
209
|
+
return this.fallbackLabel;
|
|
210
|
+
const rounded = Math.round(this.duration);
|
|
211
|
+
return 'Thought for ' + rounded + (rounded === 1 ? ' second' : ' seconds');
|
|
212
|
+
}
|
|
213
|
+
get computedClass() {
|
|
214
|
+
return cn('flex w-fit items-center gap-1.5 rounded-md px-1.5 py-1 text-muted-foreground transition-colors', 'hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', this.class);
|
|
215
|
+
}
|
|
216
|
+
onToggle() {
|
|
217
|
+
this.service.toggle();
|
|
218
|
+
}
|
|
219
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
220
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ReasoningTriggerComponent, isStandalone: true, selector: "tolle-reasoning-trigger", inputs: { icon: "icon", thinkingLabel: "thinkingLabel", fallbackLabel: "fallbackLabel", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
221
|
+
<button
|
|
222
|
+
type="button"
|
|
223
|
+
data-reasoning-trigger
|
|
224
|
+
[attr.aria-expanded]="open"
|
|
225
|
+
[attr.data-state]="open ? 'open' : 'closed'"
|
|
226
|
+
[class]="computedClass"
|
|
227
|
+
(click)="onToggle()"
|
|
228
|
+
>
|
|
229
|
+
<i
|
|
230
|
+
[class]="icon"
|
|
231
|
+
[class.animate-pulse]="streaming"
|
|
232
|
+
aria-hidden="true"
|
|
233
|
+
></i>
|
|
234
|
+
|
|
235
|
+
<span data-reasoning-label>{{ label }}</span>
|
|
236
|
+
|
|
237
|
+
<i
|
|
238
|
+
class="ri-arrow-down-s-line transition-transform duration-200"
|
|
239
|
+
[class.rotate-180]="open"
|
|
240
|
+
aria-hidden="true"
|
|
241
|
+
></i>
|
|
242
|
+
|
|
243
|
+
<ng-content></ng-content>
|
|
244
|
+
</button>
|
|
245
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
246
|
+
}
|
|
247
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningTriggerComponent, decorators: [{
|
|
248
|
+
type: Component,
|
|
249
|
+
args: [{ selector: 'tolle-reasoning-trigger', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
250
|
+
<button
|
|
251
|
+
type="button"
|
|
252
|
+
data-reasoning-trigger
|
|
253
|
+
[attr.aria-expanded]="open"
|
|
254
|
+
[attr.data-state]="open ? 'open' : 'closed'"
|
|
255
|
+
[class]="computedClass"
|
|
256
|
+
(click)="onToggle()"
|
|
257
|
+
>
|
|
258
|
+
<i
|
|
259
|
+
[class]="icon"
|
|
260
|
+
[class.animate-pulse]="streaming"
|
|
261
|
+
aria-hidden="true"
|
|
262
|
+
></i>
|
|
263
|
+
|
|
264
|
+
<span data-reasoning-label>{{ label }}</span>
|
|
265
|
+
|
|
266
|
+
<i
|
|
267
|
+
class="ri-arrow-down-s-line transition-transform duration-200"
|
|
268
|
+
[class.rotate-180]="open"
|
|
269
|
+
aria-hidden="true"
|
|
270
|
+
></i>
|
|
271
|
+
|
|
272
|
+
<ng-content></ng-content>
|
|
273
|
+
</button>
|
|
274
|
+
`, styles: [":host{display:block}\n"] }]
|
|
275
|
+
}], propDecorators: { icon: [{
|
|
276
|
+
type: Input
|
|
277
|
+
}], thinkingLabel: [{
|
|
278
|
+
type: Input
|
|
279
|
+
}], fallbackLabel: [{
|
|
280
|
+
type: Input
|
|
281
|
+
}], class: [{
|
|
282
|
+
type: Input
|
|
283
|
+
}] } });
|
|
284
|
+
/** The reasoning text itself. Rendered only while the trace is expanded. */
|
|
285
|
+
export class ReasoningContentComponent {
|
|
286
|
+
/**
|
|
287
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
288
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
289
|
+
* rendering the class it was born with.
|
|
290
|
+
*/
|
|
291
|
+
ngOnChanges() {
|
|
292
|
+
this.cdr.markForCheck();
|
|
293
|
+
}
|
|
294
|
+
/** Reasoning text to render; project your own markup instead when richer. @default '' */
|
|
295
|
+
text = '';
|
|
296
|
+
/** Extra Tailwind classes merged onto the content via `cn()` (last-wins). */
|
|
297
|
+
class = '';
|
|
298
|
+
service = inject(ReasoningService);
|
|
299
|
+
cdr = inject(ChangeDetectorRef);
|
|
300
|
+
subscriptions = new Subscription();
|
|
301
|
+
open = false;
|
|
302
|
+
ngOnInit() {
|
|
303
|
+
this.subscriptions.add(this.service.open$.subscribe((open) => {
|
|
304
|
+
this.open = open;
|
|
305
|
+
this.cdr.markForCheck();
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
ngOnDestroy() {
|
|
309
|
+
this.subscriptions.unsubscribe();
|
|
310
|
+
}
|
|
311
|
+
get computedClass() {
|
|
312
|
+
return cn('border-l-2 border-border pl-4 text-muted-foreground', this.class);
|
|
313
|
+
}
|
|
314
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
315
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ReasoningContentComponent, isStandalone: true, selector: "tolle-reasoning-content", inputs: { text: "text", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
316
|
+
<div *ngIf="open" data-reasoning-content [class]="computedClass">
|
|
317
|
+
<p *ngIf="text" class="whitespace-pre-wrap">{{ text }}</p>
|
|
318
|
+
<ng-content></ng-content>
|
|
319
|
+
</div>
|
|
320
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
321
|
+
}
|
|
322
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReasoningContentComponent, decorators: [{
|
|
323
|
+
type: Component,
|
|
324
|
+
args: [{ selector: 'tolle-reasoning-content', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
325
|
+
<div *ngIf="open" data-reasoning-content [class]="computedClass">
|
|
326
|
+
<p *ngIf="text" class="whitespace-pre-wrap">{{ text }}</p>
|
|
327
|
+
<ng-content></ng-content>
|
|
328
|
+
</div>
|
|
329
|
+
`, styles: [":host{display:block}\n"] }]
|
|
330
|
+
}], propDecorators: { text: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], class: [{
|
|
333
|
+
type: Input
|
|
334
|
+
}] } });
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvcmVhc29uaW5nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBRWhDOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ1YsVUFBVSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLDJDQUEyQztJQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUvQixlQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDdkUsNERBQTREO0lBQ25ELFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXpDLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqRSw0REFBNEQ7SUFDbkQsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFeEQsd0NBQXdDO0lBQ3hDLElBQUksSUFBSTtRQUNOLE9B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QUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sRUFBRSxDQUNQLHFEQUFxRCxFQUNyRCxJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7SUFDSixDQUFDO3dHQXhDVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixrSkFQMUI7Ozs7O0dBS1QsK0ZBUFMsWUFBWTs7NEZBU1gseUJBQXlCO2tCQWJyQyxTQUFTOytCQUNFLHlCQUF5QixjQUV2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBQ04sdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7R0FLVDs4QkFjUSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbi8qKlxuICogQ29vcmRpbmF0ZXMgYSBgdG9sbGUtcmVhc29uaW5nYCB3aXRoIGl0cyB0cmlnZ2VyIGFuZCBjb250ZW50LlxuICpcbiAqIFRoZSB0cmlnZ2VyIGFuZCBjb250ZW50IGFyZSBPblB1c2ggY2hpbGRyZW4sIHNvIHRoZSBvcGVuL3N0cmVhbWluZy9kdXJhdGlvblxuICogc3RhdGUgdGhleSByZW5kZXIgZnJvbSBpcyBwdWJsaXNoZWQgaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgcGFyZW50LlxuICpcbiAqIFByb3ZpZGVkIG9uIGBSZWFzb25pbmdDb21wb25lbnRgLCBzbyBlYWNoIHRyYWNlIGdldHMgaXRzIG93biBpbnN0YW5jZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlYXNvbmluZ1NlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wZW5Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIEVtaXRzIHdoZXRoZXIgdGhlIHRyYWNlIGlzIGV4cGFuZGVkLiAqL1xuICByZWFkb25seSBvcGVuJCA9IHRoaXMub3BlblNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0cmVhbWluZ1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogRW1pdHMgd2hldGhlciB0aGUgbW9kZWwgaXMgc3RpbGwgcHJvZHVjaW5nIHRoZSB0cmFjZS4gKi9cbiAgcmVhZG9ubHkgc3RyZWFtaW5nJCA9IHRoaXMuc3RyZWFtaW5nU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZHVyYXRpb25Tb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIC8qKiBFbWl0cyBob3cgbG9uZyB0aGUgbW9kZWwgc3BlbnQgcmVhc29uaW5nLCBpbiBzZWNvbmRzLiAqL1xuICByZWFkb25seSBkdXJhdGlvbiQgPSB0aGlzLmR1cmF0aW9uU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSB0cmFjZSBpcyBleHBhbmRlZC4gKi9cbiAgZ2V0IG9wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlblNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIHNldE9wZW4odmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuU291cmNlLnZhbHVlICE9PSB2YWx1ZSkgdGhpcy5vcGVuU291cmNlLm5leHQodmFsdWUpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5vcGVuU291cmNlLnZhbHVlKTtcbiAgfVxuXG4gIHNldFN0cmVhbWluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0cmVhbWluZ1NvdXJjZS52YWx1ZSAhPT0gdmFsdWUpIHRoaXMuc3RyZWFtaW5nU291cmNlLm5leHQodmFsdWUpO1xuICB9XG5cbiAgc2V0RHVyYXRpb24odmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmR1cmF0aW9uU291cmNlLnZhbHVlICE9PSB2YWx1ZSkgdGhpcy5kdXJhdGlvblNvdXJjZS5uZXh0KHZhbHVlKTtcbiAgfVxufVxuXG5jb25zdCByZWFzb25pbmdWYXJpYW50cyA9IGN2YSgnZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTInLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc2l6ZToge1xuICAgICAgc206ICd0ZXh0LXhzJyxcbiAgICAgIGRlZmF1bHQ6ICd0ZXh0LXNtJyxcbiAgICAgIGxnOiAndGV4dC1iYXNlJyxcbiAgICB9LFxuICB9LFxuICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICBzaXplOiAnZGVmYXVsdCcsXG4gIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgUmVhc29uaW5nUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIHJlYXNvbmluZ1ZhcmlhbnRzPjtcblxuLyoqXG4gKiBBIGNvbGxhcHNpYmxlIHZpZXcgb2YgdGhlIG1vZGVsJ3MgcmVhc29uaW5nLCBjb2xsYXBzZWQgYnkgZGVmYXVsdC5cbiAqXG4gKiBXaGlsZSBgc3RyZWFtaW5nYCBpcyB0cnVlIHRoZSB0cmlnZ2VyIHJlYWRzIFwiVGhpbmtpbmfigKZcIjsgb25jZSBpdCBmaW5pc2hlcyB0aGVcbiAqIHRyaWdnZXIgcmVwb3J0cyBob3cgbG9uZyB0aGUgbW9kZWwgdGhvdWdodCwgdXNpbmcgYGR1cmF0aW9uYC5cbiAqXG4gKiBDb21wb3NlIGl0IGZyb20gYHRvbGxlLXJlYXNvbmluZy10cmlnZ2VyYCBhbmQgYHRvbGxlLXJlYXNvbmluZy1jb250ZW50YC5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtcmVhc29uaW5nJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHByb3ZpZGVyczogW1JlYXNvbmluZ1NlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJvcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCdcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgUmVhc29uaW5nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8qKiBXaGV0aGVyIHRoZSB0cmFjZSBpcyBleHBhbmRlZC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgb3BlbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgbW9kZWwgaXMgc3RpbGwgcHJvZHVjaW5nIHRoZSB0cmFjZS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgc3RyZWFtaW5nID0gZmFsc2U7XG4gIC8qKiBTZWNvbmRzIHRoZSBtb2RlbCBzcGVudCByZWFzb25pbmcsIHNob3duIG9uY2Ugc3RyZWFtaW5nIGZpbmlzaGVzLiBAZGVmYXVsdCAwICovXG4gIEBJbnB1dCgpIGR1cmF0aW9uID0gMDtcbiAgLyoqIFRleHQgc2NhbGUgb2YgdGhlIHRyYWNlLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogUmVhc29uaW5nUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHRyYWNlIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgbmV3IHN0YXRlIHdoZW5ldmVyIHRoZSB0cmFjZSBpcyBleHBhbmRlZCBvciBjb2xsYXBzZWQuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChSZWFzb25pbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUcnVlIHdoaWxlIGFuIGBvcGVuYCBpbnB1dCBpcyBiZWluZyBwdXNoZWQgaW50byB0aGUgc2VydmljZS4gKi9cbiAgcHJpdmF0ZSBhcHBseWluZ0lucHV0ID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jKCk7XG4gICAgLy8gYHNraXAoMSlgIGRyb3BzIHRoZSBCZWhhdmlvclN1YmplY3QncyBjdXJyZW50IHZhbHVlIHNvIHNpbXBseSBtb3VudGluZ1xuICAgIC8vIHRoZSBjb21wb25lbnQgbmV2ZXIgZW1pdHMgYSBzcHVyaW91cyBgb3BlbkNoYW5nZWAuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5waXBlKHNraXAoMSkpLnN1YnNjcmliZSgob3BlbikgPT4ge1xuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgLy8gT25seSB1c2VyLWRyaXZlbiB0b2dnbGVzIGFyZSB3b3J0aCByZXBvcnRpbmc7IGVjaG9pbmcgYSBjaGFuZ2UgdGhlXG4gICAgICAgIC8vIHBhcmVudCBqdXN0IG1hZGUgd291bGQgZmlnaHQgYSBgWyhvcGVuKV1gIGJpbmRpbmcuXG4gICAgICAgIGlmICghdGhpcy5hcHBseWluZ0lucHV0KSB0aGlzLm9wZW5DaGFuZ2UuZW1pdChvcGVuKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snb3BlbiddKSB0aGlzLmFwcGx5SW5wdXQodGhpcy5vcGVuKTtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0U3RyZWFtaW5nKHRoaXMuc3RyZWFtaW5nKTtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0RHVyYXRpb24odGhpcy5kdXJhdGlvbik7XG4gIFxuICAgIC8vIEEgYm91bmQgYGNsYXNzYCBpbnB1dCBpcyB3cml0dGVuIHRocm91Z2ggQW5ndWxhcidzIHN0eWxpbmcgcGF0aCxcbiAgICAvLyB3aGljaCBkb2VzIG5vdCBtYXJrIGFuIE9uUHVzaCB2aWV3IGRpcnR5IG9uIGl0cyBvd24uXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5wdXQob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlpbmdJbnB1dCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2VydmljZS5zZXRPcGVuKG9wZW4pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcGx5aW5nSW5wdXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbihyZWFzb25pbmdWYXJpYW50cyh7IHNpemU6IHRoaXMuc2l6ZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cblxuICBwcml2YXRlIHN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnNldE9wZW4odGhpcy5vcGVuKTtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0U3RyZWFtaW5nKHRoaXMuc3RyZWFtaW5nKTtcbiAgICB0aGlzLnNlcnZpY2Uuc2V0RHVyYXRpb24odGhpcy5kdXJhdGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBUb2dnbGUgZm9yIGEgYHRvbGxlLXJlYXNvbmluZ2AuIFNob3dzIGEgbGl2ZSBcIlRoaW5raW5n4oCmXCIgbGFiZWwgd2hpbGUgdGhlXG4gKiB0cmFjZSBpcyBzdHJlYW1pbmcgYW5kIHRoZSBlbGFwc2VkIHRoaW5raW5nIHRpbWUgb25jZSBpdCBpcyBkb25lLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1yZWFzb25pbmctdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGRhdGEtcmVhc29uaW5nLXRyaWdnZXJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlblwiXG4gICAgICBbYXR0ci5kYXRhLXN0YXRlXT1cIm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiXG4gICAgICAoY2xpY2spPVwib25Ub2dnbGUoKVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgW2NsYXNzXT1cImljb25cIlxuICAgICAgICBbY2xhc3MuYW5pbWF0ZS1wdWxzZV09XCJzdHJlYW1pbmdcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPjwvaT5cblxuICAgICAgPHNwYW4gZGF0YS1yZWFzb25pbmctbGFiZWw+e3sgbGFiZWwgfX08L3NwYW4+XG5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwicmktYXJyb3ctZG93bi1zLWxpbmUgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwXCJcbiAgICAgICAgW2NsYXNzLnJvdGF0ZS0xODBdPVwib3BlblwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICA+PC9pPlxuXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9idXR0b24+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFJlYXNvbmluZ1RyaWdnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFJlbWl4aWNvbiBjbGFzcyBzaG93biBiZWZvcmUgdGhlIGxhYmVsLiBAZGVmYXVsdCAncmktYnJhaW4tbGluZScgKi9cbiAgQElucHV0KCkgaWNvbiA9ICdyaS1icmFpbi1saW5lJztcbiAgLyoqIExhYmVsIHNob3duIHdoaWxlIHRoZSB0cmFjZSBpcyBzdHJlYW1pbmcuIEBkZWZhdWx0ICdUaGlua2luZ+KApicgKi9cbiAgQElucHV0KCkgdGhpbmtpbmdMYWJlbCA9ICdUaGlua2luZ+KApic7XG4gIC8qKiBMYWJlbCB1c2VkIHdoZW4gdGhlIHRyYWNlIGZpbmlzaGVkIHdpdGhvdXQgYSBtZWFzdXJlZCBkdXJhdGlvbi4gQGRlZmF1bHQgJ1Rob3VnaHQgZm9yIGEgZmV3IHNlY29uZHMnICovXG4gIEBJbnB1dCgpIGZhbGxiYWNrTGFiZWwgPSAnVGhvdWdodCBmb3IgYSBmZXcgc2Vjb25kcyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSB0cmlnZ2VyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlID0gaW5qZWN0KFJlYXNvbmluZ1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBvcGVuID0gZmFsc2U7XG4gIHN0cmVhbWluZyA9IGZhbHNlO1xuICBkdXJhdGlvbiA9IDA7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5zdHJlYW1pbmckLnN1YnNjcmliZSgoc3RyZWFtaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc3RyZWFtaW5nID0gc3RyZWFtaW5nO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zZXJ2aWNlLmR1cmF0aW9uJC5zdWJzY3JpYmUoKGR1cmF0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBcIlRoaW5raW5n4oCmXCIgd2hpbGUgc3RyZWFtaW5nLCBvdGhlcndpc2UgaG93IGxvbmcgdGhlIG1vZGVsIHRob3VnaHQuICovXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN0cmVhbWluZykgcmV0dXJuIHRoaXMudGhpbmtpbmdMYWJlbDtcbiAgICBpZiAoIXRoaXMuZHVyYXRpb24gfHwgdGhpcy5kdXJhdGlvbiA8IDEpIHJldHVybiB0aGlzLmZhbGxiYWNrTGFiZWw7XG4gICAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQodGhpcy5kdXJhdGlvbik7XG4gICAgcmV0dXJuICdUaG91Z2h0IGZvciAnICsgcm91bmRlZCArIChyb3VuZGVkID09PSAxID8gJyBzZWNvbmQnIDogJyBzZWNvbmRzJyk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnZmxleCB3LWZpdCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSByb3VuZGVkLW1kIHB4LTEuNSBweS0xIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAnaG92ZXI6dGV4dC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG5cbiAgb25Ub2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLnRvZ2dsZSgpO1xuICB9XG59XG5cbi8qKiBUaGUgcmVhc29uaW5nIHRleHQgaXRzZWxmLiBSZW5kZXJlZCBvbmx5IHdoaWxlIHRoZSB0cmFjZSBpcyBleHBhbmRlZC4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXJlYXNvbmluZy1jb250ZW50JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgKm5nSWY9XCJvcGVuXCIgZGF0YS1yZWFzb25pbmctY29udGVudCBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPHAgKm5nSWY9XCJ0ZXh0XCIgY2xhc3M9XCJ3aGl0ZXNwYWNlLXByZS13cmFwXCI+e3sgdGV4dCB9fTwvcD5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgUmVhc29uaW5nQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogUmVhc29uaW5nIHRleHQgdG8gcmVuZGVyOyBwcm9qZWN0IHlvdXIgb3duIG1hcmt1cCBpbnN0ZWFkIHdoZW4gcmljaGVyLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSB0ZXh0ID0gJyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBjb250ZW50IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlID0gaW5qZWN0KFJlYXNvbmluZ1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBvcGVuID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5zdWJzY3JpYmUoKG9wZW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICdib3JkZXItbC0yIGJvcmRlci1ib3JkZXIgcGwtNCB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgdGhpcy5jbGFzc1xuICAgICk7XG4gIH1cbn1cbiJdfQ==
|