bways-report 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/esm2022/lib/core/config/bways-report-config.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-overlay.service.mjs +79 -0
- package/esm2022/lib/core/services/report-session-context.service.mjs +1 -44
- package/esm2022/lib/core/utils/report-parameter.util.mjs +81 -16
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +10 -2
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +10 -1
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +10 -1
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +10 -1
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +6 -4
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +11 -10
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +93 -7
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +9 -7
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +9 -16
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +5 -3
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +11 -11
- package/esm2022/lib/features/designer/designer.component.mjs +12 -7
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +5 -3
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +2 -2
- package/esm2022/lib/features/runtime/report-execution.service.mjs +35 -4
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +15 -20
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +22 -11
- package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +15 -5
- package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +6 -6
- package/fesm2022/bways-report.mjs +414 -165
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +3 -0
- package/lib/core/models/report-grid.model.d.ts +1 -1
- package/lib/core/services/report-overlay.service.d.ts +14 -0
- package/lib/core/services/report-session-context.service.d.ts +0 -5
- package/lib/core/utils/report-parameter.util.d.ts +15 -1
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +12 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +1 -0
- package/lib/features/designer/designer.component.d.ts +1 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +2 -2
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +1 -2
- package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +0 -1
- package/package.json +8 -5
- package/styles/theme.css +181 -0
- package/third-party-notices/angular-cdk-LICENSE.txt +21 -0
package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
+
import { ReportOverlayService } from '../../../core/services/report-overlay.service';
|
|
1
2
|
import { ChangeDetectionStrategy, Component, forwardRef, HostListener, computed, effect, inject, input, output, signal, untracked, viewChild, } from '@angular/core';
|
|
2
3
|
import { CommonModule } from '@angular/common';
|
|
3
4
|
import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
|
|
4
|
-
import {
|
|
5
|
+
import { OverlayModule, } from '@angular/cdk/overlay';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/cdk/overlay";
|
|
7
8
|
export class RptSearchableSelectComponent {
|
|
8
9
|
elementRef;
|
|
9
|
-
overlay = inject(Overlay);
|
|
10
10
|
panelId = 'rpt-select-panel-' + Math.random().toString(36).substring(2, 9);
|
|
11
|
-
scrollStrategy = this.
|
|
11
|
+
scrollStrategy = inject(ReportOverlayService).scrollStrategy(() => this.elementRef.nativeElement);
|
|
12
12
|
triggerWidth = signal('auto');
|
|
13
13
|
overlayPositions = [
|
|
14
14
|
{
|
|
@@ -358,7 +358,7 @@ export class RptSearchableSelectComponent {
|
|
|
358
358
|
useExisting: forwardRef(() => RptSearchableSelectComponent),
|
|
359
359
|
multi: true,
|
|
360
360
|
},
|
|
361
|
-
], viewQueries: [{ propertyName: "triggerBtnEl", first: true, predicate: ["triggerBtn"], descendants: true, isSignal: true }, { propertyName: "searchInputEl", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "optionsListEl", first: true, predicate: ["optionsList"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rpt-search-select-wrapper\" #origin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <!-- Trigger Button -->\n <button\n #triggerBtn\n type=\"button\"\n class=\"select-trigger\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [class.is-open]=\"isOpen()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-label]=\"ariaLabel() || placeholder()\"\n (click)=\"toggle($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <div class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n @if (selectedOption()) {\n <span class=\"selected-text\">{{ selectedOption()!.label }}</span>\n @if (selectedOption()!.sublabel) {\n <span class=\"selected-sublabel\">{{ selectedOption()!.sublabel }}</span>\n }\n @if (selectedOption()!.badge) {\n <span class=\"selected-badge\">{{ selectedOption()!.badge }}</span>\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n </div>\n\n <div class=\"trigger-actions\">\n @if (loading()) {\n <span class=\"spinner-dot\" title=\"Loading options...\"></span>\n }\n\n @if (selectedOption() && clearable() && !isDisabled()) {\n <button\n type=\"button\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n >\n \u2715\n </button>\n }\n\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\">\n <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n</div>\n\n<!-- Dropdown Popover Panel in CDK Overlay (attached to body, outside any clipped card) -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"close()\"\n>\n <div\n class=\"select-panel\"\n [id]=\"panelId\"\n [class.opens-above]=\"opensAbove()\"\n [style.max-height]=\"panelMaxHeight()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Search Input Box -->\n @if (searchable()) {\n <div class=\"select-search-box\">\n <span class=\"search-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"search-clear-btn\"\n title=\"Clear search\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n }\n\n <!-- Options List -->\n <div class=\"select-options-list\" #optionsList (scroll)=\"onOptionsScroll($event)\">\n @if (loading()) {\n <div class=\"select-status-row loading\">\n <span class=\"spinner-dot\"></span>\n <span>{{ loadingText() }}</span>\n </div>\n } @else if (normalizedOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>{{ emptyText() }}</span>\n </div>\n } @else if (visibleFilteredOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>No options match \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.value; let i = $index) {\n <div\n role=\"option\"\n class=\"select-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [class.is-disabled]=\"opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <div class=\"option-content\">\n <span class=\"option-label\" [title]=\"opt.label\">{{ opt.label }}</span>\n @if (opt.sublabel) {\n <span class=\"option-sublabel\" [title]=\"opt.sublabel\">{{ opt.sublabel }}</span>\n }\n </div>\n\n <div class=\"option-meta\">\n @if (opt.badge) {\n <span class=\"option-badge\">{{ opt.badge }}</span>\n }\n @if (isSelected(opt)) {\n <span class=\"option-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n </div>\n }\n\n @if (excessCount() > 0) {\n <div class=\"select-excess-hint\">\n <span class=\"excess-text\">Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down to browse or</span>\n <button\n type=\"button\"\n class=\"select-load-all-btn\"\n (click)=\"loadAll(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;position:relative;box-sizing:border-box}.rpt-search-select-wrapper{position:relative;width:100%;box-sizing:border-box}:host(.size-sm) .select-trigger{min-height:28px;padding:4px 8px;font-size:var(--rpt-font-size-sm, .75rem)}:host(.size-md) .select-trigger{min-height:36px;padding:6px 10px;font-size:var(--rpt-font-size-base, .8125rem)}:host(.size-lg) .select-trigger{min-height:42px;padding:8px 12px;font-size:var(--rpt-font-size-base, .875rem)}.select-trigger{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:6px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);color:var(--rpt-color-text, #0f172a);font-family:inherit;outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.select-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.select-trigger:focus-visible,.select-trigger.is-open{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb33}.select-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #94a3b8);border-color:var(--rpt-color-border, #e2e8f0);cursor:not-allowed}.trigger-label{flex:1;min-width:0;display:flex;align-items:center;gap:6px;overflow:hidden}.selected-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--rpt-color-text, #0f172a)}.selected-sublabel{font-size:.675rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.selected-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em;flex-shrink:0}.placeholder-text{color:var(--rpt-color-text-muted, #94a3b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trigger-actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.trigger-clear-btn{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;border:none;font-size:.55rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;padding:0;line-height:1;transition:background-color .12s ease,color .12s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.select-panel{width:100%;min-width:180px;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:select-pop .12s cubic-bezier(0,0,.2,1)}.select-panel.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:select-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes select-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes select-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.select-search-box{display:flex;align-items:center;gap:6px;padding:6px 8px;background-color:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .75rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.search-input::placeholder{color:#94a3b8}.search-clear-btn{border:none;background:#e2e8f0;color:#64748b;width:14px;height:14px;border-radius:50%;font-size:.5rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background-color .12s}.search-clear-btn:hover{background:#cbd5e1;color:#0f172a}.select-options-list{overflow-y:auto;overscroll-behavior:contain;padding:3px}.select-option-item{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;border-radius:4px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.select-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.select-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.select-option-item.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.option-content{display:flex;flex-direction:column;min-width:0;flex:1}.option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.option-sublabel{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.option-meta{display:flex;align-items:center;gap:6px;flex-shrink:0}.option-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em}.select-option-item.is-selected .option-badge{background-color:#dbeafe;color:#1e40af}.option-check{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb)}.select-status-row{padding:10px 12px;font-size:.72rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.select-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:var(--rpt-color-primary, #2563eb)}.select-status-row.empty{color:var(--rpt-color-text-muted, #94a3b8)}.select-excess-hint{font-size:.6875rem;color:var(--rpt-color-text-secondary, #475569);display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;background-color:#f8fafc;border-top:1px dashed var(--rpt-color-border, #cbd5e1);margin-top:2px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.excess-text{flex:1;line-height:1.25}.select-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.select-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.spinner-dot{display:inline-block;width:11px;height:11px;border:2px solid #bfdbfe;border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:select-spin .6s linear infinite}@keyframes select-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
361
|
+
], viewQueries: [{ propertyName: "triggerBtnEl", first: true, predicate: ["triggerBtn"], descendants: true, isSignal: true }, { propertyName: "searchInputEl", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "optionsListEl", first: true, predicate: ["optionsList"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rpt-search-select-wrapper\" #origin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <!-- Trigger Button -->\n <button\n #triggerBtn\n type=\"button\"\n class=\"select-trigger\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [class.is-open]=\"isOpen()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-label]=\"ariaLabel() || placeholder()\"\n (click)=\"toggle($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <div class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n @if (selectedOption()) {\n <span class=\"selected-text\">{{ selectedOption()!.label }}</span>\n @if (selectedOption()!.sublabel) {\n <span class=\"selected-sublabel\">{{ selectedOption()!.sublabel }}</span>\n }\n @if (selectedOption()!.badge) {\n <span class=\"selected-badge\">{{ selectedOption()!.badge }}</span>\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n </div>\n\n <div class=\"trigger-actions\">\n @if (loading()) {\n <span class=\"spinner-dot\" title=\"Loading options...\"></span>\n }\n\n @if (selectedOption() && clearable() && !isDisabled()) {\n <button\n type=\"button\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n >\n \u2715\n </button>\n }\n\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\">\n <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n</div>\n\n<!-- Dropdown Popover Panel in CDK Overlay (attached to body, outside any clipped card) -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayMinWidth]=\"'min(180px, calc(100vw - 16px))'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"close()\"\n>\n <div\n class=\"select-panel\"\n [id]=\"panelId\"\n [class.opens-above]=\"opensAbove()\"\n [style.max-height]=\"panelMaxHeight()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Search Input Box -->\n @if (searchable()) {\n <div class=\"select-search-box\">\n <span class=\"search-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"search-clear-btn\"\n title=\"Clear search\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n }\n\n <!-- Options List -->\n <div class=\"select-options-list\" #optionsList (scroll)=\"onOptionsScroll($event)\">\n @if (loading()) {\n <div class=\"select-status-row loading\">\n <span class=\"spinner-dot\"></span>\n <span>{{ loadingText() }}</span>\n </div>\n } @else if (normalizedOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>{{ emptyText() }}</span>\n </div>\n } @else if (visibleFilteredOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>No options match \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.value; let i = $index) {\n <div\n role=\"option\"\n class=\"select-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [class.is-disabled]=\"opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <div class=\"option-content\">\n <span class=\"option-label\" [title]=\"opt.label\">{{ opt.label }}</span>\n @if (opt.sublabel) {\n <span class=\"option-sublabel\" [title]=\"opt.sublabel\">{{ opt.sublabel }}</span>\n }\n </div>\n\n <div class=\"option-meta\">\n @if (opt.badge) {\n <span class=\"option-badge\">{{ opt.badge }}</span>\n }\n @if (isSelected(opt)) {\n <span class=\"option-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n </div>\n }\n\n @if (excessCount() > 0) {\n <div class=\"select-excess-hint\">\n <span class=\"excess-text\">Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down to browse or</span>\n <button\n type=\"button\"\n class=\"select-load-all-btn\"\n (click)=\"loadAll(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;position:relative;box-sizing:border-box}.rpt-search-select-wrapper{position:relative;width:100%;box-sizing:border-box}:host(.size-sm) .select-trigger{min-height:28px;padding:4px 8px;font-size:var(--rpt-font-size-sm, .75rem)}:host(.size-md) .select-trigger{min-height:36px;padding:6px 10px;font-size:var(--rpt-font-size-base, .8125rem)}:host(.size-lg) .select-trigger{min-height:42px;padding:8px 12px;font-size:var(--rpt-font-size-base, .875rem)}.select-trigger{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:6px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);color:var(--rpt-color-text, #0f172a);font-family:inherit;outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.select-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.select-trigger:focus-visible,.select-trigger.is-open{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb33}.select-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #94a3b8);border-color:var(--rpt-color-border, #e2e8f0);cursor:not-allowed}.trigger-label{flex:1;min-width:0;display:flex;align-items:center;gap:6px;overflow:hidden}.selected-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--rpt-color-text, #0f172a)}.selected-sublabel{font-size:.675rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.selected-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em;flex-shrink:0}.placeholder-text{color:var(--rpt-color-text-muted, #94a3b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trigger-actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.trigger-clear-btn{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;border:none;font-size:.55rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;padding:0;line-height:1;transition:background-color .12s ease,color .12s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.select-panel{width:100%;min-width:0;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:select-pop .12s cubic-bezier(0,0,.2,1)}.select-panel.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:select-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes select-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes select-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.select-search-box{display:flex;align-items:center;gap:6px;padding:6px 8px;background-color:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .75rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.search-input::placeholder{color:#94a3b8}.search-clear-btn{border:none;background:#e2e8f0;color:#64748b;width:14px;height:14px;border-radius:50%;font-size:.5rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background-color .12s}.search-clear-btn:hover{background:#cbd5e1;color:#0f172a}.select-options-list{overflow-y:auto;overscroll-behavior:contain;padding:3px}.select-option-item{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;border-radius:4px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.select-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.select-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.select-option-item.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.option-content{display:flex;flex-direction:column;min-width:0;flex:1}.option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.option-sublabel{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.option-meta{display:flex;align-items:center;gap:6px;flex-shrink:0}.option-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em}.select-option-item.is-selected .option-badge{background-color:#dbeafe;color:#1e40af}.option-check{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb)}.select-status-row{padding:10px 12px;font-size:.72rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.select-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:var(--rpt-color-primary, #2563eb)}.select-status-row.empty{color:var(--rpt-color-text-muted, #94a3b8)}.select-excess-hint{font-size:.6875rem;color:var(--rpt-color-text-secondary, #475569);display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;background-color:#f8fafc;border-top:1px dashed var(--rpt-color-border, #cbd5e1);margin-top:2px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.excess-text{flex:1;line-height:1.25}.select-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.select-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.spinner-dot{display:inline-block;width:11px;height:11px;border:2px solid #bfdbfe;border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:select-spin .6s linear infinite}@keyframes select-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
362
362
|
}
|
|
363
363
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptSearchableSelectComponent, decorators: [{
|
|
364
364
|
type: Component,
|
|
@@ -375,7 +375,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
375
375
|
'[class.size-sm]': 'size() === "sm"',
|
|
376
376
|
'[class.size-md]': 'size() === "md"',
|
|
377
377
|
'[class.size-lg]': 'size() === "lg"',
|
|
378
|
-
}, template: "<div class=\"rpt-search-select-wrapper\" #origin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <!-- Trigger Button -->\n <button\n #triggerBtn\n type=\"button\"\n class=\"select-trigger\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [class.is-open]=\"isOpen()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-label]=\"ariaLabel() || placeholder()\"\n (click)=\"toggle($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <div class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n @if (selectedOption()) {\n <span class=\"selected-text\">{{ selectedOption()!.label }}</span>\n @if (selectedOption()!.sublabel) {\n <span class=\"selected-sublabel\">{{ selectedOption()!.sublabel }}</span>\n }\n @if (selectedOption()!.badge) {\n <span class=\"selected-badge\">{{ selectedOption()!.badge }}</span>\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n </div>\n\n <div class=\"trigger-actions\">\n @if (loading()) {\n <span class=\"spinner-dot\" title=\"Loading options...\"></span>\n }\n\n @if (selectedOption() && clearable() && !isDisabled()) {\n <button\n type=\"button\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n >\n \u2715\n </button>\n }\n\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\">\n <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n</div>\n\n<!-- Dropdown Popover Panel in CDK Overlay (attached to body, outside any clipped card) -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"close()\"\n>\n <div\n class=\"select-panel\"\n [id]=\"panelId\"\n [class.opens-above]=\"opensAbove()\"\n [style.max-height]=\"panelMaxHeight()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Search Input Box -->\n @if (searchable()) {\n <div class=\"select-search-box\">\n <span class=\"search-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"search-clear-btn\"\n title=\"Clear search\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n }\n\n <!-- Options List -->\n <div class=\"select-options-list\" #optionsList (scroll)=\"onOptionsScroll($event)\">\n @if (loading()) {\n <div class=\"select-status-row loading\">\n <span class=\"spinner-dot\"></span>\n <span>{{ loadingText() }}</span>\n </div>\n } @else if (normalizedOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>{{ emptyText() }}</span>\n </div>\n } @else if (visibleFilteredOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>No options match \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.value; let i = $index) {\n <div\n role=\"option\"\n class=\"select-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [class.is-disabled]=\"opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <div class=\"option-content\">\n <span class=\"option-label\" [title]=\"opt.label\">{{ opt.label }}</span>\n @if (opt.sublabel) {\n <span class=\"option-sublabel\" [title]=\"opt.sublabel\">{{ opt.sublabel }}</span>\n }\n </div>\n\n <div class=\"option-meta\">\n @if (opt.badge) {\n <span class=\"option-badge\">{{ opt.badge }}</span>\n }\n @if (isSelected(opt)) {\n <span class=\"option-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n </div>\n }\n\n @if (excessCount() > 0) {\n <div class=\"select-excess-hint\">\n <span class=\"excess-text\">Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down to browse or</span>\n <button\n type=\"button\"\n class=\"select-load-all-btn\"\n (click)=\"loadAll(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;position:relative;box-sizing:border-box}.rpt-search-select-wrapper{position:relative;width:100%;box-sizing:border-box}:host(.size-sm) .select-trigger{min-height:28px;padding:4px 8px;font-size:var(--rpt-font-size-sm, .75rem)}:host(.size-md) .select-trigger{min-height:36px;padding:6px 10px;font-size:var(--rpt-font-size-base, .8125rem)}:host(.size-lg) .select-trigger{min-height:42px;padding:8px 12px;font-size:var(--rpt-font-size-base, .875rem)}.select-trigger{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:6px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);color:var(--rpt-color-text, #0f172a);font-family:inherit;outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.select-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.select-trigger:focus-visible,.select-trigger.is-open{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb33}.select-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #94a3b8);border-color:var(--rpt-color-border, #e2e8f0);cursor:not-allowed}.trigger-label{flex:1;min-width:0;display:flex;align-items:center;gap:6px;overflow:hidden}.selected-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--rpt-color-text, #0f172a)}.selected-sublabel{font-size:.675rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.selected-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em;flex-shrink:0}.placeholder-text{color:var(--rpt-color-text-muted, #94a3b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trigger-actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.trigger-clear-btn{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;border:none;font-size:.55rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;padding:0;line-height:1;transition:background-color .12s ease,color .12s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.select-panel{width:100%;min-width:180px;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:select-pop .12s cubic-bezier(0,0,.2,1)}.select-panel.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:select-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes select-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes select-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.select-search-box{display:flex;align-items:center;gap:6px;padding:6px 8px;background-color:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .75rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.search-input::placeholder{color:#94a3b8}.search-clear-btn{border:none;background:#e2e8f0;color:#64748b;width:14px;height:14px;border-radius:50%;font-size:.5rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background-color .12s}.search-clear-btn:hover{background:#cbd5e1;color:#0f172a}.select-options-list{overflow-y:auto;overscroll-behavior:contain;padding:3px}.select-option-item{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;border-radius:4px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.select-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.select-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.select-option-item.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.option-content{display:flex;flex-direction:column;min-width:0;flex:1}.option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.option-sublabel{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.option-meta{display:flex;align-items:center;gap:6px;flex-shrink:0}.option-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em}.select-option-item.is-selected .option-badge{background-color:#dbeafe;color:#1e40af}.option-check{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb)}.select-status-row{padding:10px 12px;font-size:.72rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.select-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:var(--rpt-color-primary, #2563eb)}.select-status-row.empty{color:var(--rpt-color-text-muted, #94a3b8)}.select-excess-hint{font-size:.6875rem;color:var(--rpt-color-text-secondary, #475569);display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;background-color:#f8fafc;border-top:1px dashed var(--rpt-color-border, #cbd5e1);margin-top:2px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.excess-text{flex:1;line-height:1.25}.select-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.select-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.spinner-dot{display:inline-block;width:11px;height:11px;border:2px solid #bfdbfe;border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:select-spin .6s linear infinite}@keyframes select-spin{to{transform:rotate(360deg)}}\n"] }]
|
|
378
|
+
}, template: "<div class=\"rpt-search-select-wrapper\" #origin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <!-- Trigger Button -->\n <button\n #triggerBtn\n type=\"button\"\n class=\"select-trigger\"\n [id]=\"id()\"\n [disabled]=\"isDisabled()\"\n [class.is-open]=\"isOpen()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-label]=\"ariaLabel() || placeholder()\"\n (click)=\"toggle($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <div class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n @if (selectedOption()) {\n <span class=\"selected-text\">{{ selectedOption()!.label }}</span>\n @if (selectedOption()!.sublabel) {\n <span class=\"selected-sublabel\">{{ selectedOption()!.sublabel }}</span>\n }\n @if (selectedOption()!.badge) {\n <span class=\"selected-badge\">{{ selectedOption()!.badge }}</span>\n }\n } @else {\n <span class=\"placeholder-text\">{{ placeholder() }}</span>\n }\n </div>\n\n <div class=\"trigger-actions\">\n @if (loading()) {\n <span class=\"spinner-dot\" title=\"Loading options...\"></span>\n }\n\n @if (selectedOption() && clearable() && !isDisabled()) {\n <button\n type=\"button\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n >\n \u2715\n </button>\n }\n\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\">\n <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n</div>\n\n<!-- Dropdown Popover Panel in CDK Overlay (attached to body, outside any clipped card) -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayMinWidth]=\"'min(180px, calc(100vw - 16px))'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (positionChange)=\"onPositionChange($event)\"\n (attach)=\"onOverlayAttached()\"\n (detach)=\"close()\"\n>\n <div\n class=\"select-panel\"\n [id]=\"panelId\"\n [class.opens-above]=\"opensAbove()\"\n [style.max-height]=\"panelMaxHeight()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Search Input Box -->\n @if (searchable()) {\n <div class=\"select-search-box\">\n <span class=\"search-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"search-clear-btn\"\n title=\"Clear search\"\n (click)=\"clearSearch($event)\"\n >\n \u2715\n </button>\n }\n </div>\n }\n\n <!-- Options List -->\n <div class=\"select-options-list\" #optionsList (scroll)=\"onOptionsScroll($event)\">\n @if (loading()) {\n <div class=\"select-status-row loading\">\n <span class=\"spinner-dot\"></span>\n <span>{{ loadingText() }}</span>\n </div>\n } @else if (normalizedOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>{{ emptyText() }}</span>\n </div>\n } @else if (visibleFilteredOptions().length === 0) {\n <div class=\"select-status-row empty\">\n <span>No options match \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.value; let i = $index) {\n <div\n role=\"option\"\n class=\"select-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [class.is-disabled]=\"opt.disabled\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <div class=\"option-content\">\n <span class=\"option-label\" [title]=\"opt.label\">{{ opt.label }}</span>\n @if (opt.sublabel) {\n <span class=\"option-sublabel\" [title]=\"opt.sublabel\">{{ opt.sublabel }}</span>\n }\n </div>\n\n <div class=\"option-meta\">\n @if (opt.badge) {\n <span class=\"option-badge\">{{ opt.badge }}</span>\n }\n @if (isSelected(opt)) {\n <span class=\"option-check\" aria-hidden=\"true\">\u2713</span>\n }\n </div>\n </div>\n }\n\n @if (excessCount() > 0) {\n <div class=\"select-excess-hint\">\n <span class=\"excess-text\">Showing {{ visibleFilteredOptions().length }} of {{ filteredOptions().length }} matches. Scroll down to browse or</span>\n <button\n type=\"button\"\n class=\"select-load-all-btn\"\n (click)=\"loadAll(); $event.stopPropagation();\"\n >\n Load all {{ filteredOptions().length }}\n </button>\n </div>\n }\n }\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;position:relative;box-sizing:border-box}.rpt-search-select-wrapper{position:relative;width:100%;box-sizing:border-box}:host(.size-sm) .select-trigger{min-height:28px;padding:4px 8px;font-size:var(--rpt-font-size-sm, .75rem)}:host(.size-md) .select-trigger{min-height:36px;padding:6px 10px;font-size:var(--rpt-font-size-base, .8125rem)}:host(.size-lg) .select-trigger{min-height:42px;padding:8px 12px;font-size:var(--rpt-font-size-base, .875rem)}.select-trigger{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:6px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);color:var(--rpt-color-text, #0f172a);font-family:inherit;outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.select-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.select-trigger:focus-visible,.select-trigger.is-open{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb33}.select-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #94a3b8);border-color:var(--rpt-color-border, #e2e8f0);cursor:not-allowed}.trigger-label{flex:1;min-width:0;display:flex;align-items:center;gap:6px;overflow:hidden}.selected-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--rpt-color-text, #0f172a)}.selected-sublabel{font-size:.675rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.selected-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em;flex-shrink:0}.placeholder-text{color:var(--rpt-color-text-muted, #94a3b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trigger-actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.trigger-clear-btn{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;border:none;font-size:.55rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;padding:0;line-height:1;transition:background-color .12s ease,color .12s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.select-panel{width:100%;min-width:0;max-width:100vw;box-sizing:border-box;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #00000024,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:select-pop .12s cubic-bezier(0,0,.2,1)}.select-panel.opens-above{box-shadow:0 -10px 25px -5px #00000024,0 -8px 10px -6px #00000014;animation:select-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes select-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes select-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.select-search-box{display:flex;align-items:center;gap:6px;padding:6px 8px;background-color:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .75rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.search-input::placeholder{color:#94a3b8}.search-clear-btn{border:none;background:#e2e8f0;color:#64748b;width:14px;height:14px;border-radius:50%;font-size:.5rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background-color .12s}.search-clear-btn:hover{background:#cbd5e1;color:#0f172a}.select-options-list{overflow-y:auto;overscroll-behavior:contain;padding:3px}.select-option-item{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;border-radius:4px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.select-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.select-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.select-option-item.is-disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.option-content{display:flex;flex-direction:column;min-width:0;flex:1}.option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.35}.option-sublabel{font-size:.65rem;color:var(--rpt-color-text-muted, #64748b);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.option-meta{display:flex;align-items:center;gap:6px;flex-shrink:0}.option-badge{font-size:.6rem;font-weight:600;padding:1px 4px;border-radius:3px;background-color:#e2e8f0;color:#475569;text-transform:uppercase;letter-spacing:.03em}.select-option-item.is-selected .option-badge{background-color:#dbeafe;color:#1e40af}.option-check{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb)}.select-status-row{padding:10px 12px;font-size:.72rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.select-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:var(--rpt-color-primary, #2563eb)}.select-status-row.empty{color:var(--rpt-color-text-muted, #94a3b8)}.select-excess-hint{font-size:.6875rem;color:var(--rpt-color-text-secondary, #475569);display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;background-color:#f8fafc;border-top:1px dashed var(--rpt-color-border, #cbd5e1);margin-top:2px;position:sticky;bottom:0;z-index:2;box-shadow:0 -2px 6px #0000000a}.excess-text{flex:1;line-height:1.25}.select-load-all-btn{background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.6875rem;font-weight:600;padding:3px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:all .12s ease}.select-load-all-btn:hover{background:#2563eb;color:#fff;border-color:#2563eb}.spinner-dot{display:inline-block;width:11px;height:11px;border:2px solid #bfdbfe;border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:select-spin .6s linear infinite}@keyframes select-spin{to{transform:rotate(360deg)}}\n"] }]
|
|
379
379
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { onDocumentClick: [{
|
|
380
380
|
type: HostListener,
|
|
381
381
|
args: ['document:click', ['$event']]
|
|
@@ -383,4 +383,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
383
383
|
type: HostListener,
|
|
384
384
|
args: ['document:keydown.escape']
|
|
385
385
|
}] } });
|
|
386
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXNlYXJjaGFibGUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9zZWFyY2hhYmxlLXNlbGVjdC9ycHQtc2VhcmNoYWJsZS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL3NlYXJjaGFibGUtc2VsZWN0L3JwdC1zZWFyY2hhYmxlLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUdMLE9BQU8sRUFDUCxhQUFhLEdBRWQsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBbUM5QixNQUFNLE9BQU8sNEJBQTRCO0lBQ3RCLFVBQVUsQ0FBMEI7SUFDcEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVsQyxPQUFPLEdBQUcsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNFLGNBQWMsR0FBbUIsSUFBSSxDQUFDLE9BQU8s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QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVUxQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxuICBPdmVybGF5LFxuICBPdmVybGF5TW9kdWxlLFxuICBTY3JvbGxTdHJhdGVneSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaGFibGVTZWxlY3RPcHRpb248VCA9IGFueT4ge1xuICB2YWx1ZTogVDtcbiAgbGFiZWw6IHN0cmluZztcbiAgc3VibGFiZWw/OiBzdHJpbmc7XG4gIGJhZGdlPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGdyb3VwPzogc3RyaW5nO1xuICBkYXRhPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtc2VhcmNoYWJsZS1zZWxlY3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgT3ZlcmxheU1vZHVsZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUnB0U2VhcmNoYWJsZVNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcnB0LXNlYXJjaGFibGUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3JwdC1zZWFyY2hhYmxlLXNlbGVjdC5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLW9wZW5dJzogJ2lzT3BlbigpJyxcbiAgICAnW2NsYXNzLm9wZW5zLWFib3ZlXSc6ICdvcGVuc0Fib3ZlKCknLFxuICAgICdbY2xhc3MuaXMtZGlzYWJsZWRdJzogJ2lzRGlzYWJsZWQoKScsXG4gICAgJ1tjbGFzcy5zaXplLXNtXSc6ICdzaXplKCkgPT09IFwic21cIicsXG4gICAgJ1tjbGFzcy5zaXplLW1kXSc6ICdzaXplKCkgPT09IFwibWRcIicsXG4gICAgJ1tjbGFzcy5zaXplLWxnXSc6ICdzaXplKCkgPT09IFwibGdcIicsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIFJwdFNlYXJjaGFibGVTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcblxuICByZWFkb25seSBwYW5lbElkID0gJ3JwdC1zZWxlY3QtcGFuZWwtJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KTtcbiAgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpO1xuICByZWFkb25seSB0cmlnZ2VyV2lkdGggPSBzaWduYWw8bnVtYmVyIHwgc3RyaW5nPignYXV0bycpO1xuXG4gIHJlYWRvbmx5IG92ZXJsYXlQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXG4gICAge1xuICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICBvZmZzZXRZOiA0LFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICBvZmZzZXRZOiAtNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICBvZmZzZXRZOiA0LFxuICAgIH0sXG4gICAge1xuICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgIG9mZnNldFk6IC00LFxuICAgIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuXG4gICAgLy8gU3luYyBpbnB1dCB2YWx1ZSgpIGlmIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5pbnRlcm5hbFZhbHVlLnNldCh2KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgLy8gLS0tIElucHV0cyAtLS1cbiAgcmVhZG9ubHkgb3B0aW9ucyA9IGlucHV0PFNlYXJjaGFibGVTZWxlY3RPcHRpb25bXSB8IGFueVtdPihbXSk7XG4gIHJlYWRvbmx5IHZhbHVlID0gaW5wdXQ8YW55Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJy0tIFNlbGVjdCAtLScpO1xuICByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ1NlYXJjaC4uLicpO1xuICByZWFkb25seSBkaXNhYmxlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ1RleHQgPSBpbnB1dDxzdHJpbmc+KCdMb2FkaW5nLi4uJyk7XG4gIHJlYWRvbmx5IGVtcHR5VGV4dCA9IGlucHV0PHN0cmluZz4oJ05vIG1hdGNoaW5nIG9wdGlvbnMgZm91bmQnKTtcbiAgcmVhZG9ubHkgY2xlYXJhYmxlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNlYXJjaGFibGUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2l6ZSA9IGlucHV0PCdzbScgfCAnbWQnIHwgJ2xnJz4oJ3NtJyk7XG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGFyaWFMYWJlbCA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSB2YWx1ZUtleSA9IGlucHV0PHN0cmluZz4oJ3ZhbHVlJyk7XG4gIHJlYWRvbmx5IGxhYmVsS2V5ID0gaW5wdXQ8c3RyaW5nPignbGFiZWwnKTtcbiAgcmVhZG9ubHkgc3VibGFiZWxLZXkgPSBpbnB1dDxzdHJpbmc+KCdzdWJsYWJlbCcpO1xuICByZWFkb25seSBiYWRnZUtleSA9IGlucHV0PHN0cmluZz4oJ2JhZGdlJyk7XG4gIHJlYWRvbmx5IHBhbmVsTWF4SGVpZ2h0ID0gaW5wdXQ8c3RyaW5nPignMjQwcHgnKTtcbiAgcmVhZG9ubHkgb3BlbkFib3ZlID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyAtLS0gT3V0cHV0cyAtLS1cbiAgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbj4oKTtcbiAgcmVhZG9ubHkgb3BlbmVkID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IGNsb3NlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIC8vIC0tLSBWaWV3IENoaWxkcmVuIC0tLVxuICByZWFkb25seSB0cmlnZ2VyQnRuRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4+KCd0cmlnZ2VyQnRuJyk7XG4gIHJlYWRvbmx5IHNlYXJjaElucHV0RWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ3NlYXJjaElucHV0Jyk7XG4gIHJlYWRvbmx5IG9wdGlvbnNMaXN0RWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdvcHRpb25zTGlzdCcpO1xuXG4gIC8vIC0tLSBJbnRlcm5hbCBTdGF0ZSBTaWduYWxzIC0tLVxuICByZWFkb25seSBpbnRlcm5hbFZhbHVlID0gc2lnbmFsPGFueT4oJycpO1xuICByZWFkb25seSBpc09wZW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBvcGVuc0Fib3ZlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZm9jdXNlZEluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuICBwcml2YXRlIHJlYWRvbmx5IGN2YURpc2FibGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyAtLS0gQ29udHJvbFZhbHVlQWNjZXNzb3IgQ2FsbGJhY2tzIC0tLVxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICByZWFkb25seSBpc0Rpc2FibGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuY3ZhRGlzYWJsZWQoKSk7XG5cbiAgLy8gTm9ybWFsaXplZCBvcHRpb25zXG4gIHJlYWRvbmx5IG5vcm1hbGl6ZWRPcHRpb25zID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5vcHRpb25zKCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHZLZXkgPSB0aGlzLnZhbHVlS2V5KCk7XG4gICAgY29uc3QgbEtleSA9IHRoaXMubGFiZWxLZXkoKTtcbiAgICBjb25zdCBzdWJLZXkgPSB0aGlzLnN1YmxhYmVsS2V5KCk7XG4gICAgY29uc3QgYktleSA9IHRoaXMuYmFkZ2VLZXkoKTtcblxuICAgIHJldHVybiByYXdcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgIGxhYmVsOiBTdHJpbmcoaXRlbSksXG4gICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bdktleV0gPz8gaXRlbVsndmFsdWUnXSA/PyBpdGVtWydrZXknXSA/PyBpdGVtWydpZCddID8/IGl0ZW1bJ25hbWUnXSA/PyAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtW2xLZXldID8/IGl0ZW1bJ2xhYmVsJ10gPz8gaXRlbVsnZGlzcGxheU5hbWUnXSA/PyBpdGVtWyduYW1lJ10gPz8gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgY29uc3Qgc3VibGFiZWwgPSBpdGVtW3N1YktleV0gPz8gaXRlbVsnc3VibGFiZWwnXSA/PyBpdGVtWydzY2hlbWEnXSA/PyBpdGVtWydjYXRlZ29yeSddID8/IGl0ZW1bJ2RhdGFUeXBlJ107XG4gICAgICAgIGNvbnN0IGJhZGdlID0gaXRlbVtiS2V5XSA/PyBpdGVtWydiYWRnZSddID8/IGl0ZW1bJ3R5cGUnXTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWQgPSAhIWl0ZW1bJ2Rpc2FibGVkJ107XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBsYWJlbDogU3RyaW5nKGxhYmVsKSxcbiAgICAgICAgICBzdWJsYWJlbDogc3VibGFiZWwgPyBTdHJpbmcoc3VibGFiZWwpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGJhZGdlOiBiYWRnZSA/IFN0cmluZyhiYWRnZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgZ3JvdXA6IGl0ZW1bJ2dyb3VwJ10gPyBTdHJpbmcoaXRlbVsnZ3JvdXAnXSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZGF0YTogaXRlbVsnZGF0YSddID8/IGl0ZW0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgLy8gRmlsdGVyZWQgb3B0aW9ucyB3aXRoIHJlc3BvbnNpdmUgc2VhcmNoXG4gIHJlYWRvbmx5IGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPFNlYXJjaGFibGVTZWxlY3RPcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubm9ybWFsaXplZE9wdGlvbnMoKTtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5zZWFyY2hUZXJtKCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gYWxsO1xuXG4gICAgcmV0dXJuIGFsbC5maWx0ZXIoKG9wdCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hMYWJlbCA9IG9wdC5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgY29uc3QgbWF0Y2hWYWwgPSBTdHJpbmcob3B0LnZhbHVlKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgY29uc3QgbWF0Y2hTdWIgPSBvcHQuc3VibGFiZWw/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSk7XG4gICAgICBjb25zdCBtYXRjaEJhZGdlID0gb3B0LmJhZGdlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgcmV0dXJuIG1hdGNoTGFiZWwgfHwgbWF0Y2hWYWwgfHwgbWF0Y2hTdWIgfHwgbWF0Y2hCYWRnZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSW5jcmVtZW50YWwgcmVuZGVyaW5nIGZvciBzbW9vdGggcGVyZm9ybWFuY2Ugd2l0aCB0aG91c2FuZHMgb2YgU1BzL3RhYmxlcyAoMzAwMCspXG4gIHJlYWRvbmx5IE1BWF9WSVNJQkxFX09QVElPTlMgPSAxNTA7XG4gIHJlYWRvbmx5IElOSVRJQUxfVklTSUJMRV9PUFRJT05TID0gMTUwO1xuICByZWFkb25seSByZW5kZXJlZExpbWl0ID0gc2lnbmFsPG51bWJlcj4oMTUwKTtcblxuICByZWFkb25seSB2aXNpYmxlRmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5yZW5kZXJlZExpbWl0KCk7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGZpbHRlcmVkO1xuICAgIHJldHVybiBmaWx0ZXJlZC5zbGljZSgwLCBsaW1pdCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGV4Y2Vzc0NvdW50ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZExpbWl0KCkpO1xuICB9KTtcblxuICBvbk9wdGlvbnNTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmIChlbC5zY3JvbGxUb3AgKyBlbC5jbGllbnRIZWlnaHQgPj0gZWwuc2Nyb2xsSGVpZ2h0IC0gMTIwKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZE1vcmUoKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZW5kZXJlZExpbWl0KCk7XG4gICAgaWYgKGN1cnJlbnQgPCB0b3RhbCkge1xuICAgICAgdGhpcy5yZW5kZXJlZExpbWl0LnVwZGF0ZSgoYykgPT4gTWF0aC5taW4odG90YWwsIGMgKyAxNTApKTtcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZWRMaW1pdC5zZXQodGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGgpO1xuICB9XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRPcHRpb24gPSBjb21wdXRlZDxTZWFyY2hhYmxlU2VsZWN0T3B0aW9uIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5pbnRlcm5hbFZhbHVlKCk7XG4gICAgaWYgKGN1ciA9PT0gbnVsbCB8fCBjdXIgPT09IHVuZGVmaW5lZCB8fCBjdXIgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0ckN1ciA9IFN0cmluZyhjdXIpO1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWRPcHRpb25zKCkuZmluZCgob3B0KSA9PiBTdHJpbmcob3B0LnZhbHVlKSA9PT0gc3RyQ3VyKTtcbiAgfSk7XG5cbiAgLy8gLS0tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEltcGxlbWVudGF0aW9uIC0tLVxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbFZhbHVlLnNldChvYmogPz8gJycpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jdmFEaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gIH1cblxuICAvLyAtLS0gSW50ZXJhY3Rpb24gTWV0aG9kcyAtLS1cbiAgdG9nZ2xlKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpIHx8IHRoaXMuaXNPcGVuKCkpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA+IDApIHtcbiAgICAgIHRoaXMudHJpZ2dlcldpZHRoLnNldChyZWN0LndpZHRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYW51YWxQcmVmZXJlbmNlID0gdGhpcy5vcGVuQWJvdmUoKTtcbiAgICBpZiAobWFudWFsUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9wZW5zQWJvdmUuc2V0KG1hbnVhbFByZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcbiAgICB0aGlzLnJlbmRlcmVkTGltaXQuc2V0KHRoaXMuSU5JVElBTF9WSVNJQkxFX09QVElPTlMpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgdGhpcy5vcGVuZWQuZW1pdCgpO1xuICB9XG5cbiAgb25Qb3NpdGlvbkNoYW5nZShjaGFuZ2U6IENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMub3BlbnNBYm92ZS5zZXQoY2hhbmdlLmNvbm5lY3Rpb25QYWlyLm9yaWdpblkgPT09ICd0b3AnKTtcbiAgfVxuXG4gIG9uT3ZlcmxheUF0dGFjaGVkKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9LCAyNSk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cblxuICBzZWxlY3RPcHRpb24ob3B0OiBTZWFyY2hhYmxlU2VsZWN0T3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKG9wdC5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuaW50ZXJuYWxWYWx1ZS5zZXQob3B0LnZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKG9wdC52YWx1ZSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG9wdC52YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChvcHQpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgICB0aGlzLnRyaWdnZXJCdG5FbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaW50ZXJuYWxWYWx1ZS5zZXQoJycpO1xuICAgIHRoaXMub25DaGFuZ2UoJycpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCgnJyk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5yZW5kZXJlZExpbWl0LnNldCh0aGlzLklOSVRJQUxfVklTSUJMRV9PUFRJT05TKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICB9XG5cbiAgY2xlYXJTZWFyY2goZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5yZW5kZXJlZExpbWl0LnNldCh0aGlzLklOSVRJQUxfVklTSUJMRV9PUFRJT05TKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMuc2VhcmNoSW5wdXRFbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvblNlYXJjaElucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCh2YWwpO1xuICAgIHRoaXMucmVuZGVyZWRMaW1pdC5zZXQodGhpcy5JTklUSUFMX1ZJU0lCTEVfT1BUSU9OUyk7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KDApO1xuICB9XG5cbiAgb25UcmlnZ2VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGVGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCBjb3VudCA9IHZpc2libGUubGVuZ3RoO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSAodGhpcy5mb2N1c2VkSW5kZXgoKSArIDEpICUgY291bnQ7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHQpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsRm9jdXNlZEludG9WaWV3KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuZm9jdXNlZEluZGV4KCkgPD0gMCA/IGNvdW50IC0gMSA6IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEZvY3VzZWRJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBjb3VudCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKHZpc2libGVbaWR4XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbih2aXNpYmxlWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aGlzLnRyaWdnZXJCdG5FbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVGFiJzoge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsRm9jdXNlZEludG9WaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3RFbCA9IHRoaXMub3B0aW9uc0xpc3RFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghbGlzdEVsKSByZXR1cm47XG4gICAgY29uc3QgaXRlbXMgPSBsaXN0RWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5zZWxlY3Qtb3B0aW9uLWl0ZW0nKTtcbiAgICBjb25zdCBpZHggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgIGlmIChpdGVtcyAmJiBpdGVtc1tpZHhdKSB7XG4gICAgICBpdGVtc1tpZHhdLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdDogU2VhcmNoYWJsZVNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaW50ZXJuYWxWYWx1ZSgpO1xuICAgIGlmIChjdXIgPT09IG51bGwgfHwgY3VyID09PSB1bmRlZmluZWQgfHwgY3VyID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBTdHJpbmcoY3VyKSA9PT0gU3RyaW5nKG9wdC52YWx1ZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJycHQtc2VhcmNoLXNlbGVjdC13cmFwcGVyXCIgI29yaWdpbj1cImNka092ZXJsYXlPcmlnaW5cIiBjZGtPdmVybGF5T3JpZ2luPlxuICA8IS0tIFRyaWdnZXIgQnV0dG9uIC0tPlxuICA8YnV0dG9uXG4gICAgI3RyaWdnZXJCdG5cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInNlbGVjdC10cmlnZ2VyXCJcbiAgICBbaWRdPVwiaWQoKVwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmlzLW9wZW5dPVwiaXNPcGVuKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuKClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBhbmVsSWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsKCkgfHwgcGxhY2Vob2xkZXIoKVwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJvblRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInRyaWdnZXItbGFiZWxcIiBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIXNlbGVjdGVkT3B0aW9uKClcIj5cbiAgICAgIEBpZiAoc2VsZWN0ZWRPcHRpb24oKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLXRleHRcIj57eyBzZWxlY3RlZE9wdGlvbigpIS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgQGlmIChzZWxlY3RlZE9wdGlvbigpIS5zdWJsYWJlbCkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtc3VibGFiZWxcIj57eyBzZWxlY3RlZE9wdGlvbigpIS5zdWJsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNlbGVjdGVkT3B0aW9uKCkhLmJhZGdlKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3RlZC1iYWRnZVwiPnt7IHNlbGVjdGVkT3B0aW9uKCkhLmJhZGdlIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlci10ZXh0XCI+e3sgcGxhY2Vob2xkZXIoKSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ0cmlnZ2VyLWFjdGlvbnNcIj5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1kb3RcIiB0aXRsZT1cIkxvYWRpbmcgb3B0aW9ucy4uLlwiPjwvc3Bhbj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzZWxlY3RlZE9wdGlvbigpICYmIGNsZWFyYWJsZSgpICYmICFpc0Rpc2FibGVkKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1jbGVhci1idG5cIlxuICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICDinJVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJpZ2dlci1hcnJvd1wiIFtjbGFzcy5yb3RhdGVkXT1cImlzT3BlbigpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDEwIDZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMSAxTDUgNUw5IDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48IS0tIERyb3Bkb3duIFBvcG92ZXIgUGFuZWwgaW4gQ0RLIE92ZXJsYXkgKGF0dGFjaGVkIHRvIGJvZHksIG91dHNpZGUgYW55IGNsaXBwZWQgY2FyZCkgLS0+XG48bmctdGVtcGxhdGVcbiAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJvcmlnaW5cIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJvdmVybGF5UG9zaXRpb25zXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aF09XCJ0cmlnZ2VyV2lkdGgoKVwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zXT1cInRydWVcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luXT1cIjhcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVB1c2hdPVwidHJ1ZVwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3ldPVwic2Nyb2xsU3RyYXRlZ3lcIlxuICAob3ZlcmxheU91dHNpZGVDbGljayk9XCJjbG9zZSgpXCJcbiAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gIChhdHRhY2gpPVwib25PdmVybGF5QXR0YWNoZWQoKVwiXG4gIChkZXRhY2gpPVwiY2xvc2UoKVwiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNlbGVjdC1wYW5lbFwiXG4gICAgW2lkXT1cInBhbmVsSWRcIlxuICAgIFtjbGFzcy5vcGVucy1hYm92ZV09XCJvcGVuc0Fib3ZlKClcIlxuICAgIFtzdHlsZS5tYXgtaGVpZ2h0XT1cInBhbmVsTWF4SGVpZ2h0KClcIlxuICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICAgIDwhLS0gU2VhcmNoIElucHV0IEJveCAtLT5cbiAgICBAaWYgKHNlYXJjaGFibGUoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1zZWFyY2gtYm94XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VhcmNoLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI4XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8bGluZSB4MT1cIjIxXCIgeTE9XCIyMVwiIHgyPVwiMTYuNjVcIiB5Mj1cIjE2LjY1XCI+PC9saW5lPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNzZWFyY2hJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxuICAgICAgICAgIChpbnB1dCk9XCJvblNlYXJjaElucHV0KCRldmVudClcIlxuICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgQGlmIChzZWFyY2hUZXJtKCkpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWNsZWFyLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4pyVXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gT3B0aW9ucyBMaXN0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtb3B0aW9ucy1saXN0XCIgI29wdGlvbnNMaXN0IChzY3JvbGwpPVwib25PcHRpb25zU2Nyb2xsKCRldmVudClcIj5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtc3RhdHVzLXJvdyBsb2FkaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj57eyBsb2FkaW5nVGV4dCgpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKG5vcm1hbGl6ZWRPcHRpb25zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtc3RhdHVzLXJvdyBlbXB0eVwiPlxuICAgICAgICAgIDxzcGFuPnt7IGVtcHR5VGV4dCgpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKHZpc2libGVGaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1zdGF0dXMtcm93IGVtcHR5XCI+XG4gICAgICAgICAgPHNwYW4+Tm8gb3B0aW9ucyBtYXRjaCBcInt7IHNlYXJjaFRlcm0oKSB9fVwiPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBAZm9yIChvcHQgb2YgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHQudmFsdWU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNlbGVjdC1vcHRpb24taXRlbVwiXG4gICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1mb2N1c2VkXT1cImZvY3VzZWRJbmRleCgpID09PSBpXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJvcHQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG9wdClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHQpXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImZvY3VzZWRJbmRleC5zZXQoaSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiIFt0aXRsZV09XCJvcHQubGFiZWxcIj57eyBvcHQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAob3B0LnN1YmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb24tc3VibGFiZWxcIiBbdGl0bGVdPVwib3B0LnN1YmxhYmVsXCI+e3sgb3B0LnN1YmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1tZXRhXCI+XG4gICAgICAgICAgICAgIEBpZiAob3B0LmJhZGdlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb24tYmFkZ2VcIj57eyBvcHQuYmFkZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChpc1NlbGVjdGVkKG9wdCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1jaGVja1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKckzwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGV4Y2Vzc0NvdW50KCkgPiAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1leGNlc3MtaGludFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleGNlc3MtdGV4dFwiPlNob3dpbmcge3sgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCB9fSBvZiB7eyBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggfX0gbWF0Y2hlcy4gU2Nyb2xsIGRvd24gdG8gYnJvd3NlIG9yPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtbG9hZC1hbGwtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImxvYWRBbGwoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIExvYWQgYWxsIHt7IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
386
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXNlYXJjaGFibGUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9zZWFyY2hhYmxlLXNlbGVjdC9ycHQtc2VhcmNoYWJsZS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL3NlYXJjaGFibGUtc2VsZWN0L3JwdC1zZWFyY2hhYmxlLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUdMLGFBQWEsR0FFZCxNQUFNLHNCQUFzQixDQUFDOzs7QUFtQzlCLE1BQU0sT0FBTyw0QkFBNEI7SUFDdEIsVUFBVSxDQUEwQjtJQUU1QyxPQUFPLEdBQUcsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNFLGNBQWMsR0FBbUIsTUFBTSxDQUFDLG9CQUFvQixDQUFD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K0VBcVhELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydE92ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtb3ZlcmxheS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG4gIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSxcbiAgT3ZlcmxheU1vZHVsZSxcbiAgU2Nyb2xsU3RyYXRlZ3ksXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hhYmxlU2VsZWN0T3B0aW9uPFQgPSBhbnk+IHtcbiAgdmFsdWU6IFQ7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHN1YmxhYmVsPzogc3RyaW5nO1xuICBiYWRnZT86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBncm91cD86IHN0cmluZztcbiAgZGF0YT86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXNlYXJjaGFibGUtc2VsZWN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE92ZXJsYXlNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJwdFNlYXJjaGFibGVTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JwdC1zZWFyY2hhYmxlLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ycHQtc2VhcmNoYWJsZS1zZWxlY3QuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5pcy1vcGVuXSc6ICdpc09wZW4oKScsXG4gICAgJ1tjbGFzcy5vcGVucy1hYm92ZV0nOiAnb3BlbnNBYm92ZSgpJyxcbiAgICAnW2NsYXNzLmlzLWRpc2FibGVkXSc6ICdpc0Rpc2FibGVkKCknLFxuICAgICdbY2xhc3Muc2l6ZS1zbV0nOiAnc2l6ZSgpID09PSBcInNtXCInLFxuICAgICdbY2xhc3Muc2l6ZS1tZF0nOiAnc2l6ZSgpID09PSBcIm1kXCInLFxuICAgICdbY2xhc3Muc2l6ZS1sZ10nOiAnc2l6ZSgpID09PSBcImxnXCInLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBScHRTZWFyY2hhYmxlU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHJlYWRvbmx5IHBhbmVsSWQgPSAncnB0LXNlbGVjdC1wYW5lbC0nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpO1xuICByZWFkb25seSBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3kgPSBpbmplY3QoUmVwb3J0T3ZlcmxheVNlcnZpY2UpLnNjcm9sbFN0cmF0ZWd5KCgpID0+IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgcmVhZG9ubHkgdHJpZ2dlcldpZHRoID0gc2lnbmFsPG51bWJlciB8IHN0cmluZz4oJ2F1dG8nKTtcblxuICByZWFkb25seSBvdmVybGF5UG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLTQsXG4gICAgfSxcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogNCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICBvZmZzZXRZOiAtNCxcbiAgICB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcblxuICAgIC8vIFN5bmMgaW5wdXQgdmFsdWUoKSBpZiBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuaW50ZXJuYWxWYWx1ZS5zZXQodikpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIC0tLSBJbnB1dHMgLS0tXG4gIHJlYWRvbmx5IG9wdGlvbnMgPSBpbnB1dDxTZWFyY2hhYmxlU2VsZWN0T3B0aW9uW10gfCBhbnlbXT4oW10pO1xuICByZWFkb25seSB2YWx1ZSA9IGlucHV0PGFueT4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCctLSBTZWxlY3QgLS0nKTtcbiAgcmVhZG9ubHkgc2VhcmNoUGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCdTZWFyY2guLi4nKTtcbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmdUZXh0ID0gaW5wdXQ8c3RyaW5nPignTG9hZGluZy4uLicpO1xuICByZWFkb25seSBlbXB0eVRleHQgPSBpbnB1dDxzdHJpbmc+KCdObyBtYXRjaGluZyBvcHRpb25zIGZvdW5kJyk7XG4gIHJlYWRvbmx5IGNsZWFyYWJsZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBzZWFyY2hhYmxlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNpemUgPSBpbnB1dDwnc20nIHwgJ21kJyB8ICdsZyc+KCdzbScpO1xuICByZWFkb25seSBpZCA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBhcmlhTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgdmFsdWVLZXkgPSBpbnB1dDxzdHJpbmc+KCd2YWx1ZScpO1xuICByZWFkb25seSBsYWJlbEtleSA9IGlucHV0PHN0cmluZz4oJ2xhYmVsJyk7XG4gIHJlYWRvbmx5IHN1YmxhYmVsS2V5ID0gaW5wdXQ8c3RyaW5nPignc3VibGFiZWwnKTtcbiAgcmVhZG9ubHkgYmFkZ2VLZXkgPSBpbnB1dDxzdHJpbmc+KCdiYWRnZScpO1xuICByZWFkb25seSBwYW5lbE1heEhlaWdodCA9IGlucHV0PHN0cmluZz4oJzI0MHB4Jyk7XG4gIHJlYWRvbmx5IG9wZW5BYm92ZSA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gLS0tIE91dHB1dHMgLS0tXG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PFNlYXJjaGFibGVTZWxlY3RPcHRpb24+KCk7XG4gIHJlYWRvbmx5IG9wZW5lZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAvLyAtLS0gVmlldyBDaGlsZHJlbiAtLS1cbiAgcmVhZG9ubHkgdHJpZ2dlckJ0bkVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+PigndHJpZ2dlckJ0bicpO1xuICByZWFkb25seSBzZWFyY2hJbnB1dEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdzZWFyY2hJbnB1dCcpO1xuICByZWFkb25seSBvcHRpb25zTGlzdEVsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3B0aW9uc0xpc3QnKTtcblxuICAvLyAtLS0gSW50ZXJuYWwgU3RhdGUgU2lnbmFscyAtLS1cbiAgcmVhZG9ubHkgaW50ZXJuYWxWYWx1ZSA9IHNpZ25hbDxhbnk+KCcnKTtcbiAgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgb3BlbnNBYm92ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNlYXJjaFRlcm0gPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGZvY3VzZWRJbmRleCA9IHNpZ25hbDxudW1iZXI+KC0xKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjdmFEaXNhYmxlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gLS0tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIENhbGxiYWNrcyAtLS1cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbDogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgcmVhZG9ubHkgaXNEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLmN2YURpc2FibGVkKCkpO1xuXG4gIC8vIE5vcm1hbGl6ZWQgb3B0aW9uc1xuICByZWFkb25seSBub3JtYWxpemVkT3B0aW9ucyA9IGNvbXB1dGVkPFNlYXJjaGFibGVTZWxlY3RPcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMub3B0aW9ucygpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gW107XG5cbiAgICBjb25zdCB2S2V5ID0gdGhpcy52YWx1ZUtleSgpO1xuICAgIGNvbnN0IGxLZXkgPSB0aGlzLmxhYmVsS2V5KCk7XG4gICAgY29uc3Qgc3ViS2V5ID0gdGhpcy5zdWJsYWJlbEtleSgpO1xuICAgIGNvbnN0IGJLZXkgPSB0aGlzLmJhZGdlS2V5KCk7XG5cbiAgICByZXR1cm4gcmF3XG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKGl0ZW0pLFxuICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW3ZLZXldID8/IGl0ZW1bJ3ZhbHVlJ10gPz8gaXRlbVsna2V5J10gPz8gaXRlbVsnaWQnXSA/PyBpdGVtWyduYW1lJ10gPz8gJyc7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gaXRlbVtsS2V5XSA/PyBpdGVtWydsYWJlbCddID8/IGl0ZW1bJ2Rpc3BsYXlOYW1lJ10gPz8gaXRlbVsnbmFtZSddID8/IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHN1YmxhYmVsID0gaXRlbVtzdWJLZXldID8/IGl0ZW1bJ3N1YmxhYmVsJ10gPz8gaXRlbVsnc2NoZW1hJ10gPz8gaXRlbVsnY2F0ZWdvcnknXSA/PyBpdGVtWydkYXRhVHlwZSddO1xuICAgICAgICBjb25zdCBiYWRnZSA9IGl0ZW1bYktleV0gPz8gaXRlbVsnYmFkZ2UnXSA/PyBpdGVtWyd0eXBlJ107XG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gISFpdGVtWydkaXNhYmxlZCddO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbGFiZWw6IFN0cmluZyhsYWJlbCksXG4gICAgICAgICAgc3VibGFiZWw6IHN1YmxhYmVsID8gU3RyaW5nKHN1YmxhYmVsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBiYWRnZTogYmFkZ2UgPyBTdHJpbmcoYmFkZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgIGdyb3VwOiBpdGVtWydncm91cCddID8gU3RyaW5nKGl0ZW1bJ2dyb3VwJ10pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRhdGE6IGl0ZW1bJ2RhdGEnXSA/PyBpdGVtLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIC8vIEZpbHRlcmVkIG9wdGlvbnMgd2l0aCByZXNwb25zaXZlIHNlYXJjaFxuICByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZDxTZWFyY2hhYmxlU2VsZWN0T3B0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm5vcm1hbGl6ZWRPcHRpb25zKCk7XG4gICAgY29uc3QgdGVybSA9IHRoaXMuc2VhcmNoVGVybSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGVybSkgcmV0dXJuIGFsbDtcblxuICAgIHJldHVybiBhbGwuZmlsdGVyKChvcHQpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoTGFiZWwgPSBvcHQubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgIGNvbnN0IG1hdGNoVmFsID0gU3RyaW5nKG9wdC52YWx1ZSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgIGNvbnN0IG1hdGNoU3ViID0gb3B0LnN1YmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgY29uc3QgbWF0Y2hCYWRnZSA9IG9wdC5iYWRnZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgIHJldHVybiBtYXRjaExhYmVsIHx8IG1hdGNoVmFsIHx8IG1hdGNoU3ViIHx8IG1hdGNoQmFkZ2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEluY3JlbWVudGFsIHJlbmRlcmluZyBmb3Igc21vb3RoIHBlcmZvcm1hbmNlIHdpdGggdGhvdXNhbmRzIG9mIFNQcy90YWJsZXMgKDMwMDArKVxuICByZWFkb25seSBNQVhfVklTSUJMRV9PUFRJT05TID0gMTUwO1xuICByZWFkb25seSBJTklUSUFMX1ZJU0lCTEVfT1BUSU9OUyA9IDE1MDtcbiAgcmVhZG9ubHkgcmVuZGVyZWRMaW1pdCA9IHNpZ25hbDxudW1iZXI+KDE1MCk7XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPFNlYXJjaGFibGVTZWxlY3RPcHRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMucmVuZGVyZWRMaW1pdCgpO1xuICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPD0gbGltaXQpIHJldHVybiBmaWx0ZXJlZDtcbiAgICByZXR1cm4gZmlsdGVyZWQuc2xpY2UoMCwgbGltaXQpO1xuICB9KTtcblxuICByZWFkb25seSBleGNlc3NDb3VudCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRMaW1pdCgpKTtcbiAgfSk7XG5cbiAgb25PcHRpb25zU2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoZWwuc2Nyb2xsVG9wICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIDEyMCkge1xuICAgICAgdGhpcy5sb2FkTW9yZSgpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRNb3JlKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucmVuZGVyZWRMaW1pdCgpO1xuICAgIGlmIChjdXJyZW50IDwgdG90YWwpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRMaW1pdC51cGRhdGUoKGMpID0+IE1hdGgubWluKHRvdGFsLCBjICsgMTUwKSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVkTGltaXQuc2V0KHRoaXMuZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9uID0gY29tcHV0ZWQ8U2VhcmNoYWJsZVNlbGVjdE9wdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaW50ZXJuYWxWYWx1ZSgpO1xuICAgIGlmIChjdXIgPT09IG51bGwgfHwgY3VyID09PSB1bmRlZmluZWQgfHwgY3VyID09PSAnJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdHJDdXIgPSBTdHJpbmcoY3VyKTtcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkT3B0aW9ucygpLmZpbmQoKG9wdCkgPT4gU3RyaW5nKG9wdC52YWx1ZSkgPT09IHN0ckN1cik7XG4gIH0pO1xuXG4gIC8vIC0tLSBDb250cm9sVmFsdWVBY2Nlc3NvciBJbXBsZW1lbnRhdGlvbiAtLS1cbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxWYWx1ZS5zZXQob2JqID8/ICcnKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY3ZhRGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgLy8gLS0tIEludGVyYWN0aW9uIE1ldGhvZHMgLS0tXG4gIHRvZ2dsZShldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSB8fCB0aGlzLmlzT3BlbigpKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKHJlY3Qud2lkdGggPiAwKSB7XG4gICAgICB0aGlzLnRyaWdnZXJXaWR0aC5zZXQocmVjdC53aWR0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFudWFsUHJlZmVyZW5jZSA9IHRoaXMub3BlbkFib3ZlKCk7XG4gICAgaWYgKG1hbnVhbFByZWZlcmVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vcGVuc0Fib3ZlLnNldChtYW51YWxQcmVmZXJlbmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgdGhpcy5yZW5kZXJlZExpbWl0LnNldCh0aGlzLklOSVRJQUxfVklTSUJMRV9PUFRJT05TKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uUG9zaXRpb25DaGFuZ2UoY2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5zQWJvdmUuc2V0KGNoYW5nZS5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAndG9wJyk7XG4gIH1cblxuICBvbk92ZXJsYXlBdHRhY2hlZCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSwgMjUpO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG5cbiAgc2VsZWN0T3B0aW9uKG9wdDogU2VhcmNoYWJsZVNlbGVjdE9wdGlvbik6IHZvaWQge1xuICAgIGlmIChvcHQuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmludGVybmFsVmFsdWUuc2V0KG9wdC52YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZShvcHQudmFsdWUpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChvcHQudmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQob3B0KTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy50cmlnZ2VyQnRuRWwoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmludGVybmFsVmFsdWUuc2V0KCcnKTtcbiAgICB0aGlzLm9uQ2hhbmdlKCcnKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoJycpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoJycpO1xuICAgIHRoaXMucmVuZGVyZWRMaW1pdC5zZXQodGhpcy5JTklUSUFMX1ZJU0lCTEVfT1BUSU9OUyk7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoJycpO1xuICAgIHRoaXMucmVuZGVyZWRMaW1pdC5zZXQodGhpcy5JTklUSUFMX1ZJU0lCTEVfT1BUSU9OUyk7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICB0aGlzLnNlYXJjaElucHV0RWwoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgb25TZWFyY2hJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB2YWwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQodmFsKTtcbiAgICB0aGlzLnJlbmRlcmVkTGltaXQuc2V0KHRoaXMuSU5JVElBTF9WSVNJQkxFX09QVElPTlMpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgwKTtcbiAgfVxuXG4gIG9uVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy52aXNpYmxlRmlsdGVyZWRPcHRpb25zKCk7XG4gICAgY29uc3QgY291bnQgPSB2aXNpYmxlLmxlbmd0aDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gKHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxKSAlIGNvdW50O1xuICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0KTtcbiAgICAgICAgICB0aGlzLnNjcm9sbEZvY3VzZWRJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmZvY3VzZWRJbmRleCgpIDw9IDAgPyBjb3VudCAtIDEgOiB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldik7XG4gICAgICAgICAgdGhpcy5zY3JvbGxGb2N1c2VkSW50b1ZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY291bnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbih2aXNpYmxlW2lkeF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb24odmlzaWJsZVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFc2NhcGUnOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyQnRuRWwoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1RhYic6IHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEZvY3VzZWRJbnRvVmlldygpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0RWwgPSB0aGlzLm9wdGlvbnNMaXN0RWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGl0ZW1zID0gbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuc2VsZWN0LW9wdGlvbi1pdGVtJyk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXNbaWR4XSkge1xuICAgICAgaXRlbXNbaWR4XS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZChvcHQ6IFNlYXJjaGFibGVTZWxlY3RPcHRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmludGVybmFsVmFsdWUoKTtcbiAgICBpZiAoY3VyID09PSBudWxsIHx8IGN1ciA9PT0gdW5kZWZpbmVkIHx8IGN1ciA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gU3RyaW5nKGN1cikgPT09IFN0cmluZyhvcHQudmFsdWUpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicnB0LXNlYXJjaC1zZWxlY3Qtd3JhcHBlclwiICNvcmlnaW49XCJjZGtPdmVybGF5T3JpZ2luXCIgY2RrT3ZlcmxheU9yaWdpbj5cbiAgPCEtLSBUcmlnZ2VyIEJ1dHRvbiAtLT5cbiAgPGJ1dHRvblxuICAgICN0cmlnZ2VyQnRuXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtdHJpZ2dlclwiXG4gICAgW2lkXT1cImlkKClcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgIFtjbGFzcy5pcy1vcGVuXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJwYW5lbElkXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCgpIHx8IHBsYWNlaG9sZGVyKClcIlxuICAgIChjbGljayk9XCJ0b2dnbGUoJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ0cmlnZ2VyLWxhYmVsXCIgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFzZWxlY3RlZE9wdGlvbigpXCI+XG4gICAgICBAaWYgKHNlbGVjdGVkT3B0aW9uKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3RlZC10ZXh0XCI+e3sgc2VsZWN0ZWRPcHRpb24oKSEubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIEBpZiAoc2VsZWN0ZWRPcHRpb24oKSEuc3VibGFiZWwpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkLXN1YmxhYmVsXCI+e3sgc2VsZWN0ZWRPcHRpb24oKSEuc3VibGFiZWwgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChzZWxlY3RlZE9wdGlvbigpIS5iYWRnZSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtYmFkZ2VcIj57eyBzZWxlY3RlZE9wdGlvbigpIS5iYWRnZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXItdGV4dFwiPnt7IHBsYWNlaG9sZGVyKCkgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidHJpZ2dlci1hY3Rpb25zXCI+XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXItZG90XCIgdGl0bGU9XCJMb2FkaW5nIG9wdGlvbnMuLi5cIj48L3NwYW4+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2VsZWN0ZWRPcHRpb24oKSAmJiBjbGVhcmFibGUoKSAmJiAhaXNEaXNhYmxlZCgpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRyaWdnZXItY2xlYXItYnRuXCJcbiAgICAgICAgICB0aXRsZT1cIkNsZWFyIHNlbGVjdGlvblwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlbGVjdGlvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAg4pyVXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuXG4gICAgICA8c3BhbiBjbGFzcz1cInRyaWdnZXItYXJyb3dcIiBbY2xhc3Mucm90YXRlZF09XCJpc09wZW4oKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCAxMCA2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTEgMUw1IDVMOSAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPCEtLSBEcm9wZG93biBQb3BvdmVyIFBhbmVsIGluIENESyBPdmVybGF5IChhdHRhY2hlZCB0byBib2R5LCBvdXRzaWRlIGFueSBjbGlwcGVkIGNhcmQpIC0tPlxuPG5nLXRlbXBsYXRlXG4gIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwib3JpZ2luXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbigpXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwib3ZlcmxheVBvc2l0aW9uc1wiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGhdPVwidHJpZ2dlcldpZHRoKClcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoXT1cIidtaW4oMTgwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSknXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnNdPVwidHJ1ZVwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5Vmlld3BvcnRNYXJnaW5dPVwiOFwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5UHVzaF09XCJ0cnVlXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneV09XCJzY3JvbGxTdHJhdGVneVwiXG4gIChvdmVybGF5T3V0c2lkZUNsaWNrKT1cImNsb3NlKClcIlxuICAocG9zaXRpb25DaGFuZ2UpPVwib25Qb3NpdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgKGF0dGFjaCk9XCJvbk92ZXJsYXlBdHRhY2hlZCgpXCJcbiAgKGRldGFjaCk9XCJjbG9zZSgpXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2VsZWN0LXBhbmVsXCJcbiAgICBbaWRdPVwicGFuZWxJZFwiXG4gICAgW2NsYXNzLm9wZW5zLWFib3ZlXT1cIm9wZW5zQWJvdmUoKVwiXG4gICAgW3N0eWxlLm1heC1oZWlnaHRdPVwicGFuZWxNYXhIZWlnaHQoKVwiXG4gICAgcm9sZT1cImxpc3Rib3hcIlxuICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICA+XG4gICAgPCEtLSBTZWFyY2ggSW5wdXQgQm94IC0tPlxuICAgIEBpZiAoc2VhcmNoYWJsZSgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXNlYXJjaC1ib3hcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjhcIj48L2NpcmNsZT5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMjFcIiB5MT1cIjIxXCIgeDI9XCIxNi42NVwiIHkyPVwiMTYuNjVcIj48L2xpbmU+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXIoKVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFRlcm0oKVwiXG4gICAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24pPVwib25TZWFyY2hLZXlkb3duKCRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKHNlYXJjaFRlcm0oKSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtY2xlYXItYnRuXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDinJVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBPcHRpb25zIExpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1vcHRpb25zLWxpc3RcIiAjb3B0aW9uc0xpc3QgKHNjcm9sbCk9XCJvbk9wdGlvbnNTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1zdGF0dXMtcm93IGxvYWRpbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXItZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IGxvYWRpbmdUZXh0KCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAobm9ybWFsaXplZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1zdGF0dXMtcm93IGVtcHR5XCI+XG4gICAgICAgICAgPHNwYW4+e3sgZW1wdHlUZXh0KCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAodmlzaWJsZUZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXN0YXR1cy1yb3cgZW1wdHlcIj5cbiAgICAgICAgICA8c3Bhbj5ObyBvcHRpb25zIG1hdGNoIFwie3sgc2VhcmNoVGVybSgpIH19XCI8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBmb3IgKG9wdCBvZiB2aXNpYmxlRmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdC52YWx1ZTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0LW9wdGlvbi1pdGVtXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG9wdClcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWZvY3VzZWRdPVwiZm9jdXNlZEluZGV4KCkgPT09IGlcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWRpc2FibGVkXT1cIm9wdC5kaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdClcIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiZm9jdXNlZEluZGV4LnNldChpKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9uLWxhYmVsXCIgW3RpdGxlXT1cIm9wdC5sYWJlbFwiPnt7IG9wdC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgQGlmIChvcHQuc3VibGFiZWwpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1zdWJsYWJlbFwiIFt0aXRsZV09XCJvcHQuc3VibGFiZWxcIj57eyBvcHQuc3VibGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLW1ldGFcIj5cbiAgICAgICAgICAgICAgQGlmIChvcHQuYmFkZ2UpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1iYWRnZVwiPnt7IG9wdC5iYWRnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGlzU2VsZWN0ZWQob3B0KSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9uLWNoZWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+4pyTPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZXhjZXNzQ291bnQoKSA+IDApIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWV4Y2Vzcy1oaW50XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4Y2Vzcy10ZXh0XCI+U2hvd2luZyB7eyB2aXNpYmxlRmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19IG9mIHt7IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCB9fSBtYXRjaGVzLiBTY3JvbGwgZG93biB0byBicm93c2Ugb3I8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdC1sb2FkLWFsbC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9hZEFsbCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgTG9hZCBhbGwge3sgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|