raain-app 1.6.9 → 1.6.11
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/CHANGELOG.md +12 -4
- package/esm2020/raain-details/raain-details.component.mjs +3 -3
- package/esm2020/raain-map/raain-map.component.mjs +59 -116
- package/esm2020/tools/CompareManager.mjs +5 -7
- package/fesm2015/raain-app.mjs +66 -126
- package/fesm2015/raain-app.mjs.map +1 -1
- package/fesm2020/raain-app.mjs +64 -123
- package/fesm2020/raain-app.mjs.map +1 -1
- package/package.json +3 -3
- package/raain-map/raain-map.component.d.ts +1 -14
package/CHANGELOG.md
CHANGED
|
@@ -7,16 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.6.10] - 2025-10-28
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Migrated all marker icons to use `RaainDivIcon` with HTML-based icons (raain-ui pattern)
|
|
15
|
+
- Updated speed markers to use proper `RaainDivIcon` with rotation support via `rotationAngle`
|
|
16
|
+
- Implemented dynamic sizing for speed markers based on wind speed strength (20-60px)
|
|
17
|
+
- Removed deprecated `changeMarkerStyle()` calls (rotation now handled by RaainDivIcon)
|
|
18
|
+
- Fixed TypeScript type declarations for iconSize, iconAnchor, and popupAnchor
|
|
19
|
+
|
|
20
|
+
## [1.6.9] - 2025-10-26
|
|
21
|
+
|
|
10
22
|
### Added
|
|
11
23
|
|
|
12
24
|
- [RAD-90] Cumulative features added
|
|
13
25
|
|
|
14
26
|
## [1.6.8] - 2025-10-25
|
|
15
27
|
|
|
16
|
-
## [1.6.7] - 2025-10-22
|
|
17
|
-
|
|
18
|
-
## [1.6.6] - 2025-10-16
|
|
19
|
-
|
|
20
28
|
### Added
|
|
21
29
|
|
|
22
30
|
- Trustful indicator added to speed map
|
|
@@ -342,10 +342,10 @@ export class RaainDetailsComponent {
|
|
|
342
342
|
}
|
|
343
343
|
}
|
|
344
344
|
RaainDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: RaainDetailsComponent, deps: [{ token: i1.Storage }], target: i0.ɵɵFactoryTarget.Component });
|
|
345
|
-
RaainDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: RaainDetailsComponent, selector: "raain-details", inputs: { toggleAdmin: "toggleAdmin", rainNode: "rainNode", compareManager: "compareManager", refreshManager: "refreshManager", profileService: "profileService", radarService: "radarService", toggleCumulative: "toggleCumulative" }, usesOnChanges: true, ngImport: i0, template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-col size=\"12\" size-md=\"6\">\n <!-- left content (if any) -->\n </ion-col>\n <ion-col class=\"ion-text-right\" size=\"12\" size-md=\"6\">\n <ion-label class=\"ion-margin-end\">\n <span *ngIf=\"getPercentOfComputations()\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" [disabled]=\"refreshInProgress\" class=\"refresh-button\">\n Refresh Map\n </ion-button>\n </ion-col>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : [],\n speeds: compareManager.speeds\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSelect, selector: "ion-select", inputs: ["cancelText", "compareWith", "disabled", "interface", "interfaceOptions", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "value"] }, { kind: "component", type: i4.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i4.IonToggle, selector: "ion-toggle", inputs: ["checked", "color", "disabled", "mode", "name", "value"] }, { kind: "directive", type: i4.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i4.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i5.RaainMapComponent, selector: "raain-map", inputs: ["coordinates", "markers", "timeframeContainers", "autoplay", "showMarkers", "showSpeedMarkers", "showCumulative", "currentHeight", "timeframeDates", "defaultDate", "sumValues", "sumFn"], outputs: ["selectedMarker", "changedDate", "changedSum"] }, { kind: "component", type: i6.RaainCompareStackComponent, selector: "raain-compare-stack", inputs: ["compareManager", "currentHeight", "cumulative"], outputs: ["selectedPoint"] }, { kind: "component", type: i7.RaainDateFocusComponent, selector: "raain-date-focus", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight"] }, { kind: "component", type: i8.RaainDateDynamicComponent, selector: "raain-date-dynamic", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight", "fetchData"], outputs: ["changedDate"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
345
|
+
RaainDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: RaainDetailsComponent, selector: "raain-details", inputs: { toggleAdmin: "toggleAdmin", rainNode: "rainNode", compareManager: "compareManager", refreshManager: "refreshManager", profileService: "profileService", radarService: "radarService", toggleCumulative: "toggleCumulative" }, usesOnChanges: true, ngImport: i0, template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-col size=\"12\" size-md=\"6\">\n <!-- left content (if any) -->\n </ion-col>\n <ion-col class=\"ion-text-right\" size=\"12\" size-md=\"6\">\n <ion-label class=\"ion-margin-end\">\n <span *ngIf=\"getPercentOfComputations()\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" [disabled]=\"refreshInProgress\" class=\"refresh-button\">\n Refresh Map\n </ion-button>\n </ion-col>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : [],\n speeds: compareManager.speeds\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSelect, selector: "ion-select", inputs: ["cancelText", "compareWith", "disabled", "interface", "interfaceOptions", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "value"] }, { kind: "component", type: i4.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i4.IonToggle, selector: "ion-toggle", inputs: ["checked", "color", "disabled", "mode", "name", "value"] }, { kind: "directive", type: i4.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i4.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i5.RaainMapComponent, selector: "raain-map", inputs: ["coordinates", "markers", "timeframeContainers", "autoplay", "showMarkers", "showSpeedMarkers", "showCumulative", "currentHeight", "timeframeDates", "defaultDate", "sumValues", "sumFn"], outputs: ["selectedMarker", "changedDate", "changedSum"] }, { kind: "component", type: i6.RaainCompareStackComponent, selector: "raain-compare-stack", inputs: ["compareManager", "currentHeight", "cumulative"], outputs: ["selectedPoint"] }, { kind: "component", type: i7.RaainDateFocusComponent, selector: "raain-date-focus", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight"] }, { kind: "component", type: i8.RaainDateDynamicComponent, selector: "raain-date-dynamic", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight", "fetchData"], outputs: ["changedDate"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
346
346
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: RaainDetailsComponent, decorators: [{
|
|
347
347
|
type: Component,
|
|
348
|
-
args: [{ selector: 'raain-details', template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-col size=\"12\" size-md=\"6\">\n <!-- left content (if any) -->\n </ion-col>\n <ion-col class=\"ion-text-right\" size=\"12\" size-md=\"6\">\n <ion-label class=\"ion-margin-end\">\n <span *ngIf=\"getPercentOfComputations()\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" [disabled]=\"refreshInProgress\" class=\"refresh-button\">\n Refresh Map\n </ion-button>\n </ion-col>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : [],\n speeds: compareManager.speeds\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"] }]
|
|
348
|
+
args: [{ selector: 'raain-details', template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-col size=\"12\" size-md=\"6\">\n <!-- left content (if any) -->\n </ion-col>\n <ion-col class=\"ion-text-right\" size=\"12\" size-md=\"6\">\n <ion-label class=\"ion-margin-end\">\n <span *ngIf=\"getPercentOfComputations()\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" [disabled]=\"refreshInProgress\" class=\"refresh-button\">\n Refresh Map\n </ion-button>\n </ion-col>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : [],\n speeds: compareManager.speeds\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"] }]
|
|
349
349
|
}], ctorParameters: function () { return [{ type: i1.Storage }]; }, propDecorators: { toggleAdmin: [{
|
|
350
350
|
type: Input
|
|
351
351
|
}], rainNode: [{
|
|
@@ -361,4 +361,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
361
361
|
}], toggleCumulative: [{
|
|
362
362
|
type: Input
|
|
363
363
|
}] } });
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBQyxxQkFBcUIsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUEyQixvQkFBb0IsRUFBaUIsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7QUFVeEYsTUFBTSxPQUFPLHFCQUFxQjtJQXdEOUIsWUFBc0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUZuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBMEl6QyxnRUFBZ0U7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxFQUFFLFNBQWUsRUFBRSxVQUFxQixFQUFFLEVBQUU7WUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQTNJdUMsQ0FBQztJQUVsQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLEVBQUU7WUFDTixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDekQsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNoRCxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQztZQUN6RCxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQWUsRUFBRSxVQUFxQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7U0FDekQ7UUFDRCxNQUFNLFFBQVEsR0FBRztZQUNiO2dCQUNJLEtBQUssRUFBRSxTQUFTO2dCQUNoQixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNO2FBQ1Q7WUFDRDtnQkFDSSxLQUFLLEVBQUUsVUFBVTtnQkFDakIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTTthQUNUO1lBQ0QsS0FBSztZQUNMLDJCQUEyQjtZQUMzQixzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLE1BQU07U0FDVCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ2xDLE9BQU87U0FDVjthQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDekUsV0FBVyxFQUFFLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxHQUFHO2dCQUNIO29CQUNJLEtBQUssRUFBRSxhQUFhO29CQUNwQixLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDcEMsT0FBTzs0QkFDSCxJQUFJLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM1QixDQUFDO29CQUNOLENBQUMsQ0FBQztpQkFDTDtnQkFDRDtvQkFDSSxLQUFLLEVBQUUsVUFBVTtvQkFDakIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osTUFBTSxFQUFFLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ3ZDLE9BQU87NEJBQ0gsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUIsQ0FBQztvQkFDTixDQUFDLENBQUM7aUJBQ0w7Z0JBQ0Q7b0JBQ0ksS0FBSyxFQUFFLFdBQVc7b0JBQ2xCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNsQyxPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVCLENBQUM7b0JBQ04sQ0FBQyxDQUFDO2lCQUNMO2FBQ0osQ0FBQztTQUNMO2FBQU07WUFDSCxrRUFBa0U7WUFDbEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDakUsS0FBSztnQkFDTCxXQUFXLEVBQUUsU0FBUzthQUN6QixDQUFDLENBQUM7WUFFSCxJQUFJLEdBQUc7Z0JBQ0g7b0JBQ0ksS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLEtBQUssRUFBRSxLQUFLO29CQUNaLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNsQyxPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVCLENBQUM7b0JBQ04sQ0FBQyxDQUFDO2lCQUNMO2dCQUNEO29CQUNJLEtBQUssRUFBRSxVQUFVO29CQUNqQixLQUFLLEVBQUUsS0FBSztvQkFDWixNQUFNLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDbkMsT0FBTzs0QkFDSCxJQUFJLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM1QixDQUFDO29CQUNOLENBQUMsQ0FBQztpQkFDTDtnQkFDRCxLQUFLO2dCQUNMLDJCQUEyQjtnQkFDM0Isc0JBQXNCO2dCQUN0Qiw0Q0FBNEM7Z0JBQzVDLG9CQUFvQjtnQkFDcEIsNERBQTREO2dCQUM1RCwwQ0FBMEM7Z0JBQzFDLGNBQWM7Z0JBQ2QsV0FBVztnQkFDWCxNQUFNO2FBQ1QsQ0FBQztTQUNMO1FBRUQsZ0RBQWdEO1FBQ2hELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFPTSxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBYztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztTQUN6QjtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBVTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4RCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQWE7UUFDdEMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxjQUFjLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsV0FBaUI7UUFDdkMsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxtQkFBbUI7WUFDcEIsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxHQUFHLENBQUM7UUFDbEMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBZTtRQUNuQywrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsTUFBTSxlQUFlLEdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzNGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBb0I7UUFDekMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUN6RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FDNUQsQ0FBQztRQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsT0FBTztTQUNWO1FBQ0QsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBRWhGLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGFBQXlDO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUM1RCxhQUFhLENBQUMsRUFBRSxFQUNoQixRQUFRLEVBQ1IsTUFBTSxDQUNULENBQUM7UUFDRixNQUFNLFdBQVcsR0FBa0MsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3hFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUM7WUFDN0UsTUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbEUsT0FBTyxFQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHO1lBQ3ZCO2dCQUNJLEtBQUssRUFBRSxhQUFhLENBQUMsSUFBSTtnQkFDekIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTSxFQUFFLFdBQVc7YUFDdEI7U0FDSixDQUFDO1FBQ0Ysc0VBQXNFO0lBQzFFLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBd0M7UUFDakUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUVwRSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFhO1FBQzNCLHdCQUF3QjtRQUN4Qiw4QkFBOEI7UUFDOUIsSUFBSTtJQUNSLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFrQjtRQUNwQywrREFBK0Q7UUFDL0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLHNGQUFzRjtRQUN0RiwrRkFBK0Y7UUFDL0YsSUFBSSxDQUFDLE9BQU8sR0FBRztRQUNYLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtTQUMxRSxDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYztRQUNoQix1Q0FBdUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsbUJBQW1CO1lBQ3BCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUU7WUFDMUMsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUN4RCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FDN0QsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx3QkFBd0I7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFFRCxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxRQUFRO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztRQUV6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsaUJBQWlCLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsc0JBQXNCO1lBQ3ZCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUk7UUFDZCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU3QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDOUIsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV6RixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUM7WUFDNUUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FDN0IsWUFJQyxFQUNELGNBQXNCO1FBRXRCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDekMsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBc0I7UUFDOUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxtQkFBeUM7UUFDL0QsSUFBSSxtQkFBbUIsRUFBRTtZQUNyQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7U0FDbEQ7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFzQjtRQUN2QyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDOztrSEFqY1EscUJBQXFCO3NHQUFyQixxQkFBcUIsa1RDZGxDLDZyZkFpUkE7MkZEblFhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDSSxlQUFlOzhGQU1sQixXQUFXO3NCQURqQixLQUFLO2dCQUdDLFFBQVE7c0JBRGQsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFHQyxZQUFZO3NCQURsQixLQUFLO2dCQUdDLGdCQUFnQjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXN9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQcm9maWxlU2VydmljZX0gZnJvbSAnLi4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Q2FydGVzaWFuTWVhc3VyZVZhbHVlLCBSYWluTm9kZSwgVGVhbU5vZGV9IGZyb20gJ3JhYWluLW1vZGVsJztcbmltcG9ydCB7RGF0ZVJhbmdlLCBNYXBMYXRMbmcsIFRpbWVmcmFtZUNvbnRhaW5lcnN9IGZyb20gJ3JhYWluLXVpJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXIsIEZyYW1lU2V0LCBtYXBEYXRlUmFuZ2VUb1N0cmluZywgUmVmcmVzaE1hbmFnZXJ9IGZyb20gJy4uL3Rvb2xzJztcbmltcG9ydCB7WFlUeXBlfSBmcm9tICcuLi94eXR5cGUnO1xuaW1wb3J0IHtSYWRhclNlcnZpY2V9IGZyb20gJy4uL3JhZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHtTdG9yYWdlfSBmcm9tICcuLi9zdG9yYWdlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3JhYWluLWRldGFpbHMnLFxuICAgIHRlbXBsYXRlVXJsOiAncmFhaW4tZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ3JhYWluLWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmFhaW5EZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRvZ2dsZUFkbWluOiBib29sZWFuO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJhaW5Ob2RlOiBSYWluTm9kZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb21wYXJlTWFuYWdlcjogQ29tcGFyZU1hbmFnZXI7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmVmcmVzaE1hbmFnZXI6IFJlZnJlc2hNYW5hZ2VyO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByYWRhclNlcnZpY2U6IFJhZGFyU2VydmljZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0b2dnbGVDdW11bGF0aXZlOiBib29sZWFuO1xuXG4gICAgcHVibGljIHBlcmlvZEJlZ2luOiBEYXRlO1xuICAgIHB1YmxpYyBwZXJpb2RFbmQ6IERhdGU7XG5cbiAgICAvLyBwdWJsaWMgVUkgdmFyaWFibGVzXG4gICAgcHVibGljIHRlYW1Ob2RlOiBUZWFtTm9kZTtcbiAgICBwdWJsaWMgcGVyaW9kQmVnaW5Bc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBwZXJpb2RFbmRBc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBwZXJpb2REdXJhdGlvbkFzU3RyaW5nOiBzdHJpbmc7XG4gICAgcHVibGljIGRhdGVTaG93bjogRGF0ZTtcbiAgICBwdWJsaWMgY29vcmRpbmF0ZXM6IE1hcExhdExuZztcbiAgICBwdWJsaWMgYm9yZGVyczogTWFwTGF0TG5nW107XG4gICAgcHVibGljIHRpbWVmcmFtZUNvbnRhaW5lcnM6IFRpbWVmcmFtZUNvbnRhaW5lcnM7XG4gICAgcHVibGljIGN1cnJlbnRUaW1lZnJhbWVUYXJnZXQ6IEZyYW1lU2V0O1xuICAgIHB1YmxpYyB0aW1lZnJhbWVEYXRlczogRGF0ZVtdO1xuICAgIHB1YmxpYyBjb3VudFBvaW50czoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICBzdHlsZTogc3RyaW5nO1xuICAgICAgICB2YWx1ZXM6IHtkYXRlOiBEYXRlOyB2YWx1ZTogbnVtYmVyfVtdO1xuICAgIH1bXTtcbiAgICBwdWJsaWMgY291bnRzUGVyaW9kOiB7XG4gICAgICAgIHBlcmNlbnRJbWFnZXM/OiBYWVR5cGVbXTtcbiAgICAgICAgcXVldWVSdW5uaW5nPzogbnVtYmVyO1xuICAgICAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICB9O1xuXG4gICAgcHVibGljIGdhdWdlU2VsZWN0ZWRQb2ludHM6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgc3R5bGU6IHN0cmluZztcbiAgICAgICAgdmFsdWVzOiB7ZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlcn1bXTtcbiAgICB9W107XG4gICAgcHVibGljIHRvZ2dsZUhpc3Rvcnk6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZU1hcDogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlQ29tcGFyZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlR2F1Z2VNZWFzdXJlczogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlUmVtb3ZlQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVmcmVzaEluUHJvZ3Jlc3M6IGJvb2xlYW47XG4gICAgcHVibGljIHN1bURldGFpbHM6IHN0cmluZztcbiAgICBwdWJsaWMgaXNBZG1pbjogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgRGF0ZVJhbmdlID0gRGF0ZVJhbmdlO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN0b3JhZ2U6IFN0b3JhZ2UpIHt9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBQZXJpb2REaXNwbGF5KGRhdGU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICAgICAgY29uc3QgdXNlclRpbWV6b25lT2Zmc2V0ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XG4gICAgICAgICAgICBkID0gbmV3IERhdGUoZC5nZXRUaW1lKCkgLSB1c2VyVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4YW1wbGVGb3JtYXR0ZWREYXRlID0gJzIwMTctMDYtMDFUMDg6MzAnO1xuICAgICAgICByZXR1cm4gZC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCBleGFtcGxlRm9ybWF0dGVkRGF0ZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIERhdGVVVEMoZGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGhhc0lTT0Zvcm1hdCA9IGRhdGUubWF0Y2goL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHszfVokLyk7XG4gICAgICAgIGxldCBkID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIGlmICghaGFzSVNPRm9ybWF0KSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyVGltZXpvbmVPZmZzZXQgPSBkLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDtcbiAgICAgICAgICAgIGQgPSBuZXcgRGF0ZShkLmdldFRpbWUoKSAtIHVzZXJUaW1lem9uZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoRGF0YShmb2N1c0RhdGU6IERhdGUsIGZvY3VzUmFuZ2U6IERhdGVSYW5nZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh7ZGF0ZTogbmV3IERhdGUoMjAyMCArIGksIDApLCB2YWx1ZTogMTB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWtlRGF0YSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJyUgUmFpbnknLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBJbWFnZXMnLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gIHtcbiAgICAgICAgICAgIC8vICAgICAgbGFiZWw6ICclIFF1YWxpdHknLFxuICAgICAgICAgICAgLy8gICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgLy8gICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAvLyAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IG1hcERhdGVSYW5nZVRvU3RyaW5nKGZvY3VzUmFuZ2UpO1xuICAgICAgICBsZXQgZGF0YSA9IGZha2VEYXRhO1xuICAgICAgICBpZiAoIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvY3VzUmFuZ2UgPT09IERhdGVSYW5nZS5DRU5UVVJZKSB7XG4gICAgICAgICAgICAvLyBmYWtlXG4gICAgICAgIH0gZWxzZSBpZiAoZm9jdXNSYW5nZSA9PT0gRGF0ZVJhbmdlLkhPVVIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvdXJDb3VudHMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldENvdW50c0hvdXIodGhpcy5yYWluTm9kZS5pZCwge1xuICAgICAgICAgICAgICAgIHBlcmlvZEJlZ2luOiBmb2N1c0RhdGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmFpbnkgQ291bnQnLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucmFpbnlDb3VudC5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBJbWFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogaG91ckNvdW50cy5wZXJjZW50SW1hZ2VzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSYWlueSBTdW0nLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucmFpbnlTdW0ubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZldGNoRGF0YSBUT0RPOicsIGZvY3VzRGF0ZS50b0lTT1N0cmluZygpLCByYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBjb3VudHMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldENvdW50cyh0aGlzLnJhaW5Ob2RlLmlkLCB7XG4gICAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgICAgcGVyaW9kQmVnaW46IGZvY3VzRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclIFJhaW55JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNvdW50cy5wZXJjZW50UmFpbnkubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNvdW50cy5wZXJjZW50SW1hZ2VzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICBsYWJlbDogJyUgUXVhbGl0eScsXG4gICAgICAgICAgICAgICAgLy8gICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgICAgIC8vICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudFEubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coYGZldGNoRGF0YSBET05FICR7cmFuZ2V9YCwgZGF0YSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8vIFdyYXBwZXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgdGhlIGFzeW5jIG5hdHVyZSBvZiBmZXRjaERhdGFcbiAgICBwdWJsaWMgZmV0Y2hEYXRhV3JhcHBlciA9IGFzeW5jIChmb2N1c0RhdGU6IERhdGUsIGZvY3VzUmFuZ2U6IERhdGVSYW5nZSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaERhdGEoZm9jdXNEYXRlLCBmb2N1c1JhbmdlKTtcbiAgICB9O1xuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGFuZ2UoY2hhbmdlcykudGhlbigoaWdub3JlZCkgPT4ge30pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbjogUmFpbk5vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRvZ2dsZUhpc3RvcnkpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRQb2ludHMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uUGVyaW9kQmVnaW5DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGV2ZW50Py50YXJnZXQ/LnZhbHVlID8/IHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZztcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbiA9IG5ldyBEYXRlKG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JhYWluLXBlcmlvZEJlZ2luJywgdGhpcy5wZXJpb2RCZWdpbik7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZER1cmF0aW9uQ2hhbmdlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBhc3luYyBvblBlcmlvZER1cmF0aW9uQ2hhbmdlKF9ldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25JbkhvdXIgPSBwYXJzZUZsb2F0KHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kID0gbmV3IERhdGUodGhpcy5wZXJpb2RCZWdpbi5nZXRUaW1lKCkgKyBkdXJhdGlvbkluSG91ciAqICg2MCAqIDYwMDAwKSk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kQXNTdHJpbmcgPSB0aGlzLnBlcmlvZEVuZC50b0lTT1N0cmluZygpO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdyYWFpbi1wZXJpb2RFbmQnLCB0aGlzLnBlcmlvZEVuZCk7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JhYWluLXBlcmlvZER1cmF0aW9uSW5Ib3VycycsIGR1cmF0aW9uSW5Ib3VyKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5wZXJpb2QgPSB7YmVnaW46IHRoaXMucGVyaW9kQmVnaW4sIGVuZDogdGhpcy5wZXJpb2RFbmR9O1xuICAgIH1cblxuICAgIGFzeW5jIG9uRGF0ZUNoYW5nZUluQ291bnQoZGF0ZUNoYW5nZWQ6IERhdGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uRGF0ZUNoYW5nZUluQ291bnQnLCBkYXRlQ2hhbmdlZCk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9XG4gICAgICAgICAgICBkYXRlQ2hhbmdlZC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMSkgK1xuICAgICAgICAgICAgZGF0ZUNoYW5nZWQudG9Mb2NhbGVUaW1lU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDUpO1xuICAgICAgICB0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcgPSAnMSc7XG4gICAgICAgIGF3YWl0IHRoaXMub25QZXJpb2RCZWdpbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5yZWZyZXNoKGZhbHNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkRhdGVDaGFuZ2VJbk1hcChkYXRlU2hvd246IERhdGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uRGF0ZUNoYW5nZUluTWFwJywgZGF0ZVNob3duKTtcbiAgICAgICAgdGhpcy5kYXRlU2hvd24gPSBkYXRlU2hvd247XG4gICAgICAgIGNvbnN0IGN1bXVsYXRpdmVIb3VyczogbnVtYmVyID0gIXRoaXMudG9nZ2xlQ3VtdWxhdGl2ZVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHBhcnNlRmxvYXQodGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTWFuYWdlci5mZXRjaCh0aGlzLmRhdGVTaG93biwgdGhpcy50b2dnbGVHYXVnZU1lYXN1cmVzLCBjdW11bGF0aXZlSG91cnMpO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWVUYXJnZXQgPSB0aGlzLnJlZnJlc2hNYW5hZ2VyLmdldFRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLnNldFJlcG9ydFBlcmlvZCh0aGlzLmRhdGVTaG93bik7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdW1DaGFuZ2VJbk1hcChzdW06IHN0cmluZykge1xuICAgICAgICB0aGlzLnN1bURldGFpbHMgPSBzdW07XG4gICAgfVxuXG4gICAgYXN5bmMgb25HYXVnZVNlbGVjdEluTWFwKG1hcExhdExuZzogTWFwTGF0TG5nKSB7XG4gICAgICAgIGNvbnN0IGdhdWdlc0ZpbHRlcmVkID0gdGhpcy5jb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcC5maWx0ZXIoXG4gICAgICAgICAgICAoZykgPT4gZy5sYXQgPT09IG1hcExhdExuZy5sYXQgJiYgZy5sbmcgPT09IG1hcExhdExuZy5sbmdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdhdWdlc0ZpbHRlcmVkLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdhdWdlU2VsZWN0ZWQgPSBnYXVnZXNGaWx0ZXJlZFswXTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHYXVnZVZhbHVlcyh7aWQ6IGdhdWdlU2VsZWN0ZWQuaWQsIG5hbWU6IGdhdWdlU2VsZWN0ZWQubmFtZX0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIuc2VsZWN0R2F1Z2UoZ2F1Z2VTZWxlY3RlZC5pZCwgMCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaEdhdWdlVmFsdWVzKGdhdWdlU2VsZWN0ZWQ6IHtpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IGRheUJlZ2luID0gbmV3IERhdGUodGhpcy5wZXJpb2RCZWdpbi50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCkpO1xuICAgICAgICBjb25zdCBkYXlFbmQgPSBuZXcgRGF0ZShkYXlCZWdpbi5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIC0gMSk7XG4gICAgICAgIGNvbnN0IGdhdWdlTWVhc3VyZXMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEdhdWdlTWVhc3VyZXMoXG4gICAgICAgICAgICBnYXVnZVNlbGVjdGVkLmlkLFxuICAgICAgICAgICAgZGF5QmVnaW4sXG4gICAgICAgICAgICBkYXlFbmRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZ2F1Z2VWYWx1ZXM6IHtkYXRlOiBEYXRlOyB2YWx1ZTogbnVtYmVyfVtdID0gZ2F1Z2VNZWFzdXJlcy5tYXAoKGdtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUgPSBuZXcgQ2FydGVzaWFuTWVhc3VyZVZhbHVlKGdtLnZhbHVlc1swXSBhcyBhbnkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUuZ2V0Q2FydGVzaWFuVmFsdWVzKClbMF0udmFsdWU7XG4gICAgICAgICAgICByZXR1cm4ge2RhdGU6IGdtLmRhdGUsIHZhbHVlfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogZ2F1Z2VTZWxlY3RlZC5uYW1lLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGdhdWdlVmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50czonLCB0aGlzLmdhdWdlU2VsZWN0ZWRQb2ludHMpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uR2F1Z2VTZWxlY3RJbkNvbXBhcmUoZToge3BvaW50OiBYWVR5cGU7IGNvbXBhcmVJbmRleDogbnVtYmVyfSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHYXVnZVZhbHVlcyh7aWQ6IGUucG9pbnQuaWQsIG5hbWU6IGUucG9pbnQubmFtZX0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIuc2VsZWN0R2F1Z2UoZS5wb2ludC5pZCwgZS5jb21wYXJlSW5kZXgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uVG9nZ2xlTWFwKCRldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMudG9nZ2xlTWFwKSB7XG4gICAgICAgIC8vICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hcCgpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2VEZXRlY3Rpb25UZXN0KHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICAvLyBUT0RPIGNvbnNvbGUubG9nKFRFU1RfREVURUNUSU9OKyssICdvbkNoYW5nZURldGVjdGlvblRlc3QnKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hNYXAoKSB7XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtdO1xuICAgICAgICAvLyB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHMgPSB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHM/Lmxlbmd0aCA+IDAgP1xuICAgICAgICAvLyAgdGhpcy5xdWFsaXR5Q29uZi50cnVzdGZ1bEdhdWdlSWRzIDogdGhpcy5nYXVnZXNUb0ZpbHRlci5maWx0ZXIoZyA9PiBnLmlzSW4pLm1hcChnID0+IGcuaWQpO1xuICAgICAgICB0aGlzLmJvcmRlcnMgPSBbXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSAtIDI1MCAqIDAuMDA4LCByYWluTm9kZS5sb25naXR1ZGUpLFxuICAgICAgICAgICAgLy8gIG5ldyBNYXBMYXRMbmcocmFpbk5vZGUubGF0aXR1ZGUsIHJhaW5Ob2RlLmxvbmdpdHVkZSAtIDI1MCAqIDAuMDEzKSxcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlLCByYWluTm9kZS5sb25naXR1ZGUgKyAyNTAgKiAwLjAxMyksXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSArIDI1MCAqIDAuMDA4LCByYWluTm9kZS5sb25naXR1ZGUpLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1hbmFnZXIuY2xlYW5BbGwoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZXRHYXVnZXNJbk1hcCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRoaXMudG9nZ2xlQWRtaW4pLnRoZW4oKF9pZ25vcmVkKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0UGVyaW9kT2ZOb3coKSB7XG4gICAgICAgIC8vIHNob3VsZCBsb29rIGxpa2U6IFwiMjAyNC0wOC0yNlQxMjoxM1wiXG4gICAgICAgIGNvbnN0IGxhc3QzMG1uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGFzdDMwbW4uc2V0TWludXRlcyhsYXN0MzBtbi5nZXRNaW51dGVzKCkgLSAzMCk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9XG4gICAgICAgICAgICBsYXN0MzBtbi50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMSkgKyBsYXN0MzBtbi50b0xvY2FsZVRpbWVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9ICcxJztcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZEJlZ2luQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIGdldFBlcmNlbnRPZkltYWdlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50c1BlcmlvZC5wZXJjZW50SW1hZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyaW5nUGVyaW9kID0gdGhpcy5jb3VudHNQZXJpb2QucGVyY2VudEltYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSA8PSBuZXcgRGF0ZShhLm5hbWUpLmdldFRpbWUoKSAmJlxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKGEubmFtZSkuZ2V0VGltZSgpIDw9IHRoaXMucGVyaW9kRW5kLmdldFRpbWUoKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdW1tZWQgPSBkdXJpbmdQZXJpb2QucmVkdWNlKChhLCBiKSA9PiBhICsgKGIueCA/PyAwKSwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHN1bW1lZCAvIGR1cmluZ1BlcmlvZC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgY29uc3QgdGltZWxpbmUgPSB0aGlzLnJlZnJlc2hNYW5hZ2VyLmdldFRpbWVsaW5lRnJhbWVTZXQoKTtcbiAgICAgICAgaWYgKCF0aW1lbGluZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVsaW5lV2l0aENvbXB1dGF0aW9uID0gdGltZWxpbmUuZmlsdGVyKChhKSA9PiAhIWEucmFpbkNvbXB1dGF0aW9uSWQpO1xuICAgICAgICBjb25zdCByYXRpbyA9IHRpbWVsaW5lV2l0aENvbXB1dGF0aW9uLmxlbmd0aCAvIHRpbWVsaW5lLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocmF0aW8gKiAxMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5BbGwoKSB7XG4gICAgICAgIHRoaXMuYm9yZGVycyA9IFtdO1xuXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZUNvbnRhaW5lcnMgPSBuZXcgVGltZWZyYW1lQ29udGFpbmVycyhbXSk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudFBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IHtwcm9ncmVzczogMCwgcXVldWVSdW5uaW5nOiAwLCBwZXJjZW50SW1hZ2VzOiBbXX07XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtdO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlSGlzdG9yeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvZ2dsZU1hcCA9IHRydWU7XG4gICAgICAgIHRoaXMudG9nZ2xlQ29tcGFyZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvZ2dsZUdhdWdlTWVhc3VyZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVSZW1vdmVDb21wYXJlRHVwbGljYXRlID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luID0gbmV3IERhdGUodGhpcy5zdG9yYWdlLmdldCgncmFhaW4tcGVyaW9kQmVnaW4nKSk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kID0gbmV3IERhdGUodGhpcy5zdG9yYWdlLmdldCgncmFhaW4tcGVyaW9kRW5kJykpO1xuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmcgPSBSYWFpbkRldGFpbHNDb21wb25lbnQuUGVyaW9kRGlzcGxheSh0aGlzLnBlcmlvZEJlZ2luKTtcbiAgICAgICAgdGhpcy5wZXJpb2RFbmRBc1N0cmluZyA9IFJhYWluRGV0YWlsc0NvbXBvbmVudC5QZXJpb2REaXNwbGF5KHRoaXMucGVyaW9kRW5kKTtcbiAgICAgICAgdGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nID1cbiAgICAgICAgICAgICcnICsgKHRoaXMucGVyaW9kRW5kLmdldFRpbWUoKSAtIHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpKSAvICg2MCAqIDYwMDAwKTtcblxuICAgICAgICB0aGlzLmRhdGVTaG93biA9IHRoaXMucGVyaW9kQmVnaW47XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1hbmFnZXI/LmNsZWFuQWxsKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXI/LmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdFJhaW4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRSYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMucHJvZmlsZVNlcnZpY2UuaXNBZG1pbigpO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmFpbk5vZGUgPSB0aGlzLnJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNvbXBhcmVNYW5hZ2VyLnJhaW5Ob2RlID0gdGhpcy5yYWluTm9kZTtcblxuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnNldE1ldGhvZHMoXG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaEluUHJvZ3Jlc3MuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMub25SZWZyZXNoRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdGhpcy5vbkZldGNoRG9uZS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5yYWluTm9kZS5nZXRDZW50ZXIoKTtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IG5ldyBNYXBMYXRMbmcoY2VudGVyLmxhdCwgY2VudGVyLmxuZyk7XG4gICAgICAgIHRoaXMudGVhbU5vZGUgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFRlYW0odGhpcy5yYWluTm9kZS5nZXRMaW5rKCd0ZWFtJykuZ2V0SWQoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVyaW9kQmVnaW4gJiYgdGhpcy5wZXJpb2RFbmQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucGVyaW9kID0ge2JlZ2luOiB0aGlzLnBlcmlvZEJlZ2luLCBlbmQ6IHRoaXMucGVyaW9kRW5kfTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdGhpcy50b2dnbGVBZG1pbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uUmVmcmVzaEluUHJvZ3Jlc3MoXG4gICAgICAgIGNvdW50UGVyaW9kczoge1xuICAgICAgICAgICAgcGVyY2VudEltYWdlcz86IFhZVHlwZVtdO1xuICAgICAgICAgICAgcXVldWVSdW5uaW5nPzogbnVtYmVyO1xuICAgICAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVmcmFtZURhdGVzOiBEYXRlW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHRoaXMuY291bnRzUGVyaW9kID0gY291bnRQZXJpb2RzO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gdGltZWZyYW1lRGF0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblJlZnJlc2hEb25lKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pIHtcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRpbWVmcmFtZURhdGVzO1xuICAgICAgICB0aGlzLnJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkZldGNoRG9uZSh0aW1lZnJhbWVDb250YWluZXJzPzogVGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICBpZiAodGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICAgICAgdGhpcy50aW1lZnJhbWVDb250YWluZXJzID0gdGltZWZyYW1lQ29udGFpbmVycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgfVxufVxuIiwiPCEtLSBNYWluIGNvbnRlbnQgY29udGFpbmVyIC0tPlxuPGRpdiAqbmdJZj1cInJhaW5Ob2RlXCIgY2xhc3M9XCJyYWFpbi1kZXRhaWxzLWNvbnRhaW5lclwiPlxuXG4gICAgPCEtLSBIZWFkZXIgc2VjdGlvbiB3aXRoIG5vZGUgaW5mb1xuICAgIDxpb24tY2FyZCBjbGFzcz1cIm5vZGUtaW5mby1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cIihyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwic3VjY2Vzc1wiIG5hbWU9XCJjaGVja21hcmstY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiIShyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwid2FybmluZ1wiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RlLXRpdGxlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+e3sgcmFpbk5vZGUubmFtZSB9fTwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5ieSB7eyB0ZWFtTm9kZT8ubmFtZSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPkhpc3Rvcnk8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgKGlvbkNoYW5nZSk9XCJvbkVuYWJsZUNvdW50SGlzdG9yeVRhYihyYWluTm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRvZ2dsZUhpc3RvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cbi0tPlxuXG4gICAgPCEtLSBQZXJpb2Qgc2VsZWN0aW9uIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwicGVyaW9kLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInNldFBlcmlvZE9mTm93KClcIiBjbGFzcz1cIm5vdy1idXR0b25cIiBmaWxsPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm93XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLXN0YXJ0IGlvbi1oaWRlLW1kLWRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+U3RhcnQ6PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvblBlcmlvZEJlZ2luQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwZXJpb2RCZWdpbkFzU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1kdXJhdGlvbiBpb24taGlkZS1tZC1kb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPkR1cmF0aW9uOjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3QgKGlvbkRpc21pc3MpPVwib25QZXJpb2REdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGVyaW9kRHVyYXRpb25Bc1N0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR1cmF0aW9uLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlcmlvZER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZT1cInBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIwLjI1XCI+MTUgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMC41XCI+MzAgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMVwiPjEgaG91cjwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMlwiPjIgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjNcIj4zIGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCI0XCI+NCBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiNVwiPjUgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjZcIj42IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gKm5nSWY9XCJpc0FkbWluXCIgdmFsdWU9XCIyNFwiPjI0IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImFsbC1kYXRlc1wiIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5BbGwgZGF0ZXM8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIChpb25DaGFuZ2UpPVwib25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbk5vZGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidG9nZ2xlSGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIaWRkZW4gbGFiZWwgZm9yIGNoYW5nZSBkZXRlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbi1sYWJlbFwiPnt7IG9uQ2hhbmdlRGV0ZWN0aW9uVGVzdChyYWluTm9kZSkgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEhpc3RvcmljYWwgbWFwIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlSGlzdG9yeVwiIGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWRhdGUtZHluYW1pYyAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5Db3VudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hEYXRhXT1cImZldGNoRGF0YVdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb3VudFBvaW50c1wiPlxuICAgICAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1keW5hbWljPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG5cbiAgICA8IS0tIE1hcCBzZWN0aW9uIC0tPlxuICAgIDxpb24tY2FyZCBjbGFzcz1cIm1hcC1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwibWFwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxpb24tZ3JpZD5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdyBpZD1cInByb2dyZXNzQW5kUmVmcmVzaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLW1kPVwiNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsZWZ0IGNvbnRlbnQgKGlmIGFueSkgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodFwiIHNpemU9XCIxMlwiIHNpemUtbWQ9XCI2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiaW9uLW1hcmdpbi1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRQZXJjZW50T2ZDb21wdXRhdGlvbnMoKSB9fSUgSW1hZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb3VudHNQZXJpb2QucHJvZ3Jlc3NcIiBjbGFzcz1cInByb2dyZXNzLWluZGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBQcm9ncmVzczoge3sgY291bnRzUGVyaW9kLnByb2dyZXNzIH19Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInJlZnJlc2hNYXAoKVwiIFtkaXNhYmxlZF09XCJyZWZyZXNoSW5Qcm9ncmVzc1wiIGNsYXNzPVwicmVmcmVzaC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZyZXNoIE1hcFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyBpbmRpY2F0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tcHJvZ3Jlc3MtYmFyICpuZ0lmPVwicmVmcmVzaEluUHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnVmZmVyXT1cIihjb3VudHNQZXJpb2QucHJvZ3Jlc3MgLyAoKHRpbWVmcmFtZURhdGVzPy5sZW5ndGggfHwgMTApICszKSkrMC4wMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb3VudHNQZXJpb2QucHJvZ3Jlc3MgLyAoKHRpbWVmcmFtZURhdGVzPy5sZW5ndGggfHwgMTApICszKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1wcm9ncmVzcy1iYXI+XG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDxpb24tcm93ICpuZ0lmPVwidG9nZ2xlTWFwICYmIGdldFBlcmNlbnRPZkltYWdlcygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTWFwIGNvbXBvbmVudCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJtYXAtY29sdW1uXCIgc2l6ZS1sZz1cIjdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXAtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJhYWluLW1hcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZWREYXRlKT1cIm9uRGF0ZUNoYW5nZUluTWFwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZWRTdW0pPVwib25TdW1DaGFuZ2VJbk1hcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZE1hcmtlcik9XCJvbkdhdWdlU2VsZWN0SW5NYXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29vcmRpbmF0ZXNdPVwiY29vcmRpbmF0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0RGF0ZV09XCJkYXRlU2hvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hcmtlcnNdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VzOiBjb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZXNJbkNvbXBhcmU6IGNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luQ29tcGFyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEdhdWdlczogY29tcGFyZU1hbmFnZXIuc2VsZWN0ZWRHYXVnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzOiBjb21wYXJlTWFuYWdlci5zZWxlY3RlZFBpeGVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNTb2x1dGlvbjogY29tcGFyZU1hbmFnZXIucGl4ZWxzU29sdXRpb25zPy5sZW5ndGggPyBjb21wYXJlTWFuYWdlci5waXhlbHNTb2x1dGlvbnNbMF0gOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHM6IGNvbXBhcmVNYW5hZ2VyLnNwZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0N1bXVsYXRpdmVdPVwidG9nZ2xlQ3VtdWxhdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VtRm5dPVwicmVmcmVzaE1hbmFnZXIuc3VtRm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1bVZhbHVlc109XCJyZWZyZXNoTWFuYWdlci5zdW1WYWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpbWVmcmFtZUNvbnRhaW5lcnNdPVwidGltZWZyYW1lQ29udGFpbmVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGltZWZyYW1lRGF0ZXNdPVwidGltZWZyYW1lRGF0ZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JhYWluLW1hcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRlY2huaWNhbCBkZXRhaWxzIChjb2xsYXBzaWJsZSBmb3IgY2xlYW5lciBVSSkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJ0ZWNobmljYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5JbWFnZSBEZXRhaWxzPC9zdW1tYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+Q29tcHV0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGUgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlZlcnNpb246PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwVmVyc2lvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkxhdW5jaGVkIGJ5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcExhdW5jaGVkQnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5UaW1lIHNwZW50Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcFRpbWVTcGVudEluTXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5EYXRlOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcERhdGU/LnRvSVNPU3RyaW5nKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB7eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5XYXRlciBpbiB0aGUgbWFwOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHN1bURldGFpbHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Tb3VyY2UgREJaIG1pbjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1pbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlNvdXJjZSBEQlogbWF4Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWF4IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRhIHBhbmVsIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImRhdGEtY29sdW1uXCIgc2l6ZS1sZz1cIjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb21wYXJlIHN0YWNrIGNvbXBvbmVudCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFyZS1zdGFja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFhaW4tY29tcGFyZS1zdGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFBvaW50KT1cIm9uR2F1Z2VTZWxlY3RJbkNvbXBhcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVNYW5hZ2VyXT1cImNvbXBhcmVNYW5hZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VtdWxhdGl2ZV09XCJ0b2dnbGVDdW11bGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmFhaW4tY29tcGFyZS1zdGFjaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVjaG5pY2FsIGRldGFpbHMgKGNvbGxhcHNpYmxlIGZvciBjbGVhbmVyIFVJKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscyBjbGFzcz1cInRlY2huaWNhbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdW1tYXJ5PkNvbXBhcmUgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3dhcm5pbmcnOiByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEb25lRGF0ZT8uZ2V0VGltZSgpID4gY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlEb25lRGF0ZT8uZ2V0VGltZSgpICsgNjAwMDB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Db21wdXRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jdXJyZW50UXVhbGl0eURvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmNvbXBhcmVWZXJzaW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+TGF1bmNoZWQgYnk6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5HYXVnZXM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5Db21wYXJlLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlBvaW50czo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5nbG9iYWxDb21wYXJlUG9pbnRzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCb3R0b20gcHJvZ3Jlc3MgYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXByb2dyZXNzLWJhciAqbmdJZj1cInJlZnJlc2hJblByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1ZmZlcl09XCIoY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMykpKzAuMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcHJvZ3Jlc3MtYmFyPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG4gICAgPCEtLSBHYXVnZSB2YWx1ZXMgc2VjdGlvbiAtLT5cbiAgICA8aW9uLWNhcmQgKm5nSWY9XCJnYXVnZVNlbGVjdGVkUG9pbnRzLmxlbmd0aCAmJiBnYXVnZVNlbGVjdGVkUG9pbnRzWzBdLnZhbHVlcy5sZW5ndGhcIiBjbGFzcz1cImdhdWdlLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFuYWx5dGljcy1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICBTZWxlY3RlZCBHYXVnZSBEYXRhXG4gICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8cmFhaW4tZGF0ZS1mb2N1c1xuICAgICAgICAgICAgICAgICAgICBbY3VycmVudEhlaWdodF09XCIzMDBcIlxuICAgICAgICAgICAgICAgICAgICBbZm9jdXNEYXRlXT1cInBlcmlvZEJlZ2luXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZvY3VzUmFuZ2VdPVwiRGF0ZVJhbmdlLkRBWVwiXG4gICAgICAgICAgICAgICAgICAgIFtwb2ludHNdPVwiZ2F1Z2VTZWxlY3RlZFBvaW50c1wiXG4gICAgICAgICAgICAgICAgICAgIFt3aXRob3V0QWxsXT1cInRydWVcIj5cbiAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1mb2N1cz5cbiAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgIDwvaW9uLWNhcmQ+XG5cbjwvZGl2PlxuIl19
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBQyxxQkFBcUIsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUEyQixvQkFBb0IsRUFBaUIsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7QUFVeEYsTUFBTSxPQUFPLHFCQUFxQjtJQXdEOUIsWUFBc0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUZuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBMEl6QyxnRUFBZ0U7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxFQUFFLFNBQWUsRUFBRSxVQUFxQixFQUFFLEVBQUU7WUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQTNJdUMsQ0FBQztJQUVsQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLEVBQUU7WUFDTixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUM7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QUFnQjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXN9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQcm9maWxlU2VydmljZX0gZnJvbSAnLi4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Q2FydGVzaWFuTWVhc3VyZVZhbHVlLCBSYWluTm9kZSwgVGVhbU5vZGV9IGZyb20gJ3JhYWluLW1vZGVsJztcbmltcG9ydCB7RGF0ZVJhbmdlLCBNYXBMYXRMbmcsIFRpbWVmcmFtZUNvbnRhaW5lcnN9IGZyb20gJ3JhYWluLXVpJztcbmltcG9ydCB7Q29tcGFyZU1hbmFnZXIsIEZyYW1lU2V0LCBtYXBEYXRlUmFuZ2VUb1N0cmluZywgUmVmcmVzaE1hbmFnZXJ9IGZyb20gJy4uL3Rvb2xzJztcbmltcG9ydCB7WFlUeXBlfSBmcm9tICcuLi94eXR5cGUnO1xuaW1wb3J0IHtSYWRhclNlcnZpY2V9IGZyb20gJy4uL3JhZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHtTdG9yYWdlfSBmcm9tICcuLi9zdG9yYWdlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3JhYWluLWRldGFpbHMnLFxuICAgIHRlbXBsYXRlVXJsOiAncmFhaW4tZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ3JhYWluLWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmFhaW5EZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRvZ2dsZUFkbWluOiBib29sZWFuO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJhaW5Ob2RlOiBSYWluTm9kZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb21wYXJlTWFuYWdlcjogQ29tcGFyZU1hbmFnZXI7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmVmcmVzaE1hbmFnZXI6IFJlZnJlc2hNYW5hZ2VyO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByYWRhclNlcnZpY2U6IFJhZGFyU2VydmljZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0b2dnbGVDdW11bGF0aXZlOiBib29sZWFuO1xuXG4gICAgcHVibGljIHBlcmlvZEJlZ2luOiBEYXRlO1xuICAgIHB1YmxpYyBwZXJpb2RFbmQ6IERhdGU7XG5cbiAgICAvLyBwdWJsaWMgVUkgdmFyaWFibGVzXG4gICAgcHVibGljIHRlYW1Ob2RlOiBUZWFtTm9kZTtcbiAgICBwdWJsaWMgcGVyaW9kQmVnaW5Bc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBwZXJpb2RFbmRBc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBwZXJpb2REdXJhdGlvbkFzU3RyaW5nOiBzdHJpbmc7XG4gICAgcHVibGljIGRhdGVTaG93bjogRGF0ZTtcbiAgICBwdWJsaWMgY29vcmRpbmF0ZXM6IE1hcExhdExuZztcbiAgICBwdWJsaWMgYm9yZGVyczogTWFwTGF0TG5nW107XG4gICAgcHVibGljIHRpbWVmcmFtZUNvbnRhaW5lcnM6IFRpbWVmcmFtZUNvbnRhaW5lcnM7XG4gICAgcHVibGljIGN1cnJlbnRUaW1lZnJhbWVUYXJnZXQ6IEZyYW1lU2V0O1xuICAgIHB1YmxpYyB0aW1lZnJhbWVEYXRlczogRGF0ZVtdO1xuICAgIHB1YmxpYyBjb3VudFBvaW50czoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICBzdHlsZTogc3RyaW5nO1xuICAgICAgICB2YWx1ZXM6IHtkYXRlOiBEYXRlOyB2YWx1ZTogbnVtYmVyfVtdO1xuICAgIH1bXTtcbiAgICBwdWJsaWMgY291bnRzUGVyaW9kOiB7XG4gICAgICAgIHBlcmNlbnRJbWFnZXM/OiBYWVR5cGVbXTtcbiAgICAgICAgcXVldWVSdW5uaW5nPzogbnVtYmVyO1xuICAgICAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICB9O1xuXG4gICAgcHVibGljIGdhdWdlU2VsZWN0ZWRQb2ludHM6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgc3R5bGU6IHN0cmluZztcbiAgICAgICAgdmFsdWVzOiB7ZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlcn1bXTtcbiAgICB9W107XG4gICAgcHVibGljIHRvZ2dsZUhpc3Rvcnk6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZU1hcDogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlQ29tcGFyZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlR2F1Z2VNZWFzdXJlczogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlUmVtb3ZlQ29tcGFyZUR1cGxpY2F0ZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVmcmVzaEluUHJvZ3Jlc3M6IGJvb2xlYW47XG4gICAgcHVibGljIHN1bURldGFpbHM6IHN0cmluZztcbiAgICBwdWJsaWMgaXNBZG1pbjogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgRGF0ZVJhbmdlID0gRGF0ZVJhbmdlO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN0b3JhZ2U6IFN0b3JhZ2UpIHt9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBQZXJpb2REaXNwbGF5KGRhdGU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICAgICAgY29uc3QgdXNlclRpbWV6b25lT2Zmc2V0ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XG4gICAgICAgICAgICBkID0gbmV3IERhdGUoZC5nZXRUaW1lKCkgLSB1c2VyVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4YW1wbGVGb3JtYXR0ZWREYXRlID0gJzIwMTctMDYtMDFUMDg6MzAnO1xuICAgICAgICByZXR1cm4gZC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCBleGFtcGxlRm9ybWF0dGVkRGF0ZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIERhdGVVVEMoZGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGhhc0lTT0Zvcm1hdCA9IGRhdGUubWF0Y2goL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHszfVokLyk7XG4gICAgICAgIGxldCBkID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIGlmICghaGFzSVNPRm9ybWF0KSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyVGltZXpvbmVPZmZzZXQgPSBkLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDtcbiAgICAgICAgICAgIGQgPSBuZXcgRGF0ZShkLmdldFRpbWUoKSAtIHVzZXJUaW1lem9uZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoRGF0YShmb2N1c0RhdGU6IERhdGUsIGZvY3VzUmFuZ2U6IERhdGVSYW5nZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh7ZGF0ZTogbmV3IERhdGUoMjAyMCArIGksIDApLCB2YWx1ZTogMTB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWtlRGF0YSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJyUgUmFpbnknLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBJbWFnZXMnLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gIHtcbiAgICAgICAgICAgIC8vICAgICAgbGFiZWw6ICclIFF1YWxpdHknLFxuICAgICAgICAgICAgLy8gICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgLy8gICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAvLyAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IG1hcERhdGVSYW5nZVRvU3RyaW5nKGZvY3VzUmFuZ2UpO1xuICAgICAgICBsZXQgZGF0YSA9IGZha2VEYXRhO1xuICAgICAgICBpZiAoIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvY3VzUmFuZ2UgPT09IERhdGVSYW5nZS5DRU5UVVJZKSB7XG4gICAgICAgICAgICAvLyBmYWtlXG4gICAgICAgIH0gZWxzZSBpZiAoZm9jdXNSYW5nZSA9PT0gRGF0ZVJhbmdlLkhPVVIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvdXJDb3VudHMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldENvdW50c0hvdXIodGhpcy5yYWluTm9kZS5pZCwge1xuICAgICAgICAgICAgICAgIHBlcmlvZEJlZ2luOiBmb2N1c0RhdGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmFpbnkgQ291bnQnLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucmFpbnlDb3VudC5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBJbWFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogaG91ckNvdW50cy5wZXJjZW50SW1hZ2VzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSYWlueSBTdW0nLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucmFpbnlTdW0ubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZldGNoRGF0YSBUT0RPOicsIGZvY3VzRGF0ZS50b0lTT1N0cmluZygpLCByYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBjb3VudHMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldENvdW50cyh0aGlzLnJhaW5Ob2RlLmlkLCB7XG4gICAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgICAgcGVyaW9kQmVnaW46IGZvY3VzRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclIFJhaW55JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNvdW50cy5wZXJjZW50UmFpbnkubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNvdW50cy5wZXJjZW50SW1hZ2VzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICBsYWJlbDogJyUgUXVhbGl0eScsXG4gICAgICAgICAgICAgICAgLy8gICAgICBzdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgICAgIC8vICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudFEubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coYGZldGNoRGF0YSBET05FICR7cmFuZ2V9YCwgZGF0YSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8vIFdyYXBwZXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgdGhlIGFzeW5jIG5hdHVyZSBvZiBmZXRjaERhdGFcbiAgICBwdWJsaWMgZmV0Y2hEYXRhV3JhcHBlciA9IGFzeW5jIChmb2N1c0RhdGU6IERhdGUsIGZvY3VzUmFuZ2U6IERhdGVSYW5nZSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaERhdGEoZm9jdXNEYXRlLCBmb2N1c1JhbmdlKTtcbiAgICB9O1xuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGFuZ2UoY2hhbmdlcykudGhlbigoaWdub3JlZCkgPT4ge30pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbjogUmFpbk5vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRvZ2dsZUhpc3RvcnkpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRQb2ludHMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uUGVyaW9kQmVnaW5DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGV2ZW50Py50YXJnZXQ/LnZhbHVlID8/IHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZztcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbiA9IG5ldyBEYXRlKG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JhYWluLXBlcmlvZEJlZ2luJywgdGhpcy5wZXJpb2RCZWdpbik7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZER1cmF0aW9uQ2hhbmdlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBhc3luYyBvblBlcmlvZER1cmF0aW9uQ2hhbmdlKF9ldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25JbkhvdXIgPSBwYXJzZUZsb2F0KHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kID0gbmV3IERhdGUodGhpcy5wZXJpb2RCZWdpbi5nZXRUaW1lKCkgKyBkdXJhdGlvbkluSG91ciAqICg2MCAqIDYwMDAwKSk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kQXNTdHJpbmcgPSB0aGlzLnBlcmlvZEVuZC50b0lTT1N0cmluZygpO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdyYWFpbi1wZXJpb2RFbmQnLCB0aGlzLnBlcmlvZEVuZCk7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JhYWluLXBlcmlvZER1cmF0aW9uSW5Ib3VycycsIGR1cmF0aW9uSW5Ib3VyKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5wZXJpb2QgPSB7YmVnaW46IHRoaXMucGVyaW9kQmVnaW4sIGVuZDogdGhpcy5wZXJpb2RFbmR9O1xuICAgIH1cblxuICAgIGFzeW5jIG9uRGF0ZUNoYW5nZUluQ291bnQoZGF0ZUNoYW5nZWQ6IERhdGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uRGF0ZUNoYW5nZUluQ291bnQnLCBkYXRlQ2hhbmdlZCk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9XG4gICAgICAgICAgICBkYXRlQ2hhbmdlZC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMSkgK1xuICAgICAgICAgICAgZGF0ZUNoYW5nZWQudG9Mb2NhbGVUaW1lU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDUpO1xuICAgICAgICB0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcgPSAnMSc7XG4gICAgICAgIGF3YWl0IHRoaXMub25QZXJpb2RCZWdpbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5yZWZyZXNoKGZhbHNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkRhdGVDaGFuZ2VJbk1hcChkYXRlU2hvd246IERhdGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uRGF0ZUNoYW5nZUluTWFwJywgZGF0ZVNob3duKTtcbiAgICAgICAgdGhpcy5kYXRlU2hvd24gPSBkYXRlU2hvd247XG4gICAgICAgIGNvbnN0IGN1bXVsYXRpdmVIb3VyczogbnVtYmVyID0gIXRoaXMudG9nZ2xlQ3VtdWxhdGl2ZVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHBhcnNlRmxvYXQodGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTWFuYWdlci5mZXRjaCh0aGlzLmRhdGVTaG93biwgdGhpcy50b2dnbGVHYXVnZU1lYXN1cmVzLCBjdW11bGF0aXZlSG91cnMpO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWVUYXJnZXQgPSB0aGlzLnJlZnJlc2hNYW5hZ2VyLmdldFRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLnNldFJlcG9ydFBlcmlvZCh0aGlzLmRhdGVTaG93bik7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdW1DaGFuZ2VJbk1hcChzdW06IHN0cmluZykge1xuICAgICAgICB0aGlzLnN1bURldGFpbHMgPSBzdW07XG4gICAgfVxuXG4gICAgYXN5bmMgb25HYXVnZVNlbGVjdEluTWFwKG1hcExhdExuZzogTWFwTGF0TG5nKSB7XG4gICAgICAgIGNvbnN0IGdhdWdlc0ZpbHRlcmVkID0gdGhpcy5jb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcC5maWx0ZXIoXG4gICAgICAgICAgICAoZykgPT4gZy5sYXQgPT09IG1hcExhdExuZy5sYXQgJiYgZy5sbmcgPT09IG1hcExhdExuZy5sbmdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdhdWdlc0ZpbHRlcmVkLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdhdWdlU2VsZWN0ZWQgPSBnYXVnZXNGaWx0ZXJlZFswXTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHYXVnZVZhbHVlcyh7aWQ6IGdhdWdlU2VsZWN0ZWQuaWQsIG5hbWU6IGdhdWdlU2VsZWN0ZWQubmFtZX0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIuc2VsZWN0R2F1Z2UoZ2F1Z2VTZWxlY3RlZC5pZCwgMCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaEdhdWdlVmFsdWVzKGdhdWdlU2VsZWN0ZWQ6IHtpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IGRheUJlZ2luID0gbmV3IERhdGUodGhpcy5wZXJpb2RCZWdpbi50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCkpO1xuICAgICAgICBjb25zdCBkYXlFbmQgPSBuZXcgRGF0ZShkYXlCZWdpbi5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIC0gMSk7XG4gICAgICAgIGNvbnN0IGdhdWdlTWVhc3VyZXMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEdhdWdlTWVhc3VyZXMoXG4gICAgICAgICAgICBnYXVnZVNlbGVjdGVkLmlkLFxuICAgICAgICAgICAgZGF5QmVnaW4sXG4gICAgICAgICAgICBkYXlFbmRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZ2F1Z2VWYWx1ZXM6IHtkYXRlOiBEYXRlOyB2YWx1ZTogbnVtYmVyfVtdID0gZ2F1Z2VNZWFzdXJlcy5tYXAoKGdtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUgPSBuZXcgQ2FydGVzaWFuTWVhc3VyZVZhbHVlKGdtLnZhbHVlc1swXSBhcyBhbnkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUuZ2V0Q2FydGVzaWFuVmFsdWVzKClbMF0udmFsdWU7XG4gICAgICAgICAgICByZXR1cm4ge2RhdGU6IGdtLmRhdGUsIHZhbHVlfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogZ2F1Z2VTZWxlY3RlZC5uYW1lLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGdhdWdlVmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50czonLCB0aGlzLmdhdWdlU2VsZWN0ZWRQb2ludHMpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uR2F1Z2VTZWxlY3RJbkNvbXBhcmUoZToge3BvaW50OiBYWVR5cGU7IGNvbXBhcmVJbmRleDogbnVtYmVyfSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHYXVnZVZhbHVlcyh7aWQ6IGUucG9pbnQuaWQsIG5hbWU6IGUucG9pbnQubmFtZX0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIuc2VsZWN0R2F1Z2UoZS5wb2ludC5pZCwgZS5jb21wYXJlSW5kZXgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uVG9nZ2xlTWFwKCRldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMudG9nZ2xlTWFwKSB7XG4gICAgICAgIC8vICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hcCgpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2VEZXRlY3Rpb25UZXN0KHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICAvLyBUT0RPIGNvbnNvbGUubG9nKFRFU1RfREVURUNUSU9OKyssICdvbkNoYW5nZURldGVjdGlvblRlc3QnKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hNYXAoKSB7XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtdO1xuICAgICAgICAvLyB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHMgPSB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHM/Lmxlbmd0aCA+IDAgP1xuICAgICAgICAvLyAgdGhpcy5xdWFsaXR5Q29uZi50cnVzdGZ1bEdhdWdlSWRzIDogdGhpcy5nYXVnZXNUb0ZpbHRlci5maWx0ZXIoZyA9PiBnLmlzSW4pLm1hcChnID0+IGcuaWQpO1xuICAgICAgICB0aGlzLmJvcmRlcnMgPSBbXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSAtIDI1MCAqIDAuMDA4LCByYWluTm9kZS5sb25naXR1ZGUpLFxuICAgICAgICAgICAgLy8gIG5ldyBNYXBMYXRMbmcocmFpbk5vZGUubGF0aXR1ZGUsIHJhaW5Ob2RlLmxvbmdpdHVkZSAtIDI1MCAqIDAuMDEzKSxcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlLCByYWluTm9kZS5sb25naXR1ZGUgKyAyNTAgKiAwLjAxMyksXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSArIDI1MCAqIDAuMDA4LCByYWluTm9kZS5sb25naXR1ZGUpLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1hbmFnZXIuY2xlYW5BbGwoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZXRHYXVnZXNJbk1hcCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRoaXMudG9nZ2xlQWRtaW4pLnRoZW4oKF9pZ25vcmVkKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0UGVyaW9kT2ZOb3coKSB7XG4gICAgICAgIC8vIHNob3VsZCBsb29rIGxpa2U6IFwiMjAyNC0wOC0yNlQxMjoxM1wiXG4gICAgICAgIGNvbnN0IGxhc3QzMG1uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGFzdDMwbW4uc2V0TWludXRlcyhsYXN0MzBtbi5nZXRNaW51dGVzKCkgLSAzMCk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9XG4gICAgICAgICAgICBsYXN0MzBtbi50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMSkgKyBsYXN0MzBtbi50b0xvY2FsZVRpbWVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9ICcxJztcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZEJlZ2luQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIGdldFBlcmNlbnRPZkltYWdlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50c1BlcmlvZC5wZXJjZW50SW1hZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyaW5nUGVyaW9kID0gdGhpcy5jb3VudHNQZXJpb2QucGVyY2VudEltYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSA8PSBuZXcgRGF0ZShhLm5hbWUpLmdldFRpbWUoKSAmJlxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKGEubmFtZSkuZ2V0VGltZSgpIDw9IHRoaXMucGVyaW9kRW5kLmdldFRpbWUoKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdW1tZWQgPSBkdXJpbmdQZXJpb2QucmVkdWNlKChhLCBiKSA9PiBhICsgKGIueCA/PyAwKSwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHN1bW1lZCAvIGR1cmluZ1BlcmlvZC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgY29uc3QgdGltZWxpbmUgPSB0aGlzLnJlZnJlc2hNYW5hZ2VyLmdldFRpbWVsaW5lRnJhbWVTZXQoKTtcbiAgICAgICAgaWYgKCF0aW1lbGluZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVsaW5lV2l0aENvbXB1dGF0aW9uID0gdGltZWxpbmUuZmlsdGVyKChhKSA9PiAhIWEucmFpbkNvbXB1dGF0aW9uSWQpO1xuICAgICAgICBjb25zdCByYXRpbyA9IHRpbWVsaW5lV2l0aENvbXB1dGF0aW9uLmxlbmd0aCAvIHRpbWVsaW5lLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocmF0aW8gKiAxMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5BbGwoKSB7XG4gICAgICAgIHRoaXMuYm9yZGVycyA9IFtdO1xuXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZUNvbnRhaW5lcnMgPSBuZXcgVGltZWZyYW1lQ29udGFpbmVycyhbXSk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudFBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IHtwcm9ncmVzczogMCwgcXVldWVSdW5uaW5nOiAwLCBwZXJjZW50SW1hZ2VzOiBbXX07XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtdO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlSGlzdG9yeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvZ2dsZU1hcCA9IHRydWU7XG4gICAgICAgIHRoaXMudG9nZ2xlQ29tcGFyZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvZ2dsZUdhdWdlTWVhc3VyZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVSZW1vdmVDb21wYXJlRHVwbGljYXRlID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luID0gbmV3IERhdGUodGhpcy5zdG9yYWdlLmdldCgncmFhaW4tcGVyaW9kQmVnaW4nKSk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kID0gbmV3IERhdGUodGhpcy5zdG9yYWdlLmdldCgncmFhaW4tcGVyaW9kRW5kJykpO1xuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmcgPSBSYWFpbkRldGFpbHNDb21wb25lbnQuUGVyaW9kRGlzcGxheSh0aGlzLnBlcmlvZEJlZ2luKTtcbiAgICAgICAgdGhpcy5wZXJpb2RFbmRBc1N0cmluZyA9IFJhYWluRGV0YWlsc0NvbXBvbmVudC5QZXJpb2REaXNwbGF5KHRoaXMucGVyaW9kRW5kKTtcbiAgICAgICAgdGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nID1cbiAgICAgICAgICAgICcnICsgKHRoaXMucGVyaW9kRW5kLmdldFRpbWUoKSAtIHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpKSAvICg2MCAqIDYwMDAwKTtcblxuICAgICAgICB0aGlzLmRhdGVTaG93biA9IHRoaXMucGVyaW9kQmVnaW47XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1hbmFnZXI/LmNsZWFuQWxsKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXI/LmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdFJhaW4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRSYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMucHJvZmlsZVNlcnZpY2UuaXNBZG1pbigpO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmFpbk5vZGUgPSB0aGlzLnJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNvbXBhcmVNYW5hZ2VyLnJhaW5Ob2RlID0gdGhpcy5yYWluTm9kZTtcblxuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnNldE1ldGhvZHMoXG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaEluUHJvZ3Jlc3MuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMub25SZWZyZXNoRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdGhpcy5vbkZldGNoRG9uZS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5yYWluTm9kZS5nZXRDZW50ZXIoKTtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IG5ldyBNYXBMYXRMbmcoY2VudGVyLmxhdCwgY2VudGVyLmxuZyk7XG4gICAgICAgIHRoaXMudGVhbU5vZGUgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFRlYW0odGhpcy5yYWluTm9kZS5nZXRMaW5rKCd0ZWFtJykuZ2V0SWQoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVyaW9kQmVnaW4gJiYgdGhpcy5wZXJpb2RFbmQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucGVyaW9kID0ge2JlZ2luOiB0aGlzLnBlcmlvZEJlZ2luLCBlbmQ6IHRoaXMucGVyaW9kRW5kfTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdGhpcy50b2dnbGVBZG1pbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uUmVmcmVzaEluUHJvZ3Jlc3MoXG4gICAgICAgIGNvdW50UGVyaW9kczoge1xuICAgICAgICAgICAgcGVyY2VudEltYWdlcz86IFhZVHlwZVtdO1xuICAgICAgICAgICAgcXVldWVSdW5uaW5nPzogbnVtYmVyO1xuICAgICAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVmcmFtZURhdGVzOiBEYXRlW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHRoaXMuY291bnRzUGVyaW9kID0gY291bnRQZXJpb2RzO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gdGltZWZyYW1lRGF0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblJlZnJlc2hEb25lKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pIHtcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRpbWVmcmFtZURhdGVzO1xuICAgICAgICB0aGlzLnJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkZldGNoRG9uZSh0aW1lZnJhbWVDb250YWluZXJzPzogVGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICBpZiAodGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICAgICAgdGhpcy50aW1lZnJhbWVDb250YWluZXJzID0gdGltZWZyYW1lQ29udGFpbmVycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgfVxufVxuIiwiPCEtLSBNYWluIGNvbnRlbnQgY29udGFpbmVyIC0tPlxuPGRpdiAqbmdJZj1cInJhaW5Ob2RlXCIgY2xhc3M9XCJyYWFpbi1kZXRhaWxzLWNvbnRhaW5lclwiPlxuXG4gICAgPCEtLSBQZXJpb2Qgc2VsZWN0aW9uIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwicGVyaW9kLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInNldFBlcmlvZE9mTm93KClcIiBjbGFzcz1cIm5vdy1idXR0b25cIiBmaWxsPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm93XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLXN0YXJ0IGlvbi1oaWRlLW1kLWRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+U3RhcnQ6PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvblBlcmlvZEJlZ2luQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwZXJpb2RCZWdpbkFzU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1kdXJhdGlvbiBpb24taGlkZS1tZC1kb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPkR1cmF0aW9uOjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3QgKGlvbkRpc21pc3MpPVwib25QZXJpb2REdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGVyaW9kRHVyYXRpb25Bc1N0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR1cmF0aW9uLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlcmlvZER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZT1cInBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIwLjI1XCI+MTUgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMC41XCI+MzAgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMVwiPjEgaG91cjwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMlwiPjIgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjNcIj4zIGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCI0XCI+NCBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiNVwiPjUgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjZcIj42IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gKm5nSWY9XCJpc0FkbWluXCIgdmFsdWU9XCIyNFwiPjI0IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImFsbC1kYXRlc1wiIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5BbGwgZGF0ZXM8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIChpb25DaGFuZ2UpPVwib25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbk5vZGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidG9nZ2xlSGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIaWRkZW4gbGFiZWwgZm9yIGNoYW5nZSBkZXRlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbi1sYWJlbFwiPnt7IG9uQ2hhbmdlRGV0ZWN0aW9uVGVzdChyYWluTm9kZSkgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEhpc3RvcmljYWwgbWFwIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlSGlzdG9yeVwiIGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWRhdGUtZHluYW1pYyAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5Db3VudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hEYXRhXT1cImZldGNoRGF0YVdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb3VudFBvaW50c1wiPlxuICAgICAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1keW5hbWljPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG4gICAgPCEtLSBNYXAgc2VjdGlvbiAtLT5cbiAgICA8aW9uLWNhcmQgY2xhc3M9XCJtYXAtY2FyZFwiPlxuICAgICAgICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cIm1hcC1jb250ZW50XCI+XG4gICAgICAgICAgICA8aW9uLWdyaWQ+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3cgaWQ9XCJwcm9ncmVzc0FuZFJlZnJlc2hcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1tZD1cIjZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGVmdCBjb250ZW50IChpZiBhbnkpIC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHRcIiBzaXplPVwiMTJcIiBzaXplLW1kPVwiNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImlvbi1tYXJnaW4tZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkgfX0lIEltYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY291bnRzUGVyaW9kLnByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gUHJvZ3Jlc3M6IHt7IGNvdW50c1BlcmlvZC5wcm9ncmVzcyB9fS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFnZXRQZXJjZW50T2ZDb21wdXRhdGlvbnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGltYWdlIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJyZWZyZXNoTWFwKClcIiBbZGlzYWJsZWRdPVwicmVmcmVzaEluUHJvZ3Jlc3NcIiBjbGFzcz1cInJlZnJlc2gtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaCBNYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXByb2dyZXNzLWJhciAqbmdJZj1cInJlZnJlc2hJblByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1ZmZlcl09XCIoY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMykpKzAuMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcHJvZ3Jlc3MtYmFyPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdyAqbmdJZj1cInRvZ2dsZU1hcCAmJiBnZXRQZXJjZW50T2ZJbWFnZXMoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1hcCBjb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwibWFwLWNvbHVtblwiIHNpemUtbGc9XCI3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFwLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyYWFpbi1tYXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VkRGF0ZSk9XCJvbkRhdGVDaGFuZ2VJbk1hcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VkU3VtKT1cIm9uU3VtQ2hhbmdlSW5NYXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRNYXJrZXIpPVwib25HYXVnZVNlbGVjdEluTWFwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nvb3JkaW5hdGVzXT1cImNvb3JkaW5hdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdERhdGVdPVwiZGF0ZVNob3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXJrZXJzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlczogY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5NYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VzSW5Db21wYXJlOiBjb21wYXJlTWFuYWdlci5nYXVnZXNJbkNvbXBhcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHYXVnZXM6IGNvbXBhcmVNYW5hZ2VyLnNlbGVjdGVkR2F1Z2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsczogY29tcGFyZU1hbmFnZXIuc2VsZWN0ZWRQaXhlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzU29sdXRpb246IGNvbXBhcmVNYW5hZ2VyLnBpeGVsc1NvbHV0aW9ucz8ubGVuZ3RoID8gY29tcGFyZU1hbmFnZXIucGl4ZWxzU29sdXRpb25zWzBdIDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRzOiBjb21wYXJlTWFuYWdlci5zcGVlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDdW11bGF0aXZlXT1cInRvZ2dsZUN1bXVsYXRpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1bUZuXT1cInJlZnJlc2hNYW5hZ2VyLnN1bUZuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdW1WYWx1ZXNdPVwicmVmcmVzaE1hbmFnZXIuc3VtVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lZnJhbWVDb250YWluZXJzXT1cInRpbWVmcmFtZUNvbnRhaW5lcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpbWVmcmFtZURhdGVzXT1cInRpbWVmcmFtZURhdGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yYWFpbi1tYXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZWNobmljYWwgZGV0YWlscyAoY29sbGFwc2libGUgZm9yIGNsZWFuZXIgVUkpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPVwidGVjaG5pY2FsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+SW1hZ2UgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkNvbXB1dGVkOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcERvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5MYXVuY2hlZCBieTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+RGF0ZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlPy50b0lTT1N0cmluZygpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwge3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+V2F0ZXIgaW4gdGhlIG1hcDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBzdW1EZXRhaWxzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+U291cmNlIERCWiBtaW46PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwT3JpZ2luYWxNaW4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Tb3VyY2UgREJaIG1heDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1heCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0YSBwYW5lbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJkYXRhLWNvbHVtblwiIHNpemUtbGc9XCI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1wYW5lbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29tcGFyZSBzdGFjayBjb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmUtc3RhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJhYWluLWNvbXBhcmUtc3RhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRQb2ludCk9XCJvbkdhdWdlU2VsZWN0SW5Db21wYXJlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wYXJlTWFuYWdlcl09XCJjb21wYXJlTWFuYWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1bXVsYXRpdmVdPVwidG9nZ2xlQ3VtdWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JhYWluLWNvbXBhcmUtc3RhY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRlY2huaWNhbCBkZXRhaWxzIChjb2xsYXBzaWJsZSBmb3IgY2xlYW5lciBVSSkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJ0ZWNobmljYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5Db21wYXJlIERldGFpbHM8L3N1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3YXJuaW5nJzogcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGU/LmdldFRpbWUoKSA+IGNvbXBhcmVNYW5hZ2VyLmN1cnJlbnRRdWFsaXR5RG9uZURhdGU/LmdldFRpbWUoKSArIDYwMDAwfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+Q29tcHV0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlEb25lRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VmVyc2lvbjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jb21wYXJlVmVyc2lvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkxhdW5jaGVkIGJ5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlRpbWUgc3BlbnQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+R2F1Z2VzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luQ29tcGFyZS5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Qb2ludHM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50cy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIHByb2dyZXNzIGJhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgKm5nSWY9XCJyZWZyZXNoSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJdPVwiKGNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpKSswLjAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXByb2dyZXNzLWJhcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICA8L2lvbi1ncmlkPlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cblxuICAgIDwhLS0gR2F1Z2UgdmFsdWVzIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkICpuZ0lmPVwiZ2F1Z2VTZWxlY3RlZFBvaW50cy5sZW5ndGggJiYgZ2F1Z2VTZWxlY3RlZFBvaW50c1swXS52YWx1ZXMubGVuZ3RoXCIgY2xhc3M9XCJnYXVnZS1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhbmFseXRpY3Mtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgU2VsZWN0ZWQgR2F1Z2UgRGF0YVxuICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPHJhYWluLWRhdGUtZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZvY3VzRGF0ZV09XCJwZXJpb2RCZWdpblwiXG4gICAgICAgICAgICAgICAgICAgIFtmb2N1c1JhbmdlXT1cIkRhdGVSYW5nZS5EQVlcIlxuICAgICAgICAgICAgICAgICAgICBbcG9pbnRzXT1cImdhdWdlU2VsZWN0ZWRQb2ludHNcIlxuICAgICAgICAgICAgICAgICAgICBbd2l0aG91dEFsbF09XCJ0cnVlXCI+XG4gICAgICAgICAgICA8L3JhYWluLWRhdGUtZm9jdXM+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG48L2Rpdj5cbiJdfQ==
|