tango-app-ui-ai-audio 3.0.41 → 3.0.43
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.
|
@@ -7,11 +7,10 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
import * as i1 from "../../services/audio.service";
|
|
8
8
|
import * as i2 from "@angular/router";
|
|
9
9
|
import * as i3 from "tango-app-ui-global";
|
|
10
|
-
import * as i4 from "tango-app-shared";
|
|
10
|
+
import * as i4 from "tango-app-ui-shared";
|
|
11
11
|
import * as i5 from "@angular/common";
|
|
12
12
|
import * as i6 from "@angular/forms";
|
|
13
|
-
import * as i7 from "
|
|
14
|
-
import * as i8 from "ngx-daterangepicker-material";
|
|
13
|
+
import * as i7 from "ngx-daterangepicker-material";
|
|
15
14
|
export class TangoEchoComponent {
|
|
16
15
|
audioService;
|
|
17
16
|
route;
|
|
@@ -167,7 +166,15 @@ export class TangoEchoComponent {
|
|
|
167
166
|
// ── Cohort Dropdown ─────────────────────────────────
|
|
168
167
|
cohortDropdownOpen = false;
|
|
169
168
|
cohortDropdownSearch = '';
|
|
169
|
+
// True while any cohort-related fetch is in flight. Used to disable the
|
|
170
|
+
// cohort dropdown so users can't switch to another option mid-load (which
|
|
171
|
+
// would queue overlapping requests and produce inconsistent state).
|
|
172
|
+
get isCohortLoading() {
|
|
173
|
+
return this.cardsLoading || this.detailLoading || this.isLoadingCohortSummary;
|
|
174
|
+
}
|
|
170
175
|
toggleCohortDropdown() {
|
|
176
|
+
if (this.isCohortLoading)
|
|
177
|
+
return;
|
|
171
178
|
this.cohortDropdownOpen = !this.cohortDropdownOpen;
|
|
172
179
|
if (this.cohortDropdownOpen) {
|
|
173
180
|
this.cohortDropdownSearch = '';
|
|
@@ -178,6 +185,8 @@ export class TangoEchoComponent {
|
|
|
178
185
|
this.cohortDropdownSearch = '';
|
|
179
186
|
}
|
|
180
187
|
selectCohortFromDropdown(cohort) {
|
|
188
|
+
if (this.isCohortLoading)
|
|
189
|
+
return;
|
|
181
190
|
const id = cohort.cohortId || cohort.id || cohort._id || '';
|
|
182
191
|
this.cohortDropdownOpen = false;
|
|
183
192
|
this.cohortDropdownSearch = '';
|
|
@@ -1900,11 +1909,11 @@ export class TangoEchoComponent {
|
|
|
1900
1909
|
return -offset;
|
|
1901
1910
|
}
|
|
1902
1911
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoEchoComponent, deps: [{ token: i1.AudioService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i4.AuthService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1903
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TangoEchoComponent, selector: "lib-tango-echo", host: { listeners: { "document:click": "onDocumentClickEchoFilter($event)" }, properties: { "class.echo-overall-transcripts-host": "this.hasOverallTranscriptsHostClass" } }, ngImport: i0, template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No conversations found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ cohortList.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ displayName(selectedCohortName) }}</span>\n <span class=\"flex-spacer\"></span>\n\n <!-- Audio Source filter (Overall Transcripts only) -->\n <div *ngIf=\"isOverallTranscriptsCohort && audioSourceOptions.length\" class=\"agent-dropdown-wrap me-3\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleAudioSourceDropdown()\">\n <span class=\"cohort-dd-trigger-name\">{{ selectedAudioSourceLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"audioSourceDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"audioSourceDropdownOpen\">\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let opt of audioSourceOptions\"\n class=\"agent-dd-item\"\n [class.selected]=\"opt.value === selectedAudioSource\"\n (click)=\"selectAudioSource(opt)\">\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ opt.label }}</div>\n </div>\n <svg *ngIf=\"opt.value === selectedAudioSource\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"audioSourceDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeAudioSourceDropdown()\"></div>\n </div>\n\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ displayName(selectedCohortName) || 'Select Agent' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ displayName(c.cohortName || c.name) }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE' || card.type === 'BOOLEAN_BASKET_CHART' || (card.type === 'BOOLEAN_BASKET' && card.isFunnel)\"\n [class.metric-card-dynamic--full]=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ displayName(card.name) }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <button type=\"button\" class=\"metric-export-btn\"\n *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\"\n title=\"Export to Excel\"\n (click)=\"exportBbtCard(card)\"><span>Export</span> \n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>\n </button>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\"\n (click)=\"onCategoryAnalysisClick(row, chip, $event)\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\" (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-stack-list\">\n <div *ngFor=\"let bar of card.selectedStackedBars\" class=\"bbc-stack-row\">\n <div class=\"bbc-stack-label\">{{ bar.label }}</div>\n <div class=\"bbc-stack-track\" [class.bbc-stack-track--empty]=\"bar.total === 0\">\n <div *ngFor=\"let seg of bar.segments\"\n class=\"bbc-stack-seg\"\n [style.width.%]=\"seg.percent\"\n [style.background]=\"seg.color\">\n <span *ngIf=\"seg.percent >= 10\" class=\"bbc-stack-seg-text\">{{ seg.percent }}%</span>\n <div class=\"bbc-stack-tooltip\">\n <div class=\"bbc-stack-tooltip-title\">{{ bar.label }} \u00B7 {{ seg.label }}</div>\n <div class=\"bbc-stack-tooltip-body\">{{ seg.count }} ({{ seg.percent }}%)</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bbc-stack-axis\">\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n <div class=\"bbc-legend-grid\">\n <div *ngFor=\"let item of card.selectedLegend\" class=\"bbc-legend-item\">\n <span class=\"bbc-legend-swatch\" [style.background]=\"item.color\"></span>\n <span class=\"bbc-legend-text\">{{ item.label }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_SEPORATOR \u2014 two list panels (content tags + measurements) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <div class=\"bbs-grid\">\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">Categories</div>\n <div class=\"bbs-panel-sub\">{{ card.tagRows?.length || 0 }} items</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.tagRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.tagRows?.length\">No data</div>\n </div>\n </div>\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">{{ card.measureTitle }}</div>\n <div class=\"bbs-panel-sub\">{{ card.measureSubtitle }}</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.measureRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.measureRows?.length\">No data</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n <span class=\"flex-spacer\"></span>\n <div class=\"detail-conv-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\"\n class=\"detail-conv-search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"detailSearchValue\"\n (keyup.enter)=\"onDetailSearch()\">\n <button type=\"button\"\n class=\"detail-conv-search-clear\"\n *ngIf=\"detailSearchValue\"\n (click)=\"clearDetailSearch()\"\n title=\"Clear\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <!-- Inline date + Filter button (Overall Transcripts only) -->\n <ng-container *ngIf=\"isViewOverallTranscripts\">\n <div class=\"echo-inline-date\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <input type=\"text\"\n class=\"echo-inline-date-input\"\n ngxDaterangepickerMd\n [drops]=\"'down'\"\n [opens]=\"'left'\"\n [ranges]=\"echoDateRanges\"\n [showCustomRangeLabel]=\"true\"\n [autoApply]=\"true\"\n [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\"\n [showCancel]=\"true\"\n [readonly]=\"true\"\n autocomplete=\"off\"\n [(ngModel)]=\"echoDateRange\"\n (datesUpdated)=\"onEchoDateChange($event)\"\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\n name=\"echoDaterange\" />\n </div>\n <div class=\"echo-filter-wrap\">\n <button type=\"button\" class=\"echo-filter-btn\" (click)=\"echoFilterOpen ? closeEchoFilter() : openEchoFilter()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Filter</span>\n </button>\n\n <!-- Popup -->\n <div class=\"echo-filter-popup\" *ngIf=\"echoFilterOpen\" (click)=\"$event.stopPropagation()\">\n <div class=\"efp-head\">\n <span class=\"efp-title\">Filter by</span>\n <div class=\"efp-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\" class=\"efp-search-input\" [placeholder]=\"echoFilterTab === 'stores' ? 'Search Stores' : 'Search'\" [(ngModel)]=\"echoFilterSearch\" (ngModelChange)=\"onEchoFilterSearchChange()\" />\n </div>\n </div>\n\n <div class=\"efp-body\">\n <ul class=\"efp-tabs\">\n <li [class.active]=\"echoFilterTab === 'status'\" (click)=\"setEchoFilterTab('status')\">\n <span>Status</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterStatusCount\">{{ echoFilterStatusCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'country'\" (click)=\"setEchoFilterTab('country')\">\n <span>Country</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterCountryCount\">{{ echoFilterCountryCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'region'\" (click)=\"setEchoFilterTab('region')\">\n <span>Region</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterRegionCount\">{{ echoFilterRegionCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'clusters'\" (click)=\"setEchoFilterTab('clusters')\">\n <span>Clusters</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterClusterCount\">{{ echoFilterClusterCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'stores'\" (click)=\"setEchoFilterTab('stores')\">\n <span>Stores</span><span class=\"efp-tab-count\">{{ echoFilterStoreCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'downtime'\" (click)=\"setEchoFilterTab('downtime')\">\n <span>Downtime (In Mins)</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterDowntimeCount\">{{ echoFilterDowntimeCount }}</span>\n </li>\n </ul>\n\n <div class=\"efp-pane\">\n <div class=\"form-check efp-row efp-row-all\" *ngIf=\"echoFilterVisibleRows.length > 0\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"efp-select-all\"\n [checked]=\"echoFilterAllSelected\"\n (change)=\"echoFilterToggleAll($any($event.target).checked)\" />\n <label class=\"form-check-label\" for=\"efp-select-all\">Select All</label>\n </div>\n <div class=\"form-check efp-row\" *ngFor=\"let r of echoFilterVisibleRows; trackBy: trackEchoFilterRow\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\n [id]=\"'efp-row-' + r.id\"\n [(ngModel)]=\"r.ref.checked\"\n (ngModelChange)=\"onEchoFilterRowChange()\" />\n <label class=\"form-check-label\" [for]=\"'efp-row-' + r.id\">{{ r.label }}</label>\n </div>\n <div class=\"efp-empty\" *ngIf=\"!echoFilterVisibleRows.length\">No options available</div>\n </div>\n </div>\n\n <div class=\"efp-foot\">\n <button type=\"button\" class=\"efp-reset\" (click)=\"echoFilterReset()\">Reset Filters</button>\n <div class=\"efp-foot-actions\">\n <button type=\"button\" class=\"efp-cancel\" (click)=\"closeEchoFilter()\">Cancel</button>\n <button type=\"button\" class=\"efp-apply\" (click)=\"echoFilterApply()\">Apply</button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 CATEGORY ANALYSIS POPUP \u2550\u2550\u2550 -->\n<div class=\"cap-overlay\" *ngIf=\"categoryPopupOpen\" (click)=\"closeCategoryPopup()\"></div>\n<div class=\"cap-modal\" *ngIf=\"categoryPopupOpen\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"cap-header\">\n <div class=\"cap-titles\">\n <div class=\"cap-title\">{{ categoryAnalysisCategory || 'Category' }} Analysis</div>\n <div class=\"cap-subtitle\" *ngIf=\"categoryAnalysisAttribute\">\n Filtered by <span class=\"cap-chip-inline\">{{ categoryAnalysisAttribute }}</span>\n </div>\n </div>\n <button class=\"cap-close\" (click)=\"closeCategoryPopup()\" aria-label=\"Close\">\u00D7</button>\n </div>\n\n <div class=\"cap-body\">\n <div class=\"cap-loading\" *ngIf=\"categoryAnalysisLoading\">\n <div class=\"cap-spinner\"></div>\n <span>Loading\u2026</span>\n </div>\n\n <div class=\"cap-error\" *ngIf=\"!categoryAnalysisLoading && categoryAnalysisError\">\n {{ categoryAnalysisError }}\n </div>\n\n <ng-container *ngIf=\"!categoryAnalysisLoading && !categoryAnalysisError\">\n <div class=\"cap-summary\" *ngIf=\"categoryAnalysisRows.length\">\n <span class=\"cap-summary-label\">Total conversations</span>\n <span class=\"cap-summary-value\">{{ categoryAnalysisTotal }}</span>\n </div>\n\n <div class=\"cap-table-wrap\" *ngIf=\"categoryAnalysisRows.length; else capEmpty\">\n <table class=\"cap-table\">\n <thead>\n <tr>\n <th class=\"cap-th-name\">Attribute</th>\n <th class=\"cap-th-count\">Conversations</th>\n <th class=\"cap-th-share\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of categoryAnalysisRows\">\n <td class=\"cap-td-name\" [title]=\"r.name\">{{ r.name }}</td>\n <td class=\"cap-td-count\">{{ r.count }}</td>\n <td class=\"cap-td-share\">\n <div class=\"cap-bar\">\n <div class=\"cap-bar-fill\" [style.width.%]=\"r.percent\"></div>\n </div>\n <span class=\"cap-bar-pct\">{{ r.percent }}%</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <ng-template #capEmpty>\n <div class=\"cap-empty\">No data available for this selection.</div>\n </ng-template>\n </ng-container>\n </div>\n\n <div class=\"cap-footer\">\n <button class=\"cap-btn-close\" (click)=\"closeCategoryPopup()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0;cursor:pointer}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}.metric-card-dynamic--full{grid-column:1/-1}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:14px;padding:8px 4px}.bbc-bar-list{display:flex;flex-direction:column;gap:14px;width:100%;padding:4px 2px}.bbc-bar-row{cursor:pointer;padding:8px 10px;border-radius:8px}.bbc-bar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px}.bbc-bar-label{display:inline-flex;align-items:center;gap:8px;color:#1e293b;font-weight:500;letter-spacing:.1px}.bbc-bar-dot{width:8px;height:8px;border-radius:50%;display:inline-block;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #0f172a14}.bbc-bar-pct{color:#0f172a;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}.bbc-bar-track{height:10px;background:linear-gradient(180deg,#f1f5f9,#e2e8f0);border-radius:999px;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-bar-fill{height:100%;border-radius:999px;background-image:linear-gradient(180deg,#ffffff40,#fff0 55%);background-blend-mode:overlay;transition:width .35s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px #0f172a1f}.bbc-stack-list{display:flex;flex-direction:column;gap:14px;padding:4px 2px}.bbc-stack-row{display:grid;grid-template-columns:88px 1fr;align-items:center;gap:14px}.bbc-stack-label{font-size:13px;font-weight:600;color:#334155;text-align:right}.bbc-stack-track{display:flex;width:100%;height:32px;background:#f1f5f9;border-radius:6px;overflow:visible;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-stack-track--empty{background:repeating-linear-gradient(45deg,#f8fafc,#f8fafc 6px,#f1f5f9 6px 12px)}.bbc-stack-seg{position:relative;height:100%;display:flex;align-items:center;justify-content:center;transition:width .3s ease}.bbc-stack-seg:first-child{border-radius:4px 0 0 4px}.bbc-stack-seg:last-child{border-radius:0 4px 4px 0}.bbc-stack-seg:first-child:last-child{border-radius:4px}.bbc-stack-seg:not(:last-child){border-right:1px solid rgba(255,255,255,.5)}.bbc-stack-seg:hover .bbc-stack-tooltip{opacity:1;transform:translate(-50%);pointer-events:auto}.bbc-stack-seg-text{font-size:12px;font-weight:700;color:#fff;font-variant-numeric:tabular-nums;text-shadow:0 1px 1px rgba(0,0,0,.2);pointer-events:none}.bbc-stack-tooltip{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%,-4px);background:#0f172a;color:#fff;padding:6px 10px;border-radius:6px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s,transform .15s;z-index:20;box-shadow:0 4px 12px #0f172a40}.bbc-stack-tooltip:after{content:\"\";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-bottom-color:#0f172a}.bbc-stack-tooltip-title{font-weight:600;margin-bottom:2px}.bbc-stack-tooltip-body{color:#cbd5e1;font-variant-numeric:tabular-nums}.bbc-stack-axis{display:flex;justify-content:space-between;margin-left:102px;margin-top:8px;font-size:11px;color:#98a2b3;font-variant-numeric:tabular-nums}.bbc-stack-axis>span{flex:0 0 auto}.bbc-legend-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 14px;margin-top:16px;padding-top:12px;border-top:1px solid #E4E7EC}.bbc-legend-item{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:#475569;min-width:0}.bbc-legend-swatch{width:10px;height:10px;border-radius:2px;flex-shrink:0}.bbc-legend-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-export-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 12px;border:1px solid rgba(0,0,0,.12);border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.metric-export-btn svg{flex-shrink:0}.metric-export-btn:hover{background:#f1f5f9;color:#0f172a;border-color:#0003}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-conv-search{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid #E4E7EC;border-radius:6px;background:#fff;min-width:240px;transition:border-color .15s,box-shadow .15s}.detail-conv-search:focus-within{border-color:#0ea5e9;box-shadow:0 0 0 3px #0ea5e91f}.detail-conv-search-input{flex:1;border:none;outline:none;background:transparent;font-size:13px;color:#1e293b}.detail-conv-search-input::placeholder{color:#98a2b3}.detail-conv-search-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:transparent;color:#98a2b3;cursor:pointer}.detail-conv-search-clear:hover{background:#f1f5f9;color:#334155}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}.cap-overlay{position:fixed;inset:0;background:#0f172a73;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:1200;animation:capFade .18s ease-out}.cap-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,92vw);max-height:86vh;background:#fff;border-radius:12px;box-shadow:0 24px 60px #0f172a40;z-index:1201;display:flex;flex-direction:column;overflow:hidden;animation:capPop .2s ease-out}@keyframes capFade{0%{opacity:0}to{opacity:1}}@keyframes capPop{0%{opacity:0;transform:translate(-50%,-48%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.cap-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 20px 14px;border-bottom:1px solid #E5E7EB}.cap-titles{min-width:0}.cap-title{font-size:16px;font-weight:700;color:#0f172a;line-height:1.3}.cap-subtitle{margin-top:4px;font-size:12px;color:#64748b}.cap-chip-inline{display:inline-block;padding:2px 8px;border-radius:999px;background:#e0f2fe;color:#0369a1;font-weight:600;margin-left:4px;font-size:11px}.cap-close{background:transparent;border:none;width:28px;height:28px;border-radius:6px;font-size:22px;line-height:1;color:#64748b;cursor:pointer;flex-shrink:0}.cap-close:hover{background:#f1f5f9;color:#0f172a}.cap-body{padding:16px 20px;overflow-y:auto;flex:1}.cap-loading{display:flex;align-items:center;justify-content:center;gap:10px;padding:48px 0;color:#64748b;font-size:13px}.cap-spinner{width:18px;height:18px;border:2px solid #E2E8F0;border-top-color:#0ea5e9;border-radius:50%;animation:capSpin .8s linear infinite}@keyframes capSpin{to{transform:rotate(360deg)}}.cap-error{padding:24px;text-align:center;color:#b91c1c;background:#fef2f2;border:1px solid #FECACA;border-radius:8px;font-size:13px}.cap-empty{padding:36px 0;text-align:center;color:#94a3b8;font-size:13px}.cap-summary{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#f8fafc;border:1px solid #E2E8F0;border-radius:8px;margin-bottom:12px}.cap-summary .cap-summary-label{font-size:12px;color:#64748b;font-weight:500}.cap-summary .cap-summary-value{font-size:15px;font-weight:700;color:#0f172a}.cap-table-wrap{border:1px solid #E5E7EB;border-radius:8px;overflow:hidden}.cap-table{width:100%;border-collapse:collapse;font-size:13px}.cap-table thead th{background:#f8fafc;color:#475569;font-weight:600;font-size:11px;text-transform:none;letter-spacing:.02em;padding:10px 14px;text-align:left;border-bottom:1px solid #E5E7EB}.cap-table .cap-th-count{width:80px;text-align:right}.cap-table .cap-th-share{width:200px}.cap-table tbody tr{border-bottom:1px solid #F1F5F9}.cap-table tbody tr:last-child{border-bottom:none}.cap-table tbody tr:hover{background:#f8fafc}.cap-table td{padding:10px 14px;color:#0f172a;vertical-align:middle}.cap-table .cap-td-name{font-weight:500;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cap-table .cap-td-count{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;color:#334155}.cap-table .cap-td-share{display:flex;align-items:center;gap:8px}.cap-bar{flex:1;height:6px;background:#e2e8f0;border-radius:999px;overflow:hidden}.cap-bar-fill{height:100%;background:linear-gradient(90deg,#38bdf8,#0ea5e9);border-radius:999px;transition:width .3s ease}.cap-bar-pct{font-size:11px;font-weight:600;color:#0369a1;font-variant-numeric:tabular-nums;min-width:40px;text-align:right}.cap-footer{padding:12px 20px;border-top:1px solid #E5E7EB;display:flex;justify-content:flex-end;background:#fafbfc}.cap-btn-close{padding:8px 18px;border-radius:6px;border:1px solid #CBD5E1;background:#fff;color:#334155;font-size:13px;font-weight:600;cursor:pointer}.cap-btn-close:hover{background:#f1f5f9;border-color:#94a3b8}.bbs-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;width:100%;align-items:stretch}.bbs-panel{display:flex;flex-direction:column;border:1px solid #E5E7EB;border-radius:10px;background:#fff;overflow:hidden;height:100%}.bbs-panel-head{padding:12px 14px 8px;border-bottom:1px solid #F1F5F9}.bbs-panel-title{font-size:14px;font-weight:700;color:#0f172a;line-height:1.2}.bbs-panel-sub{font-size:12px;color:#64748b;margin-top:2px}.bbs-list{flex:1;max-height:360px;overflow-y:auto;padding:4px 0}.bbs-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #F1F5F9;font-size:13px;color:#334155}.bbs-row:last-child{border-bottom:none}.bbs-row-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:12px}.bbs-row-count{font-weight:600;color:#475569;font-variant-numeric:tabular-nums}.bbs-row-clickable{cursor:pointer;transition:background-color .12s ease}.bbs-row-clickable:hover{background-color:#f8fafc}.bbs-row-selected{background-color:#eff6ff}.bbs-row-selected .bbs-row-label{color:#1d4ed8;font-weight:600}.bbs-row-selected .bbs-row-count{color:#1d4ed8}.bbs-row-selected:hover{background-color:#dbeafe}.bbs-empty{padding:16px 14px;font-size:12px;color:#94a3b8;text-align:center}.echo-inline-date{position:relative;display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;margin-left:12px}.echo-inline-date svg{flex-shrink:0}.echo-inline-date-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;min-width:200px;cursor:pointer}.echo-filter-wrap{position:relative;margin-left:8px}.echo-filter-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background-color .12s ease,border-color .12s ease}.echo-filter-btn:hover{background:#f8fafc;border-color:#cbd5e1}.echo-filter-popup{position:absolute;top:calc(100% + 6px);right:0;width:560px;background:#fff;border-radius:12px;box-shadow:0 12px 36px #0f172a1f;border:1px solid #EAECF0;z-index:100;display:flex;flex-direction:column;max-height:520px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.efp-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #EAECF0}.efp-title{font-size:14px;font-weight:600;color:#101828;letter-spacing:-.1px}.efp-search{display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid #EAECF0;border-radius:8px;background:#fff;width:220px}.efp-search-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;width:100%}.efp-search-input::placeholder{color:#98a2b3;font-weight:400}.efp-body{display:grid;grid-template-columns:210px 1fr;flex:1;min-height:0}.efp-tabs{list-style:none;margin:0;padding:8px 0;border-right:1px solid #EAECF0;overflow-y:auto}.efp-tabs li{display:flex;align-items:center;justify-content:space-between;padding:11px 20px;font-size:13px;font-weight:500;color:#475467;cursor:pointer;transition:color .12s ease,background-color .12s ease}.efp-tabs li:hover{color:#101828}.efp-tabs li.active{background:#eff8ff;color:#2e90fa;font-weight:600}.efp-tab-count{background:#f2f4f7;color:#475467;min-width:22px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;border-radius:999px;font-size:11px;font-weight:600;line-height:1}.efp-tabs li.active .efp-tab-count{background:#d1e9ff;color:#2e90fa}.efp-pane{padding:12px 16px;overflow-y:auto;max-height:360px}.efp-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:6px;margin:0}.efp-row:hover{background:#f9fafb}.efp-row .form-check-input{width:16px;height:16px;margin:0;border:1.5px solid #D0D5DD;border-radius:4px;flex-shrink:0;cursor:pointer}.efp-row .form-check-input:checked{background-color:#2e90fa;border-color:#2e90fa}.efp-row .form-check-input:focus{box-shadow:0 0 0 3px #2e90fa26;border-color:#2e90fa}.efp-row .form-check-label{flex:1;font-size:13px;font-weight:400;color:#344054;margin:0;line-height:1.4;cursor:pointer}.efp-row-all{border-bottom:1px solid #EAECF0;margin-bottom:4px;padding-bottom:10px}.efp-row-all label{font-weight:500;color:#475467}.efp-empty{padding:24px 12px;text-align:center;font-size:12px;color:#94a3b8}.efp-downtime{display:grid;grid-template-columns:1fr;gap:8px;padding:12px 8px}.efp-downtime-label{font-size:12px;font-weight:600;color:#475569;margin:8px 0 0}.efp-downtime-input{padding:8px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px;outline:0}.efp-downtime-input:focus{border-color:#93c5fd}.efp-foot{display:flex;align-items:center;justify-content:space-between;padding:12px 18px;border-top:1px solid #F1F5F9}.efp-reset{background:transparent;border:0;color:#475569;font-size:13px;font-weight:500;cursor:pointer;padding:6px 0}.efp-reset:hover{color:#1d4ed8}.efp-foot-actions{display:flex;gap:8px}.efp-cancel,.efp-apply{padding:7px 18px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid transparent}.efp-cancel{background:#fff;border-color:#e2e8f0;color:#475569}.efp-cancel:hover{background:#f8fafc}.efp-apply{background:#2563eb;color:#fff}.efp-apply:hover{background:#1d4ed8}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i8.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }] });
|
|
1912
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TangoEchoComponent, selector: "lib-tango-echo", host: { listeners: { "document:click": "onDocumentClickEchoFilter($event)" }, properties: { "class.echo-overall-transcripts-host": "this.hasOverallTranscriptsHostClass" } }, ngImport: i0, template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No conversations found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ cohortList.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ displayName(selectedCohortName) }}</span>\n <span class=\"flex-spacer\"></span>\n\n <!-- Audio Source filter (Overall Transcripts only) -->\n <div *ngIf=\"isOverallTranscriptsCohort && audioSourceOptions.length\" class=\"agent-dropdown-wrap me-3\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleAudioSourceDropdown()\">\n <span class=\"cohort-dd-trigger-name\">{{ selectedAudioSourceLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"audioSourceDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"audioSourceDropdownOpen\">\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let opt of audioSourceOptions\"\n class=\"agent-dd-item\"\n [class.selected]=\"opt.value === selectedAudioSource\"\n (click)=\"selectAudioSource(opt)\">\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ opt.label }}</div>\n </div>\n <svg *ngIf=\"opt.value === selectedAudioSource\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"audioSourceDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeAudioSourceDropdown()\"></div>\n </div>\n\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\" [class.is-loading]=\"isCohortLoading\">\n <div class=\"agent-dropdown-trigger\"\n [class.disabled]=\"isCohortLoading\"\n [attr.aria-disabled]=\"isCohortLoading\"\n (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ displayName(selectedCohortName) || 'Select Agent' }}</span>\n <svg *ngIf=\"!isCohortLoading\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n <svg *ngIf=\"isCohortLoading\" class=\"cohort-dd-spinner\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M12 2a10 10 0 0 1 10 10\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen && !isCohortLoading\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ displayName(c.cohortName || c.name) }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen && !isCohortLoading\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE' || card.type === 'BOOLEAN_BASKET_CHART' || (card.type === 'BOOLEAN_BASKET' && card.isFunnel)\"\n [class.metric-card-dynamic--full]=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ displayName(card.name) }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <button type=\"button\" class=\"metric-export-btn\"\n *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\"\n title=\"Export to Excel\"\n (click)=\"exportBbtCard(card)\"><span>Export</span> \n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>\n </button>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\"\n (click)=\"onCategoryAnalysisClick(row, chip, $event)\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\" (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-stack-list\">\n <div *ngFor=\"let bar of card.selectedStackedBars\" class=\"bbc-stack-row\">\n <div class=\"bbc-stack-label\">{{ bar.label }}</div>\n <div class=\"bbc-stack-track\" [class.bbc-stack-track--empty]=\"bar.total === 0\">\n <div *ngFor=\"let seg of bar.segments\"\n class=\"bbc-stack-seg\"\n [style.width.%]=\"seg.percent\"\n [style.background]=\"seg.color\">\n <span *ngIf=\"seg.percent >= 10\" class=\"bbc-stack-seg-text\">{{ seg.percent }}%</span>\n <div class=\"bbc-stack-tooltip\">\n <div class=\"bbc-stack-tooltip-title\">{{ bar.label }} \u00B7 {{ seg.label }}</div>\n <div class=\"bbc-stack-tooltip-body\">{{ seg.count }} ({{ seg.percent }}%)</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bbc-stack-axis\">\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n <div class=\"bbc-legend-grid\">\n <div *ngFor=\"let item of card.selectedLegend\" class=\"bbc-legend-item\">\n <span class=\"bbc-legend-swatch\" [style.background]=\"item.color\"></span>\n <span class=\"bbc-legend-text\">{{ item.label }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_SEPORATOR \u2014 two list panels (content tags + measurements) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <div class=\"bbs-grid\">\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">Categories</div>\n <div class=\"bbs-panel-sub\">{{ card.tagRows?.length || 0 }} items</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.tagRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.tagRows?.length\">No data</div>\n </div>\n </div>\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">{{ card.measureTitle }}</div>\n <div class=\"bbs-panel-sub\">{{ card.measureSubtitle }}</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.measureRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.measureRows?.length\">No data</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n <span class=\"flex-spacer\"></span>\n <div class=\"detail-conv-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\"\n class=\"detail-conv-search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"detailSearchValue\"\n (keyup.enter)=\"onDetailSearch()\">\n <button type=\"button\"\n class=\"detail-conv-search-clear\"\n *ngIf=\"detailSearchValue\"\n (click)=\"clearDetailSearch()\"\n title=\"Clear\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <!-- Inline date + Filter button (Overall Transcripts only) -->\n <ng-container *ngIf=\"isViewOverallTranscripts\">\n <div class=\"echo-inline-date\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <input type=\"text\"\n class=\"echo-inline-date-input\"\n ngxDaterangepickerMd\n [drops]=\"'down'\"\n [opens]=\"'left'\"\n [ranges]=\"echoDateRanges\"\n [showCustomRangeLabel]=\"true\"\n [autoApply]=\"true\"\n [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\"\n [showCancel]=\"true\"\n [readonly]=\"true\"\n autocomplete=\"off\"\n [(ngModel)]=\"echoDateRange\"\n (datesUpdated)=\"onEchoDateChange($event)\"\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\n name=\"echoDaterange\" />\n </div>\n <div class=\"echo-filter-wrap\">\n <button type=\"button\" class=\"echo-filter-btn\" (click)=\"echoFilterOpen ? closeEchoFilter() : openEchoFilter()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Filter</span>\n </button>\n\n <!-- Popup -->\n <div class=\"echo-filter-popup\" *ngIf=\"echoFilterOpen\" (click)=\"$event.stopPropagation()\">\n <div class=\"efp-head\">\n <span class=\"efp-title\">Filter by</span>\n <div class=\"efp-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\" class=\"efp-search-input\" [placeholder]=\"echoFilterTab === 'stores' ? 'Search Stores' : 'Search'\" [(ngModel)]=\"echoFilterSearch\" (ngModelChange)=\"onEchoFilterSearchChange()\" />\n </div>\n </div>\n\n <div class=\"efp-body\">\n <ul class=\"efp-tabs\">\n <li [class.active]=\"echoFilterTab === 'status'\" (click)=\"setEchoFilterTab('status')\">\n <span>Status</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterStatusCount\">{{ echoFilterStatusCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'country'\" (click)=\"setEchoFilterTab('country')\">\n <span>Country</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterCountryCount\">{{ echoFilterCountryCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'region'\" (click)=\"setEchoFilterTab('region')\">\n <span>Region</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterRegionCount\">{{ echoFilterRegionCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'clusters'\" (click)=\"setEchoFilterTab('clusters')\">\n <span>Clusters</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterClusterCount\">{{ echoFilterClusterCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'stores'\" (click)=\"setEchoFilterTab('stores')\">\n <span>Stores</span><span class=\"efp-tab-count\">{{ echoFilterStoreCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'downtime'\" (click)=\"setEchoFilterTab('downtime')\">\n <span>Downtime (In Mins)</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterDowntimeCount\">{{ echoFilterDowntimeCount }}</span>\n </li>\n </ul>\n\n <div class=\"efp-pane\">\n <div class=\"form-check efp-row efp-row-all\" *ngIf=\"echoFilterVisibleRows.length > 0\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"efp-select-all\"\n [checked]=\"echoFilterAllSelected\"\n (change)=\"echoFilterToggleAll($any($event.target).checked)\" />\n <label class=\"form-check-label\" for=\"efp-select-all\">Select All</label>\n </div>\n <div class=\"form-check efp-row\" *ngFor=\"let r of echoFilterVisibleRows; trackBy: trackEchoFilterRow\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\n [id]=\"'efp-row-' + r.id\"\n [(ngModel)]=\"r.ref.checked\"\n (ngModelChange)=\"onEchoFilterRowChange()\" />\n <label class=\"form-check-label\" [for]=\"'efp-row-' + r.id\">{{ r.label }}</label>\n </div>\n <div class=\"efp-empty\" *ngIf=\"!echoFilterVisibleRows.length\">No options available</div>\n </div>\n </div>\n\n <div class=\"efp-foot\">\n <button type=\"button\" class=\"efp-reset\" (click)=\"echoFilterReset()\">Reset Filters</button>\n <div class=\"efp-foot-actions\">\n <button type=\"button\" class=\"efp-cancel\" (click)=\"closeEchoFilter()\">Cancel</button>\n <button type=\"button\" class=\"efp-apply\" (click)=\"echoFilterApply()\">Apply</button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 CATEGORY ANALYSIS POPUP \u2550\u2550\u2550 -->\n<div class=\"cap-overlay\" *ngIf=\"categoryPopupOpen\" (click)=\"closeCategoryPopup()\"></div>\n<div class=\"cap-modal\" *ngIf=\"categoryPopupOpen\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"cap-header\">\n <div class=\"cap-titles\">\n <div class=\"cap-title\">{{ categoryAnalysisCategory || 'Category' }} Analysis</div>\n <div class=\"cap-subtitle\" *ngIf=\"categoryAnalysisAttribute\">\n Filtered by <span class=\"cap-chip-inline\">{{ categoryAnalysisAttribute }}</span>\n </div>\n </div>\n <button class=\"cap-close\" (click)=\"closeCategoryPopup()\" aria-label=\"Close\">\u00D7</button>\n </div>\n\n <div class=\"cap-body\">\n <div class=\"cap-loading\" *ngIf=\"categoryAnalysisLoading\">\n <div class=\"cap-spinner\"></div>\n <span>Loading\u2026</span>\n </div>\n\n <div class=\"cap-error\" *ngIf=\"!categoryAnalysisLoading && categoryAnalysisError\">\n {{ categoryAnalysisError }}\n </div>\n\n <ng-container *ngIf=\"!categoryAnalysisLoading && !categoryAnalysisError\">\n <div class=\"cap-summary\" *ngIf=\"categoryAnalysisRows.length\">\n <span class=\"cap-summary-label\">Total conversations</span>\n <span class=\"cap-summary-value\">{{ categoryAnalysisTotal }}</span>\n </div>\n\n <div class=\"cap-table-wrap\" *ngIf=\"categoryAnalysisRows.length; else capEmpty\">\n <table class=\"cap-table\">\n <thead>\n <tr>\n <th class=\"cap-th-name\">Attribute</th>\n <th class=\"cap-th-count\">Conversations</th>\n <th class=\"cap-th-share\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of categoryAnalysisRows\">\n <td class=\"cap-td-name\" [title]=\"r.name\">{{ r.name }}</td>\n <td class=\"cap-td-count\">{{ r.count }}</td>\n <td class=\"cap-td-share\">\n <div class=\"cap-bar\">\n <div class=\"cap-bar-fill\" [style.width.%]=\"r.percent\"></div>\n </div>\n <span class=\"cap-bar-pct\">{{ r.percent }}%</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <ng-template #capEmpty>\n <div class=\"cap-empty\">No data available for this selection.</div>\n </ng-template>\n </ng-container>\n </div>\n\n <div class=\"cap-footer\">\n <button class=\"cap-btn-close\" (click)=\"closeCategoryPopup()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0;cursor:pointer}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}.metric-card-dynamic--full{grid-column:1/-1}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:14px;padding:8px 4px}.bbc-bar-list{display:flex;flex-direction:column;gap:14px;width:100%;padding:4px 2px}.bbc-bar-row{cursor:pointer;padding:8px 10px;border-radius:8px}.bbc-bar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px}.bbc-bar-label{display:inline-flex;align-items:center;gap:8px;color:#1e293b;font-weight:500;letter-spacing:.1px}.bbc-bar-dot{width:8px;height:8px;border-radius:50%;display:inline-block;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #0f172a14}.bbc-bar-pct{color:#0f172a;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}.bbc-bar-track{height:10px;background:linear-gradient(180deg,#f1f5f9,#e2e8f0);border-radius:999px;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-bar-fill{height:100%;border-radius:999px;background-image:linear-gradient(180deg,#ffffff40,#fff0 55%);background-blend-mode:overlay;transition:width .35s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px #0f172a1f}.bbc-stack-list{display:flex;flex-direction:column;gap:14px;padding:4px 2px}.bbc-stack-row{display:grid;grid-template-columns:88px 1fr;align-items:center;gap:14px}.bbc-stack-label{font-size:13px;font-weight:600;color:#334155;text-align:right}.bbc-stack-track{display:flex;width:100%;height:32px;background:#f1f5f9;border-radius:6px;overflow:visible;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-stack-track--empty{background:repeating-linear-gradient(45deg,#f8fafc,#f8fafc 6px,#f1f5f9 6px 12px)}.bbc-stack-seg{position:relative;height:100%;display:flex;align-items:center;justify-content:center;transition:width .3s ease}.bbc-stack-seg:first-child{border-radius:4px 0 0 4px}.bbc-stack-seg:last-child{border-radius:0 4px 4px 0}.bbc-stack-seg:first-child:last-child{border-radius:4px}.bbc-stack-seg:not(:last-child){border-right:1px solid rgba(255,255,255,.5)}.bbc-stack-seg:hover .bbc-stack-tooltip{opacity:1;transform:translate(-50%);pointer-events:auto}.bbc-stack-seg-text{font-size:12px;font-weight:700;color:#fff;font-variant-numeric:tabular-nums;text-shadow:0 1px 1px rgba(0,0,0,.2);pointer-events:none}.bbc-stack-tooltip{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%,-4px);background:#0f172a;color:#fff;padding:6px 10px;border-radius:6px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s,transform .15s;z-index:20;box-shadow:0 4px 12px #0f172a40}.bbc-stack-tooltip:after{content:\"\";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-bottom-color:#0f172a}.bbc-stack-tooltip-title{font-weight:600;margin-bottom:2px}.bbc-stack-tooltip-body{color:#cbd5e1;font-variant-numeric:tabular-nums}.bbc-stack-axis{display:flex;justify-content:space-between;margin-left:102px;margin-top:8px;font-size:11px;color:#98a2b3;font-variant-numeric:tabular-nums}.bbc-stack-axis>span{flex:0 0 auto}.bbc-legend-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 14px;margin-top:16px;padding-top:12px;border-top:1px solid #E4E7EC}.bbc-legend-item{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:#475569;min-width:0}.bbc-legend-swatch{width:10px;height:10px;border-radius:2px;flex-shrink:0}.bbc-legend-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s,opacity .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-trigger.disabled{cursor:not-allowed;opacity:.55;pointer-events:none}.agent-dropdown-trigger.disabled:hover{border-color:#d0d5dd}.cohort-dd-spinner{animation:cohort-dd-spin .7s linear infinite}@keyframes cohort-dd-spin{to{transform:rotate(360deg)}}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-export-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 12px;border:1px solid rgba(0,0,0,.12);border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.metric-export-btn svg{flex-shrink:0}.metric-export-btn:hover{background:#f1f5f9;color:#0f172a;border-color:#0003}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-conv-search{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid #E4E7EC;border-radius:6px;background:#fff;min-width:240px;transition:border-color .15s,box-shadow .15s}.detail-conv-search:focus-within{border-color:#0ea5e9;box-shadow:0 0 0 3px #0ea5e91f}.detail-conv-search-input{flex:1;border:none;outline:none;background:transparent;font-size:13px;color:#1e293b}.detail-conv-search-input::placeholder{color:#98a2b3}.detail-conv-search-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:transparent;color:#98a2b3;cursor:pointer}.detail-conv-search-clear:hover{background:#f1f5f9;color:#334155}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}.cap-overlay{position:fixed;inset:0;background:#0f172a73;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:1200;animation:capFade .18s ease-out}.cap-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,92vw);max-height:86vh;background:#fff;border-radius:12px;box-shadow:0 24px 60px #0f172a40;z-index:1201;display:flex;flex-direction:column;overflow:hidden;animation:capPop .2s ease-out}@keyframes capFade{0%{opacity:0}to{opacity:1}}@keyframes capPop{0%{opacity:0;transform:translate(-50%,-48%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.cap-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 20px 14px;border-bottom:1px solid #E5E7EB}.cap-titles{min-width:0}.cap-title{font-size:16px;font-weight:700;color:#0f172a;line-height:1.3}.cap-subtitle{margin-top:4px;font-size:12px;color:#64748b}.cap-chip-inline{display:inline-block;padding:2px 8px;border-radius:999px;background:#e0f2fe;color:#0369a1;font-weight:600;margin-left:4px;font-size:11px}.cap-close{background:transparent;border:none;width:28px;height:28px;border-radius:6px;font-size:22px;line-height:1;color:#64748b;cursor:pointer;flex-shrink:0}.cap-close:hover{background:#f1f5f9;color:#0f172a}.cap-body{padding:16px 20px;overflow-y:auto;flex:1}.cap-loading{display:flex;align-items:center;justify-content:center;gap:10px;padding:48px 0;color:#64748b;font-size:13px}.cap-spinner{width:18px;height:18px;border:2px solid #E2E8F0;border-top-color:#0ea5e9;border-radius:50%;animation:capSpin .8s linear infinite}@keyframes capSpin{to{transform:rotate(360deg)}}.cap-error{padding:24px;text-align:center;color:#b91c1c;background:#fef2f2;border:1px solid #FECACA;border-radius:8px;font-size:13px}.cap-empty{padding:36px 0;text-align:center;color:#94a3b8;font-size:13px}.cap-summary{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#f8fafc;border:1px solid #E2E8F0;border-radius:8px;margin-bottom:12px}.cap-summary .cap-summary-label{font-size:12px;color:#64748b;font-weight:500}.cap-summary .cap-summary-value{font-size:15px;font-weight:700;color:#0f172a}.cap-table-wrap{border:1px solid #E5E7EB;border-radius:8px;overflow:hidden}.cap-table{width:100%;border-collapse:collapse;font-size:13px}.cap-table thead th{background:#f8fafc;color:#475569;font-weight:600;font-size:11px;text-transform:none;letter-spacing:.02em;padding:10px 14px;text-align:left;border-bottom:1px solid #E5E7EB}.cap-table .cap-th-count{width:80px;text-align:right}.cap-table .cap-th-share{width:200px}.cap-table tbody tr{border-bottom:1px solid #F1F5F9}.cap-table tbody tr:last-child{border-bottom:none}.cap-table tbody tr:hover{background:#f8fafc}.cap-table td{padding:10px 14px;color:#0f172a;vertical-align:middle}.cap-table .cap-td-name{font-weight:500;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cap-table .cap-td-count{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;color:#334155}.cap-table .cap-td-share{display:flex;align-items:center;gap:8px}.cap-bar{flex:1;height:6px;background:#e2e8f0;border-radius:999px;overflow:hidden}.cap-bar-fill{height:100%;background:linear-gradient(90deg,#38bdf8,#0ea5e9);border-radius:999px;transition:width .3s ease}.cap-bar-pct{font-size:11px;font-weight:600;color:#0369a1;font-variant-numeric:tabular-nums;min-width:40px;text-align:right}.cap-footer{padding:12px 20px;border-top:1px solid #E5E7EB;display:flex;justify-content:flex-end;background:#fafbfc}.cap-btn-close{padding:8px 18px;border-radius:6px;border:1px solid #CBD5E1;background:#fff;color:#334155;font-size:13px;font-weight:600;cursor:pointer}.cap-btn-close:hover{background:#f1f5f9;border-color:#94a3b8}.bbs-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;width:100%;align-items:stretch}.bbs-panel{display:flex;flex-direction:column;border:1px solid #E5E7EB;border-radius:10px;background:#fff;overflow:hidden;height:100%}.bbs-panel-head{padding:12px 14px 8px;border-bottom:1px solid #F1F5F9}.bbs-panel-title{font-size:14px;font-weight:700;color:#0f172a;line-height:1.2}.bbs-panel-sub{font-size:12px;color:#64748b;margin-top:2px}.bbs-list{flex:1;max-height:360px;overflow-y:auto;padding:4px 0}.bbs-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #F1F5F9;font-size:13px;color:#334155}.bbs-row:last-child{border-bottom:none}.bbs-row-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:12px}.bbs-row-count{font-weight:600;color:#475569;font-variant-numeric:tabular-nums}.bbs-row-clickable{cursor:pointer;transition:background-color .12s ease}.bbs-row-clickable:hover{background-color:#f8fafc}.bbs-row-selected{background-color:#eff6ff}.bbs-row-selected .bbs-row-label{color:#1d4ed8;font-weight:600}.bbs-row-selected .bbs-row-count{color:#1d4ed8}.bbs-row-selected:hover{background-color:#dbeafe}.bbs-empty{padding:16px 14px;font-size:12px;color:#94a3b8;text-align:center}.echo-inline-date{position:relative;display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;margin-left:12px}.echo-inline-date svg{flex-shrink:0}.echo-inline-date-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;min-width:200px;cursor:pointer}.echo-filter-wrap{position:relative;margin-left:8px}.echo-filter-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background-color .12s ease,border-color .12s ease}.echo-filter-btn:hover{background:#f8fafc;border-color:#cbd5e1}.echo-filter-popup{position:absolute;top:calc(100% + 6px);right:0;width:560px;background:#fff;border-radius:12px;box-shadow:0 12px 36px #0f172a1f;border:1px solid #EAECF0;z-index:100;display:flex;flex-direction:column;max-height:520px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.efp-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #EAECF0}.efp-title{font-size:14px;font-weight:600;color:#101828;letter-spacing:-.1px}.efp-search{display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid #EAECF0;border-radius:8px;background:#fff;width:220px}.efp-search-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;width:100%}.efp-search-input::placeholder{color:#98a2b3;font-weight:400}.efp-body{display:grid;grid-template-columns:210px 1fr;flex:1;min-height:0}.efp-tabs{list-style:none;margin:0;padding:8px 0;border-right:1px solid #EAECF0;overflow-y:auto}.efp-tabs li{display:flex;align-items:center;justify-content:space-between;padding:11px 20px;font-size:13px;font-weight:500;color:#475467;cursor:pointer;transition:color .12s ease,background-color .12s ease}.efp-tabs li:hover{color:#101828}.efp-tabs li.active{background:#eff8ff;color:#2e90fa;font-weight:600}.efp-tab-count{background:#f2f4f7;color:#475467;min-width:22px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;border-radius:999px;font-size:11px;font-weight:600;line-height:1}.efp-tabs li.active .efp-tab-count{background:#d1e9ff;color:#2e90fa}.efp-pane{padding:12px 16px;overflow-y:auto;max-height:360px}.efp-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:6px;margin:0}.efp-row:hover{background:#f9fafb}.efp-row .form-check-input{width:16px;height:16px;margin:0;border:1.5px solid #D0D5DD;border-radius:4px;flex-shrink:0;cursor:pointer}.efp-row .form-check-input:checked{background-color:#2e90fa;border-color:#2e90fa}.efp-row .form-check-input:focus{box-shadow:0 0 0 3px #2e90fa26;border-color:#2e90fa}.efp-row .form-check-label{flex:1;font-size:13px;font-weight:400;color:#344054;margin:0;line-height:1.4;cursor:pointer}.efp-row-all{border-bottom:1px solid #EAECF0;margin-bottom:4px;padding-bottom:10px}.efp-row-all label{font-weight:500;color:#475467}.efp-empty{padding:24px 12px;text-align:center;font-size:12px;color:#94a3b8}.efp-downtime{display:grid;grid-template-columns:1fr;gap:8px;padding:12px 8px}.efp-downtime-label{font-size:12px;font-weight:600;color:#475569;margin:8px 0 0}.efp-downtime-input{padding:8px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px;outline:0}.efp-downtime-input:focus{border-color:#93c5fd}.efp-foot{display:flex;align-items:center;justify-content:space-between;padding:12px 18px;border-top:1px solid #F1F5F9}.efp-reset{background:transparent;border:0;color:#475569;font-size:13px;font-weight:500;cursor:pointer;padding:6px 0}.efp-reset:hover{color:#1d4ed8}.efp-foot-actions{display:flex;gap:8px}.efp-cancel,.efp-apply{padding:7px 18px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid transparent}.efp-cancel{background:#fff;border-color:#e2e8f0;color:#475569}.efp-cancel:hover{background:#f8fafc}.efp-apply{background:#2563eb;color:#fff}.efp-apply:hover{background:#1d4ed8}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }] });
|
|
1904
1913
|
}
|
|
1905
1914
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoEchoComponent, decorators: [{
|
|
1906
1915
|
type: Component,
|
|
1907
|
-
args: [{ selector: 'lib-tango-echo', template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No conversations found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ cohortList.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ displayName(selectedCohortName) }}</span>\n <span class=\"flex-spacer\"></span>\n\n <!-- Audio Source filter (Overall Transcripts only) -->\n <div *ngIf=\"isOverallTranscriptsCohort && audioSourceOptions.length\" class=\"agent-dropdown-wrap me-3\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleAudioSourceDropdown()\">\n <span class=\"cohort-dd-trigger-name\">{{ selectedAudioSourceLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"audioSourceDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"audioSourceDropdownOpen\">\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let opt of audioSourceOptions\"\n class=\"agent-dd-item\"\n [class.selected]=\"opt.value === selectedAudioSource\"\n (click)=\"selectAudioSource(opt)\">\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ opt.label }}</div>\n </div>\n <svg *ngIf=\"opt.value === selectedAudioSource\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"audioSourceDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeAudioSourceDropdown()\"></div>\n </div>\n\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ displayName(selectedCohortName) || 'Select Agent' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ displayName(c.cohortName || c.name) }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE' || card.type === 'BOOLEAN_BASKET_CHART' || (card.type === 'BOOLEAN_BASKET' && card.isFunnel)\"\n [class.metric-card-dynamic--full]=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ displayName(card.name) }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <button type=\"button\" class=\"metric-export-btn\"\n *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\"\n title=\"Export to Excel\"\n (click)=\"exportBbtCard(card)\"><span>Export</span> \n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>\n </button>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\"\n (click)=\"onCategoryAnalysisClick(row, chip, $event)\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\" (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-stack-list\">\n <div *ngFor=\"let bar of card.selectedStackedBars\" class=\"bbc-stack-row\">\n <div class=\"bbc-stack-label\">{{ bar.label }}</div>\n <div class=\"bbc-stack-track\" [class.bbc-stack-track--empty]=\"bar.total === 0\">\n <div *ngFor=\"let seg of bar.segments\"\n class=\"bbc-stack-seg\"\n [style.width.%]=\"seg.percent\"\n [style.background]=\"seg.color\">\n <span *ngIf=\"seg.percent >= 10\" class=\"bbc-stack-seg-text\">{{ seg.percent }}%</span>\n <div class=\"bbc-stack-tooltip\">\n <div class=\"bbc-stack-tooltip-title\">{{ bar.label }} \u00B7 {{ seg.label }}</div>\n <div class=\"bbc-stack-tooltip-body\">{{ seg.count }} ({{ seg.percent }}%)</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bbc-stack-axis\">\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n <div class=\"bbc-legend-grid\">\n <div *ngFor=\"let item of card.selectedLegend\" class=\"bbc-legend-item\">\n <span class=\"bbc-legend-swatch\" [style.background]=\"item.color\"></span>\n <span class=\"bbc-legend-text\">{{ item.label }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_SEPORATOR \u2014 two list panels (content tags + measurements) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <div class=\"bbs-grid\">\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">Categories</div>\n <div class=\"bbs-panel-sub\">{{ card.tagRows?.length || 0 }} items</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.tagRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.tagRows?.length\">No data</div>\n </div>\n </div>\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">{{ card.measureTitle }}</div>\n <div class=\"bbs-panel-sub\">{{ card.measureSubtitle }}</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.measureRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.measureRows?.length\">No data</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n <span class=\"flex-spacer\"></span>\n <div class=\"detail-conv-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\"\n class=\"detail-conv-search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"detailSearchValue\"\n (keyup.enter)=\"onDetailSearch()\">\n <button type=\"button\"\n class=\"detail-conv-search-clear\"\n *ngIf=\"detailSearchValue\"\n (click)=\"clearDetailSearch()\"\n title=\"Clear\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <!-- Inline date + Filter button (Overall Transcripts only) -->\n <ng-container *ngIf=\"isViewOverallTranscripts\">\n <div class=\"echo-inline-date\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <input type=\"text\"\n class=\"echo-inline-date-input\"\n ngxDaterangepickerMd\n [drops]=\"'down'\"\n [opens]=\"'left'\"\n [ranges]=\"echoDateRanges\"\n [showCustomRangeLabel]=\"true\"\n [autoApply]=\"true\"\n [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\"\n [showCancel]=\"true\"\n [readonly]=\"true\"\n autocomplete=\"off\"\n [(ngModel)]=\"echoDateRange\"\n (datesUpdated)=\"onEchoDateChange($event)\"\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\n name=\"echoDaterange\" />\n </div>\n <div class=\"echo-filter-wrap\">\n <button type=\"button\" class=\"echo-filter-btn\" (click)=\"echoFilterOpen ? closeEchoFilter() : openEchoFilter()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Filter</span>\n </button>\n\n <!-- Popup -->\n <div class=\"echo-filter-popup\" *ngIf=\"echoFilterOpen\" (click)=\"$event.stopPropagation()\">\n <div class=\"efp-head\">\n <span class=\"efp-title\">Filter by</span>\n <div class=\"efp-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\" class=\"efp-search-input\" [placeholder]=\"echoFilterTab === 'stores' ? 'Search Stores' : 'Search'\" [(ngModel)]=\"echoFilterSearch\" (ngModelChange)=\"onEchoFilterSearchChange()\" />\n </div>\n </div>\n\n <div class=\"efp-body\">\n <ul class=\"efp-tabs\">\n <li [class.active]=\"echoFilterTab === 'status'\" (click)=\"setEchoFilterTab('status')\">\n <span>Status</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterStatusCount\">{{ echoFilterStatusCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'country'\" (click)=\"setEchoFilterTab('country')\">\n <span>Country</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterCountryCount\">{{ echoFilterCountryCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'region'\" (click)=\"setEchoFilterTab('region')\">\n <span>Region</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterRegionCount\">{{ echoFilterRegionCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'clusters'\" (click)=\"setEchoFilterTab('clusters')\">\n <span>Clusters</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterClusterCount\">{{ echoFilterClusterCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'stores'\" (click)=\"setEchoFilterTab('stores')\">\n <span>Stores</span><span class=\"efp-tab-count\">{{ echoFilterStoreCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'downtime'\" (click)=\"setEchoFilterTab('downtime')\">\n <span>Downtime (In Mins)</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterDowntimeCount\">{{ echoFilterDowntimeCount }}</span>\n </li>\n </ul>\n\n <div class=\"efp-pane\">\n <div class=\"form-check efp-row efp-row-all\" *ngIf=\"echoFilterVisibleRows.length > 0\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"efp-select-all\"\n [checked]=\"echoFilterAllSelected\"\n (change)=\"echoFilterToggleAll($any($event.target).checked)\" />\n <label class=\"form-check-label\" for=\"efp-select-all\">Select All</label>\n </div>\n <div class=\"form-check efp-row\" *ngFor=\"let r of echoFilterVisibleRows; trackBy: trackEchoFilterRow\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\n [id]=\"'efp-row-' + r.id\"\n [(ngModel)]=\"r.ref.checked\"\n (ngModelChange)=\"onEchoFilterRowChange()\" />\n <label class=\"form-check-label\" [for]=\"'efp-row-' + r.id\">{{ r.label }}</label>\n </div>\n <div class=\"efp-empty\" *ngIf=\"!echoFilterVisibleRows.length\">No options available</div>\n </div>\n </div>\n\n <div class=\"efp-foot\">\n <button type=\"button\" class=\"efp-reset\" (click)=\"echoFilterReset()\">Reset Filters</button>\n <div class=\"efp-foot-actions\">\n <button type=\"button\" class=\"efp-cancel\" (click)=\"closeEchoFilter()\">Cancel</button>\n <button type=\"button\" class=\"efp-apply\" (click)=\"echoFilterApply()\">Apply</button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 CATEGORY ANALYSIS POPUP \u2550\u2550\u2550 -->\n<div class=\"cap-overlay\" *ngIf=\"categoryPopupOpen\" (click)=\"closeCategoryPopup()\"></div>\n<div class=\"cap-modal\" *ngIf=\"categoryPopupOpen\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"cap-header\">\n <div class=\"cap-titles\">\n <div class=\"cap-title\">{{ categoryAnalysisCategory || 'Category' }} Analysis</div>\n <div class=\"cap-subtitle\" *ngIf=\"categoryAnalysisAttribute\">\n Filtered by <span class=\"cap-chip-inline\">{{ categoryAnalysisAttribute }}</span>\n </div>\n </div>\n <button class=\"cap-close\" (click)=\"closeCategoryPopup()\" aria-label=\"Close\">\u00D7</button>\n </div>\n\n <div class=\"cap-body\">\n <div class=\"cap-loading\" *ngIf=\"categoryAnalysisLoading\">\n <div class=\"cap-spinner\"></div>\n <span>Loading\u2026</span>\n </div>\n\n <div class=\"cap-error\" *ngIf=\"!categoryAnalysisLoading && categoryAnalysisError\">\n {{ categoryAnalysisError }}\n </div>\n\n <ng-container *ngIf=\"!categoryAnalysisLoading && !categoryAnalysisError\">\n <div class=\"cap-summary\" *ngIf=\"categoryAnalysisRows.length\">\n <span class=\"cap-summary-label\">Total conversations</span>\n <span class=\"cap-summary-value\">{{ categoryAnalysisTotal }}</span>\n </div>\n\n <div class=\"cap-table-wrap\" *ngIf=\"categoryAnalysisRows.length; else capEmpty\">\n <table class=\"cap-table\">\n <thead>\n <tr>\n <th class=\"cap-th-name\">Attribute</th>\n <th class=\"cap-th-count\">Conversations</th>\n <th class=\"cap-th-share\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of categoryAnalysisRows\">\n <td class=\"cap-td-name\" [title]=\"r.name\">{{ r.name }}</td>\n <td class=\"cap-td-count\">{{ r.count }}</td>\n <td class=\"cap-td-share\">\n <div class=\"cap-bar\">\n <div class=\"cap-bar-fill\" [style.width.%]=\"r.percent\"></div>\n </div>\n <span class=\"cap-bar-pct\">{{ r.percent }}%</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <ng-template #capEmpty>\n <div class=\"cap-empty\">No data available for this selection.</div>\n </ng-template>\n </ng-container>\n </div>\n\n <div class=\"cap-footer\">\n <button class=\"cap-btn-close\" (click)=\"closeCategoryPopup()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0;cursor:pointer}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}.metric-card-dynamic--full{grid-column:1/-1}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:14px;padding:8px 4px}.bbc-bar-list{display:flex;flex-direction:column;gap:14px;width:100%;padding:4px 2px}.bbc-bar-row{cursor:pointer;padding:8px 10px;border-radius:8px}.bbc-bar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px}.bbc-bar-label{display:inline-flex;align-items:center;gap:8px;color:#1e293b;font-weight:500;letter-spacing:.1px}.bbc-bar-dot{width:8px;height:8px;border-radius:50%;display:inline-block;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #0f172a14}.bbc-bar-pct{color:#0f172a;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}.bbc-bar-track{height:10px;background:linear-gradient(180deg,#f1f5f9,#e2e8f0);border-radius:999px;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-bar-fill{height:100%;border-radius:999px;background-image:linear-gradient(180deg,#ffffff40,#fff0 55%);background-blend-mode:overlay;transition:width .35s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px #0f172a1f}.bbc-stack-list{display:flex;flex-direction:column;gap:14px;padding:4px 2px}.bbc-stack-row{display:grid;grid-template-columns:88px 1fr;align-items:center;gap:14px}.bbc-stack-label{font-size:13px;font-weight:600;color:#334155;text-align:right}.bbc-stack-track{display:flex;width:100%;height:32px;background:#f1f5f9;border-radius:6px;overflow:visible;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-stack-track--empty{background:repeating-linear-gradient(45deg,#f8fafc,#f8fafc 6px,#f1f5f9 6px 12px)}.bbc-stack-seg{position:relative;height:100%;display:flex;align-items:center;justify-content:center;transition:width .3s ease}.bbc-stack-seg:first-child{border-radius:4px 0 0 4px}.bbc-stack-seg:last-child{border-radius:0 4px 4px 0}.bbc-stack-seg:first-child:last-child{border-radius:4px}.bbc-stack-seg:not(:last-child){border-right:1px solid rgba(255,255,255,.5)}.bbc-stack-seg:hover .bbc-stack-tooltip{opacity:1;transform:translate(-50%);pointer-events:auto}.bbc-stack-seg-text{font-size:12px;font-weight:700;color:#fff;font-variant-numeric:tabular-nums;text-shadow:0 1px 1px rgba(0,0,0,.2);pointer-events:none}.bbc-stack-tooltip{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%,-4px);background:#0f172a;color:#fff;padding:6px 10px;border-radius:6px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s,transform .15s;z-index:20;box-shadow:0 4px 12px #0f172a40}.bbc-stack-tooltip:after{content:\"\";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-bottom-color:#0f172a}.bbc-stack-tooltip-title{font-weight:600;margin-bottom:2px}.bbc-stack-tooltip-body{color:#cbd5e1;font-variant-numeric:tabular-nums}.bbc-stack-axis{display:flex;justify-content:space-between;margin-left:102px;margin-top:8px;font-size:11px;color:#98a2b3;font-variant-numeric:tabular-nums}.bbc-stack-axis>span{flex:0 0 auto}.bbc-legend-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 14px;margin-top:16px;padding-top:12px;border-top:1px solid #E4E7EC}.bbc-legend-item{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:#475569;min-width:0}.bbc-legend-swatch{width:10px;height:10px;border-radius:2px;flex-shrink:0}.bbc-legend-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-export-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 12px;border:1px solid rgba(0,0,0,.12);border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.metric-export-btn svg{flex-shrink:0}.metric-export-btn:hover{background:#f1f5f9;color:#0f172a;border-color:#0003}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-conv-search{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid #E4E7EC;border-radius:6px;background:#fff;min-width:240px;transition:border-color .15s,box-shadow .15s}.detail-conv-search:focus-within{border-color:#0ea5e9;box-shadow:0 0 0 3px #0ea5e91f}.detail-conv-search-input{flex:1;border:none;outline:none;background:transparent;font-size:13px;color:#1e293b}.detail-conv-search-input::placeholder{color:#98a2b3}.detail-conv-search-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:transparent;color:#98a2b3;cursor:pointer}.detail-conv-search-clear:hover{background:#f1f5f9;color:#334155}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}.cap-overlay{position:fixed;inset:0;background:#0f172a73;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:1200;animation:capFade .18s ease-out}.cap-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,92vw);max-height:86vh;background:#fff;border-radius:12px;box-shadow:0 24px 60px #0f172a40;z-index:1201;display:flex;flex-direction:column;overflow:hidden;animation:capPop .2s ease-out}@keyframes capFade{0%{opacity:0}to{opacity:1}}@keyframes capPop{0%{opacity:0;transform:translate(-50%,-48%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.cap-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 20px 14px;border-bottom:1px solid #E5E7EB}.cap-titles{min-width:0}.cap-title{font-size:16px;font-weight:700;color:#0f172a;line-height:1.3}.cap-subtitle{margin-top:4px;font-size:12px;color:#64748b}.cap-chip-inline{display:inline-block;padding:2px 8px;border-radius:999px;background:#e0f2fe;color:#0369a1;font-weight:600;margin-left:4px;font-size:11px}.cap-close{background:transparent;border:none;width:28px;height:28px;border-radius:6px;font-size:22px;line-height:1;color:#64748b;cursor:pointer;flex-shrink:0}.cap-close:hover{background:#f1f5f9;color:#0f172a}.cap-body{padding:16px 20px;overflow-y:auto;flex:1}.cap-loading{display:flex;align-items:center;justify-content:center;gap:10px;padding:48px 0;color:#64748b;font-size:13px}.cap-spinner{width:18px;height:18px;border:2px solid #E2E8F0;border-top-color:#0ea5e9;border-radius:50%;animation:capSpin .8s linear infinite}@keyframes capSpin{to{transform:rotate(360deg)}}.cap-error{padding:24px;text-align:center;color:#b91c1c;background:#fef2f2;border:1px solid #FECACA;border-radius:8px;font-size:13px}.cap-empty{padding:36px 0;text-align:center;color:#94a3b8;font-size:13px}.cap-summary{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#f8fafc;border:1px solid #E2E8F0;border-radius:8px;margin-bottom:12px}.cap-summary .cap-summary-label{font-size:12px;color:#64748b;font-weight:500}.cap-summary .cap-summary-value{font-size:15px;font-weight:700;color:#0f172a}.cap-table-wrap{border:1px solid #E5E7EB;border-radius:8px;overflow:hidden}.cap-table{width:100%;border-collapse:collapse;font-size:13px}.cap-table thead th{background:#f8fafc;color:#475569;font-weight:600;font-size:11px;text-transform:none;letter-spacing:.02em;padding:10px 14px;text-align:left;border-bottom:1px solid #E5E7EB}.cap-table .cap-th-count{width:80px;text-align:right}.cap-table .cap-th-share{width:200px}.cap-table tbody tr{border-bottom:1px solid #F1F5F9}.cap-table tbody tr:last-child{border-bottom:none}.cap-table tbody tr:hover{background:#f8fafc}.cap-table td{padding:10px 14px;color:#0f172a;vertical-align:middle}.cap-table .cap-td-name{font-weight:500;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cap-table .cap-td-count{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;color:#334155}.cap-table .cap-td-share{display:flex;align-items:center;gap:8px}.cap-bar{flex:1;height:6px;background:#e2e8f0;border-radius:999px;overflow:hidden}.cap-bar-fill{height:100%;background:linear-gradient(90deg,#38bdf8,#0ea5e9);border-radius:999px;transition:width .3s ease}.cap-bar-pct{font-size:11px;font-weight:600;color:#0369a1;font-variant-numeric:tabular-nums;min-width:40px;text-align:right}.cap-footer{padding:12px 20px;border-top:1px solid #E5E7EB;display:flex;justify-content:flex-end;background:#fafbfc}.cap-btn-close{padding:8px 18px;border-radius:6px;border:1px solid #CBD5E1;background:#fff;color:#334155;font-size:13px;font-weight:600;cursor:pointer}.cap-btn-close:hover{background:#f1f5f9;border-color:#94a3b8}.bbs-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;width:100%;align-items:stretch}.bbs-panel{display:flex;flex-direction:column;border:1px solid #E5E7EB;border-radius:10px;background:#fff;overflow:hidden;height:100%}.bbs-panel-head{padding:12px 14px 8px;border-bottom:1px solid #F1F5F9}.bbs-panel-title{font-size:14px;font-weight:700;color:#0f172a;line-height:1.2}.bbs-panel-sub{font-size:12px;color:#64748b;margin-top:2px}.bbs-list{flex:1;max-height:360px;overflow-y:auto;padding:4px 0}.bbs-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #F1F5F9;font-size:13px;color:#334155}.bbs-row:last-child{border-bottom:none}.bbs-row-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:12px}.bbs-row-count{font-weight:600;color:#475569;font-variant-numeric:tabular-nums}.bbs-row-clickable{cursor:pointer;transition:background-color .12s ease}.bbs-row-clickable:hover{background-color:#f8fafc}.bbs-row-selected{background-color:#eff6ff}.bbs-row-selected .bbs-row-label{color:#1d4ed8;font-weight:600}.bbs-row-selected .bbs-row-count{color:#1d4ed8}.bbs-row-selected:hover{background-color:#dbeafe}.bbs-empty{padding:16px 14px;font-size:12px;color:#94a3b8;text-align:center}.echo-inline-date{position:relative;display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;margin-left:12px}.echo-inline-date svg{flex-shrink:0}.echo-inline-date-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;min-width:200px;cursor:pointer}.echo-filter-wrap{position:relative;margin-left:8px}.echo-filter-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background-color .12s ease,border-color .12s ease}.echo-filter-btn:hover{background:#f8fafc;border-color:#cbd5e1}.echo-filter-popup{position:absolute;top:calc(100% + 6px);right:0;width:560px;background:#fff;border-radius:12px;box-shadow:0 12px 36px #0f172a1f;border:1px solid #EAECF0;z-index:100;display:flex;flex-direction:column;max-height:520px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.efp-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #EAECF0}.efp-title{font-size:14px;font-weight:600;color:#101828;letter-spacing:-.1px}.efp-search{display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid #EAECF0;border-radius:8px;background:#fff;width:220px}.efp-search-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;width:100%}.efp-search-input::placeholder{color:#98a2b3;font-weight:400}.efp-body{display:grid;grid-template-columns:210px 1fr;flex:1;min-height:0}.efp-tabs{list-style:none;margin:0;padding:8px 0;border-right:1px solid #EAECF0;overflow-y:auto}.efp-tabs li{display:flex;align-items:center;justify-content:space-between;padding:11px 20px;font-size:13px;font-weight:500;color:#475467;cursor:pointer;transition:color .12s ease,background-color .12s ease}.efp-tabs li:hover{color:#101828}.efp-tabs li.active{background:#eff8ff;color:#2e90fa;font-weight:600}.efp-tab-count{background:#f2f4f7;color:#475467;min-width:22px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;border-radius:999px;font-size:11px;font-weight:600;line-height:1}.efp-tabs li.active .efp-tab-count{background:#d1e9ff;color:#2e90fa}.efp-pane{padding:12px 16px;overflow-y:auto;max-height:360px}.efp-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:6px;margin:0}.efp-row:hover{background:#f9fafb}.efp-row .form-check-input{width:16px;height:16px;margin:0;border:1.5px solid #D0D5DD;border-radius:4px;flex-shrink:0;cursor:pointer}.efp-row .form-check-input:checked{background-color:#2e90fa;border-color:#2e90fa}.efp-row .form-check-input:focus{box-shadow:0 0 0 3px #2e90fa26;border-color:#2e90fa}.efp-row .form-check-label{flex:1;font-size:13px;font-weight:400;color:#344054;margin:0;line-height:1.4;cursor:pointer}.efp-row-all{border-bottom:1px solid #EAECF0;margin-bottom:4px;padding-bottom:10px}.efp-row-all label{font-weight:500;color:#475467}.efp-empty{padding:24px 12px;text-align:center;font-size:12px;color:#94a3b8}.efp-downtime{display:grid;grid-template-columns:1fr;gap:8px;padding:12px 8px}.efp-downtime-label{font-size:12px;font-weight:600;color:#475569;margin:8px 0 0}.efp-downtime-input{padding:8px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px;outline:0}.efp-downtime-input:focus{border-color:#93c5fd}.efp-foot{display:flex;align-items:center;justify-content:space-between;padding:12px 18px;border-top:1px solid #F1F5F9}.efp-reset{background:transparent;border:0;color:#475569;font-size:13px;font-weight:500;cursor:pointer;padding:6px 0}.efp-reset:hover{color:#1d4ed8}.efp-foot-actions{display:flex;gap:8px}.efp-cancel,.efp-apply{padding:7px 18px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid transparent}.efp-cancel{background:#fff;border-color:#e2e8f0;color:#475569}.efp-cancel:hover{background:#f8fafc}.efp-apply{background:#2563eb;color:#fff}.efp-apply:hover{background:#1d4ed8}\n"] }]
|
|
1916
|
+
args: [{ selector: 'lib-tango-echo', template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No conversations found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ cohortList.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ displayName(selectedCohortName) }}</span>\n <span class=\"flex-spacer\"></span>\n\n <!-- Audio Source filter (Overall Transcripts only) -->\n <div *ngIf=\"isOverallTranscriptsCohort && audioSourceOptions.length\" class=\"agent-dropdown-wrap me-3\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleAudioSourceDropdown()\">\n <span class=\"cohort-dd-trigger-name\">{{ selectedAudioSourceLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"audioSourceDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"audioSourceDropdownOpen\">\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let opt of audioSourceOptions\"\n class=\"agent-dd-item\"\n [class.selected]=\"opt.value === selectedAudioSource\"\n (click)=\"selectAudioSource(opt)\">\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ opt.label }}</div>\n </div>\n <svg *ngIf=\"opt.value === selectedAudioSource\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n </div>\n </div>\n <div *ngIf=\"audioSourceDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeAudioSourceDropdown()\"></div>\n </div>\n\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\" [class.is-loading]=\"isCohortLoading\">\n <div class=\"agent-dropdown-trigger\"\n [class.disabled]=\"isCohortLoading\"\n [attr.aria-disabled]=\"isCohortLoading\"\n (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ displayName(selectedCohortName) || 'Select Agent' }}</span>\n <svg *ngIf=\"!isCohortLoading\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n <svg *ngIf=\"isCohortLoading\" class=\"cohort-dd-spinner\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M12 2a10 10 0 0 1 10 10\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen && !isCohortLoading\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ displayName(c.cohortName || c.name) }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen && !isCohortLoading\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE' || card.type === 'BOOLEAN_BASKET_CHART' || (card.type === 'BOOLEAN_BASKET' && card.isFunnel)\"\n [class.metric-card-dynamic--full]=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ displayName(card.name) }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <button type=\"button\" class=\"metric-export-btn\"\n *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\"\n title=\"Export to Excel\"\n (click)=\"exportBbtCard(card)\"><span>Export</span> \n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>\n </button>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\"\n (click)=\"onCategoryAnalysisClick(row, chip, $event)\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\"\n (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\" (click)=\"onCategoryAnalysisClick(row, undefined, $event)\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-stack-list\">\n <div *ngFor=\"let bar of card.selectedStackedBars\" class=\"bbc-stack-row\">\n <div class=\"bbc-stack-label\">{{ bar.label }}</div>\n <div class=\"bbc-stack-track\" [class.bbc-stack-track--empty]=\"bar.total === 0\">\n <div *ngFor=\"let seg of bar.segments\"\n class=\"bbc-stack-seg\"\n [style.width.%]=\"seg.percent\"\n [style.background]=\"seg.color\">\n <span *ngIf=\"seg.percent >= 10\" class=\"bbc-stack-seg-text\">{{ seg.percent }}%</span>\n <div class=\"bbc-stack-tooltip\">\n <div class=\"bbc-stack-tooltip-title\">{{ bar.label }} \u00B7 {{ seg.label }}</div>\n <div class=\"bbc-stack-tooltip-body\">{{ seg.count }} ({{ seg.percent }}%)</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bbc-stack-axis\">\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n <div class=\"bbc-legend-grid\">\n <div *ngFor=\"let item of card.selectedLegend\" class=\"bbc-legend-item\">\n <span class=\"bbc-legend-swatch\" [style.background]=\"item.color\"></span>\n <span class=\"bbc-legend-text\">{{ item.label }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_SEPORATOR \u2014 two list panels (content tags + measurements) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_SEPORATOR'\">\n <div class=\"bbs-grid\">\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">Categories</div>\n <div class=\"bbs-panel-sub\">{{ card.tagRows?.length || 0 }} items</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.tagRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.tagRows?.length\">No data</div>\n </div>\n </div>\n <div class=\"bbs-panel\">\n <div class=\"bbs-panel-head\">\n <div class=\"bbs-panel-title\">{{ card.measureTitle }}</div>\n <div class=\"bbs-panel-sub\">{{ card.measureSubtitle }}</div>\n </div>\n <div class=\"bbs-list\">\n <div class=\"bbs-row bbs-row-clickable\" *ngFor=\"let r of card.measureRows; let i = index\"\n [class.bbs-row-top]=\"i === 0\"\n [class.bbs-row-selected]=\"(r.id && selectedCardId === r.id) || (!r.id && selectedCardName === r.label)\"\n (click)=\"onCardRowClick(r.id, r.label)\">\n <span class=\"bbs-row-label\" [title]=\"r.label\">{{ r.label }}</span>\n <span class=\"bbs-row-count\">{{ r.count }}</span>\n </div>\n <div class=\"bbs-empty\" *ngIf=\"!card.measureRows?.length\">No data</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n <span class=\"flex-spacer\"></span>\n <div class=\"detail-conv-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\"\n class=\"detail-conv-search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"detailSearchValue\"\n (keyup.enter)=\"onDetailSearch()\">\n <button type=\"button\"\n class=\"detail-conv-search-clear\"\n *ngIf=\"detailSearchValue\"\n (click)=\"clearDetailSearch()\"\n title=\"Clear\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <!-- Inline date + Filter button (Overall Transcripts only) -->\n <ng-container *ngIf=\"isViewOverallTranscripts\">\n <div class=\"echo-inline-date\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <input type=\"text\"\n class=\"echo-inline-date-input\"\n ngxDaterangepickerMd\n [drops]=\"'down'\"\n [opens]=\"'left'\"\n [ranges]=\"echoDateRanges\"\n [showCustomRangeLabel]=\"true\"\n [autoApply]=\"true\"\n [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\"\n [showCancel]=\"true\"\n [readonly]=\"true\"\n autocomplete=\"off\"\n [(ngModel)]=\"echoDateRange\"\n (datesUpdated)=\"onEchoDateChange($event)\"\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\n name=\"echoDaterange\" />\n </div>\n <div class=\"echo-filter-wrap\">\n <button type=\"button\" class=\"echo-filter-btn\" (click)=\"echoFilterOpen ? closeEchoFilter() : openEchoFilter()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Filter</span>\n </button>\n\n <!-- Popup -->\n <div class=\"echo-filter-popup\" *ngIf=\"echoFilterOpen\" (click)=\"$event.stopPropagation()\">\n <div class=\"efp-head\">\n <span class=\"efp-title\">Filter by</span>\n <div class=\"efp-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\" class=\"efp-search-input\" [placeholder]=\"echoFilterTab === 'stores' ? 'Search Stores' : 'Search'\" [(ngModel)]=\"echoFilterSearch\" (ngModelChange)=\"onEchoFilterSearchChange()\" />\n </div>\n </div>\n\n <div class=\"efp-body\">\n <ul class=\"efp-tabs\">\n <li [class.active]=\"echoFilterTab === 'status'\" (click)=\"setEchoFilterTab('status')\">\n <span>Status</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterStatusCount\">{{ echoFilterStatusCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'country'\" (click)=\"setEchoFilterTab('country')\">\n <span>Country</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterCountryCount\">{{ echoFilterCountryCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'region'\" (click)=\"setEchoFilterTab('region')\">\n <span>Region</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterRegionCount\">{{ echoFilterRegionCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'clusters'\" (click)=\"setEchoFilterTab('clusters')\">\n <span>Clusters</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterClusterCount\">{{ echoFilterClusterCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'stores'\" (click)=\"setEchoFilterTab('stores')\">\n <span>Stores</span><span class=\"efp-tab-count\">{{ echoFilterStoreCount }}</span>\n </li>\n <li [class.active]=\"echoFilterTab === 'downtime'\" (click)=\"setEchoFilterTab('downtime')\">\n <span>Downtime (In Mins)</span><span class=\"efp-tab-count\" *ngIf=\"echoFilterDowntimeCount\">{{ echoFilterDowntimeCount }}</span>\n </li>\n </ul>\n\n <div class=\"efp-pane\">\n <div class=\"form-check efp-row efp-row-all\" *ngIf=\"echoFilterVisibleRows.length > 0\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"efp-select-all\"\n [checked]=\"echoFilterAllSelected\"\n (change)=\"echoFilterToggleAll($any($event.target).checked)\" />\n <label class=\"form-check-label\" for=\"efp-select-all\">Select All</label>\n </div>\n <div class=\"form-check efp-row\" *ngFor=\"let r of echoFilterVisibleRows; trackBy: trackEchoFilterRow\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\n [id]=\"'efp-row-' + r.id\"\n [(ngModel)]=\"r.ref.checked\"\n (ngModelChange)=\"onEchoFilterRowChange()\" />\n <label class=\"form-check-label\" [for]=\"'efp-row-' + r.id\">{{ r.label }}</label>\n </div>\n <div class=\"efp-empty\" *ngIf=\"!echoFilterVisibleRows.length\">No options available</div>\n </div>\n </div>\n\n <div class=\"efp-foot\">\n <button type=\"button\" class=\"efp-reset\" (click)=\"echoFilterReset()\">Reset Filters</button>\n <div class=\"efp-foot-actions\">\n <button type=\"button\" class=\"efp-cancel\" (click)=\"closeEchoFilter()\">Cancel</button>\n <button type=\"button\" class=\"efp-apply\" (click)=\"echoFilterApply()\">Apply</button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ displayName(cohort.cohortName || cohort.name) }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 CATEGORY ANALYSIS POPUP \u2550\u2550\u2550 -->\n<div class=\"cap-overlay\" *ngIf=\"categoryPopupOpen\" (click)=\"closeCategoryPopup()\"></div>\n<div class=\"cap-modal\" *ngIf=\"categoryPopupOpen\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"cap-header\">\n <div class=\"cap-titles\">\n <div class=\"cap-title\">{{ categoryAnalysisCategory || 'Category' }} Analysis</div>\n <div class=\"cap-subtitle\" *ngIf=\"categoryAnalysisAttribute\">\n Filtered by <span class=\"cap-chip-inline\">{{ categoryAnalysisAttribute }}</span>\n </div>\n </div>\n <button class=\"cap-close\" (click)=\"closeCategoryPopup()\" aria-label=\"Close\">\u00D7</button>\n </div>\n\n <div class=\"cap-body\">\n <div class=\"cap-loading\" *ngIf=\"categoryAnalysisLoading\">\n <div class=\"cap-spinner\"></div>\n <span>Loading\u2026</span>\n </div>\n\n <div class=\"cap-error\" *ngIf=\"!categoryAnalysisLoading && categoryAnalysisError\">\n {{ categoryAnalysisError }}\n </div>\n\n <ng-container *ngIf=\"!categoryAnalysisLoading && !categoryAnalysisError\">\n <div class=\"cap-summary\" *ngIf=\"categoryAnalysisRows.length\">\n <span class=\"cap-summary-label\">Total conversations</span>\n <span class=\"cap-summary-value\">{{ categoryAnalysisTotal }}</span>\n </div>\n\n <div class=\"cap-table-wrap\" *ngIf=\"categoryAnalysisRows.length; else capEmpty\">\n <table class=\"cap-table\">\n <thead>\n <tr>\n <th class=\"cap-th-name\">Attribute</th>\n <th class=\"cap-th-count\">Conversations</th>\n <th class=\"cap-th-share\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of categoryAnalysisRows\">\n <td class=\"cap-td-name\" [title]=\"r.name\">{{ r.name }}</td>\n <td class=\"cap-td-count\">{{ r.count }}</td>\n <td class=\"cap-td-share\">\n <div class=\"cap-bar\">\n <div class=\"cap-bar-fill\" [style.width.%]=\"r.percent\"></div>\n </div>\n <span class=\"cap-bar-pct\">{{ r.percent }}%</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <ng-template #capEmpty>\n <div class=\"cap-empty\">No data available for this selection.</div>\n </ng-template>\n </ng-container>\n </div>\n\n <div class=\"cap-footer\">\n <button class=\"cap-btn-close\" (click)=\"closeCategoryPopup()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0;cursor:pointer}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}.metric-card-dynamic--full{grid-column:1/-1}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:14px;padding:8px 4px}.bbc-bar-list{display:flex;flex-direction:column;gap:14px;width:100%;padding:4px 2px}.bbc-bar-row{cursor:pointer;padding:8px 10px;border-radius:8px}.bbc-bar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px}.bbc-bar-label{display:inline-flex;align-items:center;gap:8px;color:#1e293b;font-weight:500;letter-spacing:.1px}.bbc-bar-dot{width:8px;height:8px;border-radius:50%;display:inline-block;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #0f172a14}.bbc-bar-pct{color:#0f172a;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}.bbc-bar-track{height:10px;background:linear-gradient(180deg,#f1f5f9,#e2e8f0);border-radius:999px;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-bar-fill{height:100%;border-radius:999px;background-image:linear-gradient(180deg,#ffffff40,#fff0 55%);background-blend-mode:overlay;transition:width .35s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px #0f172a1f}.bbc-stack-list{display:flex;flex-direction:column;gap:14px;padding:4px 2px}.bbc-stack-row{display:grid;grid-template-columns:88px 1fr;align-items:center;gap:14px}.bbc-stack-label{font-size:13px;font-weight:600;color:#334155;text-align:right}.bbc-stack-track{display:flex;width:100%;height:32px;background:#f1f5f9;border-radius:6px;overflow:visible;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-stack-track--empty{background:repeating-linear-gradient(45deg,#f8fafc,#f8fafc 6px,#f1f5f9 6px 12px)}.bbc-stack-seg{position:relative;height:100%;display:flex;align-items:center;justify-content:center;transition:width .3s ease}.bbc-stack-seg:first-child{border-radius:4px 0 0 4px}.bbc-stack-seg:last-child{border-radius:0 4px 4px 0}.bbc-stack-seg:first-child:last-child{border-radius:4px}.bbc-stack-seg:not(:last-child){border-right:1px solid rgba(255,255,255,.5)}.bbc-stack-seg:hover .bbc-stack-tooltip{opacity:1;transform:translate(-50%);pointer-events:auto}.bbc-stack-seg-text{font-size:12px;font-weight:700;color:#fff;font-variant-numeric:tabular-nums;text-shadow:0 1px 1px rgba(0,0,0,.2);pointer-events:none}.bbc-stack-tooltip{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%,-4px);background:#0f172a;color:#fff;padding:6px 10px;border-radius:6px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s,transform .15s;z-index:20;box-shadow:0 4px 12px #0f172a40}.bbc-stack-tooltip:after{content:\"\";position:absolute;bottom:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-bottom-color:#0f172a}.bbc-stack-tooltip-title{font-weight:600;margin-bottom:2px}.bbc-stack-tooltip-body{color:#cbd5e1;font-variant-numeric:tabular-nums}.bbc-stack-axis{display:flex;justify-content:space-between;margin-left:102px;margin-top:8px;font-size:11px;color:#98a2b3;font-variant-numeric:tabular-nums}.bbc-stack-axis>span{flex:0 0 auto}.bbc-legend-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 14px;margin-top:16px;padding-top:12px;border-top:1px solid #E4E7EC}.bbc-legend-item{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:#475569;min-width:0}.bbc-legend-swatch{width:10px;height:10px;border-radius:2px;flex-shrink:0}.bbc-legend-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s,opacity .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-trigger.disabled{cursor:not-allowed;opacity:.55;pointer-events:none}.agent-dropdown-trigger.disabled:hover{border-color:#d0d5dd}.cohort-dd-spinner{animation:cohort-dd-spin .7s linear infinite}@keyframes cohort-dd-spin{to{transform:rotate(360deg)}}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-export-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 12px;border:1px solid rgba(0,0,0,.12);border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.metric-export-btn svg{flex-shrink:0}.metric-export-btn:hover{background:#f1f5f9;color:#0f172a;border-color:#0003}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-conv-search{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid #E4E7EC;border-radius:6px;background:#fff;min-width:240px;transition:border-color .15s,box-shadow .15s}.detail-conv-search:focus-within{border-color:#0ea5e9;box-shadow:0 0 0 3px #0ea5e91f}.detail-conv-search-input{flex:1;border:none;outline:none;background:transparent;font-size:13px;color:#1e293b}.detail-conv-search-input::placeholder{color:#98a2b3}.detail-conv-search-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:transparent;color:#98a2b3;cursor:pointer}.detail-conv-search-clear:hover{background:#f1f5f9;color:#334155}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}.cap-overlay{position:fixed;inset:0;background:#0f172a73;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:1200;animation:capFade .18s ease-out}.cap-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,92vw);max-height:86vh;background:#fff;border-radius:12px;box-shadow:0 24px 60px #0f172a40;z-index:1201;display:flex;flex-direction:column;overflow:hidden;animation:capPop .2s ease-out}@keyframes capFade{0%{opacity:0}to{opacity:1}}@keyframes capPop{0%{opacity:0;transform:translate(-50%,-48%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.cap-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 20px 14px;border-bottom:1px solid #E5E7EB}.cap-titles{min-width:0}.cap-title{font-size:16px;font-weight:700;color:#0f172a;line-height:1.3}.cap-subtitle{margin-top:4px;font-size:12px;color:#64748b}.cap-chip-inline{display:inline-block;padding:2px 8px;border-radius:999px;background:#e0f2fe;color:#0369a1;font-weight:600;margin-left:4px;font-size:11px}.cap-close{background:transparent;border:none;width:28px;height:28px;border-radius:6px;font-size:22px;line-height:1;color:#64748b;cursor:pointer;flex-shrink:0}.cap-close:hover{background:#f1f5f9;color:#0f172a}.cap-body{padding:16px 20px;overflow-y:auto;flex:1}.cap-loading{display:flex;align-items:center;justify-content:center;gap:10px;padding:48px 0;color:#64748b;font-size:13px}.cap-spinner{width:18px;height:18px;border:2px solid #E2E8F0;border-top-color:#0ea5e9;border-radius:50%;animation:capSpin .8s linear infinite}@keyframes capSpin{to{transform:rotate(360deg)}}.cap-error{padding:24px;text-align:center;color:#b91c1c;background:#fef2f2;border:1px solid #FECACA;border-radius:8px;font-size:13px}.cap-empty{padding:36px 0;text-align:center;color:#94a3b8;font-size:13px}.cap-summary{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#f8fafc;border:1px solid #E2E8F0;border-radius:8px;margin-bottom:12px}.cap-summary .cap-summary-label{font-size:12px;color:#64748b;font-weight:500}.cap-summary .cap-summary-value{font-size:15px;font-weight:700;color:#0f172a}.cap-table-wrap{border:1px solid #E5E7EB;border-radius:8px;overflow:hidden}.cap-table{width:100%;border-collapse:collapse;font-size:13px}.cap-table thead th{background:#f8fafc;color:#475569;font-weight:600;font-size:11px;text-transform:none;letter-spacing:.02em;padding:10px 14px;text-align:left;border-bottom:1px solid #E5E7EB}.cap-table .cap-th-count{width:80px;text-align:right}.cap-table .cap-th-share{width:200px}.cap-table tbody tr{border-bottom:1px solid #F1F5F9}.cap-table tbody tr:last-child{border-bottom:none}.cap-table tbody tr:hover{background:#f8fafc}.cap-table td{padding:10px 14px;color:#0f172a;vertical-align:middle}.cap-table .cap-td-name{font-weight:500;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cap-table .cap-td-count{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;color:#334155}.cap-table .cap-td-share{display:flex;align-items:center;gap:8px}.cap-bar{flex:1;height:6px;background:#e2e8f0;border-radius:999px;overflow:hidden}.cap-bar-fill{height:100%;background:linear-gradient(90deg,#38bdf8,#0ea5e9);border-radius:999px;transition:width .3s ease}.cap-bar-pct{font-size:11px;font-weight:600;color:#0369a1;font-variant-numeric:tabular-nums;min-width:40px;text-align:right}.cap-footer{padding:12px 20px;border-top:1px solid #E5E7EB;display:flex;justify-content:flex-end;background:#fafbfc}.cap-btn-close{padding:8px 18px;border-radius:6px;border:1px solid #CBD5E1;background:#fff;color:#334155;font-size:13px;font-weight:600;cursor:pointer}.cap-btn-close:hover{background:#f1f5f9;border-color:#94a3b8}.bbs-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;width:100%;align-items:stretch}.bbs-panel{display:flex;flex-direction:column;border:1px solid #E5E7EB;border-radius:10px;background:#fff;overflow:hidden;height:100%}.bbs-panel-head{padding:12px 14px 8px;border-bottom:1px solid #F1F5F9}.bbs-panel-title{font-size:14px;font-weight:700;color:#0f172a;line-height:1.2}.bbs-panel-sub{font-size:12px;color:#64748b;margin-top:2px}.bbs-list{flex:1;max-height:360px;overflow-y:auto;padding:4px 0}.bbs-row{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #F1F5F9;font-size:13px;color:#334155}.bbs-row:last-child{border-bottom:none}.bbs-row-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:12px}.bbs-row-count{font-weight:600;color:#475569;font-variant-numeric:tabular-nums}.bbs-row-clickable{cursor:pointer;transition:background-color .12s ease}.bbs-row-clickable:hover{background-color:#f8fafc}.bbs-row-selected{background-color:#eff6ff}.bbs-row-selected .bbs-row-label{color:#1d4ed8;font-weight:600}.bbs-row-selected .bbs-row-count{color:#1d4ed8}.bbs-row-selected:hover{background-color:#dbeafe}.bbs-empty{padding:16px 14px;font-size:12px;color:#94a3b8;text-align:center}.echo-inline-date{position:relative;display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;margin-left:12px}.echo-inline-date svg{flex-shrink:0}.echo-inline-date-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;min-width:200px;cursor:pointer}.echo-filter-wrap{position:relative;margin-left:8px}.echo-filter-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid #E2E8F0;border-radius:8px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background-color .12s ease,border-color .12s ease}.echo-filter-btn:hover{background:#f8fafc;border-color:#cbd5e1}.echo-filter-popup{position:absolute;top:calc(100% + 6px);right:0;width:560px;background:#fff;border-radius:12px;box-shadow:0 12px 36px #0f172a1f;border:1px solid #EAECF0;z-index:100;display:flex;flex-direction:column;max-height:520px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.efp-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid #EAECF0}.efp-title{font-size:14px;font-weight:600;color:#101828;letter-spacing:-.1px}.efp-search{display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid #EAECF0;border-radius:8px;background:#fff;width:220px}.efp-search-input{border:0;outline:0;background:transparent;font-size:13px;color:#344054;width:100%}.efp-search-input::placeholder{color:#98a2b3;font-weight:400}.efp-body{display:grid;grid-template-columns:210px 1fr;flex:1;min-height:0}.efp-tabs{list-style:none;margin:0;padding:8px 0;border-right:1px solid #EAECF0;overflow-y:auto}.efp-tabs li{display:flex;align-items:center;justify-content:space-between;padding:11px 20px;font-size:13px;font-weight:500;color:#475467;cursor:pointer;transition:color .12s ease,background-color .12s ease}.efp-tabs li:hover{color:#101828}.efp-tabs li.active{background:#eff8ff;color:#2e90fa;font-weight:600}.efp-tab-count{background:#f2f4f7;color:#475467;min-width:22px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;border-radius:999px;font-size:11px;font-weight:600;line-height:1}.efp-tabs li.active .efp-tab-count{background:#d1e9ff;color:#2e90fa}.efp-pane{padding:12px 16px;overflow-y:auto;max-height:360px}.efp-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:6px;margin:0}.efp-row:hover{background:#f9fafb}.efp-row .form-check-input{width:16px;height:16px;margin:0;border:1.5px solid #D0D5DD;border-radius:4px;flex-shrink:0;cursor:pointer}.efp-row .form-check-input:checked{background-color:#2e90fa;border-color:#2e90fa}.efp-row .form-check-input:focus{box-shadow:0 0 0 3px #2e90fa26;border-color:#2e90fa}.efp-row .form-check-label{flex:1;font-size:13px;font-weight:400;color:#344054;margin:0;line-height:1.4;cursor:pointer}.efp-row-all{border-bottom:1px solid #EAECF0;margin-bottom:4px;padding-bottom:10px}.efp-row-all label{font-weight:500;color:#475467}.efp-empty{padding:24px 12px;text-align:center;font-size:12px;color:#94a3b8}.efp-downtime{display:grid;grid-template-columns:1fr;gap:8px;padding:12px 8px}.efp-downtime-label{font-size:12px;font-weight:600;color:#475569;margin:8px 0 0}.efp-downtime-input{padding:8px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px;outline:0}.efp-downtime-input:focus{border-color:#93c5fd}.efp-foot{display:flex;align-items:center;justify-content:space-between;padding:12px 18px;border-top:1px solid #F1F5F9}.efp-reset{background:transparent;border:0;color:#475569;font-size:13px;font-weight:500;cursor:pointer;padding:6px 0}.efp-reset:hover{color:#1d4ed8}.efp-foot-actions{display:flex;gap:8px}.efp-cancel,.efp-apply{padding:7px 18px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid transparent}.efp-cancel{background:#fff;border-color:#e2e8f0;color:#475569}.efp-cancel:hover{background:#f8fafc}.efp-apply{background:#2563eb;color:#fff}.efp-apply:hover{background:#1d4ed8}\n"] }]
|
|
1908
1917
|
}], ctorParameters: () => [{ type: i1.AudioService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i4.AuthService }, { type: i0.ElementRef }], propDecorators: { hasOverallTranscriptsHostClass: [{
|
|
1909
1918
|
type: HostBinding,
|
|
1910
1919
|
args: ['class.echo-overall-transcripts-host']
|
|
@@ -1912,4 +1921,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1912
1921
|
type: HostListener,
|
|
1913
1922
|
args: ['document:click', ['$event']]
|
|
1914
1923
|
}] } });
|
|
1915
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tZWNoby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1haS1hdWRpby9zcmMvbGliL2NvbXBvbmVudHMvdGFuZ28tZWNoby90YW5nby1lY2hvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFpLWF1ZGlvL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1lY2hvL3RhbmdvLWVjaG8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7Ozs7Ozs7Ozs7QUFVMUIsTUFBTSxPQUFPLGtCQUFrQjtJQStNbkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbE5WLElBQ0ksOEJBQThCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsV0FBVyxHQUFpRCxlQUFlLENBQUM7SUFFNUUsc0RBQXNEO0lBQ3RELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUN4QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLFVBQVUsR0FBUSxFQUFFLENBQUM7SUFDckIsS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUVoQixzREFBc0Q7SUFDdEQsaUJBQWlCLEdBQVEsSUFBSSxDQUFDO0lBQzlCLHNCQUFzQixHQUFH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QUFPLENBQUMsTUFBTSxDQUFDO0lBQ2pCLENBQUM7d0dBbjdEVSxrQkFBa0I7NEZBQWxCLGtCQUFrQixvT0NmL0Isc3hxREE4MEJBOzs0RkQvekJhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7dU5BT3RCLDhCQUE4QjtzQkFEakMsV0FBVzt1QkFBQyxxQ0FBcUM7Z0JBcWhCbEQseUJBQXlCO3NCQUR4QixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgQXVkaW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXVkaW8uc2VydmljZSc7XG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXNoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi10YW5nby1lY2hvJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhbmdvLWVjaG8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YW5nby1lY2hvLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGFuZ29FY2hvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZWNoby1vdmVyYWxsLXRyYW5zY3JpcHRzLWhvc3QnKVxuICBnZXQgaGFzT3ZlcmFsbFRyYW5zY3JpcHRzSG9zdENsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmlld092ZXJhbGxUcmFuc2NyaXB0cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBOYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjdXJyZW50UGFnZTogJ2NvbnZlcnNhdGlvbnMnIHwgJ2FnZW50YW5hbHlzaXMnIHwgJ21hbmFnZScgPSAnY29udmVyc2F0aW9ucyc7XG5cbiAgLy8g4pSA4pSAIFVzZXIgLyBHbG9iYWwgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNsaWVudElkID0gJzExJztcbiAgc3RvcmVJZHM6IHN0cmluZ1tdID0gW107XG4gIHN0YXJ0RGF0ZSA9ICcnO1xuICBlbmREYXRlID0gJyc7XG4gIGhlYWRlckRhdGE6IGFueSA9IHt9O1xuICB1c2VyczogYW55ID0ge307XG5cbiAgLy8g4pSA4pSAIENvaG9ydCBTdW1tYXJ5IENhcmQgKE92ZXJhbGwgVHJhbnNjcmlwdHMpIOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb2hvcnRTdW1tYXJ5Q2FyZDogYW55ID0gbnVsbDtcbiAgaXNMb2FkaW5nQ29ob3J0U3VtbWFyeSA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBdWRpbyBTb3VyY2UgZmlsdGVyICh2aXNpYmxlIG9ubHkgZm9yIE92ZXJhbGwgVHJhbnNjcmlwdHMgY29ob3J0KSDilIDilIBcbiAgYXVkaW9Tb3VyY2VPcHRpb25zOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4gPSBbXTtcbiAgc2VsZWN0ZWRBdWRpb1NvdXJjZTogc3RyaW5nID0gJyc7XG4gIGF1ZGlvU291cmNlRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgZ2V0IGlzT3ZlcmFsbFRyYW5zY3JpcHRzQ29ob3J0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPT09ICdPdmVyYWxsX3RyYW5zY3JpcHRzX3YyJykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgbmFtZSA9ICh0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIG5hbWUgPT09ICdvdmVyYWxsIHRyYW5zY3JpcHRzJztcbiAgfVxuXG4gIGdldCBzZWxlY3RlZEF1ZGlvU291cmNlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHQgPSB0aGlzLmF1ZGlvU291cmNlT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlKTtcbiAgICByZXR1cm4gb3B0Py5sYWJlbCB8fCB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UgfHwgJ1NlbGVjdCc7XG4gIH1cblxuICB0b2dnbGVBdWRpb1NvdXJjZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuYXVkaW9Tb3VyY2VEcm9wZG93bk9wZW4gPSAhdGhpcy5hdWRpb1NvdXJjZURyb3Bkb3duT3BlbjtcbiAgfVxuXG4gIGNsb3NlQXVkaW9Tb3VyY2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmF1ZGlvU291cmNlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RBdWRpb1NvdXJjZShvcHQ6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgdGhpcy5hdWRpb1NvdXJjZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlmIChvcHQudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSkgcmV0dXJuO1xuICAgIHRoaXMub25BdWRpb1NvdXJjZUNoYW5nZShvcHQudmFsdWUpO1xuICB9XG5cbiAgb25BdWRpb1NvdXJjZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdjb252ZXJzYXRpb25zJykge1xuICAgICAgdGhpcy5jb252UGFnZSA9IDE7XG4gICAgICB0aGlzLmZldGNoQ29udmVyc2F0aW9ucygpO1xuICAgICAgdGhpcy5mZXRjaENvaG9ydFN1bW1hcnlDYXJkKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcycgJiYgdGhpcy5kZXRhaWxWaWV3KSB7XG4gICAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBdWRpb1NvdXJjZU9wdGlvbnMocmF3OiBhbnkpOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xuICAgIGlmICghcmF3KSByZXR1cm4gW107XG4gICAgLy8gQWNjZXB0OiBhcnJheSBvZiBzdHJpbmdzLCBhcnJheSBvZiB7dmFsdWUsbGFiZWx9IC8ge25hbWUsaWR9LCBvciBvYmplY3QgbWFwXG4gICAgbGV0IGxpc3Q6IGFueVtdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgbGlzdCA9IHJhdztcbiAgICBlbHNlIGlmICh0eXBlb2YgcmF3ID09PSAnb2JqZWN0JykgbGlzdCA9IE9iamVjdC5rZXlzKHJhdyk7XG5cbiAgICByZXR1cm4gbGlzdFxuICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpdGVtID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBTdHJpbmcoaXRlbSksIGxhYmVsOiBTdHJpbmcoaXRlbSkgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0udmFsdWUgPz8gaXRlbS5pZCA/PyBpdGVtLmtleSA/PyBpdGVtLm5hbWUgPz8gaXRlbS5hdWRpb1NvdXJjZSA/PyAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtLmxhYmVsID8/IGl0ZW0ubmFtZSA/PyBpdGVtLnRpdGxlID8/IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHsgdmFsdWU6IFN0cmluZyh2YWx1ZSksIGxhYmVsOiBTdHJpbmcobGFiZWwpIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHgpOiB4IGlzIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9ID0+ICEheCk7XG4gIH1cblxuICAvLyDilIDilIAgQ29udmVyc2F0aW9ucyAodHJhbnNjcmlwdC1saXN0IEFQSSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnZlcnNhdGlvbnM6IGFueVtdID0gW107XG4gIGNvbnZQYWdlID0gMTtcbiAgY29udlBlclBhZ2UgPSAxMDtcbiAgY29udlRvdGFsID0gMDtcbiAgY29udlRvdGFsUGFnZXMgPSAxO1xuICBjb252UGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgNTAsIDEwMF07XG4gIGNvbnZMb2FkaW5nID0gZmFsc2U7XG4gIGNvbnZTZWFyY2hRdWVyeSA9ICcnO1xuICBleHBhbmRlZENvbnZJZHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgY29udlRhYnM6IHsgW2NvbnZJZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICAvLyBBSSBDaGF0XG4gIGNvbnZBaVJlcGx5ID0gJyc7XG4gIGNvbnZBaUxvYWRpbmcgPSBmYWxzZTtcblxuICAvLyDilIDilIAgQWdlbnQgQW5hbHlzaXMgKGNvaG9ydC9hdWRpby1wYWdlIEFQSSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvaG9ydExpc3Q6IGFueVtdID0gW107XG4gIHNlbGVjdGVkQ29ob3J0SWQgPSAnJztcbiAgc2VsZWN0ZWRDb2hvcnROYW1lID0gJyc7XG4gIGNvaG9ydENhcmRzOiBhbnlbXSA9IFtdO1xuICBjYXJkc0xvYWRpbmcgPSBmYWxzZTtcbiAgZGV0YWlsVmlldyA9IGZhbHNlO1xuICBwcml2YXRlIF9pbml0RG9uZSA9IGZhbHNlO1xuICBhbmFseXNpc1NlYXJjaCA9ICcnO1xuXG4gIGdldCBhY3RpdmVDb2hvcnRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2hvcnRMaXN0LmZpbHRlcigoYzogYW55KSA9PiBjLm1ldHJpY3NBZGRlZCA+IDApO1xuICB9XG5cbiAgZ2V0IG51bWVyaWNTdHJpcENhcmQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jb2hvcnRDYXJkcy5maW5kKChjOiBhbnkpID0+IGMudHlwZSA9PT0gJ05VTUVSSUNfR1JPVVAnKSB8fCBudWxsO1xuICB9XG5cbiAgZ2V0IG5vbk51bWVyaWNDYXJkcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29ob3J0Q2FyZHMuZmlsdGVyKChjOiBhbnkpID0+IGMudHlwZSAhPT0gJ05VTUVSSUNfR1JPVVAnKTtcbiAgfVxuXG4gIGdldE51bWVyaWNUaWxlQ29sb3IoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcGFsZXR0ZSA9IFsnI0U1NDg0RCcsICcjRjVBNjIzJywgJyM3QzVDRkMnLCAnIzE2QTM0QScsICcjMEVBNUU5JywgJyNFQzQ4OTknXTtcbiAgICByZXR1cm4gcGFsZXR0ZVtpbmRleCAlIHBhbGV0dGUubGVuZ3RoXTtcbiAgfVxuXG4gIC8vIERldGFpbCBjb252ZXJzYXRpb25zIChmcm9tIGNvaG9ydCBjYXJkIGNsaWNrKVxuICBkZXRhaWxDb252ZXJzYXRpb25zOiBhbnlbXSA9IFtdO1xuICBkZXRhaWxQYWdlID0gMTtcbiAgZGV0YWlsUGVyUGFnZSA9IDEwO1xuICBkZXRhaWxUb3RhbFBhZ2VzID0gMTtcbiAgZGV0YWlsVG90YWwgPSAwO1xuICBkZXRhaWxQYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCA1MCwgMTAwXTtcbiAgZGV0YWlsUGFnZUNvbnZzOiBhbnlbXSA9IFtdO1xuICBkZXRhaWxPcGVuSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBkZXRhaWxMb2FkaW5nID0gZmFsc2U7XG4gIGRldGFpbENvbnZEZXRhaWw6IGFueSA9IG51bGw7XG4gIGRldGFpbFNlYXJjaFZhbHVlID0gJyc7XG5cbiAgLy8g4pSA4pSAIE1hbmFnZSAoY29ob3J0IENSVUQgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgbWFuYWdlQ29ob3J0czogYW55W10gPSBbXTtcbiAgbWFuYWdlTG9hZGluZyA9IGZhbHNlO1xuICBtYW5hZ2VQYWdlID0gMTtcbiAgbWFuYWdlUGVyUGFnZSA9IDEwO1xuICBtYW5hZ2VUb3RhbCA9IDA7XG4gIG1hbmFnZVRvdGFsUGFnZXMgPSAxO1xuICBtYW5hZ2VQYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XG4gIG1hbmFnZVNlYXJjaCA9ICcnO1xuXG4gIC8vIOKUgOKUgCBBdWRpbyBQbGF5ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHBsYXlpbmdDb252SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB3YXZlZm9ybUhlaWdodHM6IG51bWJlcltdID0gW107XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVdhdmVmb3JtKCk6IHZvaWQge1xuICAgIC8vIEdlbmVyYXRlIH4yMDAgYmFycyB3aXRoIG5hdHVyYWwgd2F2ZWZvcm0gcGF0dGVyblxuICAgIGNvbnN0IGJhcnM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDA7IGkrKykge1xuICAgICAgY29uc3QgaCA9IE1hdGgubWF4KDMsIE1hdGguYWJzKE1hdGguc2luKGkgKiAwLjE1KSAqIDI4ICsgTWF0aC5zaW4oaSAqIDAuNCkgKiAxMiArIE1hdGguY29zKGkgKiAwLjA4KSAqIDgpKTtcbiAgICAgIGJhcnMucHVzaChNYXRoLnJvdW5kKGgpKTtcbiAgICB9XG4gICAgdGhpcy53YXZlZm9ybUhlaWdodHMgPSBiYXJzO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvaG9ydCBEcm9wZG93biDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29ob3J0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIGNvaG9ydERyb3Bkb3duU2VhcmNoID0gJyc7XG5cbiAgdG9nZ2xlQ29ob3J0RHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93bk9wZW4gPSAhdGhpcy5jb2hvcnREcm9wZG93bk9wZW47XG4gICAgaWYgKHRoaXMuY29ob3J0RHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoID0gJyc7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VDb2hvcnREcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcbiAgfVxuXG4gIHNlbGVjdENvaG9ydEZyb21Ecm9wZG93bihjb2hvcnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gY29ob3J0LmNvaG9ydElkIHx8IGNvaG9ydC5pZCB8fCBjb2hvcnQuX2lkIHx8ICcnO1xuICAgIHRoaXMuY29ob3J0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93blNlYXJjaCA9ICcnO1xuICAgIHRoaXMub25Db2hvcnREcm9wZG93bkNoYW5nZShpZCk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWREcm9wZG93bkNvaG9ydHMoKTogYW55W10ge1xuICAgIGlmICghdGhpcy5jb2hvcnREcm9wZG93blNlYXJjaCkgcmV0dXJuIHRoaXMuY29ob3J0TGlzdDtcbiAgICBjb25zdCBxID0gdGhpcy5jb2hvcnREcm9wZG93blNlYXJjaC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmNvaG9ydExpc3QuZmlsdGVyKChjOiBhbnkpID0+ICgoYy5jb2hvcnROYW1lIHx8IGMubmFtZSB8fCAnJykgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGaWx0ZXJzIERyYXdlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZHJhd2VyT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIERlZmF1bHQgc3RvcmUgbGlzdCAoc2FtZSBhcyBleGlzdGluZyBhdWRpby1wYWdlL3RyYW5zY3JpcHQtbGlzdClcbiAgcHJpdmF0ZSBkZWZhdWx0U3RvcmVzID0gW1xuICAgICcxMS0xMDYyJywgJzExLTEwNzgnLCAnMTEtMTA4MycsICcxMS0xNTE1JywgJzExLTE1NCcsICcxMS0xNjI2JyxcbiAgICAnMTEtMTgxJywgJzExLTE5NDcnLCAnMTEtMTk5NCcsICcxMS0yMDAnLCAnMTEtMjAyJywgJzExLTIxNScsXG4gICAgJzExLTI2MCcsICcxMS03OCcsICcxMS04MTknXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdWRpb1NlcnZpY2U6IEF1ZGlvU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgKSB7XG4gICAgdGhpcy5nZW5lcmF0ZVdhdmVmb3JtKCk7XG4gIH1cblxuICAvLyBTeW5jID92aWV3PW92ZXJhbGwtdHJhbnNjcmlwdHMgaW4gdGhlIFVSTCB3aGVuIEFnZW50IEFuYWx5c2lzIGlzIHNob3dpbmdcbiAgLy8gdGhlIE92ZXJhbGwgVHJhbnNjcmlwdHMgY29ob3J0IGRldGFpbC4gUmVtb3ZlZCBmb3IgYW55IG90aGVyIGNvaG9ydCBvclxuICAvLyB3aGVuIGxlYXZpbmcgdGhlIGRldGFpbCB2aWV3LlxuICAvLyDilIDilIAgSW5saW5lIGRhdGUgcmFuZ2UgcGlja2VyIChPdmVyYWxsIFRyYW5zY3JpcHRzIHZpZXcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBlY2hvRGF0ZVJhbmdlOiBhbnkgPSB7IHN0YXJ0RGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgzMCwgJ2RheScpLCBlbmREYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXknKSB9O1xuICBlY2hvRGF0ZVJhbmdlczogYW55ID0ge1xuICAgIFRvZGF5OiBbZGF5anMoKSwgZGF5anMoKV0sXG4gICAgWWVzdGVyZGF5OiBbZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5JyksIGRheWpzKCkuc3VidHJhY3QoMSwgJ2RheScpXSxcbiAgICAnVGhpcyBXZWVrJzogW2RheWpzKCkuc3VidHJhY3QoNywgJ2RheScpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXknKV0sXG4gICAgJ0xhc3QgV2Vlayc6IFtkYXlqcygpLnN1YnRyYWN0KDE0LCAnZGF5Jykuc3RhcnRPZignZGF5JyksIGRheWpzKCkuc3VidHJhY3QoOCwgJ2RheScpLmVuZE9mKCdkYXknKV0sXG4gICAgJ1RoaXMgTW9udGgnOiBbZGF5anMoKS5zdWJ0cmFjdCgzMCwgJ2RheScpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXknKV0sXG4gICAgJ0xhc3QgTW9udGgnOiBbZGF5anMoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5zdGFydE9mKCdtb250aCcpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpXVxuICB9O1xuXG4gIGluaXRFY2hvRGF0ZVJhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGFydERhdGUgfHwgdGhpcy5nZXRTdGFydERhdGUoKTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLmVuZERhdGUgfHwgdGhpcy5nZXRFbmREYXRlKCk7XG4gICAgY29uc3QgcyA9IGRheWpzKHN0YXJ0LCAnWVlZWS1NTS1ERCcpO1xuICAgIGNvbnN0IGUgPSBkYXlqcyhlbmQsICdZWVlZLU1NLUREJyk7XG4gICAgaWYgKHMuaXNWYWxpZCgpICYmIGUuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLmVjaG9EYXRlUmFuZ2UgPSB7IHN0YXJ0RGF0ZTogcywgZW5kRGF0ZTogZSB9O1xuICAgIH1cbiAgfVxuXG4gIG9uRWNob0RhdGVDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghZXZlbnQ/LnN0YXJ0RGF0ZSB8fCAhZXZlbnQ/LmVuZERhdGUpIHJldHVybjtcbiAgICBjb25zdCBzID0gZGF5anMoZXZlbnQuc3RhcnREYXRlKTtcbiAgICBjb25zdCBlID0gZGF5anMoZXZlbnQuZW5kRGF0ZSk7XG4gICAgaWYgKCFzLmlzVmFsaWQoKSB8fCAhZS5pc1ZhbGlkKCkpIHJldHVybjtcbiAgICBjb25zdCBzdGFydFN0ciA9IHMuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgY29uc3QgZW5kU3RyID0gZS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICBpZiAoc3RhcnRTdHIgPT09IHRoaXMuc3RhcnREYXRlICYmIGVuZFN0ciA9PT0gdGhpcy5lbmREYXRlKSByZXR1cm47XG4gICAgdGhpcy5zdGFydERhdGUgPSBzdGFydFN0cjtcbiAgICB0aGlzLmVuZERhdGUgPSBlbmRTdHI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpO1xuICAgICAgY29uc3QgaGY6IGFueSA9IHJhdyA/IEpTT04ucGFyc2UocmF3KSA6IHt9O1xuICAgICAgaGYuZGF0ZSA9IHsgc3RhcnREYXRlOiBzdGFydFN0ciwgZW5kRGF0ZTogZW5kU3RyIH07XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeShoZikpO1xuICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KGhmKTtcbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnICYmIHRoaXMuZGV0YWlsVmlldykge1xuICAgICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICAgIHRoaXMuZmV0Y2hDb2hvcnRDYXJkcygpO1xuICAgICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSW5saW5lIHJpY2ggZmlsdGVyIHBvcHVwIChPdmVyYWxsIFRyYW5zY3JpcHRzIHZpZXcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBlY2hvRmlsdGVyT3BlbiA9IGZhbHNlO1xuICBlY2hvRmlsdGVyVGFiOiAnc3RhdHVzJyB8ICdjb3VudHJ5JyB8ICdyZWdpb24nIHwgJ2NsdXN0ZXJzJyB8ICdzdG9yZXMnIHwgJ2Rvd250aW1lJyA9ICdzdG9yZXMnO1xuICBlY2hvRmlsdGVyU2VhcmNoID0gJyc7XG4gIGVjaG9GaWx0ZXJTdGF0dXM6IHsgbGFiZWw6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9W10gPSBbXG4gICAgeyBsYWJlbDogJ0FjdGl2ZScsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJ0luYWN0aXZlJywgY2hlY2tlZDogZmFsc2UgfVxuICBdO1xuICBlY2hvRmlsdGVyQ291bnRyaWVzOiB7IGNvdW50cnk6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgZWNob0ZpbHRlclJlZ2lvbnM6IHsgY2l0eTogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH1bXSA9IFtdO1xuICBlY2hvRmlsdGVyQ2x1c3RlcnM6IHsgZ3JvdXBOYW1lOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGVjaG9GaWx0ZXJTdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBzdG9yZU5hbWU6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgLy8gRG93bnRpbWU6IHByZXNldCByYW5nZXMgKHNhbWUgc2V0IGFzIHRoZSBnbG9iYWwgdHJhZmZpYy1oZWFkZXIpXG4gIGVjaG9GaWx0ZXJEb3dudGltZU9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9W10gPSBbXG4gICAgeyBsYWJlbDogJzAtMTIwIG1pbnMnLCB2YWx1ZTogJzAtMTIwJywgY2hlY2tlZDogZmFsc2UgfSxcbiAgICB7IGxhYmVsOiAnMTIxLTM2MCBtaW5zJywgdmFsdWU6ICcxMjEtMzYwJywgY2hlY2tlZDogZmFsc2UgfSxcbiAgICB7IGxhYmVsOiAnMzYxLTYwMCBtaW5zJywgdmFsdWU6ICczNjEtNjAwJywgY2hlY2tlZDogZmFsc2UgfSxcbiAgICB7IGxhYmVsOiAnNjAxKyBtaW5zJywgdmFsdWU6ICc2MDErJywgY2hlY2tlZDogZmFsc2UgfVxuICBdO1xuXG4gIGdldCBlY2hvRmlsdGVyU3RhdHVzQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZWNob0ZpbHRlclN0YXR1cy5maWx0ZXIocyA9PiBzLmNoZWNrZWQpLmxlbmd0aDsgfVxuICBnZXQgZWNob0ZpbHRlckNvdW50cnlDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5lY2hvRmlsdGVyQ291bnRyaWVzLmZpbHRlcihjID0+IGMuY2hlY2tlZCkubGVuZ3RoOyB9XG4gIGdldCBlY2hvRmlsdGVyUmVnaW9uQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZWNob0ZpbHRlclJlZ2lvbnMuZmlsdGVyKHIgPT4gci5jaGVja2VkKS5sZW5ndGg7IH1cbiAgZ2V0IGVjaG9GaWx0ZXJDbHVzdGVyQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZWNob0ZpbHRlckNsdXN0ZXJzLmZpbHRlcihjID0+IGMuY2hlY2tlZCkubGVuZ3RoOyB9XG4gIGdldCBlY2hvRmlsdGVyU3RvcmVDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5lY2hvRmlsdGVyU3RvcmVzLmZpbHRlcihzID0+IHMuY2hlY2tlZCkubGVuZ3RoOyB9XG4gIGdldCBlY2hvRmlsdGVyRG93bnRpbWVDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5lY2hvRmlsdGVyRG93bnRpbWVPcHRpb25zLmZpbHRlcihkID0+IGQuY2hlY2tlZCkubGVuZ3RoOyB9XG4gIGdldCBlY2hvRmlsdGVyRG93bnRpbWVBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmVjaG9GaWx0ZXJEb3dudGltZUNvdW50ID4gMDsgfVxuXG4gIGxvYWRFY2hvRmlsdGVyc0Zyb21TdG9yYWdlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKTtcbiAgICAgIGNvbnN0IGhmOiBhbnkgPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiB7fTtcbiAgICAgIHRoaXMuZWNob0ZpbHRlckNvdW50cmllcyA9IEFycmF5LmlzQXJyYXkoaGYuY291bnRyeSlcbiAgICAgICAgPyBoZi5jb3VudHJ5Lm1hcCgoYzogYW55KSA9PiAoeyBjb3VudHJ5OiBjLmNvdW50cnksIGNoZWNrZWQ6ICEhYy5jaGVja2VkIH0pKSA6IFtdO1xuICAgICAgdGhpcy5lY2hvRmlsdGVyUmVnaW9ucyA9IEFycmF5LmlzQXJyYXkoaGYubG9jYXRpb24pXG4gICAgICAgID8gaGYubG9jYXRpb24ubWFwKChsOiBhbnkpID0+ICh7IGNpdHk6IGwuY2l0eSwgY2hlY2tlZDogISFsLmNoZWNrZWQgfSkpIDogW107XG4gICAgICB0aGlzLmVjaG9GaWx0ZXJDbHVzdGVycyA9IEFycmF5LmlzQXJyYXkoaGYuZ3JvdXApXG4gICAgICAgID8gaGYuZ3JvdXAubWFwKChnOiBhbnkpID0+ICh7IGdyb3VwTmFtZTogZy5ncm91cE5hbWUsIGNoZWNrZWQ6ICEhZy5jaGVja2VkIH0pKSA6IFtdO1xuICAgICAgdGhpcy5lY2hvRmlsdGVyU3RvcmVzID0gQXJyYXkuaXNBcnJheShoZi5zdG9yZXMpXG4gICAgICAgID8gaGYuc3RvcmVzLm1hcCgoczogYW55KSA9PiAoeyBzdG9yZUlkOiBzLnN0b3JlSWQsIHN0b3JlTmFtZTogcy5zdG9yZU5hbWUsIGNoZWNrZWQ6IHMuY2hlY2tlZCAhPT0gZmFsc2UgfSkpIDogW107XG5cbiAgICAgIC8vIFJlc3RvcmUgU3RhdHVzIHNlbGVjdGlvbiBmcm9tIHRoZSBzaGFyZWQgYHN0YXR1c2Aga2V5IChzYW1lIG9uZSB0aGVcbiAgICAgIC8vIGdsb2JhbCB0cmFmZmljLWhlYWRlciB3cml0ZXMg4oCUIGUuZy4gW1wiYWN0aXZlXCJdKS5cbiAgICAgIGNvbnN0IHNhdmVkU3RhdHVzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkoaGYuc3RhdHVzKSA/IGhmLnN0YXR1cyA6IFtdO1xuICAgICAgY29uc3Qgc3RhdHVzU2V0ID0gbmV3IFNldChzYXZlZFN0YXR1cy5tYXAoKHM6IHN0cmluZykgPT4gKHMgfHwgJycpLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIHRoaXMuZWNob0ZpbHRlclN0YXR1cy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICBzLmNoZWNrZWQgPSBzdGF0dXNTZXQuaGFzKHMubGFiZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUmVzdG9yZSBEb3dudGltZSBzZWxlY3Rpb24gZnJvbSB0aGUgc2hhcmVkIGBkb3dudGltZWAga2V5LlxuICAgICAgY29uc3Qgc2F2ZWREb3dudGltZTogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGhmLmRvd250aW1lKSA/IGhmLmRvd250aW1lIDogW107XG4gICAgICBjb25zdCBkb3dudGltZVNldCA9IG5ldyBTZXQoc2F2ZWREb3dudGltZSk7XG4gICAgICB0aGlzLmVjaG9GaWx0ZXJEb3dudGltZU9wdGlvbnMuZm9yRWFjaChkID0+IHtcbiAgICAgICAgZC5jaGVja2VkID0gZG93bnRpbWVTZXQuaGFzKGQudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gIH1cblxuICBvcGVuRWNob0ZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRFY2hvRmlsdGVyc0Zyb21TdG9yYWdlKCk7XG4gICAgdGhpcy5lY2hvRmlsdGVyVGFiID0gJ3N0b3Jlcyc7XG4gICAgdGhpcy5lY2hvRmlsdGVyU2VhcmNoID0gJyc7XG4gICAgdGhpcy5lY2hvRmlsdGVyT3BlbiA9IHRydWU7XG4gICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICAvLyBQb3B1bGF0ZSBDb3VudHJ5IC8gUmVnaW9uIC8gQ2x1c3RlciBvcHRpb25zIGZyb20gdGhlIHNhbWUgQVBJcyB0aGVcbiAgICAvLyBnbG9iYWwgdHJhZmZpYy1oZWFkZXIgdXNlcy4gVGhlIE92ZXJhbGwgVHJhbnNjcmlwdHMgcGFnZSBtb3VudHMgdGhlXG4gICAgLy8gc2luZ2xlU2VsZWN0IHRvb2xiYXIgKHRvb2xiYXIuY29tcG9uZW50LnRzOjIyNCkgd2hpY2ggZG9lcyBOT1QgZmV0Y2hcbiAgICAvLyB0aGVzZSBsaXN0cywgc28gdGhlIHBvcHVwIHdvdWxkIG90aGVyd2lzZSBzaG93IFwiTm8gb3B0aW9ucyBhdmFpbGFibGVcIi5cbiAgICB0aGlzLmZldGNoRWNob0ZpbHRlck9wdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGVjaG9GaWx0ZXJDbGllbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsaWVudElkIHx8IHRoaXMudXNlcnM/LmNsaWVudElkIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZWNob0ZpbHRlclN0YXR1c1ZhbHVlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGlja3MgPSB0aGlzLmVjaG9GaWx0ZXJTdGF0dXMuZmlsdGVyKHMgPT4gcy5jaGVja2VkKS5tYXAocyA9PiBzLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgIHJldHVybiBwaWNrcy5sZW5ndGggPyBwaWNrcyA6IFsnYWN0aXZlJ107XG4gIH1cblxuICBwcml2YXRlIGdldCBlY2hvRmlsdGVyQ2hlY2tlZENvdW50cmllcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZWNob0ZpbHRlckNvdW50cmllcy5maWx0ZXIoYyA9PiBjLmNoZWNrZWQpLm1hcChjID0+IGMuY291bnRyeSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBlY2hvRmlsdGVyQ2hlY2tlZENpdGllcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZWNob0ZpbHRlclJlZ2lvbnMuZmlsdGVyKHIgPT4gci5jaGVja2VkKS5tYXAociA9PiByLmNpdHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZWNob0ZpbHRlckNoZWNrZWRDbHVzdGVycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZWNob0ZpbHRlckNsdXN0ZXJzLmZpbHRlcihjID0+IGMuY2hlY2tlZCkubWFwKGMgPT4gYy5ncm91cE5hbWUpO1xuICB9XG5cbiAgLy8gSW5pdGlhbCBmZXRjaCB3aGVuIHRoZSBwb3B1cCBvcGVucy4gTG9hZHMgYWxsIGZvdXIgY2FzY2FkZWQgbGlzdHMuXG4gIHByaXZhdGUgZmV0Y2hFY2hvRmlsdGVyT3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWNob0ZpbHRlckNsaWVudElkKSByZXR1cm47XG4gICAgdGhpcy5mZXRjaEVjaG9Db3VudHJpZXMoKTtcbiAgICB0aGlzLmZldGNoRWNob1JlZ2lvbnMoKTtcbiAgICB0aGlzLmZldGNoRWNob0NsdXN0ZXJzKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9TdG9yZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hFY2hvQ291bnRyaWVzKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5nZXRDb3VudHJ5KHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmVjaG9GaWx0ZXJDbGllbnRJZCxcbiAgICAgIHN0YXR1czogdGhpcy5lY2hvRmlsdGVyU3RhdHVzVmFsdWVzXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQodGhpcy5lY2hvRmlsdGVyQ2hlY2tlZENvdW50cmllcyk7XG4gICAgICAgIHRoaXMuZWNob0ZpbHRlckNvdW50cmllcyA9IChyZXM/LmRhdGE/LmNvdW50cnlEYXRhIHx8IFtdKS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICBjb3VudHJ5OiBpdGVtLmNvdW50cnksXG4gICAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWQuaGFzKGl0ZW0uY291bnRyeSlcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAodGhpcy5lY2hvRmlsdGVyVGFiID09PSAnY291bnRyeScpIHtcbiAgICAgICAgICB0aGlzLnJlYnVpbGRFY2hvRmlsdGVyUm93cygpO1xuICAgICAgICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoRWNob1JlZ2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoLmdldExvY2F0aW9uKHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmVjaG9GaWx0ZXJDbGllbnRJZCxcbiAgICAgIGNvdW50cnk6IHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDb3VudHJpZXMsXG4gICAgICBjaXR5OiBbXSwgZ3JvdXA6IFtdLFxuICAgICAgc3RhdHVzOiB0aGlzLmVjaG9GaWx0ZXJTdGF0dXNWYWx1ZXNcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCh0aGlzLmVjaG9GaWx0ZXJDaGVja2VkQ2l0aWVzKTtcbiAgICAgICAgdGhpcy5lY2hvRmlsdGVyUmVnaW9ucyA9IChyZXM/LmRhdGE/LmxvY2F0aW9uRGF0YSB8fCBbXSkubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgY2l0eTogaXRlbS5jaXR5LFxuICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkLmhhcyhpdGVtLmNpdHkpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHRoaXMuZWNob0ZpbHRlclRhYiA9PT0gJ3JlZ2lvbicpIHtcbiAgICAgICAgICB0aGlzLnJlYnVpbGRFY2hvRmlsdGVyUm93cygpO1xuICAgICAgICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoRWNob0NsdXN0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5nZXRHcm91cHMoe1xuICAgICAgY2xpZW50SWQ6IHRoaXMuZWNob0ZpbHRlckNsaWVudElkLFxuICAgICAgY291bnRyeTogdGhpcy5lY2hvRmlsdGVyQ2hlY2tlZENvdW50cmllcyxcbiAgICAgIGNpdHk6IHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDaXRpZXMsXG4gICAgICBncm91cDogW10sXG4gICAgICBzdGF0dXM6IHRoaXMuZWNob0ZpbHRlclN0YXR1c1ZhbHVlc1xuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDbHVzdGVycyk7XG4gICAgICAgIHRoaXMuZWNob0ZpbHRlckNsdXN0ZXJzID0gKHJlcz8uZGF0YT8uZ3JvdXBEYXRhIHx8IFtdKS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICBncm91cE5hbWU6IGl0ZW0uZ3JvdXBOYW1lLFxuICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkLmhhcyhpdGVtLmdyb3VwTmFtZSlcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAodGhpcy5lY2hvRmlsdGVyVGFiID09PSAnY2x1c3RlcnMnKSB7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICAgICAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2hlbiBhIGNhc2NhZGUgKGNvdW50cnkvcmVnaW9uL2NsdXN0ZXIvc3RhdHVzIGNoYW5nZSkgcmVmZXRjaGVzIHN0b3JlcyxcbiAgLy8gd2UgYXV0by1jaGVjayBldmVyeSByZXR1cm5lZCBzdG9yZSBzbyB0aGUgdXBzdHJlYW0gZmlsdGVyIGlzIGltbWVkaWF0ZWx5XG4gIC8vIGFwcGxpZWQuIFdoZW4gd2UncmUganVzdCByZWZyZXNoaW5nIHRoZSBzdG9yZXMgbGlzdCB3aXRob3V0IGEgY2FzY2FkZVxuICAvLyAoZS5nLiBpbml0aWFsIG9wZW4pLCB3ZSBwcmVzZXJ2ZSBhbnkgcHJpb3Igc2VsZWN0aW9uLlxuICBwcml2YXRlIGZldGNoRWNob1N0b3JlcyhhdXRvQ2hlY2tBbGw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5nZXRIZWFkZXJTdG9yZXMoe1xuICAgICAgY2xpZW50SWQ6IHRoaXMuZWNob0ZpbHRlckNsaWVudElkLFxuICAgICAgY291bnRyeTogdGhpcy5lY2hvRmlsdGVyQ2hlY2tlZENvdW50cmllcyxcbiAgICAgIGNpdHk6IHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDaXRpZXMsXG4gICAgICBjbHVzdGVyczogdGhpcy5lY2hvRmlsdGVyQ2hlY2tlZENsdXN0ZXJzLFxuICAgICAgc3RhdHVzOiB0aGlzLmVjaG9GaWx0ZXJTdGF0dXNWYWx1ZXNcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmICghcmVzIHx8IHJlcy5jb2RlICE9PSAyMDApIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RvcmVzRGF0YSA9IHJlcz8uZGF0YT8uc3RvcmVzRGF0YSB8fCBbXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNseUNoZWNrZWQgPSBuZXcgU2V0KFxuICAgICAgICAgIHRoaXMuZWNob0ZpbHRlclN0b3Jlcy5maWx0ZXIocyA9PiBzLmNoZWNrZWQpLm1hcChzID0+IHMuc3RvcmVJZClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaGFkUHJpb3JTZWxlY3Rpb24gPSBwcmV2aW91c2x5Q2hlY2tlZC5zaXplID4gMDtcbiAgICAgICAgdGhpcy5lY2hvRmlsdGVyU3RvcmVzID0gc3RvcmVzRGF0YS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgICBzdG9yZUlkOiBzLnN0b3JlSWQsXG4gICAgICAgICAgc3RvcmVOYW1lOiBzLnN0b3JlTmFtZSxcbiAgICAgICAgICBjaGVja2VkOiBhdXRvQ2hlY2tBbGxcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiAoaGFkUHJpb3JTZWxlY3Rpb24gPyBwcmV2aW91c2x5Q2hlY2tlZC5oYXMocy5zdG9yZUlkKSA6IHRydWUpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHRoaXMuZWNob0ZpbHRlclRhYiA9PT0gJ3N0b3JlcycpIHtcbiAgICAgICAgICB0aGlzLnJlYnVpbGRFY2hvRmlsdGVyUm93cygpO1xuICAgICAgICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBDYXNjYWRlIGhhbmRsZXJzIOKAlCBjYWxsZWQgd2hlbiBhIHJvdyBpbiB0aGUgbWF0Y2hpbmcgdGFiIGlzIHRvZ2dsZWQuXG4gIC8vIE1pcnJvcnMgdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LnRzIHVwZGF0ZVNlbGVjdGVkQ291bnRyaWVzL0xvY2F0aW9ucy9Hcm91cHMuXG4gIG9uRWNob0NvdW50cnlDaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gQ291bnRyeSBjaGFuZ2VkIOKGkiBpbnZhbGlkYXRlIGRvd25zdHJlYW0gbGlzdHMgYW5kIHJlZmV0Y2guIEF1dG8tY2hlY2tcbiAgICAvLyB0aGUgcmV0dXJuZWQgc3RvcmVzIHNvIHRoZSBuZXcgZ2VvZ3JhcGhpYyBzY29wZSBpcyBhcHBsaWVkIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMuZmV0Y2hFY2hvUmVnaW9ucygpO1xuICAgIHRoaXMuZmV0Y2hFY2hvQ2x1c3RlcnMoKTtcbiAgICB0aGlzLmZldGNoRWNob1N0b3Jlcyh0cnVlKTtcbiAgfVxuXG4gIG9uRWNob1JlZ2lvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZldGNoRWNob0NsdXN0ZXJzKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9TdG9yZXModHJ1ZSk7XG4gIH1cblxuICBvbkVjaG9DbHVzdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZmV0Y2hFY2hvU3RvcmVzKHRydWUpO1xuICB9XG5cbiAgb25FY2hvU3RhdHVzQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIFN0YXR1cyBhZmZlY3RzIGV2ZXJ5IGxpc3Qg4oCUIHJlZmV0Y2ggYWxsLlxuICAgIHRoaXMuZmV0Y2hFY2hvQ291bnRyaWVzKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9SZWdpb25zKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9DbHVzdGVycygpO1xuICAgIHRoaXMuZmV0Y2hFY2hvU3RvcmVzKHRydWUpO1xuICB9XG5cbiAgLy8gRG93bnRpbWUg4oaSIFN0b3JlcyBjYXNjYWRlLiBNaXJyb3JzIHRyYWZmaWMtaGVhZGVyLmRvd250aW1lQXBpKCk6XG4gIC8vIFBPU1QgL2dldC1zdG9yZS1saXN0LXYyIHdpdGggdGhlIGN1cnJlbnQgc3RvcmUgSURzICsgc2VsZWN0ZWQgZG93bnRpbWVcbiAgLy8gcmFuZ2VzICsgZGF0ZSByYW5nZS4gUmVzcG9uc2UgaXMgdGhlIHN1YnNldCBvZiBzdG9yZXMgd2hvc2UgZG93bnRpbWVcbiAgLy8gZmFsbHMgaW4gdGhlIHNlbGVjdGVkIHJhbmdlczsgd2UgbWFyayBvbmx5IHRob3NlIGFzIGNoZWNrZWQuXG4gIG9uRWNob0Rvd250aW1lQ2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGRvd250aW1lID0gdGhpcy5lY2hvRmlsdGVyRG93bnRpbWVPcHRpb25zLmZpbHRlcihkID0+IGQuY2hlY2tlZCkubWFwKGQgPT4gZC52YWx1ZSk7XG4gICAgaWYgKCFkb3dudGltZS5sZW5ndGgpIHtcbiAgICAgIC8vIE5vIGRvd250aW1lIGZpbHRlciBzZWxlY3RlZCDigJQgcmVzdG9yZSBcImFsbFwiIHN0YXRlIGZvciBzdG9yZXMuXG4gICAgICB0aGlzLmVjaG9GaWx0ZXJTdG9yZXMuZm9yRWFjaChzID0+IHMuY2hlY2tlZCA9IHRydWUpO1xuICAgICAgaWYgKHRoaXMuZWNob0ZpbHRlclRhYiA9PT0gJ3N0b3JlcycpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICAgICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuZWNob0ZpbHRlckNsaWVudElkLFxuICAgICAgc3RvcmVJZDogdGhpcy5lY2hvRmlsdGVyU3RvcmVzLm1hcChzID0+IHMuc3RvcmVJZCksXG4gICAgICBkb3dudGltZSxcbiAgICAgIGZyb21EYXRlOiB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgIHRvRGF0ZTogdGhpcy5lbmREYXRlXG4gICAgfTtcblxuICAgIHRoaXMuYXV0aC5nZXREb3dudGltZUhlYWRlcihvYmopLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFyZXMgfHwgcmVzLmNvZGUgIT09IDIwMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBtYXRjaGluZ0lkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgKHJlcz8uZGF0YT8uc3RvcmVzRGF0YSB8fCBbXSkubWFwKChkOiBhbnkpID0+IGQuc3RvcmVJZClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lY2hvRmlsdGVyU3RvcmVzLmZvckVhY2gocyA9PiBzLmNoZWNrZWQgPSBtYXRjaGluZ0lkcy5oYXMocy5zdG9yZUlkKSk7XG4gICAgICAgIGlmICh0aGlzLmVjaG9GaWx0ZXJUYWIgPT09ICdzdG9yZXMnKSB7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICAgICAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VFY2hvRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuZWNob0ZpbHRlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmVjaG9GaWx0ZXJTZWFyY2ggPSAnJztcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrRWNob0ZpbHRlcihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lY2hvRmlsdGVyT3BlbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlIHwgbnVsbDtcbiAgICBjb25zdCB3cmFwID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVjaG8tZmlsdGVyLXdyYXAnKTtcbiAgICBpZiAod3JhcCAmJiB0YXJnZXQgJiYgIXdyYXAuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZUVjaG9GaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDYWNoZWQgdmlzaWJsZSByb3dzLiBSZWNvbXB1dGVkIG9ubHkgd2hlbiB0YWIvc2VhcmNoL3NvdXJjZSBkYXRhIGNoYW5nZVxuICAvLyB2aWEgcmVidWlsZEVjaG9GaWx0ZXJSb3dzKCkuIFJlYWRpbmcgYSBwbGFpbiBmaWVsZCBpcyBPKDEpIGZvciB0aGVcbiAgLy8gdGVtcGxhdGUsIHZzIHRoZSBwcmV2aW91cyBnZXR0ZXIgd2hpY2ggcmVtYXBwZWQgMjAwMCsgaXRlbXMgZXZlcnkgQ0RcbiAgLy8gY3ljbGUgYW5kIGNhdXNlZCBjbGljayBsYWcgcGx1cyByYWNlIGNvbmRpdGlvbnMuXG4gIGVjaG9GaWx0ZXJWaXNpYmxlUm93czogeyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByZWY6IHsgY2hlY2tlZDogYm9vbGVhbiB9IH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk6IHZvaWQge1xuICAgIGNvbnN0IHEgPSB0aGlzLmVjaG9GaWx0ZXJTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IHJvd3M6IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgcmVmOiB7IGNoZWNrZWQ6IGJvb2xlYW4gfSB9W10gPSBbXTtcbiAgICBzd2l0Y2ggKHRoaXMuZWNob0ZpbHRlclRhYikge1xuICAgICAgY2FzZSAnc3RhdHVzJzpcbiAgICAgICAgcm93cyA9IHRoaXMuZWNob0ZpbHRlclN0YXR1cy5tYXAocyA9PiAoeyBpZDogcy5sYWJlbCwgbGFiZWw6IHMubGFiZWwsIHJlZjogcyB9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgIHJvd3MgPSB0aGlzLmVjaG9GaWx0ZXJDb3VudHJpZXMubWFwKGMgPT4gKHsgaWQ6IGMuY291bnRyeSwgbGFiZWw6IGMuY291bnRyeSwgcmVmOiBjIH0pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWdpb24nOlxuICAgICAgICByb3dzID0gdGhpcy5lY2hvRmlsdGVyUmVnaW9ucy5tYXAociA9PiAoeyBpZDogci5jaXR5LCBsYWJlbDogci5jaXR5LCByZWY6IHIgfSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NsdXN0ZXJzJzpcbiAgICAgICAgcm93cyA9IHRoaXMuZWNob0ZpbHRlckNsdXN0ZXJzLm1hcChjID0+ICh7IGlkOiBjLmdyb3VwTmFtZSwgbGFiZWw6IGMuZ3JvdXBOYW1lLCByZWY6IGMgfSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0b3Jlcyc6XG4gICAgICAgIHJvd3MgPSB0aGlzLmVjaG9GaWx0ZXJTdG9yZXMubWFwKHMgPT4gKHsgaWQ6IHMuc3RvcmVJZCwgbGFiZWw6IHMuc3RvcmVOYW1lLCByZWY6IHMgfSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd250aW1lJzpcbiAgICAgICAgcm93cyA9IHRoaXMuZWNob0ZpbHRlckRvd250aW1lT3B0aW9ucy5tYXAoZCA9PiAoeyBpZDogZC52YWx1ZSwgbGFiZWw6IGQubGFiZWwsIHJlZjogZCB9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmVjaG9GaWx0ZXJWaXNpYmxlUm93cyA9IHEgPyByb3dzLmZpbHRlcihyID0+IHIubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiByb3dzO1xuICB9XG5cbiAgc2V0RWNob0ZpbHRlclRhYih0YWI6ICdzdGF0dXMnIHwgJ2NvdW50cnknIHwgJ3JlZ2lvbicgfCAnY2x1c3RlcnMnIHwgJ3N0b3JlcycgfCAnZG93bnRpbWUnKTogdm9pZCB7XG4gICAgdGhpcy5lY2hvRmlsdGVyVGFiID0gdGFiO1xuICAgIHRoaXMuZWNob0ZpbHRlclNlYXJjaCA9ICcnO1xuICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gIH1cblxuICBvbkVjaG9GaWx0ZXJTZWFyY2hDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgfVxuXG4gIHRyYWNrRWNob0ZpbHRlclJvdyA9IChfOiBudW1iZXIsIHI6IHsgaWQ6IHN0cmluZyB9KSA9PiByLmlkO1xuXG4gIC8vIFBsYWluIGZpZWxkLCByZWZyZXNoZWQgYnkgc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpIHdoZW5ldmVyIHJvd3NcbiAgLy8gb3Igcm93LmNoZWNrZWQgY2hhbmdlcy4gQXZvaWRzIGEgZ2V0dGVyIHRoYXQgcnVucyBvbiBldmVyeSBDRCBjeWNsZS5cbiAgZWNob0ZpbHRlckFsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5lY2hvRmlsdGVyVmlzaWJsZVJvd3M7XG4gICAgdGhpcy5lY2hvRmlsdGVyQWxsU2VsZWN0ZWQgPSByb3dzLmxlbmd0aCA+IDAgJiYgcm93cy5ldmVyeShyID0+IHIucmVmLmNoZWNrZWQpO1xuICB9XG5cbiAgZWNob0ZpbHRlclRvZ2dsZVJvdyhyZWY6IHsgY2hlY2tlZDogYm9vbGVhbiB9LCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgcmVmLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICB9XG5cbiAgZWNob0ZpbHRlclRvZ2dsZUFsbChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZWNob0ZpbHRlclZpc2libGVSb3dzKSB7XG4gICAgICByLnJlZi5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB9XG4gICAgdGhpcy5lY2hvRmlsdGVyQWxsU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgIHRoaXMub25FY2hvRmlsdGVyUm93Q2hhbmdlKCk7XG4gIH1cblxuICAvLyBTaW5nbGUgZW50cnkgcG9pbnQgZm9yIHJvdyB0b2dnbGVzIOKAlCBkaXNwYXRjaGVzIHRoZSBjYXNjYWRlIHJlZmV0Y2hcbiAgLy8gYmFzZWQgb24gdGhlIGFjdGl2ZSB0YWIuIE1pcnJvcnMgdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LnRzIGJlaGF2aW91clxuICAvLyB3aGVyZSBjaGFuZ2luZyBhIGNvdW50cnkgaW52YWxpZGF0ZXMgcmVnaW9ucy9jbHVzdGVycy9zdG9yZXMsIGV0Yy5cbiAgb25FY2hvRmlsdGVyUm93Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICAgIHN3aXRjaCAodGhpcy5lY2hvRmlsdGVyVGFiKSB7XG4gICAgICBjYXNlICdzdGF0dXMnOiB0aGlzLm9uRWNob1N0YXR1c0NoYW5nZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ2NvdW50cnknOiB0aGlzLm9uRWNob0NvdW50cnlDaGFuZ2UoKTsgYnJlYWs7XG4gICAgICBjYXNlICdyZWdpb24nOiB0aGlzLm9uRWNob1JlZ2lvbkNoYW5nZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ2NsdXN0ZXJzJzogdGhpcy5vbkVjaG9DbHVzdGVyQ2hhbmdlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAnZG93bnRpbWUnOiB0aGlzLm9uRWNob0Rvd250aW1lQ2hhbmdlKCk7IGJyZWFrO1xuICAgICAgLy8gJ3N0b3JlcycgaXMgdGVybWluYWwg4oCUIG5vIGRvd25zdHJlYW0gZGVwZW5kZW5jeVxuICAgIH1cbiAgfVxuXG4gIGVjaG9GaWx0ZXJSZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmVjaG9GaWx0ZXJTdGF0dXMuZm9yRWFjaChzID0+IHMuY2hlY2tlZCA9IGZhbHNlKTtcbiAgICB0aGlzLmVjaG9GaWx0ZXJDb3VudHJpZXMuZm9yRWFjaChjID0+IGMuY2hlY2tlZCA9IGZhbHNlKTtcbiAgICB0aGlzLmVjaG9GaWx0ZXJSZWdpb25zLmZvckVhY2gociA9PiByLmNoZWNrZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5lY2hvRmlsdGVyQ2x1c3RlcnMuZm9yRWFjaChjID0+IGMuY2hlY2tlZCA9IGZhbHNlKTtcbiAgICB0aGlzLmVjaG9GaWx0ZXJTdG9yZXMuZm9yRWFjaChzID0+IHMuY2hlY2tlZCA9IHRydWUpO1xuICAgIHRoaXMuZWNob0ZpbHRlckRvd250aW1lT3B0aW9ucy5mb3JFYWNoKGQgPT4gZC5jaGVja2VkID0gZmFsc2UpO1xuICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gIH1cblxuICBlY2hvRmlsdGVyQXBwbHkoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpO1xuICAgICAgY29uc3QgaGY6IGFueSA9IHJhdyA/IEpTT04ucGFyc2UocmF3KSA6IHt9O1xuICAgICAgaGYuY291bnRyeSA9IHRoaXMuZWNob0ZpbHRlckNvdW50cmllcy5tYXAoYyA9PiAoeyBjb3VudHJ5OiBjLmNvdW50cnksIGNoZWNrZWQ6IGMuY2hlY2tlZCB9KSk7XG4gICAgICBoZi5sb2NhdGlvbiA9IHRoaXMuZWNob0ZpbHRlclJlZ2lvbnMubWFwKHIgPT4gKHsgY2l0eTogci5jaXR5LCBjaGVja2VkOiByLmNoZWNrZWQgfSkpO1xuICAgICAgaGYuZ3JvdXAgPSB0aGlzLmVjaG9GaWx0ZXJDbHVzdGVycy5tYXAoYyA9PiAoeyBncm91cE5hbWU6IGMuZ3JvdXBOYW1lLCBjaGVja2VkOiBjLmNoZWNrZWQgfSkpO1xuICAgICAgaGYuc3RvcmVzID0gdGhpcy5lY2hvRmlsdGVyU3RvcmVzLm1hcChzID0+ICh7IHN0b3JlSWQ6IHMuc3RvcmVJZCwgc3RvcmVOYW1lOiBzLnN0b3JlTmFtZSwgY2hlY2tlZDogcy5jaGVja2VkIH0pKTtcbiAgICAgIC8vIFVzZSB0aGUgc2hhcmVkIGtleXMgKGBzdGF0dXNgLCBgZG93bnRpbWVgKSBzbyBsb2NhbFN0b3JhZ2Ugc3RhdGUgc3RheXNcbiAgICAgIC8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgZ2xvYmFsIHRyYWZmaWMtaGVhZGVyLlxuICAgICAgY29uc3QgY2hlY2tlZFN0YXR1cyA9IHRoaXMuZWNob0ZpbHRlclN0YXR1cy5maWx0ZXIocyA9PiBzLmNoZWNrZWQpLm1hcChzID0+IHMubGFiZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICBoZi5zdGF0dXMgPSBjaGVja2VkU3RhdHVzLmxlbmd0aCA/IGNoZWNrZWRTdGF0dXMgOiBbJ2FjdGl2ZSddO1xuICAgICAgaGYuZG93bnRpbWUgPSB0aGlzLmVjaG9GaWx0ZXJEb3dudGltZU9wdGlvbnMuZmlsdGVyKGQgPT4gZC5jaGVja2VkKS5tYXAoZCA9PiBkLnZhbHVlKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KGhmKSk7XG4gICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQoaGYpO1xuICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICAgIHRoaXMuY2xvc2VFY2hvRmlsdGVyKCk7XG4gICAgLy8gUmVmcmVzaCBkYXRhIGJhc2VkIG9uIG5ldyBzZWxlY3Rpb25zXG4gICAgdGhpcy5zdG9yZUlkcyA9IHRoaXMuZWNob0ZpbHRlclN0b3Jlcy5maWx0ZXIocyA9PiBzLmNoZWNrZWQpLm1hcChzID0+IHMuc3RvcmVJZCk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdhZ2VudGFuYWx5c2lzJyAmJiB0aGlzLmRldGFpbFZpZXcpIHtcbiAgICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgICB0aGlzLmZldGNoQ29ob3J0Q2FyZHMoKTtcbiAgICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBPVkVSQUxMX1RSQU5TQ1JJUFRTX1ZJRVcgPSAnb3ZlcmFsbC10cmFuc2NyaXB0cyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgT1ZFUkFMTF9UUkFOU0NSSVBUU19CT0RZX0NMQVNTID0gJ2VjaG8tb3ZlcmFsbC10cmFuc2NyaXB0cyc7XG5cbiAgZ2V0IGlzVmlld092ZXJhbGxUcmFuc2NyaXB0cygpOiBib29sZWFuIHtcbiAgICAvLyBVUkwgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBzbyBkaXJlY3QgbG9hZHMgLyByZWZyZXNoIG9uXG4gICAgLy8gP3ZpZXc9b3ZlcmFsbC10cmFuc2NyaXB0cyB3b3JrIGV2ZW4gYmVmb3JlIGNvaG9ydCBzdGF0ZSByZXN0b3Jlcy5cbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgndmlldycpID09PSB0aGlzLk9WRVJBTExfVFJBTlNDUklQVFNfVklFVykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcydcbiAgICAgICYmIHRoaXMuZGV0YWlsVmlld1xuICAgICAgJiYgdGhpcy5pc092ZXJhbGxUcmFuc2NyaXB0c0NvaG9ydDtcbiAgfVxuXG4gIHByaXZhdGUgc3luY092ZXJhbGxUcmFuc2NyaXB0c1F1ZXJ5UGFyYW0oKTogdm9pZCB7XG4gICAgLy8gRGVyaXZlZCBcInNob3VsZCBiZSBhY3RpdmVcIiBmcm9tIGNvbXBvbmVudCBzdGF0ZVxuICAgIGNvbnN0IGRlcml2ZWQgPSB0aGlzLmN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcycgJiYgdGhpcy5kZXRhaWxWaWV3ICYmIHRoaXMuaXNPdmVyYWxsVHJhbnNjcmlwdHNDb2hvcnQ7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3ZpZXcnKTtcbiAgICBjb25zdCB1cmxTYXlzID0gY3VycmVudCA9PT0gdGhpcy5PVkVSQUxMX1RSQU5TQ1JJUFRTX1ZJRVc7XG4gICAgLy8gQm9keSBjbGFzcyBpcyBPTiBpZiBFSVRIRVIgVVJMIG9yIGRlcml2ZWQgc3RhdGUgc2F5cyBzbyAoY292ZXJzIHRoZVxuICAgIC8vIGJyaWVmIHdpbmRvdyBkdXJpbmcgaW5pdGlhbCByZXN0b3JlIHdoZXJlIHN0YXRlIGhhc24ndCBjYXVnaHQgdXAgeWV0KS5cbiAgICBjb25zdCBhY3RpdmUgPSBkZXJpdmVkIHx8IHVybFNheXM7XG4gICAgLy8gVVJMIG11c3QgcmVmbGVjdCBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZS4gRG9uJ3QgdXNlIHVybFNheXMgYXMgYVxuICAgIC8vIGZhbGxiYWNrIGhlcmUg4oCUIHRoYXQgbWFrZXMgdGhlIHBhcmFtIHN0aWNreSB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlc1xuICAgIC8vIGZyb20gT3ZlcmFsbCBUcmFuc2NyaXB0cyB0byBhbm90aGVyIGNvaG9ydC5cbiAgICBjb25zdCB3YW50ID0gZGVyaXZlZCA/IHRoaXMuT1ZFUkFMTF9UUkFOU0NSSVBUU19WSUVXIDogbnVsbDtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQodGhpcy5PVkVSQUxMX1RSQU5TQ1JJUFRTX0JPRFlfQ0xBU1MpO1xuICAgICAgdGhpcy5pbml0RWNob0RhdGVSYW5nZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5PVkVSQUxMX1RSQU5TQ1JJUFRTX0JPRFlfQ0xBU1MpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudCA9PT0gd2FudCkgcmV0dXJuO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgcXVlcnlQYXJhbXM6IHsgdmlldzogd2FudCB9LFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIHJlcGxhY2VVcmw6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIDEuIEdldCB1c2VyIGluZm9cbiAgICBpZiAoJ3VzZXItaW5mbycgaW4gbG9jYWxTdG9yYWdlKSB7XG4gICAgICB0aGlzLnVzZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XG4gICAgICB0aGlzLmNsaWVudElkID0gdGhpcy51c2Vycz8uY2xpZW50SWQgfHwgJzExJztcbiAgICB9XG5cbiAgICAvLyAyLiBSZXN0b3JlIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBpZiAoJ2hlYWRlci1maWx0ZXJzJyBpbiBsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIHx8ICd7fScpO1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckZpbHRlcnM/LmNsaWVudCB8fCB0aGlzLmNsaWVudElkO1xuICAgICAgaWYgKGhlYWRlckZpbHRlcnM/LmRhdGU/LnN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZS5zdGFydERhdGU7XG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZS5lbmREYXRlO1xuICAgICAgfVxuICAgICAgaWYgKGhlYWRlckZpbHRlcnM/LnN0b3Jlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc3RvcmVJZHMgPSB0aGlzLmV4dHJhY3RDaGVja2VkU3RvcmVzKGhlYWRlckZpbHRlcnMuc3RvcmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyYi4gUmVzdG9yZSBkZXRhaWwgdmlldyBzdGF0ZSAoc3Vydml2ZXMgY29tcG9uZW50IHJlLWluaXQgb24gZGF0ZSBjaGFuZ2UpXG4gICAgdGhpcy5yZXN0b3JlRGV0YWlsU3RhdGUoKTtcblxuICAgIC8vIDMuIFN1YnNjcmliZSB0byBxdWVyeSBwYXJhbXMgZm9yIHRhYiBzd2l0Y2hpbmdcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnN0IHByZXZQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIGNvbnN0IHRhYiA9IHBhcmFtc1sndGFiJ107XG4gICAgICBpZiAodGFiID09PSAnYW5hbHlzaXMnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnYWdlbnRhbmFseXNpcyc7XG4gICAgICB9IGVsc2UgaWYgKHRhYiA9PT0gJ21hbmFnZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9ICdtYW5hZ2UnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9ICdjb252ZXJzYXRpb25zJztcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGRldGFpbCBzdGF0ZSB3aGVuIGxlYXZpbmcgQWdlbnQgQW5hbHlzaXMgdGFiXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSAhPT0gJ2FnZW50YW5hbHlzaXMnICYmIHByZXZQYWdlID09PSAnYWdlbnRhbmFseXNpcycpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxWaWV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmNsZWFyRGV0YWlsU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY092ZXJhbGxUcmFuc2NyaXB0c1F1ZXJ5UGFyYW0oKTtcbiAgICAgIC8vIE9ubHkgcmVsb2FkIGlmIHRhYiBhY3R1YWxseSBjaGFuZ2VkIChza2lwIG9uIGZpcnN0IGVtaXQg4oCUIGRhdGFSYW5nZVZhbHVlIGhhbmRsZXMgaXQpXG4gICAgICBpZiAocHJldlBhZ2UgIT09IHRoaXMuY3VycmVudFBhZ2UgJiYgdGhpcy5faW5pdERvbmUpIHtcbiAgICAgICAgdGhpcy5sb2FkQ3VycmVudFRhYigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gNC4gU3Vic2NyaWJlIHRvIGdsb2JhbCB0b29sYmFyIGNoYW5nZXMg4oCUIHRoaXMgaXMgdGhlIE1BSU4gZGF0YSB0cmlnZ2VyXG4gICAgLy8gICAgKHNhbWUgcGF0dGVybiBhcyB0cmFuc2NyaXB0LWxpc3QgYW5kIGF1ZGlvLXBhZ2UpXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQgfHwgdGhpcy5jbGllbnRJZDtcbiAgICAgICAgaWYgKGRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gZGF0YS5kYXRlLnN0YXJ0RGF0ZTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUgPSBkYXRhLmRhdGUuZW5kRGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YT8uc3RvcmVzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlSWRzID0gdGhpcy5leHRyYWN0Q2hlY2tlZFN0b3JlcyhkYXRhLnN0b3Jlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZldGNoIGRhdGEgZm9yIGN1cnJlbnQgdGFiXG4gICAgICB0aGlzLmxvYWRDdXJyZW50VGFiKCk7XG4gICAgICB0aGlzLl9pbml0RG9uZSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5PVkVSQUxMX1RSQU5TQ1JJUFRTX0JPRFlfQ0xBU1MpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGxvYWRDdXJyZW50VGFiKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSAnY29udmVyc2F0aW9ucycpIHtcbiAgICAgIHRoaXMuY29udlBhZ2UgPSAxO1xuICAgICAgdGhpcy5mZXRjaENvbnZlcnNhdGlvbnMoKTtcbiAgICAgIHRoaXMuZmV0Y2hDb2hvcnRTdW1tYXJ5Q2FyZCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnKSB7XG4gICAgICB0aGlzLmxvYWRDb2hvcnRMaXN0KCk7XG4gICAgICBpZiAodGhpcy5kZXRhaWxWaWV3KSB7XG4gICAgICAgIHRoaXMuZmV0Y2hDb2hvcnRTdW1tYXJ5Q2FyZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ21hbmFnZScpIHtcbiAgICAgIHRoaXMubWFuYWdlUGFnZSA9IDE7XG4gICAgICB0aGlzLmxvYWRNYW5hZ2VDb2hvcnRzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIE1hcHBpbmcgKHNhbWUgYXMgdHJhbnNjcmlwdC1saXN0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBtYXBDb252ZXJzYXRpb24oaXRlbTogYW55KTogYW55IHtcbiAgICBjb25zdCByYXdUaW1lID0gaXRlbS5UaW1lc3RhbXAgfHwgaXRlbS50aW1lIHx8ICcnO1xuICAgIGNvbnN0IHJhd0R1cmF0aW9uID0gaXRlbS5EdXJhdGlvbiB8fCBpdGVtLmR1cmF0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHJhd0Rlc2MgPSBpdGVtLlN1bW1hcnkgfHwgaXRlbS5hdWRpb0Rlc2NyaXB0aW9uIHx8IGl0ZW0uc3VtbWFyeSB8fCBpdGVtLmNvbnZlcnNhdGlvbkRldGFpbHM/LmF1ZGlvU3VtbWFyeSB8fCAnJztcbiAgICByZXR1cm4ge1xuICAgICAgYXVkaW9JZDogaXRlbS5kb2NfaWQgfHwgaXRlbS5hdWRpb0lkIHx8IGl0ZW0uX2lkIHx8ICcnLFxuICAgICAgc3RvcmVJZDogaXRlbS5zdG9yZUlkIHx8ICcnLFxuICAgICAgc3RvcmVOYW1lOiBpdGVtLnN0b3JlTmFtZSB8fCAnJyxcbiAgICAgIHVzZXJOYW1lOiBpdGVtLnN0YWZmIHx8IGl0ZW0uc3RhZmZJZCB8fCBpdGVtLnVzZXJOYW1lIHx8IGl0ZW0uc3RhZmZOYW1lIHx8ICcnLFxuICAgICAgbG9jYXRpb246IGl0ZW0ubG9jYXRpb24gfHwgaXRlbS5zdGF0ZSB8fCAnJyxcbiAgICAgIGRhdGU6IGl0ZW0uZGF0ZSB8fCAnJyxcbiAgICAgIHRpbWU6IHRoaXMuZm9ybWF0VGltZShyYXdUaW1lKSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmZvcm1hdER1cmF0aW9uKHJhd0R1cmF0aW9uKSxcbiAgICAgIGF1ZGlvRGVzY3JpcHRpb246IHRoaXMuY2xlYW5UcmFuc2NyaXB0aW9uKHJhd0Rlc2MpLFxuICAgICAgYXVkaW9Vcmw6IGl0ZW0uYXVkaW9VcmwgfHwgaXRlbS5hdWRpb191cmwgfHwgJycsXG4gICAgICBjb252ZXJzYXRpb25EZXRhaWxzOiBpdGVtLmNvbnZlcnNhdGlvbkRldGFpbHMgfHwgeyBhdWRpb1N1bW1hcnk6ICcnLCB0cmFuc2NyaXB0aW9uOiAnJyB9LFxuICAgICAgbWV0cmljczogdGhpcy5wYXJzZU1ldHJpY3MoaXRlbS5tZXRyaWNzKSxcbiAgICAgIGFpSW5zaWdodHM6IGl0ZW0uYWlJbnNpZ2h0cyB8fCB7IHRpdGxlOiAnQUkgSW5zaWdodHMnLCBzdW1tYXJ5OiBbXSB9LFxuICAgICAgX2RldGFpbExvYWRlZDogISEoaXRlbS5haUluc2lnaHRzIHx8IGl0ZW0uY29udmVyc2F0aW9uRGV0YWlscyksXG4gICAgICBfZGV0YWlsTG9hZGluZzogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFBhcnNlIG1ldHJpY3MgZnJvbSBBUEkgcmVzcG9uc2UgKHNhbWUgYXMgYXVkaW8tcGFnZSlcbiAgcHJpdmF0ZSBwYXJzZU1ldHJpY3MocmF3OiBhbnkpOiBhbnlbXSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gcmF3O1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJhdylcbiAgICAgIC5maWx0ZXIoKHNlY3Rpb246IGFueSkgPT4gc2VjdGlvbiAmJiB0eXBlb2Ygc2VjdGlvbiA9PT0gJ29iamVjdCcgJiYgc2VjdGlvbi50eXBlKVxuICAgICAgLm1hcCgoc2VjdGlvbjogYW55KSA9PiAoe1xuICAgICAgICBuYW1lOiBzZWN0aW9uLm5hbWUgfHwgJycsXG4gICAgICAgIHR5cGU6IHNlY3Rpb24udHlwZSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHNlY3Rpb24udmFsdWUgfHwgW11cbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8vIExvYWQgY29udmVyc2F0aW9uIGRldGFpbCBvbiBleHBhbmQgKHNhbWUgYXMgYXVkaW8tcGFnZSlcbiAgbG9hZENvbnZEZXRhaWwoY29udjogYW55KTogdm9pZCB7XG4gICAgaWYgKChjb252Ll9kZXRhaWxMb2FkZWQgJiYgY29udi5hdWRpb1VybCkgfHwgY29udi5fZGV0YWlsTG9hZGluZykgcmV0dXJuO1xuICAgIGNvbnYuX2RldGFpbExvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGNvaG9ydElkOiB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPyBbdGhpcy5zZWxlY3RlZENvaG9ydElkXSA6IFtdLCBjbGllbnRJZDogdGhpcy5jbGllbnRJZCB9O1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvbnZlcnNhdGlvbkRldGFpbChjb252LmF1ZGlvSWQsIHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdyA9IHJlcz8uZGF0YTtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gcmF3Py5hdWRpb0lkID8gcmF3IDogKHJhdz8uZGF0YT8uYXVkaW9JZCA/IHJhdy5kYXRhIDogKHJhdyB8fCB7fSkpO1xuICAgICAgICBpZiAoZGV0YWlsLm1ldHJpY3MpIGNvbnYubWV0cmljcyA9IHRoaXMucGFyc2VNZXRyaWNzKGRldGFpbC5tZXRyaWNzKTtcbiAgICAgICAgaWYgKGRldGFpbC5haUluc2lnaHRzPy5zdW1tYXJ5Py5sZW5ndGgpIGNvbnYuYWlJbnNpZ2h0cyA9IGRldGFpbC5haUluc2lnaHRzO1xuICAgICAgICBpZiAoZGV0YWlsLmNvbnZlcnNhdGlvbkRldGFpbHM/LmF1ZGlvU3VtbWFyeSkgY29udi5jb252ZXJzYXRpb25EZXRhaWxzID0gZGV0YWlsLmNvbnZlcnNhdGlvbkRldGFpbHM7XG4gICAgICAgIGlmIChkZXRhaWwuYXVkaW9VcmwgfHwgZGV0YWlsLmF1ZGlvX3VybCkgY29udi5hdWRpb1VybCA9IGRldGFpbC5hdWRpb1VybCB8fCBkZXRhaWwuYXVkaW9fdXJsO1xuICAgICAgICBjb252Ll9kZXRhaWxMb2FkZWQgPSB0cnVlO1xuICAgICAgICBjb252Ll9kZXRhaWxMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgY29udi5fZGV0YWlsTG9hZGluZyA9IGZhbHNlOyB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBDbGVhbiBcIlN0YWZmOlwiLCBcIkN1c3RvbWVyOlwiIHByZWZpeGVzIGZyb20gdHJhbnNjcmlwdGlvbiB0ZXh0XG4gIGNsZWFuVHJhbnNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvXFxbXFxkezJ9OlxcZHsyfVxccyotPlxccypcXGR7Mn06XFxkezJ9XFxdXFxzKi9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC9cXGIoU3RhZmZ8Q3VzdG9tZXIpXFxzKjpcXHMqL2dpLCAnJyk7XG4gIH1cblxuICAvLyBGb3JtYXQgZHVyYXRpb24gZnJvbSBzZWNvbmRzIChlLmcuIDUxNCDihpIgXCI4bSAxNHNcIilcbiAgcHJpdmF0ZSBmb3JtYXREdXJhdGlvbih2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWwpIHJldHVybiAnJztcbiAgICBjb25zdCB0b3RhbFNlYyA9IHBhcnNlRmxvYXQodmFsKTtcbiAgICBpZiAoaXNOYU4odG90YWxTZWMpKSByZXR1cm4gdmFsO1xuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHRvdGFsU2VjIC8gNjApO1xuICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKHRvdGFsU2VjICUgNjApO1xuICAgIHJldHVybiBzZWNzID4gMCA/IGAke21pbnN9bSAke3NlY3N9c2AgOiBgJHttaW5zfW1gO1xuICB9XG5cbiAgLy8gRm9ybWF0IHRpbWUgZnJvbSBJU08gc3RyaW5nIChlLmcuIFwiMjAyNi0wNC0wOFQyMjowMDo0Mi45NzI3ODkrMDU6MzBcIiDihpIgXCIxMDowMCBQTVwiKVxuICBwcml2YXRlIGZvcm1hdFRpbWUodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdmFsKSByZXR1cm4gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIHZhbDtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZygnZW4tVVMnLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIGhvdXIxMjogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgZXh0cmFjdENoZWNrZWRTdG9yZXMoc3RvcmVzOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICAvLyBGaWx0ZXIgb25seSBjaGVja2VkIHN0b3JlcywgdGhlbiBleHRyYWN0IHN0b3JlSWRcbiAgICBjb25zdCBjaGVja2VkID0gc3RvcmVzLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQgIT09IGZhbHNlKTtcbiAgICByZXR1cm4gY2hlY2tlZC5tYXAoKHM6IGFueSkgPT4gcy5faWQgfHwgcy5zdG9yZUlkIHx8IHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdG9yZUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVJZHMubGVuZ3RoID4gMCA/IHRoaXMuc3RvcmVJZHMgOiB0aGlzLmRlZmF1bHRTdG9yZXM7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0RGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZSB8fCAnMjAyNi0wNC0wOCc7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZERhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lbmREYXRlIHx8ICcyMDI2LTA0LTA4JztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRCYXNlUGF5bG9hZCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRJZDogW3RoaXMuY2xpZW50SWRdLFxuICAgICAgc3RvcmVJZDogdGhpcy5nZXRTdG9yZUlkcygpLFxuICAgICAgc3RhcnREYXRlOiB0aGlzLmdldFN0YXJ0RGF0ZSgpLFxuICAgICAgZW5kRGF0ZTogdGhpcy5nZXRFbmREYXRlKCksXG4gICAgICBpc0FJOiBmYWxzZSxcbiAgICAgIGFuYWx5dGljc1R5cGU6ICdhdWRpbycsXG4gICAgICBpc0V4cG9ydDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIENPTlZFUlNBVElPTlMgVEFCICh1c2VzIHRyYW5zY3JpcHRzTGlzdCBBUEkpXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBmZXRjaENvbnZlcnNhdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb252TG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgLi4udGhpcy5idWlsZEJhc2VQYXlsb2FkKCksXG4gICAgICBpc0FJOiBmYWxzZSxcbiAgICAgIGFuYWx5dGljc1R5cGU6ICd0cmFuc2NyaXB0JyxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmNvbnZTZWFyY2hRdWVyeSB8fCAnJyxcbiAgICAgIGxpbWl0OiB0aGlzLmNvbnZQZXJQYWdlLFxuICAgICAgX2lkOiBbXSxcbiAgICAgIG9mZnNldDogdGhpcy5jb252UGFnZSAtIDFcbiAgICB9O1xuICAgIGlmICh0aGlzLmlzT3ZlcmFsbFRyYW5zY3JpcHRzQ29ob3J0ICYmIHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSkge1xuICAgICAgcGF5bG9hZC5hdWRpb1NvdXJjZSA9IHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS50cmFuc2NyaXB0c0xpc3QocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgY29uc3QgbGlzdCA9IGRhdGE/LmRhdGEgfHwgZGF0YT8uY29udmVyc2F0aW9ucyB8fCBbXTtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25zID0gbGlzdC5tYXAoKGl0ZW06IGFueSkgPT4gdGhpcy5tYXBDb252ZXJzYXRpb24oaXRlbSkpO1xuICAgICAgICB0aGlzLmNvbnZUb3RhbCA9IGRhdGE/LmNvdW50ID8/IGRhdGE/LnBhZ2luYXRpb24/LnRvdGFsID8/IHRoaXMuY29udmVyc2F0aW9ucy5sZW5ndGg7XG4gICAgICAgIHRoaXMuY29udlRvdGFsUGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5jb252VG90YWwgLyB0aGlzLmNvbnZQZXJQYWdlKSk7XG4gICAgICAgIHRoaXMuY29udlBhZ2luYXRpb25TaXplcyA9IHRoaXMuY29udlRvdGFsID4gMTAgPyBbMTAsIDIwLCA1MCwgMTAwXSA6IFt0aGlzLmNvbnZUb3RhbCB8fCAxMF07XG4gICAgICAgIHRoaXMuY29udlBlclBhZ2UgPSB0aGlzLmNvbnZQYWdpbmF0aW9uU2l6ZXMuaW5jbHVkZXModGhpcy5jb252UGVyUGFnZSkgPyB0aGlzLmNvbnZQZXJQYWdlIDogdGhpcy5jb252UGFnaW5hdGlvblNpemVzWzBdO1xuICAgICAgICAvLyBBdXRvLWV4cGFuZCBmaXJzdFxuICAgICAgICBpZiAodGhpcy5jb252ZXJzYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmV4cGFuZGVkQ29udklkcyA9IHsgW3RoaXMuY29udmVyc2F0aW9uc1swXS5hdWRpb0lkXTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb252VG90YWwgPSAwO1xuICAgICAgICB0aGlzLmNvbnZUb3RhbFBhZ2VzID0gMTtcbiAgICAgICAgdGhpcy5jb252TG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZmV0Y2hDb2hvcnRTdW1tYXJ5Q2FyZCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2hvcnRJZCA9IHRoaXMuc2VsZWN0ZWRDb2hvcnRJZFxuICAgICAgPyBbdGhpcy5zZWxlY3RlZENvaG9ydElkXVxuICAgICAgOiAodGhpcy5oZWFkZXJEYXRhPy5jb2hvcnRcbiAgICAgICAgICA/IChBcnJheS5pc0FycmF5KHRoaXMuaGVhZGVyRGF0YS5jb2hvcnQpID8gdGhpcy5oZWFkZXJEYXRhLmNvaG9ydCA6IFt0aGlzLmhlYWRlckRhdGEuY29ob3J0XSlcbiAgICAgICAgICA6IFtdKTtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBzdGFydERhdGU6IHRoaXMuZ2V0U3RhcnREYXRlKCksXG4gICAgICBlbmREYXRlOiB0aGlzLmdldEVuZERhdGUoKSxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZ2V0U3RvcmVJZHMoKSxcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF0sXG4gICAgICBjb2hvcnRJZFxuICAgIH07XG5cbiAgICB0aGlzLmlzTG9hZGluZ0NvaG9ydFN1bW1hcnkgPSB0cnVlO1xuICAgIHRoaXMuY29ob3J0U3VtbWFyeUNhcmQgPSBudWxsO1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvaG9ydFN1bW1hcnlDYXJkKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGEgPz8gcmVzID8/IG51bGw7XG4gICAgICAgIHRoaXMuY29ob3J0U3VtbWFyeUNhcmQgPSBkYXRhO1xuXG4gICAgICAgIGNvbnN0IHJhdyA9IEFycmF5LmlzQXJyYXkoZGF0YSlcbiAgICAgICAgICA/IGRhdGFcbiAgICAgICAgICA6IChkYXRhPy5hdWRpb1NvdXJjZSA/PyBkYXRhPy5hdWRpb1NvdXJjZXMgPz8gZGF0YT8uZmlsdGVycz8uYXVkaW9Tb3VyY2UgPz8gbnVsbCk7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmJ1aWxkQXVkaW9Tb3VyY2VPcHRpb25zKHJhdyk7XG4gICAgICAgIGlmIChvcHRzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuYXVkaW9Tb3VyY2VPcHRpb25zID0gb3B0cztcbiAgICAgICAgICBpZiAoIW9wdHMuc29tZShvID0+IG8udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSA9IG9wdHNbMF0udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0xvYWRpbmdDb2hvcnRTdW1tYXJ5ID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb2hvcnRTdW1tYXJ5Q2FyZCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nQ29ob3J0U3VtbWFyeSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25Db252UGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnZQYWdlID0gcGFnZTtcbiAgICB0aGlzLmZldGNoQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgb25Db252UGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb252UGVyUGFnZSA9IHBhcnNlSW50KHNpemUpO1xuICAgIHRoaXMuY29udlBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICB0b2dnbGVDb252RXhwYW5kKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHBhbmRlZENvbnZJZHNbaWRdKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ29udklkcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ29udklkcyA9IHsgW2lkXTogdHJ1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIGdldENvbnZJZChjb252OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb252Py5kb2NfaWQgfHwgY29udj8uYXVkaW9JZCB8fCBjb252Py5faWQgfHwgJyc7XG4gIH1cblxuICBnZXRDb252VGFiKGNvbnZJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb252VGFic1tjb252SWRdIHx8ICdzdW1tYXJ5JztcbiAgfVxuXG4gIHNldENvbnZUYWIoY29udklkOiBzdHJpbmcsIHRhYjogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNvbnZUYWJzW2NvbnZJZF0gPSB0YWI7XG4gIH1cblxuICAvLyBBSSBTZWFyY2hcbiAgc2VuZENvbnZRdWVyeSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udlNlYXJjaFF1ZXJ5LnRyaW0oKSkgcmV0dXJuO1xuICAgIHRoaXMuY29udkFpTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jb252QWlSZXBseSA9ICcnO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHVzZXJfaWQ6IHRoaXMudXNlcnM/LmVtYWlsIHx8ICd1c2VyJyxcbiAgICAgIHNlc3Npb25faWQ6IGBFQ0hPXyR7RGF0ZS5ub3coKX1gLFxuICAgICAgc2Vzc2lvbl9kYXRlOiB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgIHNlc3Npb25fdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMuY29udlNlYXJjaFF1ZXJ5LFxuICAgICAgYW5hbHl0aWNzVHlwZTogJ3RyYW5zY3JpcHQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHNlbGVjdGVkX3N0b3JlczogdGhpcy5nZXRTdG9yZUlkcygpLFxuICAgICAgICBkYXRlX3JhbmdlOiB7IHN0YXJ0OiB0aGlzLnN0YXJ0RGF0ZSwgZW5kOiB0aGlzLmVuZERhdGUgfSxcbiAgICAgICAgc2VsZWN0ZWRfcHJvZHVjdHM6IFsnQXVkaW8nXVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5jaGF0U3RyZWFtKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29udkFpUmVwbHkgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IHJlcyA6IChyZXM/LmRhdGE/Lm1hcCgoZDogYW55KSA9PiBkLnRleHQpLmpvaW4oJycpIHx8ICdObyByZXNwb25zZScpO1xuICAgICAgICB0aGlzLmNvbnZBaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnZBaVJlcGx5ID0gJ1VuYWJsZSB0byBwcm9jZXNzIHlvdXIgcXVlcnkuIFBsZWFzZSB0cnkgYWdhaW4uJztcbiAgICAgICAgdGhpcy5jb252QWlMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jb252U2VhcmNoUXVlcnkgPSAnJztcbiAgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBBR0VOVCBBTkFMWVNJUyBUQUIgKHVzZXMgY29ob3J0IEFQSXMpXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBsb2FkQ29ob3J0TGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmF1ZGlvU2VydmljZS5saXN0Q29ob3J0cyh0aGlzLmNsaWVudElkLCAxMDAsIDApLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29ob3J0TGlzdCA9IHJlcz8uZGF0YT8uY29ob3J0cyB8fCBbXTtcbiAgICAgICAgLy8gSWYgYSBjb2hvcnQgd2FzIGFscmVhZHkgc2VsZWN0ZWQgKGUuZy4gZnJvbSBkcm9wZG93biksIGxvYWQgaXRzIGRhdGFcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCkge1xuICAgICAgICAgIHRoaXMuZmV0Y2hDb2hvcnRDYXJkcygpO1xuICAgICAgICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmNvaG9ydExpc3QgPSBbXTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gU2VsZWN0IGNvaG9ydCBmcm9tIG92ZXJ2aWV3IGNhcmQgY2xpY2tcbiAgc2VsZWN0Q29ob3J0RGV0YWlsKGNvaG9ydDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydElkID0gY29ob3J0LmNvaG9ydElkIHx8IGNvaG9ydC5pZCB8fCBjb2hvcnQuX2lkIHx8ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lID0gY29ob3J0LmNvaG9ydE5hbWUgfHwgY29ob3J0Lm5hbWUgfHwgJyc7XG4gICAgdGhpcy5kZXRhaWxWaWV3ID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZElkID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZENhcmROYW1lID0gJyc7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICB0aGlzLmF1ZGlvU291cmNlT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSA9ICcnO1xuICAgIHRoaXMuc2F2ZURldGFpbFN0YXRlKCk7XG4gICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgICBpZiAodGhpcy5pc092ZXJhbGxUcmFuc2NyaXB0c0NvaG9ydCkge1xuICAgICAgdGhpcy5mZXRjaENvaG9ydFN1bW1hcnlDYXJkKCk7XG4gICAgfVxuICAgIHRoaXMuc3luY092ZXJhbGxUcmFuc2NyaXB0c1F1ZXJ5UGFyYW0oKTtcbiAgfVxuXG4gIG9uRGV0YWlsU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIGNsZWFyRGV0YWlsU2VhcmNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZXRhaWxTZWFyY2hWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuZGV0YWlsU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBiYWNrVG9PdmVydmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9ICcnO1xuICAgIHRoaXMuY29ob3J0Q2FyZHMgPSBbXTtcbiAgICB0aGlzLmRldGFpbFBhZ2VDb252cyA9IFtdO1xuICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IFtdO1xuICAgIHRoaXMuY2xlYXJEZXRhaWxTdGF0ZSgpO1xuICAgIHRoaXMuc3luY092ZXJhbGxUcmFuc2NyaXB0c1F1ZXJ5UGFyYW0oKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXJzaXN0IGRldGFpbCB2aWV3IHN0YXRlIGFjcm9zcyBjb21wb25lbnQgcmUtaW5pdCAoZGF0ZSBjaGFuZ2UpIOKUgOKUgFxuICBwcml2YXRlIHNhdmVEZXRhaWxTdGF0ZSgpOiB2b2lkIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdlY2hvLWRldGFpbCcsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRldGFpbFZpZXc6IHRoaXMuZGV0YWlsVmlldyxcbiAgICAgIGNvaG9ydElkOiB0aGlzLnNlbGVjdGVkQ29ob3J0SWQsXG4gICAgICBjb2hvcnROYW1lOiB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZURldGFpbFN0YXRlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlY2hvLWRldGFpbCcpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybjtcbiAgICAgIGNvbnN0IHN0YXRlID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgaWYgKHN0YXRlPy5kZXRhaWxWaWV3ICYmIHN0YXRlPy5jb2hvcnRJZCkge1xuICAgICAgICB0aGlzLmRldGFpbFZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSBzdGF0ZS5jb2hvcnRJZDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvaG9ydE5hbWUgPSBzdGF0ZS5jb2hvcnROYW1lIHx8ICcnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyRGV0YWlsU3RhdGUoKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnZWNoby1kZXRhaWwnKTtcbiAgfVxuXG4gIC8vIENoYW5nZSBjb2hvcnQgZnJvbSBkcm9wZG93blxuICBvbkNvaG9ydERyb3Bkb3duQ2hhbmdlKGNvaG9ydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSBjb2hvcnRJZDtcbiAgICBjb25zdCBjb2hvcnQgPSB0aGlzLmNvaG9ydExpc3QuZmluZCgoYzogYW55KSA9PiAoYy5jb2hvcnRJZCB8fCBjLmlkIHx8IGMuX2lkKSA9PT0gY29ob3J0SWQpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lID0gY29ob3J0Py5jb2hvcnROYW1lIHx8IGNvaG9ydD8ubmFtZSB8fCAnJztcbiAgICB0aGlzLmRldGFpbFZpZXcgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDYXJkSWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZE5hbWUgPSAnJztcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuc2F2ZURldGFpbFN0YXRlKCk7XG4gICAgdGhpcy5hdWRpb1NvdXJjZU9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UgPSAnJztcbiAgICB0aGlzLmZldGNoQ29ob3J0Q2FyZHMoKTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICAgIGlmICh0aGlzLmlzT3ZlcmFsbFRyYW5zY3JpcHRzQ29ob3J0KSB7XG4gICAgICB0aGlzLmZldGNoQ29ob3J0U3VtbWFyeUNhcmQoKTtcbiAgICB9XG4gICAgdGhpcy5zeW5jT3ZlcmFsbFRyYW5zY3JpcHRzUXVlcnlQYXJhbSgpO1xuICB9XG5cbiAgZmV0Y2hDb2hvcnRDYXJkcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2hvcnRJZCkgcmV0dXJuO1xuICAgIHRoaXMuY2FyZHNMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLmJ1aWxkQmFzZVBheWxvYWQoKSxcbiAgICAgIGNvaG9ydFR5cGU6IHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9PT0gJ092ZXJhbGxfdHJhbnNjcmlwdHNfdjInID8gW10gOiBbdGhpcy5zZWxlY3RlZENvaG9ydElkXVxuICAgIH07XG4gICAgaWYgKHRoaXMuaXNPdmVyYWxsVHJhbnNjcmlwdHNDb2hvcnQgJiYgdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlKSB7XG4gICAgICBwYXlsb2FkLmF1ZGlvU291cmNlID0gdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlO1xuICAgIH1cblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvaG9ydEFuYWx5c2lzQ2FyZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvaG9ydENhcmRzID0gdGhpcy5wYXJzZUNvaG9ydEFuYWx5c2lzKHJlcz8uZGF0YT8uY29ob3J0QW5hbHlzaXMgfHwge30pO1xuICAgICAgICB0aGlzLmNhcmRzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ob3J0Q2FyZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jYXJkc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBhcnNlIGNvaG9ydCBhbmFseXNpcyAoc2FtZSBhcyBhdWRpby1wYWdlKVxuICBwYXJzZUNvaG9ydEFuYWx5c2lzKGFuYWx5c2lzOiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgY2FyZHM6IGFueVtdID0gW107XG4gICAgY29uc3QgbnVtZXJpY1Jvd3M6IGFueVtdID0gW107XG4gICAgY29uc3Qgc2tpcEtleXMgPSBuZXcgU2V0KFsndG90YWxBdWRpb0F2YWlsYWJsZScsICdjb2hvcnRUeXBlJywgJ2RhdGVSYW5nZScsICd1bmlxdWVQaXRjaGVzJ10pO1xuICAgIHRoaXMudG90YWxBdWRpbyA9IGFuYWx5c2lzLnRvdGFsQXVkaW9BdmFpbGFibGUgfHwgMDtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFuYWx5c2lzKSkge1xuICAgICAgaWYgKHNraXBLZXlzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBhbmFseXNpc1trZXldO1xuICAgICAgaWYgKCFzZWN0aW9uIHx8IHR5cGVvZiBzZWN0aW9uICE9PSAnb2JqZWN0JykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHZhbHVlczogYW55W10gPSBzZWN0aW9uLnZhbHVlIHx8IFtdO1xuICAgICAgY29uc3QgdHlwZSA9IHNlY3Rpb24udHlwZTtcbiAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIC8vIENvbW1vbiBmaWVsZHMgZnJvbSBzZWN0aW9uXG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHNlY3Rpb24uY29tcHV0YXRpb25fbm90ZSB8fCBzZWN0aW9uLmNvbXB1dGF0aW9uTm90ZSB8fCBzZWN0aW9uLmRlc2NyaXB0aW9uIHx8IHNlY3Rpb24uZGVzYyB8fCAnJztcbiAgICAgIGNvbnN0IHNob3J0RGVzY3JpcHRpb24gPSBzZWN0aW9uLnNob3J0RGVzY3JpcHRpb24gfHwgc2VjdGlvbi5zaG9ydF9kZXNjcmlwdGlvbiB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHNlY3Rpb24uc3RhdHVzIHx8IHNlY3Rpb24uc2VudGltZW50IHx8ICcnO1xuICAgICAgY29uc3QgYXBwbGljYWJsZUNvdW50ID0gc2VjdGlvbi5hcHBsaWNhYmxlX2NvdW50ID8/IHNlY3Rpb24uYXBwbGljYWJsZUNvdW50ID8/IG51bGw7XG5cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSBzZWN0aW9uLmFjdHVhbF90eXBlIHx8IHNlY3Rpb24uYWN0dWFsVHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHR5cGVVcHBlciA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IHR5cGUudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgICAgY29uc3QgYWN0dWFsVXBwZXIgPSB0eXBlb2YgYWN0dWFsVHlwZSA9PT0gJ3N0cmluZycgPyBhY3R1YWxUeXBlLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICAgIGlmICh0eXBlVXBwZXIgPT09ICdCT09MRUFOX0JBU0tFVF9TRVBPUkFUT1InIHx8IGFjdHVhbFVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfU0VQT1JBVE9SJykge1xuICAgICAgICBjb25zdCBjYXJkTmFtZSA9IHNlY3Rpb24ubmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IHRhZ1Jvd3MgPSAoQXJyYXkuaXNBcnJheShzZWN0aW9uLmNvbnRlbnRfdGFncykgPyBzZWN0aW9uLmNvbnRlbnRfdGFncyA6IFtdKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gKHsgaWQ6IHQuX2lkID8/IHQuaWQgPz8gJycsIGxhYmVsOiB0LnRhZyA/PyB0Lm5hbWUgPz8gJycsIGNvdW50OiB0LmNvdW50ID8/IDAgfSkpXG4gICAgICAgICAgLmZpbHRlcigocjogYW55KSA9PiByLmxhYmVsKVxuICAgICAgICAgIC5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuICAgICAgICBjb25zdCBtZWFzdXJlU3JjID0gc2VjdGlvbi5tZWFzdXJlbWVudHM/LnRlbXBsZV9sZW5ndGhzXG4gICAgICAgICAgPz8gc2VjdGlvbi5tZWFzdXJlbWVudHM/Lmxlbmd0aHNcbiAgICAgICAgICA/PyBzZWN0aW9uLm1lYXN1cmVtZW50cz8udmFsdWVzXG4gICAgICAgICAgPz8gW107XG4gICAgICAgIGNvbnN0IG1lYXN1cmVSb3dzID0gKEFycmF5LmlzQXJyYXkobWVhc3VyZVNyYykgPyBtZWFzdXJlU3JjIDogW10pXG4gICAgICAgICAgLm1hcCgobTogYW55KSA9PiAoeyBpZDogbS5faWQgPz8gbS5pZCA/PyAnJywgbGFiZWw6IG0ubmFtZSA/PyBtLmxhYmVsID8/ICcnLCBjb3VudDogbS5jb3VudCA/PyAwIH0pKVxuICAgICAgICAgIC5maWx0ZXIoKHI6IGFueSkgPT4gci5sYWJlbClcbiAgICAgICAgICAuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuY291bnQgLSBhLmNvdW50KTtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IGNhcmROYW1lLFxuICAgICAgICAgIHR5cGU6ICdCT09MRUFOX0JBU0tFVF9TRVBPUkFUT1InLFxuICAgICAgICAgIGFwcGxpY2FibGVDb3VudCxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICBzaG9ydERlc2NyaXB0aW9uLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICB0YWdzVGl0bGU6IGNhcmROYW1lLFxuICAgICAgICAgIHRhZ3NTdWJ0aXRsZTogYCR7YXBwbGljYWJsZUNvdW50ID8/IDB9IGNvbnZlcnNhdGlvbnNgLFxuICAgICAgICAgIHRhZ1Jvd3MsXG4gICAgICAgICAgbWVhc3VyZVRpdGxlOiAnTWVhc3VyZW1lbnRzJyxcbiAgICAgICAgICBtZWFzdXJlU3VidGl0bGU6IGAke3NlY3Rpb24ubWVhc3VyZW1lbnRzPy50b3RhbCA/PyBtZWFzdXJlUm93cy5sZW5ndGh9YCxcbiAgICAgICAgICBtZWFzdXJlUm93c1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfVEFCTEUnIHx8IGFjdHVhbFVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfVEFCTEUnKSB7XG4gICAgICAgIGNvbnN0IGNhcmROYW1lID0gc2VjdGlvbi5uYW1lIHx8IGtleTtcbiAgICAgICAgY29uc3QgZGF0YVJvd3M6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLmRhdGEpID8gc2VjdGlvbi5kYXRhIDogW107XG4gICAgICAgIGNvbnN0IHRhYmxlUm93cyA9IGRhdGFSb3dzLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBhdHRyczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHJvdy5hdHRyaWJ1dGVzKSA/IHJvdy5hdHRyaWJ1dGVzIDogW107XG4gICAgICAgICAgY29uc3Qgc3RhdHVzU2V0ID0gbmV3IFNldChbJ0ZVTEZJTExFRCcsICdOT1RfRlVMRklMTEVEJywgJ09GRkVSRURfQUxURVJOQVRJVkUnXSk7XG4gICAgICAgICAgY29uc3QgTUFYX0NISVBfTEVOID0gMTg7XG4gICAgICAgICAgY29uc3QgTUFYX1ZJU0lCTEUgPSA0O1xuICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSBhdHRycy5maWx0ZXIoKGE6IHN0cmluZykgPT4gIXN0YXR1c1NldC5oYXMoKGEgfHwgJycpLnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgICAgICBjb25zdCBzaG9ydENoaXBzID0gY2xlYW5lZC5maWx0ZXIoKGM6IHN0cmluZykgPT4gYy5sZW5ndGggPD0gTUFYX0NISVBfTEVOKTtcbiAgICAgICAgICBjb25zdCBsb25nQ2hpcHMgPSBjbGVhbmVkLmZpbHRlcigoYzogc3RyaW5nKSA9PiBjLmxlbmd0aCA+IE1BWF9DSElQX0xFTik7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZSA9IHNob3J0Q2hpcHMuc2xpY2UoMCwgTUFYX1ZJU0lCTEUpO1xuICAgICAgICAgIGNvbnN0IG92ZXJmbG93ID0gWy4uLnNob3J0Q2hpcHMuc2xpY2UoTUFYX1ZJU0lCTEUpLCAuLi5sb25nQ2hpcHNdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICAgICAgYnJhbmQ6IHJvdy5icmFuZCB8fCAnJyxcbiAgICAgICAgICAgIHZpc2libGVDaGlwczogdmlzaWJsZSxcbiAgICAgICAgICAgIG92ZXJmbG93Q2hpcHM6IG92ZXJmbG93LFxuICAgICAgICAgICAgb3ZlcmZsb3dDb3VudDogb3ZlcmZsb3cubGVuZ3RoLFxuICAgICAgICAgICAgb3ZlcmZsb3dUb29sdGlwOiBvdmVyZmxvdy5qb2luKCcsICcpLFxuICAgICAgICAgICAgYWxsQXR0cmlidXRlczogY2xlYW5lZCxcbiAgICAgICAgICAgIGNvdW50OiByb3cuY291bnQgPz8gMFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgdGFibGVSb3dzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlVXBwZXIgPT09ICdCT09MRUFOX0JBU0tFVF9CQVInIHx8IGFjdHVhbFVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJykge1xuICAgICAgICBjb25zdCBjYXJkTmFtZSA9IHNlY3Rpb24ubmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IHBpZUNvbG9ycyA9IFsnIzBFQTVFOScsICcjMzhCREY4JywgJyM3REQzRkMnLCAnIzAyODRDNycsICcjQkFFNkZEJywgJyMwNzU5ODUnLCAnI0UwRjJGRScsICcjMDM2OUExJywgJyMyMkQzRUUnXTtcbiAgICAgICAgY29uc3QgcmF3Um93cyA9IHZhbHVlc1xuICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLm5hbWUgfHwgJycsXG4gICAgICAgICAgICByZXNwb25zZXM6IGl0ZW0uUmVzcG9uc2VzID8/IGl0ZW0uY291bnQgPz8gMCxcbiAgICAgICAgICAgIHNjb3JlOiBpdGVtLnNjb3JlID8/IDBcbiAgICAgICAgICB9KSlcbiAgICAgICAgICAuZmlsdGVyKChyOiBhbnkpID0+IHIucmVzcG9uc2VzID4gMClcbiAgICAgICAgICAuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICAgICAgY29uc3QgdG90YWxSZXNwb25zZXMgPSByYXdSb3dzLnJlZHVjZSgoczogbnVtYmVyLCByOiBhbnkpID0+IHMgKyByLnJlc3BvbnNlcywgMCk7XG4gICAgICAgIGNvbnN0IGN4ID0gNTAsIGN5ID0gNTAsIHJhZGl1cyA9IDQ1O1xuICAgICAgICBsZXQgc3RhcnRBbmdsZSA9IC1NYXRoLlBJIC8gMjtcbiAgICAgICAgY29uc3QgcGllU2xpY2VzID0gcmF3Um93cy5tYXAoKHI6IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJhY3Rpb24gPSB0b3RhbFJlc3BvbnNlcyA/IHIucmVzcG9uc2VzIC8gdG90YWxSZXNwb25zZXMgOiAwO1xuICAgICAgICAgIGNvbnN0IGFuZ2xlID0gZnJhY3Rpb24gKiAyICogTWF0aC5QSTtcbiAgICAgICAgICBjb25zdCBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyBhbmdsZTtcbiAgICAgICAgICBjb25zdCB4MSA9IGN4ICsgcmFkaXVzICogTWF0aC5jb3Moc3RhcnRBbmdsZSk7XG4gICAgICAgICAgY29uc3QgeTEgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKHN0YXJ0QW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHgyID0gY3ggKyByYWRpdXMgKiBNYXRoLmNvcyhlbmRBbmdsZSk7XG4gICAgICAgICAgY29uc3QgeTIgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKGVuZEFuZ2xlKTtcbiAgICAgICAgICBjb25zdCBsYXJnZUFyYyA9IGFuZ2xlID4gTWF0aC5QSSA/IDEgOiAwO1xuICAgICAgICAgIGxldCBwYXRoOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKHJhd1Jvd3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwYXRoID0gYE0gJHtjeCAtIHJhZGl1c30gJHtjeX0gQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgMSAxICR7Y3ggKyByYWRpdXN9ICR7Y3l9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDEgMSAke2N4IC0gcmFkaXVzfSAke2N5fSBaYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGBNICR7Y3h9ICR7Y3l9IEwgJHt4MX0gJHt5MX0gQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgJHtsYXJnZUFyY30gMSAke3gyfSAke3kyfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhcnRBbmdsZSA9IGVuZEFuZ2xlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbDogci5sYWJlbCxcbiAgICAgICAgICAgIHJlc3BvbnNlczogci5yZXNwb25zZXMsXG4gICAgICAgICAgICBzY29yZTogci5zY29yZSxcbiAgICAgICAgICAgIHBlcmNlbnQ6IE1hdGgucm91bmQoZnJhY3Rpb24gKiAxMDApLFxuICAgICAgICAgICAgY29sb3I6IHBpZUNvbG9yc1tpICUgcGllQ29sb3JzLmxlbmd0aF0sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBjYXJkTmFtZSxcbiAgICAgICAgICB0eXBlOiAnQk9PTEVBTl9CQVNLRVRfQkFSJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcGllU2xpY2VzLFxuICAgICAgICAgIHNlbGVjdGVkUGllTGFiZWw6IHBpZVNsaWNlc1swXT8ubGFiZWwgfHwgJydcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyAmJiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdib29sZWFuX2Jhc2tldF9jaGFydCcpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgICBjb25zdCBsb29rc0xpa2VLZXl3b3JkQXJyYXkgPSBmaXJzdFZhbHVlICYmIHR5cGVvZiBmaXJzdFZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgICYmICgnYnJlYWtkb3duJyBpbiBmaXJzdFZhbHVlIHx8ICdzdGFmZicgaW4gZmlyc3RWYWx1ZSB8fCAnY3VzdG9tZXInIGluIGZpcnN0VmFsdWUgfHwgJ2tleXdvcmQnIGluIGZpcnN0VmFsdWUpO1xuICAgICAgICBjb25zdCBrZXl3b3JkRGF0YTogYW55W10gPSBBcnJheS5pc0FycmF5KHNlY3Rpb24ua2V5d29yZERhdGEpXG4gICAgICAgICAgPyBzZWN0aW9uLmtleXdvcmREYXRhXG4gICAgICAgICAgOiAoQXJyYXkuaXNBcnJheShzZWN0aW9uLmRhdGEpXG4gICAgICAgICAgICAgID8gc2VjdGlvbi5kYXRhXG4gICAgICAgICAgICAgIDogKGxvb2tzTGlrZUtleXdvcmRBcnJheSA/IHZhbHVlcyA6IFtdKSk7XG4gICAgICAgIGNvbnN0IHNlbnRpbWVudFBhbGV0dGU6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgIE5FR0FUSVZFOiAnIzYwQzZGRicsXG4gICAgICAgICAgTkVVVFJBTDogJyNCNkUzRkYnLFxuICAgICAgICAgIFBPU0lUSVZFOiAnI0Q5RjFGRidcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYnVpbGRTbGljZXMgPSAoczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmVnID0gcz8ubmVnYXRpdmUgPz8gMDtcbiAgICAgICAgICBjb25zdCBuZXUgPSBzPy5uZXV0cmFsID8/IDA7XG4gICAgICAgICAgY29uc3QgcG9zID0gcz8ucG9zaXRpdmUgPz8gMDtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05lZ2F0aXZlJywga2V5OiAnTkVHQVRJVkUnLCBwZXJjZW50OiBuZWcsIGNvbG9yOiBzZW50aW1lbnRQYWxldHRlWydORUdBVElWRSddIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnTmV1dHJhbCcsICBrZXk6ICdORVVUUkFMJywgIHBlcmNlbnQ6IG5ldSwgY29sb3I6IHNlbnRpbWVudFBhbGV0dGVbJ05FVVRSQUwnXSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1Bvc2l0aXZlJywga2V5OiAnUE9TSVRJVkUnLCBwZXJjZW50OiBwb3MsIGNvbG9yOiBzZW50aW1lbnRQYWxldHRlWydQT1NJVElWRSddIH1cbiAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGFmZkNvbG9yczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgTkVHQVRJVkU6ICcjMDA3N0U2JyxcbiAgICAgICAgICBORVVUUkFMOiAnIzAwQTNGRicsXG4gICAgICAgICAgUE9TSVRJVkU6ICcjNERDM0ZGJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjdXN0Q29sb3JzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICBORUdBVElWRTogJyM4QUQ4RkYnLFxuICAgICAgICAgIE5FVVRSQUw6ICcjQkRFOEZGJyxcbiAgICAgICAgICBQT1NJVElWRTogJyNEOUYxRkYnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1aWxkU3RhY2tCYXIgPSAobGFiZWw6IHN0cmluZywgczogYW55LCBjb2xvcnM6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmVnID0gKyhzPy5uZWdhdGl2ZSA/PyAwKTtcbiAgICAgICAgICBjb25zdCBuZXUgPSArKHM/Lm5ldXRyYWwgPz8gMCk7XG4gICAgICAgICAgY29uc3QgcG9zID0gKyhzPy5wb3NpdGl2ZSA/PyAwKTtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IG5lZyArIG5ldSArIHBvcztcbiAgICAgICAgICBjb25zdCBwY3QgPSAodjogbnVtYmVyKSA9PiB0b3RhbCA+IDAgPyArKCh2IC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpIDogMDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgIHNlZ21lbnRzOiBbXG4gICAgICAgICAgICAgIHsga2V5OiAnTkVHQVRJVkUnLCBsYWJlbDogJ05lZ2F0aXZlJywgY291bnQ6IG5lZywgcGVyY2VudDogcGN0KG5lZyksIGNvbG9yOiBjb2xvcnNbJ05FR0FUSVZFJ10gfSxcbiAgICAgICAgICAgICAgeyBrZXk6ICdORVVUUkFMJywgIGxhYmVsOiAnTmV1dHJhbCcsICBjb3VudDogbmV1LCBwZXJjZW50OiBwY3QobmV1KSwgY29sb3I6IGNvbG9yc1snTkVVVFJBTCddIH0sXG4gICAgICAgICAgICAgIHsga2V5OiAnUE9TSVRJVkUnLCBsYWJlbDogJ1Bvc2l0aXZlJywgY291bnQ6IHBvcywgcGVyY2VudDogcGN0KHBvcyksIGNvbG9yOiBjb2xvcnNbJ1BPU0lUSVZFJ10gfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1aWxkTGVnZW5kID0gKHN0YWZmOiBhbnksIGN1c3Q6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlZ3M6IGFueVtdID0gW107XG4gICAgICAgICAgY29uc3QgcHVzaCA9IChncm91cDogc3RyaW5nLCBzOiBhbnksIGNvbG9yczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIFsnTkVHQVRJVkUnLCAnTkVVVFJBTCcsICdQT1NJVElWRSddLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgIHNlZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgICAgICAga2V5OiBrLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtncm91cH0gwrcgJHtrLmNoYXJBdCgwKSArIGsuc2xpY2UoMSkudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNba10sXG4gICAgICAgICAgICAgICAgY291bnQ6ICsocz8uW2sudG9Mb3dlckNhc2UoKV0gPz8gMClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHB1c2goJ1N0YWZmJywgc3RhZmYsIHN0YWZmQ29sb3JzKTtcbiAgICAgICAgICBwdXNoKCdDdXN0b21lcicsIGN1c3QsIGN1c3RDb2xvcnMpO1xuICAgICAgICAgIHJldHVybiBzZWdzO1xuICAgICAgICB9O1xuICAgICAgICBsZXQga2V5d29yZFJvd3M6IGFueVtdID0gW107XG4gICAgICAgIGlmIChrZXl3b3JkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICBrZXl3b3JkUm93cyA9IGtleXdvcmREYXRhLm1hcCgoazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBicmVha2Rvd24gPSBrLmJyZWFrZG93biB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHN0YWZmID0gay5zdGFmZiB8fCBicmVha2Rvd24uc3RhZmYgfHwgay5zZW50aW1lbnQgfHwgeyBuZWdhdGl2ZTogMCwgbmV1dHJhbDogMCwgcG9zaXRpdmU6IDAgfTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3QgPSBrLmN1c3RvbWVyIHx8IGJyZWFrZG93bi5jdXN0b21lciB8fCB7IG5lZ2F0aXZlOiAwLCBuZXV0cmFsOiAwLCBwb3NpdGl2ZTogMCB9O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IGsuaWQsXG4gICAgICAgICAgICAgIGxhYmVsOiBrLmtleXdvcmQgfHwgJycsXG4gICAgICAgICAgICAgIGNvdW50OiBrLmNvdW50IHx8IDAsXG4gICAgICAgICAgICAgIHNlbnRpbWVudDogc3RhZmYsXG4gICAgICAgICAgICAgIHNsaWNlczogYnVpbGRTbGljZXMoc3RhZmYpLFxuICAgICAgICAgICAgICBzdGFja2VkQmFyczogW1xuICAgICAgICAgICAgICAgIGJ1aWxkU3RhY2tCYXIoJ1N0YWZmJywgc3RhZmYsIHN0YWZmQ29sb3JzKSxcbiAgICAgICAgICAgICAgICBidWlsZFN0YWNrQmFyKCdDdXN0b21lcicsIGN1c3QsIGN1c3RDb2xvcnMpXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGxlZ2VuZDogYnVpbGRMZWdlbmQoc3RhZmYsIGN1c3QpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLmNvdW50IC0gYS5jb3VudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IGRlcml2ZSBmcm9tIGNvbnRlbnRfdGFncyArIHNoYXJlZCBzdGF0dXNfdGFnc1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRUYWdzOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoc2VjdGlvbi5jb250ZW50X3RhZ3MpID8gc2VjdGlvbi5jb250ZW50X3RhZ3MgOiB2YWx1ZXM7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzVGFnczogYW55W10gPSBBcnJheS5pc0FycmF5KHNlY3Rpb24uc3RhdHVzX3RhZ3MpID8gc2VjdGlvbi5zdGF0dXNfdGFncyA6IFtdO1xuICAgICAgICAgIGNvbnN0IHRvdGFsU3RhdHVzID0gc3RhdHVzVGFncy5yZWR1Y2UoKHN1bTogbnVtYmVyLCB0OiBhbnkpID0+IHN1bSArICh0LmNvdW50IHx8IDApLCAwKTtcbiAgICAgICAgICBjb25zdCBzaGFyZWRTZW50aW1lbnQ6IGFueSA9IHsgbmVnYXRpdmU6IDAsIG5ldXRyYWw6IDAsIHBvc2l0aXZlOiAwIH07XG4gICAgICAgICAgc3RhdHVzVGFncy5mb3JFYWNoKCh0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSAodC50YWcgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoayA9PT0gJ25lZ2F0aXZlJyB8fCBrID09PSAnbmV1dHJhbCcgfHwgayA9PT0gJ3Bvc2l0aXZlJykge1xuICAgICAgICAgICAgICBzaGFyZWRTZW50aW1lbnRba10gPSB0b3RhbFN0YXR1cyA/IE1hdGgucm91bmQoKHQuY291bnQgLyB0b3RhbFN0YXR1cykgKiAxMDApIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBrZXl3b3JkUm93cyA9IGNvbnRlbnRUYWdzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgbGFiZWw6IGl0ZW0udGFnID8/IGl0ZW0ubmFtZSA/PyAnJyxcbiAgICAgICAgICAgIGNvdW50OiBpdGVtLmNvdW50ID8/IGl0ZW0uUmVzcG9uc2VzID8/IDAsXG4gICAgICAgICAgICBzZW50aW1lbnQ6IHNoYXJlZFNlbnRpbWVudCxcbiAgICAgICAgICAgIHNsaWNlczogYnVpbGRTbGljZXMoc2hhcmVkU2VudGltZW50KSxcbiAgICAgICAgICAgIHN0YWNrZWRCYXJzOiBbXG4gICAgICAgICAgICAgIGJ1aWxkU3RhY2tCYXIoJ1N0YWZmJywgc2hhcmVkU2VudGltZW50LCBzdGFmZkNvbG9ycyksXG4gICAgICAgICAgICAgIGJ1aWxkU3RhY2tCYXIoJ0N1c3RvbWVyJywgeyBuZWdhdGl2ZTogMCwgbmV1dHJhbDogMCwgcG9zaXRpdmU6IDAgfSwgY3VzdENvbG9ycylcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBsZWdlbmQ6IGJ1aWxkTGVnZW5kKHNoYXJlZFNlbnRpbWVudCwgeyBuZWdhdGl2ZTogMCwgbmV1dHJhbDogMCwgcG9zaXRpdmU6IDAgfSlcbiAgICAgICAgICB9KSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuY291bnQgLSBhLmNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFJvdyA9IGtleXdvcmRSb3dzWzBdIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGZpcnN0U2xpY2UgPSBmaXJzdFJvdz8uc2xpY2VzPy5maW5kKChzOiBhbnkpID0+IHMucGVyY2VudCA+IDApIHx8IGZpcnN0Um93Py5zbGljZXM/LlswXSB8fCBudWxsO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUX0NIQVJUJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAga2V5d29yZFJvd3MsXG4gICAgICAgICAgc2VsZWN0ZWRLZXl3b3JkOiBmaXJzdFJvdz8ubGFiZWwgfHwgJycsXG4gICAgICAgICAgc2VsZWN0ZWRLZXl3b3JkQ291bnQ6IGZpcnN0Um93Py5jb3VudCB8fCAwLFxuICAgICAgICAgIHNlbGVjdGVkU2xpY2VzOiBmaXJzdFJvdz8uc2xpY2VzIHx8IFtdLFxuICAgICAgICAgIHNlbGVjdGVkU2VudGltZW50OiBmaXJzdFNsaWNlLFxuICAgICAgICAgIHNlbGVjdGVkU3RhY2tlZEJhcnM6IGZpcnN0Um93Py5zdGFja2VkQmFycyB8fCBbXSxcbiAgICAgICAgICBzZWxlY3RlZExlZ2VuZDogZmlyc3RSb3c/LmxlZ2VuZCB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUJykge1xuICAgICAgICBjb25zdCBjYXJkTmFtZSA9IHNlY3Rpb24ubmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IGlzRnVubmVsID0gY2FyZE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZnVubmVsJyk7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBjYXJkTmFtZSxcbiAgICAgICAgICB0eXBlOiAnQk9PTEVBTl9CQVNLRVQnLFxuICAgICAgICAgIGlzRnVubmVsLFxuICAgICAgICAgIGFwcGxpY2FibGVDb3VudCxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICBzaG9ydERlc2NyaXB0aW9uLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBib29sZWFuUm93czogdmFsdWVzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IGl0ZW0uX2lkIHx8ICcnLFxuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgIHJlc3BvbnNlczogaXRlbS5SZXNwb25zZXMgPz8gaXRlbS5jb3VudCA/PyAwLFxuICAgICAgICAgICAgc2NvcmU6IGl0ZW0uc2NvcmUgPz8gMFxuICAgICAgICAgIH0pKS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYi5yZXNwb25zZXMgLSBhLnJlc3BvbnNlcylcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdOVU1FUklDX1NDQUxBUicgfHwgdHlwZSA9PT0gJ05VTUVSSUNfQVJSQVknKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZXNbMF0gfHwge307XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2VjdGlvbi5zY2FsZSB8fCB7fTtcbiAgICAgICAgbnVtZXJpY1Jvd3MucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IHNlY3Rpb24ubmFtZSB8fCBrZXksXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGF2ZzogaXRlbS5BdmcgPz8gaXRlbS5hdmcgPz8gMCxcbiAgICAgICAgICBtaW46IGl0ZW0uTWluID8/IGl0ZW0ubWluID8/IHNjYWxlLm1pbiA/PyBzZWN0aW9uLm1pbiA/PyBudWxsLFxuICAgICAgICAgIG1heDogaXRlbS5NYXggPz8gaXRlbS5tYXggPz8gc2NhbGUubWF4ID8/IHNlY3Rpb24ubWF4ID8/IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTVUJKRUNUSVZFJyB8fCB0eXBlID09PSAnU1VCSkVDVElWRV9DT1VOVCcpIHtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IHNlY3Rpb24ubmFtZSB8fCBrZXksXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgc3ViamVjdGl2ZVJvd3M6IHZhbHVlcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIF9pZDogaXRlbS5faWQgfHwgJycsXG4gICAgICAgICAgICByZWFzb25pbmc6IGl0ZW0ucmVhc29uaW5nIHx8ICcnLFxuICAgICAgICAgICAgc3RvcmVfaWQ6IGl0ZW0uc3RvcmVfaWQgfHwgJycsXG4gICAgICAgICAgICBkYXRlOiBpdGVtLmRhdGUgfHwgJydcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR3JvdXAgYWxsIG51bWVyaWMgc2NvcmVzIGludG8gb25lIGNhcmRcbiAgICBpZiAobnVtZXJpY1Jvd3MubGVuZ3RoID4gMCkge1xuICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgIGtleTogJ251bWVyaWNTY29yZXMnLFxuICAgICAgICBuYW1lOiAnQXZlcmFnZSBTY29yZXMnLFxuICAgICAgICB0eXBlOiAnTlVNRVJJQ19HUk9VUCcsXG4gICAgICAgIG51bWVyaWNSb3dzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgdW5pcXVlIHBpdGNoZXMgY2FyZCBpZiBwcmVzZW50IChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gICAgaWYgKGFuYWx5c2lzLnVuaXF1ZVBpdGNoZXMgJiYgQXJyYXkuaXNBcnJheShhbmFseXNpcy51bmlxdWVQaXRjaGVzKSkge1xuICAgICAgY29uc3QgcGl0Y2hJbnNlcnRJZHggPSBjYXJkcy5sZW5ndGggPj0gMiA/IDIgOiBjYXJkcy5sZW5ndGg7XG4gICAgICBjYXJkcy5zcGxpY2UocGl0Y2hJbnNlcnRJZHgsIDAsIHtcbiAgICAgICAga2V5OiAndW5pcXVlUGl0Y2hlcycsXG4gICAgICAgIG5hbWU6ICdQaXRjaCBLZXl3b3JkcyBUcmFja2VyJyxcbiAgICAgICAgdHlwZTogJ1VOSVFVRV9QSVRDSEVTJyxcbiAgICAgICAgcGl0Y2hSb3dzOiBhbmFseXNpcy51bmlxdWVQaXRjaGVzLm1hcCgocDogYW55KSA9PiAoeyBpZDogcC5waXRjaElkLCBkZXNjOiBwLmRlc2NyaXB0aW9uIH0pKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhcmRzO1xuICB9XG5cbiAgLy8gQ2FyZCByb3cgY2xpY2sgKHNhbWUgYXMgYXVkaW8tcGFnZSBvbkNhcmRSb3dDbGljaylcbiAgc2VsZWN0ZWRDYXJkSWQgPSAnJztcbiAgc2VsZWN0ZWRDYXJkTmFtZSA9ICcnO1xuICB0b3RhbEF1ZGlvID0gMDtcblxuICAvLyBQcm9kdWN0IEF0dHJpYnV0ZSBBbmFseXNpcyDigJQgcm93L2NoaXAgY2xpY2sg4oaSIGNhdGVnb3J5LWFuYWx5c2lzLWNhcmRcbiAgY2F0ZWdvcnlQb3B1cE9wZW4gPSBmYWxzZTtcbiAgY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmcgPSBmYWxzZTtcbiAgY2F0ZWdvcnlBbmFseXNpc0Vycm9yID0gJyc7XG4gIGNhdGVnb3J5QW5hbHlzaXNDYXRlZ29yeSA9ICcnO1xuICBjYXRlZ29yeUFuYWx5c2lzQXR0cmlidXRlID0gJyc7XG4gIGNhdGVnb3J5QW5hbHlzaXNSb3dzOiB7IG5hbWU6IHN0cmluZzsgY291bnQ6IG51bWJlcjsgcGVyY2VudDogbnVtYmVyIH1bXSA9IFtdO1xuICBjYXRlZ29yeUFuYWx5c2lzVG90YWwgPSAwO1xuXG4gIG9uQ2F0ZWdvcnlBbmFseXNpc0NsaWNrKHJvdzogYW55LCBhdHRyaWJ1dGU/OiBzdHJpbmcsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH1cbiAgICBpZiAoIXJvdykgcmV0dXJuO1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5nZXRTdGFydERhdGUoKSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZ2V0RW5kRGF0ZSgpLFxuICAgICAgc3RvcmVJZDogdGhpcy5nZXRTdG9yZUlkcygpLFxuICAgICAgY29ob3J0SWQ6IHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCxcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIGNhdGVnb3J5OiByb3cuYnJhbmQgfHwgJydcbiAgICB9O1xuICAgIGlmIChhdHRyaWJ1dGUpIHBheWxvYWQuYXR0cmlidXRlID0gYXR0cmlidXRlO1xuXG4gICAgdGhpcy5jYXRlZ29yeVBvcHVwT3BlbiA9IHRydWU7XG4gICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzRXJyb3IgPSAnJztcbiAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNDYXRlZ29yeSA9IHJvdy5icmFuZCB8fCAnJztcbiAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUgfHwgJyc7XG4gICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzUm93cyA9IFtdO1xuICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc1RvdGFsID0gMDtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENhdGVnb3J5QW5hbHlzaXNDYXJkKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGEgPz8gcmVzID8/IHt9O1xuICAgICAgICBjb25zdCByYXdMaXN0OiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KGRhdGE/LnJlc3VsdHMpID8gZGF0YS5yZXN1bHRzXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KGRhdGE/LnZhbHVlKSA/IGRhdGEudmFsdWVcbiAgICAgICAgICA6IEFycmF5LmlzQXJyYXkoZGF0YT8uZGF0YSkgPyBkYXRhLmRhdGFcbiAgICAgICAgICA6IEFycmF5LmlzQXJyYXkoZGF0YT8udmFsdWVzKSA/IGRhdGEudmFsdWVzXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KGRhdGE/LmF0dHJpYnV0ZXMpID8gZGF0YS5hdHRyaWJ1dGVzXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KHJlcz8ucmVzdWx0cykgPyByZXMucmVzdWx0c1xuICAgICAgICAgIDogW107XG5cbiAgICAgICAgY29uc3QgbWFwcGVkID0gcmF3TGlzdC5tYXAoKGl0OiBhbnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogaXQ/LmNhdGVnb3J5ID8/IGl0Py5uYW1lID8/IGl0Py5sYWJlbCA/PyBpdD8uYXR0cmlidXRlID8/IGl0Py5rZXkgPz8gJycsXG4gICAgICAgICAgY291bnQ6IE51bWJlcihpdD8udmFsdWUgPz8gaXQ/LmNvdW50ID8/IGl0Py5SZXNwb25zZXMgPz8gaXQ/LnJlc3BvbnNlcyA/PyAwKVxuICAgICAgICB9KSkuZmlsdGVyKHIgPT4gci5uYW1lKTtcblxuICAgICAgICBjb25zdCB0b3RhbCA9IG1hcHBlZC5yZWR1Y2UoKHMsIHIpID0+IHMgKyAoci5jb3VudCB8fCAwKSwgMCk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc1RvdGFsID0gdG90YWw7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc1Jvd3MgPSBtYXBwZWRcbiAgICAgICAgICAubWFwKHIgPT4gKHsgLi4uciwgcGVyY2VudDogdG90YWwgPyBNYXRoLnJvdW5kKChyLmNvdW50IC8gdG90YWwpICogMTAwMCkgLyAxMCA6IDAgfSkpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc0Vycm9yID0gJ0ZhaWxlZCB0byBsb2FkIGNhdGVnb3J5IGFuYWx5c2lzLic7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlQ2F0ZWdvcnlQb3B1cCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhdGVnb3J5UG9wdXBPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzUm93cyA9IFtdO1xuICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc0Vycm9yID0gJyc7XG4gIH1cblxuICBvbkNhcmRSb3dDbGljayhpZDogYW55LCBuYW1lOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGFueSBwbGF5aW5nIGF1ZGlvXG4gICAgaWYgKHRoaXMucGxheWluZ0NvbnZJZCkge1xuICAgICAgY29uc3QgYXVkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYXVkaW8tJHt0aGlzLnBsYXlpbmdDb252SWR9YCkgYXMgSFRNTEF1ZGlvRWxlbWVudDtcbiAgICAgIGlmIChhdWRpbykgeyBhdWRpby5wYXVzZSgpOyBhdWRpby5jdXJyZW50VGltZSA9IDA7IH1cbiAgICAgIHRoaXMucGxheWluZ0NvbnZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDYXJkSWQgPSBpZCB8fCAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZE5hbWUgPSBpZCA/ICcnIDogKG5hbWUgfHwgJycpO1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgICAvLyBTY3JvbGwgdG8gY29udmVyc2F0aW9ucyBzZWN0aW9uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWNob0NvbnZlcnNhdGlvbnMnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBmZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgb2xkIGRhdGEgaW1tZWRpYXRlbHkgc28gc3RhbGUgcmVzdWx0cyBkb24ndCBzaG93XG4gICAgdGhpcy5kZXRhaWxDb252ZXJzYXRpb25zID0gW107XG4gICAgdGhpcy5kZXRhaWxQYWdlQ29udnMgPSBbXTtcbiAgICB0aGlzLmRldGFpbE9wZW5JZCA9IG51bGw7XG4gICAgdGhpcy5kZXRhaWxUb3RhbCA9IDA7XG4gICAgdGhpcy5kZXRhaWxMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLmJ1aWxkQmFzZVBheWxvYWQoKSxcbiAgICAgIGNvaG9ydFR5cGU6IHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9PT0gJ092ZXJhbGxfdHJhbnNjcmlwdHNfdjInID8gW10gOiBbdGhpcy5zZWxlY3RlZENvaG9ydElkXSxcbiAgICAgIGxpbWl0OiB0aGlzLmRldGFpbFBlclBhZ2UsXG4gICAgICBfaWQ6IHRoaXMuc2VsZWN0ZWRDYXJkSWQgPyBbdGhpcy5zZWxlY3RlZENhcmRJZF0gOiBbXSxcbiAgICAgIG5hbWU6IHRoaXMuc2VsZWN0ZWRDYXJkTmFtZSxcbiAgICAgIG9mZnNldDogdGhpcy5kZXRhaWxQYWdlIC0gMSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmRldGFpbFNlYXJjaFZhbHVlIHx8ICcnXG4gICAgfTtcbiAgICBpZiAodGhpcy5pc092ZXJhbGxUcmFuc2NyaXB0c0NvaG9ydCAmJiB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UpIHtcbiAgICAgIHBheWxvYWQuYXVkaW9Tb3VyY2UgPSB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hdWRpb1NlcnZpY2UuZ2V0Q29udmVyc2F0aW9uc0xpc3QocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgY29uc3QgbGlzdCA9IGRhdGE/LmRhdGEgfHwgZGF0YT8uY29udmVyc2F0aW9ucyB8fCBbXTtcbiAgICAgICAgdGhpcy5kZXRhaWxDb252ZXJzYXRpb25zID0gbGlzdC5tYXAoKGl0ZW06IGFueSkgPT4gdGhpcy5tYXBDb252ZXJzYXRpb24oaXRlbSkpO1xuICAgICAgICB0aGlzLmRldGFpbFRvdGFsID0gZGF0YT8uY291bnQgPz8gZGF0YT8ucGFnaW5hdGlvbj8udG90YWwgPz8gdGhpcy5kZXRhaWxDb252ZXJzYXRpb25zLmxlbmd0aDtcbiAgICAgICAgdGhpcy5kZXRhaWxUb3RhbFBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuZGV0YWlsVG90YWwgLyB0aGlzLmRldGFpbFBlclBhZ2UpKTtcbiAgICAgICAgdGhpcy5kZXRhaWxQYWdpbmF0aW9uU2l6ZXMgPSB0aGlzLmRldGFpbFRvdGFsID4gMTAgPyBbMTAsIDIwLCA1MCwgMTAwXSA6IFt0aGlzLmRldGFpbFRvdGFsIHx8IDEwXTtcbiAgICAgICAgdGhpcy5kZXRhaWxQZXJQYWdlID0gdGhpcy5kZXRhaWxQYWdpbmF0aW9uU2l6ZXMuaW5jbHVkZXModGhpcy5kZXRhaWxQZXJQYWdlKSA/IHRoaXMuZGV0YWlsUGVyUGFnZSA6IHRoaXMuZGV0YWlsUGFnaW5hdGlvblNpemVzWzBdO1xuICAgICAgICB0aGlzLmRldGFpbFBhZ2VDb252cyA9IHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuZGV0YWlsUGFnZUNvbnZzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmRldGFpbE9wZW5JZCA9IHRoaXMuZGV0YWlsUGFnZUNvbnZzWzBdLmF1ZGlvSWQ7XG4gICAgICAgICAgdGhpcy5sb2FkQ29udkRldGFpbCh0aGlzLmRldGFpbFBhZ2VDb252c1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRhaWxMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5kZXRhaWxDb252ZXJzYXRpb25zID0gW107XG4gICAgICAgIHRoaXMuZGV0YWlsUGFnZUNvbnZzID0gW107XG4gICAgICAgIHRoaXMuZGV0YWlsVG90YWxQYWdlcyA9IDE7XG4gICAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZENvbnZlcnNhdGlvbkRldGFpbChjb252OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBhdWRpb0lkID0gY29udj8uZG9jX2lkIHx8IGNvbnY/LmF1ZGlvSWQgfHwgY29udj8uX2lkO1xuICAgIGlmICghYXVkaW9JZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5hdWRpb1NlcnZpY2UuZ2V0Q29udmVyc2F0aW9uRGV0YWlsKGF1ZGlvSWQsIHtcbiAgICAgIGNvaG9ydElkOiBbdGhpcy5zZWxlY3RlZENvaG9ydElkXSxcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kZXRhaWxDb252RGV0YWlsID0gcmVzPy5kYXRhIHx8IHJlcztcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmRldGFpbENvbnZEZXRhaWwgPSBudWxsOyB9XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVEZXRhaWxDb252KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbE9wZW5JZCA9IHRoaXMuZGV0YWlsT3BlbklkID09PSBpZCA/IG51bGwgOiBpZDtcbiAgfVxuXG4gIG9uRGV0YWlsUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSBwYWdlO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBvbkRldGFpbFBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsUGVyUGFnZSA9IHBhcnNlSW50KHNpemUpO1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBNQU5BR0UgVEFCICh1c2VzIGxpc3RDb2hvcnRzL2RlbGV0ZUNvaG9ydCBBUElzKVxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgbG9hZE1hbmFnZUNvaG9ydHMoKTogdm9pZCB7XG4gICAgdGhpcy5tYW5hZ2VMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBvZmZzZXQgPSAodGhpcy5tYW5hZ2VQYWdlIC0gMSkgKiB0aGlzLm1hbmFnZVBlclBhZ2U7XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5saXN0Q29ob3J0cyh0aGlzLmNsaWVudElkLCB0aGlzLm1hbmFnZVBlclBhZ2UsIG9mZnNldCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tYW5hZ2VDb2hvcnRzID0gcmVzPy5kYXRhPy5jb2hvcnRzIHx8IFtdO1xuICAgICAgICB0aGlzLm1hbmFnZVRvdGFsID0gcmVzPy5kYXRhPy5wYWdpbmF0aW9uPy50b3RhbCA/PyB0aGlzLm1hbmFnZUNvaG9ydHMubGVuZ3RoO1xuICAgICAgICB0aGlzLm1hbmFnZVRvdGFsUGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5tYW5hZ2VUb3RhbCAvIHRoaXMubWFuYWdlUGVyUGFnZSkpO1xuICAgICAgICB0aGlzLm1hbmFnZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLm1hbmFnZUNvaG9ydHMgPSBbXTtcbiAgICAgICAgdGhpcy5tYW5hZ2VUb3RhbCA9IDA7XG4gICAgICAgIHRoaXMubWFuYWdlVG90YWxQYWdlcyA9IDE7XG4gICAgICAgIHRoaXMubWFuYWdlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25NYW5hZ2VQYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWFuYWdlUGFnZSA9IHBhZ2U7XG4gICAgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpO1xuICB9XG5cbiAgb25NYW5hZ2VQYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmFnZVBlclBhZ2UgPSBwYXJzZUludChzaXplKTtcbiAgICB0aGlzLm1hbmFnZVBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZE1hbmFnZUNvaG9ydHMoKTtcbiAgfVxuXG4gIG9uTWFuYWdlU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMubWFuYWdlUGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpO1xuICB9XG5cbiAgZGVsZXRlQ29ob3J0KGNvaG9ydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBjb2hvcnQ/JykpIHJldHVybjtcbiAgICB0aGlzLmF1ZGlvU2VydmljZS5kZWxldGVDb2hvcnQoY29ob3J0SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4geyB0aGlzLmxvYWRNYW5hZ2VDb2hvcnRzKCk7IH0sXG4gICAgICBlcnJvcjogKCkgPT4geyBhbGVydCgnRmFpbGVkIHRvIGRlbGV0ZSBjb2hvcnQuJyk7IH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBBVURJTyBQTEFZRVIgKHNhbWUgcGF0dGVybiBhcyB0cmFuc2NyaXB0LWxpc3QpXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBwbGF5YmFja1N0YXRlczogeyBbaWQ6IHN0cmluZ106IHsgY3VycmVudFRpbWU6IHN0cmluZzsgdG90YWxUaW1lOiBzdHJpbmc7IHByb2dyZXNzOiBudW1iZXIgfSB9ID0ge307XG4gIGlzTXV0ZWQgPSBmYWxzZTtcblxuICB0b2dnbGVQbGF5KGNvbnZJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYXVkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYXVkaW8tJHtjb252SWR9YCkgYXMgSFRNTEF1ZGlvRWxlbWVudDtcbiAgICBpZiAoIWF1ZGlvKSByZXR1cm47XG4gICAgaWYgKHRoaXMucGxheWluZ0NvbnZJZCA9PT0gY29udklkKSB7XG4gICAgICBhdWRpby5wYXVzZSgpO1xuICAgICAgdGhpcy5wbGF5aW5nQ29udklkID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGF1c2UgYW55IGN1cnJlbnRseSBwbGF5aW5nXG4gICAgICBpZiAodGhpcy5wbGF5aW5nQ29udklkKSB7XG4gICAgICAgIGNvbnN0IG90aGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7dGhpcy5wbGF5aW5nQ29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgICAgIGlmIChvdGhlcikgb3RoZXIucGF1c2UoKTtcbiAgICAgICAgdGhpcy5wbGF5aW5nQ29udklkID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBsYXlQcm9taXNlID0gYXVkaW8ucGxheSgpO1xuICAgICAgaWYgKHBsYXlQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGxheVByb21pc2UudGhlbigoKSA9PiB7IHRoaXMucGxheWluZ0NvbnZJZCA9IGNvbnZJZDsgfSkuY2F0Y2goKCkgPT4geyB0aGlzLnBsYXlpbmdDb252SWQgPSBudWxsOyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGxheWluZ0NvbnZJZCA9IGNvbnZJZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkxvYWRlZE1ldGFkYXRhKGF1ZGlvOiBIVE1MQXVkaW9FbGVtZW50LCBjb252SWQ6IHN0cmluZywgYXBpRHVyYXRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXSkge1xuICAgICAgdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdID0geyBjdXJyZW50VGltZTogJzA6MDAnLCB0b3RhbFRpbWU6ICcwOjAwJywgcHJvZ3Jlc3M6IDAgfTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF07XG4gICAgaWYgKGlzRmluaXRlKGF1ZGlvLmR1cmF0aW9uKSAmJiBhdWRpby5kdXJhdGlvbiA+IDApIHtcbiAgICAgIHN0YXRlLnRvdGFsVGltZSA9IHRoaXMuZm9ybWF0QXVkaW9UaW1lKGF1ZGlvLmR1cmF0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGFwaUR1cmF0aW9uKSB7XG4gICAgICBzdGF0ZS50b3RhbFRpbWUgPSBhcGlEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICBvblRpbWVVcGRhdGUoYXVkaW86IEhUTUxBdWRpb0VsZW1lbnQsIGNvbnZJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0pIHtcbiAgICAgIHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXSA9IHsgY3VycmVudFRpbWU6ICcwOjAwJywgdG90YWxUaW1lOiAnMDowMCcsIHByb2dyZXNzOiAwIH07XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdO1xuICAgIHN0YXRlLmN1cnJlbnRUaW1lID0gdGhpcy5mb3JtYXRBdWRpb1RpbWUoYXVkaW8uY3VycmVudFRpbWUpO1xuICAgIGlmIChpc0Zpbml0ZShhdWRpby5kdXJhdGlvbikgJiYgYXVkaW8uZHVyYXRpb24gPiAwKSB7XG4gICAgICBzdGF0ZS5wcm9ncmVzcyA9IGF1ZGlvLmN1cnJlbnRUaW1lIC8gYXVkaW8uZHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgc2Vla0F1ZGlvKGV2ZW50OiBNb3VzZUV2ZW50LCBjb252SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNrID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gdHJhY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcmF0aW8gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSk7XG4gICAgY29uc3QgYXVkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYXVkaW8tJHtjb252SWR9YCkgYXMgSFRNTEF1ZGlvRWxlbWVudDtcbiAgICBpZiAoIWF1ZGlvIHx8ICFpc0Zpbml0ZShhdWRpby5kdXJhdGlvbikgfHwgYXVkaW8uZHVyYXRpb24gPD0gMCkgcmV0dXJuO1xuICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gcmF0aW8gKiBhdWRpby5kdXJhdGlvbjtcbiAgICAvLyBVcGRhdGUgd2F2ZWZvcm0gcHJvZ3Jlc3MgaW5zdGFudGx5IOKAlCByZWFzc2lnbiBvYmplY3QgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgcHJldiA9IHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXSB8fCB7IGN1cnJlbnRUaW1lOiAnMDowMCcsIHRvdGFsVGltZTogJzA6MDAnLCBwcm9ncmVzczogMCB9O1xuICAgIHRoaXMucGxheWJhY2tTdGF0ZXMgPSB7XG4gICAgICAuLi50aGlzLnBsYXliYWNrU3RhdGVzLFxuICAgICAgW2NvbnZJZF06IHsgLi4ucHJldiwgcHJvZ3Jlc3M6IHJhdGlvLCBjdXJyZW50VGltZTogdGhpcy5mb3JtYXRBdWRpb1RpbWUoYXVkaW8uY3VycmVudFRpbWUpIH1cbiAgICB9O1xuICAgIC8vIElmIG5vdCBhbHJlYWR5IHBsYXlpbmcsIHN0YXJ0IHBsYXliYWNrIGZyb20gdGhlIGNsaWNrZWQgcG9zaXRpb25cbiAgICBpZiAodGhpcy5wbGF5aW5nQ29udklkICE9PSBjb252SWQpIHtcbiAgICAgIGNvbnN0IHBsYXlQcm9taXNlID0gYXVkaW8ucGxheSgpO1xuICAgICAgaWYgKHBsYXlQcm9taXNlKSB7XG4gICAgICAgIHBsYXlQcm9taXNlLnRoZW4oKCkgPT4geyB0aGlzLnBsYXlpbmdDb252SWQgPSBjb252SWQ7IH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNdXRlZCA9ICF0aGlzLmlzTXV0ZWQ7XG4gICAgY29uc3QgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYXVkaW8nKTtcbiAgICBhdWRpb3MuZm9yRWFjaChhID0+IGEubXV0ZWQgPSB0aGlzLmlzTXV0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRBdWRpb1RpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXNlY29uZHMpIHJldHVybiAnMDowMCc7XG4gICAgY29uc3QgbWlucyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApO1xuICAgIHJldHVybiBgJHttaW5zfToke3NlY3MgPCAxMCA/ICcwJyArIHNlY3MgOiBzZWNzfWA7XG4gIH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gRklMVEVSUyBEUkFXRVJcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIG9wZW5GaWx0ZXJEcmF3ZXIoKTogdm9pZCB7IHRoaXMuZHJhd2VyT3BlbiA9IHRydWU7IH1cbiAgY2xvc2VGaWx0ZXJEcmF3ZXIoKTogdm9pZCB7IHRoaXMuZHJhd2VyT3BlbiA9IGZhbHNlOyB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIFVUSUxJVFlcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIHRyYWNrQnlJZChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBpdGVtPy5pZCB8fCBpdGVtPy5faWQgfHwgaXRlbT8uZG9jX2lkIHx8IGluZGV4O1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2Uoc3RhdHVzOiBzdHJpbmcpOiB7IGJnOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfSB7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybiB7IGJnOiAnJywgY29sb3I6ICcnIH07XG4gICAgY29uc3QgcyA9IHN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChzLmluY2x1ZGVzKCdwb3NpdGl2ZScpIHx8IHMuaW5jbHVkZXMoJ3N0cm9uZycpIHx8IHMuaW5jbHVkZXMoJ2dvb2QnKSB8fCBzLmluY2x1ZGVzKCdjb25maWRlbnQnKSB8fCBzLmluY2x1ZGVzKCdleGNlbGxlbnQnKSlcbiAgICAgIHJldHVybiB7IGJnOiAnI0QxRkFFNScsIGNvbG9yOiAnIzA2NUY0NicgfTtcbiAgICBpZiAocy5pbmNsdWRlcygnd2FybmluZycpIHx8IHMuaW5jbHVkZXMoJ21vZGVyYXRlJykgfHwgcy5pbmNsdWRlcygncm9vbSB0byBpbXByb3ZlJykgfHwgcy5pbmNsdWRlcygnYXZlcmFnZScpKVxuICAgICAgcmV0dXJuIHsgYmc6ICcjRkVGM0M3JywgY29sb3I6ICcjOTI0MDBFJyB9O1xuICAgIGlmIChzLmluY2x1ZGVzKCduZWdhdGl2ZScpIHx8IHMuaW5jbHVkZXMoJ3dlYWsnKSB8fCBzLmluY2x1ZGVzKCdwb29yJykgfHwgcy5pbmNsdWRlcygnY3JpdGljYWwnKSlcbiAgICAgIHJldHVybiB7IGJnOiAnI0ZFRTJFMicsIGNvbG9yOiAnIzk5MUIxQicgfTtcbiAgICByZXR1cm4geyBiZzogJyNGMEY0RkYnLCBjb2xvcjogJyMxQTJCNEInIH07XG4gIH1cblxuICBmb3JtYXRNZXRyaWNWYWx1ZSh2OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh2LnNjb3JlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHMgPSB2LnNjb3JlO1xuICAgICAgaWYgKHR5cGVvZiBzID09PSAnbnVtYmVyJykgcmV0dXJuIHMgKyAnJSc7XG4gICAgICBjb25zdCBzdHIgPSBTdHJpbmcocyk7XG4gICAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHYuVG90YWwgPz8gdi50b3RhbCA/PyB2LkF2ZyA/PyB2LmF2ZyA/PyB2LmNvdW50O1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsICE9IG51bGwgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgZ2V0U2NvcmVDb2xvcihzY29yZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoc2NvcmUgPj0gMzUpIHJldHVybiAnIzAwNzdFNic7XG4gICAgaWYgKHNjb3JlID49IDIwKSByZXR1cm4gJyMwMEEzRkYnO1xuICAgIGlmIChzY29yZSA+PSAxMCkgcmV0dXJuICcjNERDM0ZGJztcbiAgICBpZiAoc2NvcmUgPj0gNSkgcmV0dXJuICcjOEFEOEZGJztcbiAgICBpZiAoc2NvcmUgPj0gMikgcmV0dXJuICcjQkRFOEZGJztcbiAgICByZXR1cm4gJyNEOUYxRkYnO1xuICB9XG5cbiAgaGFzU2VhcmNoTWF0Y2gobGlzdDogYW55W10sIHNlYXJjaDogc3RyaW5nLCBrZXkxOiBzdHJpbmcsIGtleTI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghc2VhcmNoKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBxID0gc2VhcmNoLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGxpc3Quc29tZShpdGVtID0+ICgoaXRlbVtrZXkxXSB8fCBpdGVtW2tleTJdIHx8ICcnKSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICB9XG5cbiAgTWF0aCA9IE1hdGg7XG5cbiAgLy8gRGlzcGxheS1vbmx5IGxhYmVsIG92ZXJyaWRlcy4gQmFja2VuZCB2YWx1ZXMgYW5kIElEcyBhcmUgdW50b3VjaGVkLlxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlOYW1lT3ZlcnJpZGVzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAnY3VzdG9tIHBpdGNoIHBvaW50cyBkaXNjb3ZlcnknOiAnVW5pcXVlIFBpdGNoIERpc2NvdmVyeSdcbiAgfTtcblxuICBkaXNwbGF5TmFtZShuYW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHMgPSAobmFtZSA/PyAnJykudG9TdHJpbmcoKTtcbiAgICBjb25zdCBrZXkgPSBzLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lT3ZlcnJpZGVzW2tleV0gfHwgcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBCb29sZWFuX2Jhc2tldF9jaGFydCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyDilIDilIAgQk9PTEVBTl9CQVNLRVRfVEFCTEUgb3ZlcmZsb3cgdG9vbHRpcCAoZmxvYXRpbmcpIOKUgOKUgOKUgFxuICBiYnRUb29sdGlwOiB7IHZpc2libGU6IGJvb2xlYW47IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpdGVtczogc3RyaW5nW10gfSA9IHtcbiAgICB2aXNpYmxlOiBmYWxzZSwgeDogMCwgeTogMCwgaXRlbXM6IFtdXG4gIH07XG5cbiAgc2hvd0JidFRvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW1zOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBhcHByb3hXaWR0aCA9IDIyMDtcbiAgICBjb25zdCBtYXJnaW4gPSAxMjtcbiAgICBjb25zdCB2dyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGxldCB4ID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgY29uc3QgaGFsZldpZHRoID0gYXBwcm94V2lkdGggLyAyO1xuICAgIGlmICh4ICsgaGFsZldpZHRoID4gdncgLSBtYXJnaW4pIHggPSB2dyAtIG1hcmdpbiAtIGhhbGZXaWR0aDtcbiAgICBpZiAoeCAtIGhhbGZXaWR0aCA8IG1hcmdpbikgeCA9IG1hcmdpbiArIGhhbGZXaWR0aDtcbiAgICB0aGlzLmJidFRvb2x0aXAgPSB7XG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgeCxcbiAgICAgIHk6IHJlY3QudG9wIC0gOCxcbiAgICAgIGl0ZW1zXG4gICAgfTtcbiAgfVxuXG4gIGhpZGVCYnRUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMuYmJ0VG9vbHRpcCA9IHsgdmlzaWJsZTogZmFsc2UsIHg6IDAsIHk6IDAsIGl0ZW1zOiBbXSB9O1xuICB9XG5cbiAgZXhwb3J0QmJ0Q2FyZChjYXJkOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNhcmQgfHwgIUFycmF5LmlzQXJyYXkoY2FyZC50YWJsZVJvd3MpIHx8IGNhcmQudGFibGVSb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvd3MgPSBjYXJkLnRhYmxlUm93cy5tYXAoKHI6IGFueSkgPT4gKHtcbiAgICAgIEJyYW5kOiByLmJyYW5kIHx8ICcnLFxuICAgICAgQXR0cmlidXRlczogQXJyYXkuaXNBcnJheShyLmFsbEF0dHJpYnV0ZXMpID8gci5hbGxBdHRyaWJ1dGVzLmpvaW4oJywgJykgOiAnJyxcbiAgICAgIENvdW50OiByLmNvdW50ID8/IDBcbiAgICB9KSk7XG4gICAgY29uc3Qgd29ya3NoZWV0OiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChyb3dzKTtcbiAgICB3b3Jrc2hlZXRbJyFjb2xzJ10gPSBbeyB3Y2g6IDI4IH0sIHsgd2NoOiA4MCB9LCB7IHdjaDogMTAgfV07XG4gICAgY29uc3Qgd29ya2Jvb2s6IFhMU1guV29ya0Jvb2sgPSB7IFNoZWV0czogeyBEYXRhOiB3b3Jrc2hlZXQgfSwgU2hlZXROYW1lczogWydEYXRhJ10gfTtcbiAgICBjb25zdCBidWZmZXI6IGFueSA9IFhMU1gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSk7XG4gICAgY29uc3Qgc2FmZU5hbWUgPSAoY2FyZC5uYW1lIHx8ICdjYXJkJykudG9TdHJpbmcoKS5yZXBsYWNlKC9bXmEtejAtOS1fXSsvZ2ksICdfJyk7XG4gICAgRmlsZVNhdmVyLnNhdmVBcyhibG9iLCBgJHtzYWZlTmFtZX0ueGxzeGApO1xuICB9XG5cbiAgc2VsZWN0UGllU2xpY2UoY2FyZDogYW55LCBzbGljZTogYW55KTogdm9pZCB7XG4gICAgY2FyZC5zZWxlY3RlZFBpZUxhYmVsID0gc2xpY2UubGFiZWw7XG4gIH1cblxuICBzZWxlY3RCYXNrZXRLZXl3b3JkKGNhcmQ6IGFueSwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjYXJkLnNlbGVjdGVkS2V5d29yZCA9IHJvdy5sYWJlbDtcbiAgICBjYXJkLnNlbGVjdGVkS2V5d29yZENvdW50ID0gcm93LmNvdW50IHx8IDA7XG4gICAgY2FyZC5zZWxlY3RlZFNsaWNlcyA9IHJvdy5zbGljZXMgfHwgW107XG4gICAgY2FyZC5zZWxlY3RlZFNlbnRpbWVudCA9IGNhcmQuc2VsZWN0ZWRTbGljZXMuZmluZCgoczogYW55KSA9PiBzLnBlcmNlbnQgPiAwKSB8fCBjYXJkLnNlbGVjdGVkU2xpY2VzWzBdIHx8IG51bGw7XG4gICAgY2FyZC5zZWxlY3RlZFN0YWNrZWRCYXJzID0gcm93LnN0YWNrZWRCYXJzIHx8IFtdO1xuICAgIGNhcmQuc2VsZWN0ZWRMZWdlbmQgPSByb3cubGVnZW5kIHx8IFtdO1xuICB9XG5cbiAgc2VsZWN0QmFza2V0U2VudGltZW50KGNhcmQ6IGFueSwgc2xpY2U6IGFueSk6IHZvaWQge1xuICAgIGNhcmQuc2VsZWN0ZWRTZW50aW1lbnQgPSBzbGljZTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHN0cm9rZS1kYXNoYXJyYXkgb2Zmc2V0IHNlZ21lbnRzIGZvciBkb251dCByaW5nXG4gIGdldERvbnV0RGFzaChzbGljZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiA0MjsgLy8gcj00MlxuICAgIGNvbnN0IGxlbiA9IChzbGljZS5wZXJjZW50IC8gMTAwKSAqIGNpcmN1bWZlcmVuY2U7XG4gICAgcmV0dXJuIGAke2xlbn0gJHtjaXJjdW1mZXJlbmNlIC0gbGVufWA7XG4gIH1cblxuICBnZXREb251dE9mZnNldChpbmRleDogbnVtYmVyLCBjYXJkOiBhbnkpOiBudW1iZXIge1xuICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSAyICogTWF0aC5QSSAqIDQyO1xuICAgIGNvbnN0IHNsaWNlcyA9IGNhcmQuc2VsZWN0ZWRTbGljZXMgfHwgW107XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7XG4gICAgICBvZmZzZXQgKz0gKHNsaWNlc1tpXS5wZXJjZW50IC8gMTAwKSAqIGNpcmN1bWZlcmVuY2U7XG4gICAgfVxuICAgIHJldHVybiAtb2Zmc2V0O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZWNoby1wYWdlXCI+XG4gIDwhLS0gRmxvYXRpbmcgdG9vbHRpcCBmb3IgQk9PTEVBTl9CQVNLRVRfVEFCTEUgb3ZlcmZsb3cgY2hpcHMgLS0+XG4gIDxkaXYgY2xhc3M9XCJiYnQtZmxvYXQtdG9vbHRpcFwiXG4gICAgICAgKm5nSWY9XCJiYnRUb29sdGlwLnZpc2libGVcIlxuICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImJidFRvb2x0aXAueFwiXG4gICAgICAgW3N0eWxlLnRvcC5weF09XCJiYnRUb29sdGlwLnlcIj5cbiAgICA8c3BhbiAqbmdGb3I9XCJsZXQgb3Ygb2YgYmJ0VG9vbHRpcC5pdGVtc1wiIGNsYXNzPVwiYmJ0LWNoaXAtdG9vbHRpcC1pdGVtXCI+e3sgb3YgfX08L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZWNoby1jb250ZW50XCI+XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBDT05WRVJTQVRJT05TIFRBQiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnY29udmVyc2F0aW9ucydcIj5cblxuICAgICAgPCEtLSBUYW5nbyBBSSBIZWFkZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tYWktaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS1sb2dvXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI2XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjZmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgMmwyLjA5IDYuMjZMMjAgMTBsLTUuOTEgMS43NEwxMiAxOGwtMi4wOS02LjI2TDQgMTBsNS45MS0xLjc0TDEyIDJ6XCIvPjwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLWhlYWRlci10ZXh0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLXRpdGxlXCI+VGFuZ28gQUk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tYWktc3VidGl0bGVcIj5BbmFseXNlIGNvbnZlcnNhdGlvbnMsIHN0b3JlcyAmIHN0YWZmIHBlcmZvcm1hbmNlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VhcmNoIENhcmQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWNoby1zZWFyY2gtY2FyZFwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVjaG8tc2VhcmNoLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJBc2sgYW55dGhpbmcuLi4gJ1doaWNoIHN0b3JlcyBhcmUgbm90IHBlcmZvcm1pbmcgd2VsbD8nXCIgWyhuZ01vZGVsKV09XCJjb252U2VhcmNoUXVlcnlcIiAoa2V5dXAuZW50ZXIpPVwic2VuZENvbnZRdWVyeSgpXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJlY2hvLXNlYXJjaC1zZW5kXCIgKGNsaWNrKT1cInNlbmRDb252UXVlcnkoKVwiIFtkaXNhYmxlZF09XCIhY29udlNlYXJjaFF1ZXJ5Py50cmltKClcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMjJcIiB5MT1cIjJcIiB4Mj1cIjExXCIgeTI9XCIxM1wiPjwvbGluZT5cbiAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjIyIDIgMTUgMjIgMTEgMTMgMiA5IDIyIDJcIj48L3BvbHlnb24+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQUkgUmVzcG9uc2UgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWNoby1haS1yZXNwb25zZVwiICpuZ0lmPVwiY29udkFpTG9hZGluZyB8fCBjb252QWlSZXBseVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udkFpTG9hZGluZ1wiIGNsYXNzPVwidHlwaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0eXBpbmctZG90XCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwidHlwaW5nLWRvdFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInR5cGluZy1kb3RcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCAqbmdJZj1cIiFjb252QWlMb2FkaW5nICYmIGNvbnZBaVJlcGx5XCIgY2xhc3M9XCJlY2hvLWFpLXRleHRcIj57eyBjb252QWlSZXBseSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRvdGFsIGNvdW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVjaG8tY29udi1jb3VudFwiPnt7IGNvbnZUb3RhbCB9fSBDb252ZXJzYXRpb25zPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29udmVyc2F0aW9ucyBsaXN0IGFyZWEgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udmVyc2F0aW9ucy1zZWN0aW9uXCI+XG5cbiAgICAgIDwhLS0gTG9hZGluZyAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJjb252TG9hZGluZ1wiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZVwiPkxvYWRpbmcgY29udmVyc2F0aW9ucy4uLjwvZGl2PlxuXG4gICAgICA8IS0tIENvbnZlcnNhdGlvbiBjYXJkcyAoZHluYW1pYyBmcm9tIEFQSSDigJQgc2FtZSBwYXR0ZXJuIGFzIHRyYW5zY3JpcHQtbGlzdCkgLS0+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb252IG9mIGNvbnZlcnNhdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiIGNsYXNzPVwiY29udi1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVDb252RXhwYW5kKGNvbnYuYXVkaW9JZClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1oZWFkZXItYm9keVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtbWV0YS1yb3dcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb252LWlkXCI+e3sgY29udi5hdWRpb0lkIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnIGJyYW5kXCIgKm5nSWY9XCJjb252LnN0b3JlTmFtZVwiPnt7IGNvbnYuc3RvcmVOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LmxvY2F0aW9uXCI+e3sgY29udi5sb2NhdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi51c2VyTmFtZVwiPnt7IGNvbnYudXNlck5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYuZGF0ZVwiPnt7IGNvbnYuZGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZyBtZXRhLXRhZy0tZHVyYXRpb25cIiAqbmdJZj1cImNvbnYuZHVyYXRpb25cIj57eyBjb252LmR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICB7eyBjb252LmF1ZGlvRGVzY3JpcHRpb24gfHwgJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZScgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWNoZXZyb25cIiBbY2xhc3Mub3Blbl09XCJleHBhbmRlZENvbnZJZHNbY29udi5hdWRpb0lkXVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOTRBM0I4XCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNNiA5bDYgNiA2LTZcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRXhwYW5kZWQgYm9keSAodW5pZmllZCBsYXlvdXQgbWF0Y2hpbmcgQWdlbnQgQW5hbHlzaXMgZGVzaWduKSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImV4cGFuZGVkQ29udklkc1tjb252LmF1ZGlvSWRdXCIgY2xhc3M9XCJjb252LWJvZHktZXhwYW5kZWRcIj5cblxuICAgICAgICAgIDwhLS0gV2F2ZWZvcm0gcGxheWVyIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXBsYXllclwiICpuZ0lmPVwiY29udi5hdWRpb1VybFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVjaG8tcGxheS1idG5cIiBbY2xhc3MucGxheWluZ109XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiAoY2xpY2spPVwidG9nZ2xlUGxheShjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJwbGF5aW5nQ29udklkICE9PSBjb252LmF1ZGlvSWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+PHBhdGggZD1cIk04IDV2MTRsMTEtN3pcIi8+PC9zdmc+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+PHBhdGggZD1cIk02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHpcIi8+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXdhdmVmb3JtXCIgW2NsYXNzLndmLXBsYXlpbmddPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgKGNsaWNrKT1cInNlZWtBdWRpbygkZXZlbnQsIGNvbnYuYXVkaW9JZClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8td2YtYmFyXCIgKm5nRm9yPVwibGV0IGggb2Ygd2F2ZWZvcm1IZWlnaHRzOyBsZXQgaSA9IGluZGV4XCIgW3N0eWxlLmhlaWdodC5weF09XCJoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucGxheWVkXT1cIihwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy5wcm9ncmVzcyB8fCAwKSA+IGkgLyB3YXZlZm9ybUhlaWdodHMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVjaG8tdGltZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZCAmJiBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy5jdXJyZW50VGltZVwiPnt7IHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0uY3VycmVudFRpbWUgfX0gLyA8L3NwYW4+e3sgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8udG90YWxUaW1lIHx8IGNvbnYuZHVyYXRpb24gfHwgJy0tJyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGF1ZGlvIFtpZF09XCInYXVkaW8tJyArIGNvbnYuYXVkaW9JZFwiIFtzcmNdPVwiY29udi5hdWRpb1VybFwiIHByZWxvYWQ9XCJhdXRvXCJcbiAgICAgICAgICAgICAgKHRpbWV1cGRhdGUpPVwib25UaW1lVXBkYXRlKGF1ZGlvRWwsIGNvbnYuYXVkaW9JZClcIlxuICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25Mb2FkZWRNZXRhZGF0YShhdWRpb0VsLCBjb252LmF1ZGlvSWQsIGNvbnYuZHVyYXRpb24pXCJcbiAgICAgICAgICAgICAgKGVuZGVkKT1cInBsYXlpbmdDb252SWQgPSBudWxsXCIgI2F1ZGlvRWw+PC9hdWRpbz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gU3VtbWFyeSBDb250ZW50IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWJvZHktcGFkZGluZ1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzdW1tYXJ5LXRleHRcIj57eyBjb252LmF1ZGlvRGVzY3JpcHRpb24gfHwgY29udi5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkgfHwgJ05vIHN1bW1hcnkgYXZhaWxhYmxlJyB9fTwvcD5cbiAgICAgICAgICAgIDwhLS0gQUkgSW5zaWdodHMgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5haUluc2lnaHRzPy5zdW1tYXJ5Py5sZW5ndGhcIiBjbGFzcz1cImFpLWluc2lnaHRzLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWluc2lnaHRzLWxhYmVsXCI+QUkgSW5zaWdodHM8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW5zaWdodCBvZiBjb252LmFpSW5zaWdodHMuc3VtbWFyeVwiIGNsYXNzPVwiYWktaW5zaWdodC1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktaW5zaWdodC1kb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJpbnNpZ2h0LnR5cGUgPT09ICdwb3NpdGl2ZScgPyAnIzAwQTNGRicgOiBpbnNpZ2h0LnR5cGUgPT09ICduZWdhdGl2ZScgPyAnI0VGNDQ0NCcgOiAnI0Y1OUUwQidcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWluc2lnaHQtdGV4dFwiPnt7IGluc2lnaHQudGV4dCB8fCBpbnNpZ2h0IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE5vIGRhdGEgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWNvbnZMb2FkaW5nICYmIGNvbnZlcnNhdGlvbnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdGF0ZVwiPlxuICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiZWNoby1ub2RhdGEtaW1nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS10aXRsZVwiPk5vIGNvbnZlcnNhdGlvbnMgZm91bmQ8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXN1YlwiPk5vIGNvbnZlcnNhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSBhbmQgc3RvcmVzLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICAgIDxsaWItcGFnaW5hdGlvbiAqbmdJZj1cImNvbnZUb3RhbCA+IDBcIiBbaXRlbXNQZXJQYWdlXT1cImNvbnZQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImNvbnZQYWdlXCIgW3RvdGFsSXRlbXNdPVwiY29udlRvdGFsXCJcbiAgICAgICAgW3BhZ2luYXRpb25TaXplc109XCJjb252UGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cImNvbnZQZXJQYWdlXCIgKHBhZ2VDaGFuZ2UpPVwib25Db252UGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uQ29udlBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgPC9kaXY+IDwhLS0gZW5kIGNvbnZlcnNhdGlvbnMtc2VjdGlvbiAtLT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIEFHRU5UIEFOQUxZU0lTIFRBQiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcydcIj5cblxuICAgICAgPCEtLSDilIDilIAgT1ZFUlZJRVc6IEFnZW50IENhcmRzIEdyaWQg4pSA4pSAIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkZXRhaWxWaWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3Mtb3ZlcnZpZXctaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3Mtb3ZlcnZpZXctdGl0bGVcIj5BbmFseXRpY3MgT3ZlcnZpZXc8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3Mtb3ZlcnZpZXctc3VidGl0bGVcIj57eyBjb2hvcnRMaXN0Lmxlbmd0aCB9fSBhY3RpdmUgYWdlbnRzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1zZWFyY2gtd3JhcFwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiNy41XCIvPjxwYXRoIGQ9XCJNMTYuNSAxNi41TDIxIDIxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYW5hbHlzaXNTZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhZ2VudHPigKZcIiBjbGFzcz1cImVjaG8taW5saW5lLWlucHV0XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb2hvcnRMaXN0Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZS0tbXV0ZWRcIj5Mb2FkaW5nIGFnZW50cy4uLjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtZ3JpZFwiIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwiJ3JlcGVhdCgnICsgTWF0aC5taW4oY29ob3J0TGlzdC5sZW5ndGgsIDQpICsgJywgMWZyKSdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2hvcnQgb2YgY29ob3J0TGlzdDsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmRcIiAqbmdJZj1cIiFhbmFseXNpc1NlYXJjaCB8fCAoY29ob3J0LmNvaG9ydE5hbWUgfHwgY29ob3J0Lm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoYW5hbHlzaXNTZWFyY2gudG9Mb3dlckNhc2UoKSlcIiAoY2xpY2spPVwic2VsZWN0Q29ob3J0RGV0YWlsKGNvaG9ydClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC10b3Atcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtbmFtZVwiPnt7IGRpc3BsYXlOYW1lKGNvaG9ydC5jb2hvcnROYW1lIHx8IGNvaG9ydC5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1iYWRnZS1hY3RpdmVcIj5BY3RpdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBtZXRyaWNzICYgc3RvcmVzIGJhZGdlcyBoaWRkZW4gZm9yIG5vdyAtLT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1zcGFjZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5hbHl0aWNzLWhvdmVyLWxpbmtcIj5WaWV3IGFuYWx5dGljcyDihpI8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0g4pSA4pSAIERFVEFJTDogU2VsZWN0ZWQgQ29ob3J0IE1ldHJpY3MgKyBDb252ZXJzYXRpb25zIOKUgOKUgCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxWaWV3XCI+XG5cbiAgICAgICAgPCEtLSBIZWFkZXI6IOKGkCBCYWNrICsgVGl0bGUgKyBDb252ZXJzYXRpb25zICsgRHJvcGRvd24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtaGVhZGVyLWJhclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZXRhaWwtYmFjay1idG5cIiAoY2xpY2spPVwiYmFja1RvT3ZlcnZpZXcoKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0xNSAxOGwtNi02IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1oZWFkZXItdGl0bGVcIj57eyBkaXNwbGF5TmFtZShzZWxlY3RlZENvaG9ydE5hbWUpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG5cbiAgICAgICAgICA8IS0tIEF1ZGlvIFNvdXJjZSBmaWx0ZXIgKE92ZXJhbGwgVHJhbnNjcmlwdHMgb25seSkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzT3ZlcmFsbFRyYW5zY3JpcHRzQ29ob3J0ICYmIGF1ZGlvU291cmNlT3B0aW9ucy5sZW5ndGhcIiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLXdyYXAgbWUtM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLXRyaWdnZXJcIiAoY2xpY2spPVwidG9nZ2xlQXVkaW9Tb3VyY2VEcm9wZG93bigpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29ob3J0LWRkLXRyaWdnZXItbmFtZVwiPnt7IHNlbGVjdGVkQXVkaW9Tb3VyY2VMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIFtzdHlsZS50cmFuc2Zvcm1dPVwiYXVkaW9Tb3VyY2VEcm9wZG93bk9wZW4gPyAncm90YXRlKDE4MGRlZyknIDogJ25vbmUnXCI+PHBhdGggZD1cIk02IDlsNiA2IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImF1ZGlvU291cmNlRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2hvcnQtZGQtc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0IG9mIGF1ZGlvU291cmNlT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFnZW50LWRkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9wdC52YWx1ZSA9PT0gc2VsZWN0ZWRBdWRpb1NvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXVkaW9Tb3VyY2Uob3B0KVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRkLW5hbWVcIj57eyBvcHQubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm9wdC52YWx1ZSA9PT0gc2VsZWN0ZWRBdWRpb1NvdXJjZVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0yMCA2TDkgMTdsLTUtNVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdWRpb1NvdXJjZURyb3Bkb3duT3BlblwiIGNsYXNzPVwiY29ob3J0LWRkLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlQXVkaW9Tb3VyY2VEcm9wZG93bigpXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1oZWFkZXItY29udi1jb3VudFwiPlRvdGFsIENvbnZlcnNhdGlvbnM6IHt7IHRvdGFsQXVkaW8gfX08L3NwYW4+XG5cbiAgICAgICAgICA8IS0tIENvaG9ydCBEcm9wZG93biAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtZHJvcGRvd24td3JhcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLXRyaWdnZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29ob3J0RHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLWRvdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvaG9ydC1kZC10cmlnZ2VyLW5hbWVcIj57eyBkaXNwbGF5TmFtZShzZWxlY3RlZENvaG9ydE5hbWUpIHx8ICdTZWxlY3QgQWdlbnQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgW3N0eWxlLnRyYW5zZm9ybV09XCJjb2hvcnREcm9wZG93bk9wZW4gPyAncm90YXRlKDE4MGRlZyknIDogJ25vbmUnXCI+PHBhdGggZD1cIk02IDlsNiA2IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImNvaG9ydERyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLXNlYXJjaC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1zZWFyY2gtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImNvaG9ydERyb3Bkb3duU2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWdlbnRz4oCmXCIgY2xhc3M9XCJlY2hvLWlubGluZS1pbnB1dC0tc21hbGxcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2hvcnQtZGQtc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZERyb3Bkb3duQ29ob3J0czsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJhZ2VudC1kZC1pdGVtXCIgW2NsYXNzLnNlbGVjdGVkXT1cIihjLmNvaG9ydElkIHx8IGMuaWQgfHwgYy5faWQpID09PSBzZWxlY3RlZENvaG9ydElkXCIgKGNsaWNrKT1cInNlbGVjdENvaG9ydEZyb21Ecm9wZG93bihjKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImMubWV0cmljc0FkZGVkID4gMCA/ICcjMTBCOTgxJyA6ICcjRDBENUREJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRkLW5hbWVcIj57eyBkaXNwbGF5TmFtZShjLmNvaG9ydE5hbWUgfHwgYy5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtZGQtbWV0YVwiPnt7IGMubWV0cmljc0FkZGVkIHx8IDAgfX0gbWV0cmljczwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiKGMuY29ob3J0SWQgfHwgYy5pZCB8fCBjLl9pZCkgPT09IHNlbGVjdGVkQ29ob3J0SWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjAgNkw5IDE3bC01LTVcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkRHJvcGRvd25Db2hvcnRzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY29ob3J0LWRkLW5vLXJlc3VsdHNcIj5ObyBhZ2VudHMgZm91bmQ8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2hvcnREcm9wZG93bk9wZW5cIiBjbGFzcz1cImNvaG9ydC1kZC1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZUNvaG9ydERyb3Bkb3duKClcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBMb2FkaW5nIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FyZHNMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWVtcHR5LXN0YXRlLS1tdXRlZFwiPkxvYWRpbmcgbWV0cmljcy4uLjwvZGl2PlxuXG4gICAgICAgIDwhLS0gTnVtZXJpYyBzY29yZXMg4oCUIGZ1bGwtd2lkdGggc3RhdCBzdHJpcCBhYm92ZSBjYXJkcyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjYXJkc0xvYWRpbmcgJiYgbnVtZXJpY1N0cmlwQ2FyZD8ubnVtZXJpY1Jvd3M/Lmxlbmd0aFwiIGNsYXNzPVwibnVtZXJpYy1zdGF0LXN0cmlwXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIG51bWVyaWNTdHJpcENhcmQubnVtZXJpY1Jvd3M7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJudW1lcmljLXN0YXQtdGlsZVwiXG4gICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyLWxlZnQtY29sb3JdPVwiZ2V0TnVtZXJpY1RpbGVDb2xvcihpKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51bWVyaWMtc3RhdC1sYWJlbFwiPnt7IHJvdy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVtZXJpYy1zdGF0LXZhbHVlXCIgW3N0eWxlLmNvbG9yXT1cImdldE51bWVyaWNUaWxlQ29sb3IoaSlcIj5cbiAgICAgICAgICAgICAge3sgcm93LmF2ZyB9fTxzcGFuICpuZ0lmPVwicm93Lm1heCAhPT0gbnVsbFwiIGNsYXNzPVwibnVtZXJpYy1zdGF0LW1heFwiPi97eyByb3cubWF4IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVtZXJpYy1zdGF0LXN1YlwiICpuZ0lmPVwicm93Lm1heCAhPT0gbnVsbCAmJiByb3cubWluICE9PSBudWxsXCI+XG4gICAgICAgICAgICAgIHNjYWxlIHt7IHJvdy5taW4gfX3igJN7eyByb3cubWF4IH19e3sgcm93LmRlc2NyaXB0aW9uID8gJyDCtyAnICsgcm93LmRlc2NyaXB0aW9uIDogJycgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1ldHJpYyBDYXJkcyAoZHluYW1pYyBjb2x1bW5zIGJhc2VkIG9uIGNhcmQgY291bnQpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNhcmRzTG9hZGluZyAmJiBub25OdW1lcmljQ2FyZHMubGVuZ3RoID4gMFwiIGNsYXNzPVwibWV0cmljLWNhcmRzLWR5bmFtaWNcIlxuICAgICAgICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwiJ3JlcGVhdCgnICsgTWF0aC5taW4obm9uTnVtZXJpY0NhcmRzLmxlbmd0aCwgNCkgKyAnLCAxZnIpJ1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNhcmQgb2Ygbm9uTnVtZXJpY0NhcmRzOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cIm1ldHJpYy1jYXJkLWR5bmFtaWNcIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1ldHJpYy1jYXJkLWR5bmFtaWMtLXdpZGVdPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJyB8fCBjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRScgfHwgY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfQ0hBUlQnIHx8IChjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVCcgJiYgY2FyZC5pc0Z1bm5lbClcIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1ldHJpYy1jYXJkLWR5bmFtaWMtLWZ1bGxdPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfU0VQT1JBVE9SJ1wiPlxuICAgICAgICAgICAgPCEtLSBDYXJkIEhlYWRlcjogVGl0bGUgKyBTdGF0dXMgQmFkZ2UgKyBJbmZvIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLXRpdGxlXCI+e3sgZGlzcGxheU5hbWUoY2FyZC5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2FyZC5zdGF0dXNcIiBjbGFzcz1cIm1ldHJpYy1zdGF0dXMtYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0U3RhdHVzQmFkZ2UoY2FyZC5zdGF0dXMpLmJnXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRTdGF0dXNCYWRnZShjYXJkLnN0YXR1cykuY29sb3JcIj57eyBjYXJkLnN0YXR1cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1ldHJpYy1leHBvcnQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfVEFCTEUnXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHRvIEV4Y2VsXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRCYnRDYXJkKGNhcmQpXCI+PHNwYW4+RXhwb3J0PC9zcGFuPiBcbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNFwiLz48cG9seWxpbmUgcG9pbnRzPVwiNyAxMCAxMiAxNSAxNyAxMFwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCIxNVwiIHgyPVwiMTJcIiB5Mj1cIjNcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1pbmZvLWljb25cIiAqbmdJZj1cImNhcmQuZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWluZm8tdG9vbHRpcFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGNhcmQuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLXN1YnRpdGxlXCIgKm5nSWY9XCJjYXJkLnR5cGUgIT09ICdOVU1FUklDX1NDQUxBUicgJiYgY2FyZC50eXBlICE9PSAnTlVNRVJJQ19BUlJBWSdcIj57eyBjYXJkLmFwcGxpY2FibGVDb3VudCA/PyB0b3RhbEF1ZGlvIH19IGNvbnZlcnNhdGlvbnM8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDwhLS0gQk9PTEVBTl9CQVNLRVRfVEFCTEUg4oCUIGJyYW5kIHJvd3Mgd2l0aCBhdHRyaWJ1dGUgY2hpcHMgKyBjb3VudCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJidC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQudGFibGVSb3dzXCIgY2xhc3M9XCJiYnQtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LWJyYW5kXCIgW3RpdGxlXT1cInJvdy5icmFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhdGVnb3J5QW5hbHlzaXNDbGljayhyb3csIHVuZGVmaW5lZCwgJGV2ZW50KVwiPnt7IHJvdy5icmFuZCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJidC1jaGlwc1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgY2hpcCBvZiByb3cudmlzaWJsZUNoaXBzXCIgY2xhc3M9XCJiYnQtY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhdGVnb3J5QW5hbHlzaXNDbGljayhyb3csIGNoaXAsICRldmVudClcIj57eyBjaGlwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5vdmVyZmxvd0NvdW50ID4gMFwiIGNsYXNzPVwiYmJ0LWNoaXAgYmJ0LWNoaXAtLW1vcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzaG93QmJ0VG9vbHRpcCgkZXZlbnQsIHJvdy5vdmVyZmxvd0NoaXBzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhpZGVCYnRUb29sdGlwKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYXRlZ29yeUFuYWx5c2lzQ2xpY2socm93LCB1bmRlZmluZWQsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAre3sgcm93Lm92ZXJmbG93Q291bnQgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LWNvdW50XCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlBbmFseXNpc0NsaWNrKHJvdywgdW5kZWZpbmVkLCAkZXZlbnQpXCI+e3sgcm93LmNvdW50IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gQk9PTEVBTl9CQVNLRVRfQkFSIOKAlCBjYXRlZ29yeSBsaXN0ICsgcGllIGNoYXJ0ICsgbGVnZW5kIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX0JBUidcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYi13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYi1saXN0XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjYXJkLnBpZVNsaWNlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmJiLWxpc3Qtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJiYi1saXN0LXJvdy0tYWN0aXZlXT1cImNhcmQuc2VsZWN0ZWRQaWVMYWJlbCA9PT0gc2xpY2UubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGllU2xpY2UoY2FyZCwgc2xpY2UpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJiLWxpc3QtbGFiZWxcIiBbdGl0bGVdPVwic2xpY2UubGFiZWxcIj57eyBzbGljZS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmItcGllLWNvbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYi1waWUtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYmJiLXBpZVwiIHZpZXdCb3g9XCIwIDAgMTAwIDEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjYXJkLnBpZVNsaWNlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZF09XCJzbGljZS5wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cInNsaWNlLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwLjhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYmItcGllLXNsaWNlLS1hY3RpdmVdPVwiY2FyZC5zZWxlY3RlZFBpZUxhYmVsID09PSBzbGljZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBpZVNsaWNlKGNhcmQsIHNsaWNlKVwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLWxlZ2VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjYXJkLnBpZVNsaWNlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYmItbGVnZW5kLXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJiYi1sZWdlbmQtcm93LS1hY3RpdmVdPVwiY2FyZC5zZWxlY3RlZFBpZUxhYmVsID09PSBzbGljZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBpZVNsaWNlKGNhcmQsIHNsaWNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJiLWxlZ2VuZC1kb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJzbGljZS5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYi1sZWdlbmQtbGFiZWxcIj57eyBzbGljZS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYi1sZWdlbmQtcGN0XCI+e3sgc2xpY2UucGVyY2VudCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEJvb2xlYW5fYmFza2V0X2NoYXJ0IOKAlCBrZXl3b3JkIGxpc3QgKyBzZW50aW1lbnQgZG9udXQgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfQ0hBUlQnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMta2V5d29yZC1saXN0XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC5rZXl3b3JkUm93c1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmJjLWtleXdvcmQtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJiYy1rZXl3b3JkLXJvdy0tYWN0aXZlXT1cImNhcmQuc2VsZWN0ZWRLZXl3b3JkID09PSByb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QmFza2V0S2V5d29yZChjYXJkLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJjLWtleXdvcmQtbGFiZWxcIiBbdGl0bGVdPVwicm93LmxhYmVsXCI+e3sgcm93LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1rZXl3b3JkLWNvdW50XCI+e3sgcm93LmNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1jaGFydC1zaWRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLXN0YWNrLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYmFyIG9mIGNhcmQuc2VsZWN0ZWRTdGFja2VkQmFyc1wiIGNsYXNzPVwiYmJjLXN0YWNrLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtc3RhY2stbGFiZWxcIj57eyBiYXIubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLXN0YWNrLXRyYWNrXCIgW2NsYXNzLmJiYy1zdGFjay10cmFjay0tZW1wdHldPVwiYmFyLnRvdGFsID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWcgb2YgYmFyLnNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYmMtc3RhY2stc2VnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwic2VnLnBlcmNlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzZWcuY29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWcucGVyY2VudCA+PSAxMFwiIGNsYXNzPVwiYmJjLXN0YWNrLXNlZy10ZXh0XCI+e3sgc2VnLnBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLXN0YWNrLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLXN0YWNrLXRvb2x0aXAtdGl0bGVcIj57eyBiYXIubGFiZWwgfX0gwrcge3sgc2VnLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1zdGFjay10b29sdGlwLWJvZHlcIj57eyBzZWcuY291bnQgfX0gKHt7IHNlZy5wZXJjZW50IH19JSk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtc3RhY2stYXhpc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjAlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjI1JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj41MCU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+NzUlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjEwMCU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtbGVnZW5kLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjYXJkLnNlbGVjdGVkTGVnZW5kXCIgY2xhc3M9XCJiYmMtbGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1sZWdlbmQtc3dhdGNoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiaXRlbS5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1sZWdlbmQtdGV4dFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gQk9PTEVBTl9CQVNLRVRfU0VQT1JBVE9SIOKAlCB0d28gbGlzdCBwYW5lbHMgKGNvbnRlbnQgdGFncyArIG1lYXN1cmVtZW50cykgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfU0VQT1JBVE9SJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsLWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1wYW5lbC10aXRsZVwiPkNhdGVnb3JpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1wYW5lbC1zdWJcIj57eyBjYXJkLnRhZ1Jvd3M/Lmxlbmd0aCB8fCAwIH19IGl0ZW1zPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXJvdyBiYnMtcm93LWNsaWNrYWJsZVwiICpuZ0Zvcj1cImxldCByIG9mIGNhcmQudGFnUm93czsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJicy1yb3ctdG9wXT1cImkgPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYnMtcm93LXNlbGVjdGVkXT1cIihyLmlkICYmIHNlbGVjdGVkQ2FyZElkID09PSByLmlkKSB8fCAoIXIuaWQgJiYgc2VsZWN0ZWRDYXJkTmFtZSA9PT0gci5sYWJlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhcmRSb3dDbGljayhyLmlkLCByLmxhYmVsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJzLXJvdy1sYWJlbFwiIFt0aXRsZV09XCJyLmxhYmVsXCI+e3sgci5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJicy1yb3ctY291bnRcIj57eyByLmNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1lbXB0eVwiICpuZ0lmPVwiIWNhcmQudGFnUm93cz8ubGVuZ3RoXCI+Tm8gZGF0YTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1wYW5lbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1wYW5lbC1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtcGFuZWwtdGl0bGVcIj57eyBjYXJkLm1lYXN1cmVUaXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsLXN1YlwiPnt7IGNhcmQubWVhc3VyZVN1YnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXJvdyBiYnMtcm93LWNsaWNrYWJsZVwiICpuZ0Zvcj1cImxldCByIG9mIGNhcmQubWVhc3VyZVJvd3M7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYnMtcm93LXRvcF09XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJzLXJvdy1zZWxlY3RlZF09XCIoci5pZCAmJiBzZWxlY3RlZENhcmRJZCA9PT0gci5pZCkgfHwgKCFyLmlkICYmIHNlbGVjdGVkQ2FyZE5hbWUgPT09IHIubGFiZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYXJkUm93Q2xpY2soci5pZCwgci5sYWJlbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJicy1yb3ctbGFiZWxcIiBbdGl0bGVdPVwici5sYWJlbFwiPnt7IHIubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYnMtcm93LWNvdW50XCI+e3sgci5jb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtZW1wdHlcIiAqbmdJZj1cIiFjYXJkLm1lYXN1cmVSb3dzPy5sZW5ndGhcIj5ObyBkYXRhPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVCDigJQgRnVubmVsIENoYXJ0IChsZWZ0LWFsaWduZWQpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUJyAmJiBjYXJkLmlzRnVubmVsXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5uZWwtY2hhcnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC5ib29sZWFuUm93czsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZnVubmVsLXN0YWdlXCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKHJvdy5pZCwgcm93LmxhYmVsKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bm5lbC1iYXJcIiBbdGl0bGVdPVwicm93LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY2FyZC5ib29sZWFuUm93c1swXT8ucmVzcG9uc2VzID4gMCA/IChyb3cucmVzcG9uc2VzIC8gY2FyZC5ib29sZWFuUm93c1swXS5yZXNwb25zZXMgKiAxMDApIDogMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0U2NvcmVDb2xvcihyb3cuc2NvcmUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnVubmVsLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ1bm5lbC1sYWJlbFwiPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ1bm5lbC12YWx1ZVwiPiA8c3BhbiBjbGFzcz1cImZ1bm5lbC12YWx1ZS1jb3VudFwiPnt7IHJvdy5yZXNwb25zZXMgfX08L3NwYW4+ICh7eyByb3cuc2NvcmUgfX0pJSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVCDigJQgcm93cyB3aXRoIHByb2dyZXNzIGJhcnMgKG5vbi1mdW5uZWwpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUJyAmJiAhY2FyZC5pc0Z1bm5lbFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC5ib29sZWFuUm93czsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibWV0cmljLWJvb2wtcm93XCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKHJvdy5pZCwgcm93LmxhYmVsKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWRvdFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldFNjb3JlQ29sb3Iocm93LnNjb3JlKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtcm93LWxhYmVsXCIgW3RpdGxlXT1cInJvdy5sYWJlbFwiPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLXNjb3JlIG1ldHJpYy1zY29yZS0tdGVhbFwiPnt7IHJvdy5zY29yZSB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1jb3VudFwiPnt7IHJvdy5yZXNwb25zZXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1wcm9ncmVzcy10cmFja1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1wcm9ncmVzcy1maWxsXCIgW3N0eWxlLndpZHRoLiVdPVwicm93LnNjb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0U2NvcmVDb2xvcihyb3cuc2NvcmUpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgPCEtLSBVTklRVUVfUElUQ0hFUyDigJQgcGl0Y2gga2V5d29yZHMgdHJhY2tlciAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdVTklRVUVfUElUQ0hFUydcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpdGNoLWtleXdvcmQtY291bnRcIj57eyBjYXJkLnBpdGNoUm93cz8ubGVuZ3RoIHx8IDAgfX0ga2V5d29yZHM8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwaXRjaCBvZiBjYXJkLnBpdGNoUm93czsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibWV0cmljLWJvb2wtcm93XCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKCcnLCBjYXJkLmtleSlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1yb3ctZG90XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJbJyMwMEEzRkYnLCcjMTBCOTgxJywnI0Y1OUUwQicsJyNFRjQ0NDQnLCcjOEI1Q0Y2JywnI0VDNDg5OScsJyMwNkI2RDQnLCcjODRDQzE2JywnI0Y5NzMxNicsJyM2MzY2RjEnXVtpICUgMTBdXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGl0Y2gtcm93LWxhYmVsXCI+e3sgcGl0Y2guaWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGl0Y2gtcm93LWRlc2NcIj57eyBwaXRjaC5kZXNjID8gcGl0Y2guZGVzYy5zbGljZSgwLCA2MCkgOiAn4oCTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIFNVQkpFQ1RJVkUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnU1VCSkVDVElWRScgfHwgY2FyZC50eXBlID09PSAnU1VCSkVDVElWRV9DT1VOVCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YmplY3RpdmUtd3JhcFwiIChjbGljayk9XCJvbkNhcmRSb3dDbGljaygnJywgY2FyZC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQuc3ViamVjdGl2ZVJvd3M/LnNsaWNlKDAsIDIpXCIgY2xhc3M9XCJzdWJqZWN0aXZlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAg4oCiIHt7IHJvdy5yZWFzb25pbmcgfHwgcm93LnN0b3JlX2lkIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj48IS0tIGVuZCBtZXRyaWMtY2FyZC1jb250ZW50IC0tPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEZ1bGwgbm8tZGF0YSBzdGF0ZTogbm8gY2FyZHMgQU5EIG5vIGNvbnZlcnNhdGlvbnMgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhY2FyZHNMb2FkaW5nICYmICFkZXRhaWxMb2FkaW5nICYmIGNvaG9ydENhcmRzLmxlbmd0aCA9PT0gMCAmJiBkZXRhaWxQYWdlQ29udnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdGF0ZVwiPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJObyBkYXRhXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1pbWdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1ub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXN1YlwiPk5vIGFuYWx5c2lzIGRhdGEgb3IgY29udmVyc2F0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBkYXRlIHJhbmdlIGFuZCBzdG9yZXMuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0g4pSA4pSAIENvbnZlcnNhdGlvbnMgU2VjdGlvbiAoc2hvdyB3aGVuIGNhcmRzIGV4aXN0IE9SIGNvbnZlcnNhdGlvbnMgZXhpc3QgT1IgbG9hZGluZykg4pSA4pSAIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiZWNob0NvbnZlcnNhdGlvbnNcIiBjbGFzcz1cImNvbnZlcnNhdGlvbnMtc2VjdGlvblwiICpuZ0lmPVwiY2FyZHNMb2FkaW5nIHx8IGRldGFpbExvYWRpbmcgfHwgY29ob3J0Q2FyZHMubGVuZ3RoID4gMCB8fCBkZXRhaWxQYWdlQ29udnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtY29udi1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS44XCI+PHBhdGggZD1cIk0yMCAySDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyaDExbDUgM1Y0YTIgMiAwIDAgMC0yLTJ6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtY29udi1zZWN0aW9uLXRpdGxlXCI+Q29udmVyc2F0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VhcmNoXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvbnZlcnNhdGlvbnMuLi5cIlxuICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkZXRhaWxTZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25EZXRhaWxTZWFyY2goKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VhcmNoLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRldGFpbFNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEZXRhaWxTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDbGVhclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiLz48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBJbmxpbmUgZGF0ZSArIEZpbHRlciBidXR0b24gKE92ZXJhbGwgVHJhbnNjcmlwdHMgb25seSkgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNWaWV3T3ZlcmFsbFRyYW5zY3JpcHRzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLWlubGluZS1kYXRlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMuMzMzMyAxLjY2NjYzVjQuOTk5OTZNNi42NjY2NyAxLjY2NjYzVjQuOTk5OTZNMi41IDguMzMzMjlIMTcuNU00LjE2NjY3IDMuMzMzMjlIMTUuODMzM0MxNi43NTM4IDMuMzMzMjkgMTcuNSA0LjA3OTQ4IDE3LjUgNC45OTk5NlYxNi42NjY2QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY2VjQuOTk5OTZDMi41IDQuMDc5NDggMy4yNDYxOSAzLjMzMzI5IDQuMTY2NjcgMy4zMzMyOVpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVjaG8taW5saW5lLWRhdGUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICBuZ3hEYXRlcmFuZ2VwaWNrZXJNZFxuICAgICAgICAgICAgICAgICAgICAgICBbZHJvcHNdPVwiJ2Rvd24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW29wZW5zXT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFtyYW5nZXNdPVwiZWNob0RhdGVSYW5nZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdXRvQXBwbHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2tlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2FuY2VsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZWNob0RhdGVSYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIChkYXRlc1VwZGF0ZWQpPVwib25FY2hvRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJlY2hvRGF0ZXJhbmdlXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLWZpbHRlci13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJlY2hvLWZpbHRlci1idG5cIiAoY2xpY2spPVwiZWNob0ZpbHRlck9wZW4gPyBjbG9zZUVjaG9GaWx0ZXIoKSA6IG9wZW5FY2hvRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSAxMEgxNU0yLjUgNUgxNy41TTcuNSAxNUgxMi41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDwhLS0gUG9wdXAgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tZmlsdGVyLXBvcHVwXCIgKm5nSWY9XCJlY2hvRmlsdGVyT3BlblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZnAtaGVhZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVmcC10aXRsZVwiPkZpbHRlciBieTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVmcC1zZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3LjVcIi8+PHBhdGggZD1cIk0xNi41IDE2LjVMMjEgMjFcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJlZnAtc2VhcmNoLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cImVjaG9GaWx0ZXJUYWIgPT09ICdzdG9yZXMnID8gJ1NlYXJjaCBTdG9yZXMnIDogJ1NlYXJjaCdcIiBbKG5nTW9kZWwpXT1cImVjaG9GaWx0ZXJTZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvbkVjaG9GaWx0ZXJTZWFyY2hDaGFuZ2UoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZnAtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJlZnAtdGFic1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuYWN0aXZlXT1cImVjaG9GaWx0ZXJUYWIgPT09ICdzdGF0dXMnXCIgKGNsaWNrKT1cInNldEVjaG9GaWx0ZXJUYWIoJ3N0YXR1cycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TdGF0dXM8L3NwYW4+PHNwYW4gY2xhc3M9XCJlZnAtdGFiLWNvdW50XCIgKm5nSWY9XCJlY2hvRmlsdGVyU3RhdHVzQ291bnRcIj57eyBlY2hvRmlsdGVyU3RhdHVzQ291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJlY2hvRmlsdGVyVGFiID09PSAnY291bnRyeSdcIiAoY2xpY2spPVwic2V0RWNob0ZpbHRlclRhYignY291bnRyeScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Db3VudHJ5PC9zcGFuPjxzcGFuIGNsYXNzPVwiZWZwLXRhYi1jb3VudFwiICpuZ0lmPVwiZWNob0ZpbHRlckNvdW50cnlDb3VudFwiPnt7IGVjaG9GaWx0ZXJDb3VudHJ5Q291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJlY2hvRmlsdGVyVGFiID09PSAncmVnaW9uJ1wiIChjbGljayk9XCJzZXRFY2hvRmlsdGVyVGFiKCdyZWdpb24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UmVnaW9uPC9zcGFuPjxzcGFuIGNsYXNzPVwiZWZwLXRhYi1jb3VudFwiICpuZ0lmPVwiZWNob0ZpbHRlclJlZ2lvbkNvdW50XCI+e3sgZWNob0ZpbHRlclJlZ2lvbkNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwiZWNob0ZpbHRlclRhYiA9PT0gJ2NsdXN0ZXJzJ1wiIChjbGljayk9XCJzZXRFY2hvRmlsdGVyVGFiKCdjbHVzdGVycycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DbHVzdGVyczwvc3Bhbj48c3BhbiBjbGFzcz1cImVmcC10YWItY291bnRcIiAqbmdJZj1cImVjaG9GaWx0ZXJDbHVzdGVyQ291bnRcIj57eyBlY2hvRmlsdGVyQ2x1c3RlckNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwiZWNob0ZpbHRlclRhYiA9PT0gJ3N0b3JlcydcIiAoY2xpY2spPVwic2V0RWNob0ZpbHRlclRhYignc3RvcmVzJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0b3Jlczwvc3Bhbj48c3BhbiBjbGFzcz1cImVmcC10YWItY291bnRcIj57eyBlY2hvRmlsdGVyU3RvcmVDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuYWN0aXZlXT1cImVjaG9GaWx0ZXJUYWIgPT09ICdkb3dudGltZSdcIiAoY2xpY2spPVwic2V0RWNob0ZpbHRlclRhYignZG93bnRpbWUnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bnRpbWUgKEluIE1pbnMpPC9zcGFuPjxzcGFuIGNsYXNzPVwiZWZwLXRhYi1jb3VudFwiICpuZ0lmPVwiZWNob0ZpbHRlckRvd250aW1lQ291bnRcIj57eyBlY2hvRmlsdGVyRG93bnRpbWVDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZnAtcGFuZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGVmcC1yb3cgZWZwLXJvdy1hbGxcIiAqbmdJZj1cImVjaG9GaWx0ZXJWaXNpYmxlUm93cy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlZnAtc2VsZWN0LWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZWNob0ZpbHRlckFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImVjaG9GaWx0ZXJUb2dnbGVBbGwoJGFueSgkZXZlbnQudGFyZ2V0KS5jaGVja2VkKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZWZwLXNlbGVjdC1hbGxcIj5TZWxlY3QgQWxsPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBlZnAtcm93XCIgKm5nRm9yPVwibGV0IHIgb2YgZWNob0ZpbHRlclZpc2libGVSb3dzOyB0cmFja0J5OiB0cmFja0VjaG9GaWx0ZXJSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInZWZwLXJvdy0nICsgci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyLnJlZi5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkVjaG9GaWx0ZXJSb3dDaGFuZ2UoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInZWZwLXJvdy0nICsgci5pZFwiPnt7IHIubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZnAtZW1wdHlcIiAqbmdJZj1cIiFlY2hvRmlsdGVyVmlzaWJsZVJvd3MubGVuZ3RoXCI+Tm8gb3B0aW9ucyBhdmFpbGFibGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVmcC1mb290XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZWZwLXJlc2V0XCIgKGNsaWNrKT1cImVjaG9GaWx0ZXJSZXNldCgpXCI+UmVzZXQgRmlsdGVyczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWZwLWZvb3QtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZWZwLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZUVjaG9GaWx0ZXIoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZWZwLWFwcGx5XCIgKGNsaWNrKT1cImVjaG9GaWx0ZXJBcHBseSgpXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJkZXRhaWxMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWVtcHR5LXN0YXRlLS1tdXRlZFwiPkxvYWRpbmcuLi48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnYgb2YgZGV0YWlsUGFnZUNvbnZzOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cImRldGFpbC1jb252LWNhcmRcIj5cbiAgICAgICAgICAgIDwhLS0gQ29udiBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRGV0YWlsQ29udihjb252LmF1ZGlvSWQpOyBsb2FkQ29udkRldGFpbChjb252KVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnYtaWRcIj57eyBjb252LmF1ZGlvSWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtbWV0YS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnIGJyYW5kXCIgKm5nSWY9XCJjb252LnN0b3JlTmFtZVwiPnt7IGNvbnYuc3RvcmVOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYubG9jYXRpb25cIj57eyBjb252LmxvY2F0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYuZGF0ZVwiPnt7IGNvbnYuZGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LnRpbWVcIj57eyBjb252LnRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1jaGV2cm9uXCIgW2NsYXNzLm9wZW5dPVwiZGV0YWlsT3BlbklkID09PSBjb252LmF1ZGlvSWRcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5NEEzQjhcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk02IDlsNiA2IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBFeHBhbmRlZCBib2R5IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbE9wZW5JZCA9PT0gY29udi5hdWRpb0lkXCIgY2xhc3M9XCJjb252LWJvZHktZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgPCEtLSBXYXZlZm9ybSBwbGF5ZXIgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXBsYXllclwiICpuZ0lmPVwiY29udi5hdWRpb1VybFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlY2hvLXBsYXktYnRuXCIgW2NsYXNzLnBsYXlpbmddPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgKGNsaWNrKT1cInRvZ2dsZVBsYXkoY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInBsYXlpbmdDb252SWQgIT09IGNvbnYuYXVkaW9JZFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj48cGF0aCBkPVwiTTggNXYxNGwxMS03elwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+PHBhdGggZD1cIk02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHpcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8td2F2ZWZvcm1cIiBbY2xhc3Mud2YtcGxheWluZ109XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiAoY2xpY2spPVwic2Vla0F1ZGlvKCRldmVudCwgY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8td2YtYmFyXCIgKm5nRm9yPVwibGV0IGggb2Ygd2F2ZWZvcm1IZWlnaHRzOyBsZXQgaSA9IGluZGV4XCIgW3N0eWxlLmhlaWdodC5weF09XCJoXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBsYXllZF09XCIocGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8ucHJvZ3Jlc3MgfHwgMCkgPiBpIC8gd2F2ZWZvcm1IZWlnaHRzLmxlbmd0aFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNoby10aW1lXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkICYmIHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LmN1cnJlbnRUaW1lXCI+e3sgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXS5jdXJyZW50VGltZSB9fSAvIDwvc3Bhbj57eyBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy50b3RhbFRpbWUgfHwgY29udi5kdXJhdGlvbiB8fCAnLS0nIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGF1ZGlvIFtpZF09XCInYXVkaW8tJyArIGNvbnYuYXVkaW9JZFwiIFtzcmNdPVwiY29udi5hdWRpb1VybFwiIHByZWxvYWQ9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICh0aW1ldXBkYXRlKT1cIm9uVGltZVVwZGF0ZShhdWRpb0VsLCBjb252LmF1ZGlvSWQpXCJcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxvYWRlZE1ldGFkYXRhKGF1ZGlvRWwsIGNvbnYuYXVkaW9JZCwgY29udi5kdXJhdGlvbilcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cInBsYXlpbmdDb252SWQgPSBudWxsXCIgI2F1ZGlvRWw+PC9hdWRpbz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi10YWJzXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnYtdGFiLWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ2V0Q29udlRhYihjb252LmF1ZGlvSWQpID09PSAnc3VtbWFyeSdcIiAoY2xpY2spPVwic2V0Q29udlRhYihjb252LmF1ZGlvSWQsICdzdW1tYXJ5JywgJGV2ZW50KVwiPlN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udi10YWItYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJnZXRDb252VGFiKGNvbnYuYXVkaW9JZCkgPT09ICd0cmFuc2NyaXB0J1wiIChjbGljayk9XCJzZXRDb252VGFiKGNvbnYuYXVkaW9JZCwgJ3RyYW5zY3JpcHQnLCAkZXZlbnQpXCI+VHJhbnNjcmlwdDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIENvbnRlbnQ6IExlZnQgKFN1bW1hcnkvVHJhbnNjcmlwdCArIEFJIEluc2lnaHRzKSArIFJpZ2h0IChNZXRyaWNzKSAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb250ZW50LXNwbGl0XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBMZWZ0IHNpZGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb250ZW50LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb252VGFiKGNvbnYuYXVkaW9JZCkgPT09ICdzdW1tYXJ5J1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktdGV4dFwiPnt7IGNvbnYuYXVkaW9EZXNjcmlwdGlvbiB8fCBjb252LmNvbnZlcnNhdGlvbkRldGFpbHM/LmF1ZGlvU3VtbWFyeSB8fCAnTm8gc3VtbWFyeSBhdmFpbGFibGUnIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIEFJIEluc2lnaHRzIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5haUluc2lnaHRzPy5zdW1tYXJ5Py5sZW5ndGhcIiBjbGFzcz1cImFpLWluc2lnaHRzLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktaW5zaWdodHMtbGFiZWxcIj5BSSBJbnNpZ2h0czwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGluc2lnaHQgb2YgY29udi5haUluc2lnaHRzLnN1bW1hcnlcIiBjbGFzcz1cImFpLWluc2lnaHQtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktaW5zaWdodC1kb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJpbnNpZ2h0LnR5cGUgPT09ICdwb3NpdGl2ZScgPyAnIzAwQTNGRicgOiBpbnNpZ2h0LnR5cGUgPT09ICduZWdhdGl2ZScgPyAnI0VGNDQ0NCcgOiAnI0Y1OUUwQidcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktaW5zaWdodC10ZXh0XCI+e3sgaW5zaWdodC50ZXh0IHx8IGluc2lnaHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29udlRhYihjb252LmF1ZGlvSWQpID09PSAndHJhbnNjcmlwdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdW1tYXJ5LXRleHQgc3VtbWFyeS10ZXh0LS1wcmV3cmFwXCI+e3sgY2xlYW5UcmFuc2NyaXB0aW9uKGNvbnYuY29udmVyc2F0aW9uRGV0YWlscz8udHJhbnNjcmlwdGlvbikgfHwgJ05vIHRyYW5zY3JpcHQgYXZhaWxhYmxlJyB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgc2lkZTogTWV0cmljcyAob25seSBzaG93IHZhbHVlcyB0aGF0IGhhdmUgZGF0YSkgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb250ZW50LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1wYW5lbC1sYWJlbFwiPk1ldHJpY3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb252Lm1ldHJpY3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtIG9mIGNvbnYubWV0cmljc1wiIGNsYXNzPVwibWV0cmljLWl0ZW0td3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luZ2xlIHZhbHVlOiBuYW1lICsgdmFsdWUgb24gc2FtZSByb3cgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm0udmFsdWU/Lmxlbmd0aCA9PT0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1zaW5nbGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLXNpbmdsZS1uYW1lXCIgW3RpdGxlXT1cIm0ubmFtZVwiPnt7IG0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtc2luZ2xlLXZhbHVlXCIgW3N0eWxlLmNvbG9yXT1cIm0udmFsdWVbMF0uc2NvcmUgIT09IG51bGwgJiYgbS52YWx1ZVswXS5zY29yZSAhPT0gdW5kZWZpbmVkID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybWF0TWV0cmljVmFsdWUobS52YWx1ZVswXSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aXBsZSB2YWx1ZXM6IGhlYWRlciArIHJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm0udmFsdWU/Lmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtbXVsdGktaGVhZGVyXCIgW3RpdGxlXT1cIm0ubmFtZVwiPnt7IG0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdiBvZiBtLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIodi5zY29yZSAhPT0gbnVsbCAmJiB2LnNjb3JlICE9PSB1bmRlZmluZWQpIHx8ICh2LlRvdGFsICE9PSBudWxsICYmIHYuVG90YWwgIT09IHVuZGVmaW5lZCkgfHwgKHYuQXZnICE9PSBudWxsICYmIHYuQXZnICE9PSB1bmRlZmluZWQpIHx8ICh2LnRvdGFsICE9PSBudWxsICYmIHYudG90YWwgIT09IHVuZGVmaW5lZCkgfHwgKHYuYXZnICE9PSBudWxsICYmIHYuYXZnICE9PSB1bmRlZmluZWQpIHx8ICh2LmNvdW50ICE9PSBudWxsICYmIHYuY291bnQgIT09IHVuZGVmaW5lZClcIiBjbGFzcz1cIm1ldHJpYy1tdWx0aS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1tdWx0aS1uYW1lXCIgW3RpdGxlXT1cInYubmFtZVwiPnt7IHYubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1tdWx0aS12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidi5zY29yZSAhPT0gbnVsbCAmJiB2LnNjb3JlICE9PSB1bmRlZmluZWQgPyAnIzAwQTNGRicgOiAnIzM0NDA1NCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdE1ldHJpY1ZhbHVlKHYpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb252Lm1ldHJpY3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5zdG9yZU5hbWVcIiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay1yb3dcIj48c3BhbiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay1sYWJlbFwiPlN0b3JlPC9zcGFuPjxzcGFuIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLXZhbHVlXCI+e3sgY29udi5zdG9yZU5hbWUgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252LmR1cmF0aW9uXCIgY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stcm93XCI+PHNwYW4gY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stbGFiZWxcIj5EdXJhdGlvbjwvc3Bhbj48c3BhbiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay12YWx1ZVwiPnt7IGNvbnYuZHVyYXRpb24gfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252Ll9kZXRhaWxMb2FkaW5nXCIgY2xhc3M9XCJtZXRyaWMtZGV0YWlsLWxvYWRpbmdcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTm8gY29udmVyc2F0aW9ucyBmb3IgdGhpcyBmaWx0ZXIgKG9ubHkgd2hlbiBjYXJkcyBleGlzdCBidXQgY29udnMgYXJlIGVtcHR5KSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFkZXRhaWxMb2FkaW5nICYmIGRldGFpbFBhZ2VDb252cy5sZW5ndGggPT09IDAgJiYgY29ob3J0Q2FyZHMubGVuZ3RoID4gMFwiIGNsYXNzPVwiZWNoby1ub2RhdGEtc3RhdGVcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiZWNoby1ub2RhdGEtaW1nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdWJcIj5ObyBjb252ZXJzYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHNlbGVjdGVkIGZpbHRlci48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgICA8bGliLXBhZ2luYXRpb24gKm5nSWY9XCJkZXRhaWxUb3RhbCA+IDBcIiBbaXRlbXNQZXJQYWdlXT1cImRldGFpbFBlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiZGV0YWlsUGFnZVwiIFt0b3RhbEl0ZW1zXT1cImRldGFpbFRvdGFsXCJcbiAgICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cImRldGFpbFBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJkZXRhaWxQZXJQYWdlXCIgKHBhZ2VDaGFuZ2UpPVwib25EZXRhaWxQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvbkRldGFpbFBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgPC9uZy1jb250YWluZXI+PCEtLSBlbmQgZGV0YWlsVmlldyAtLT5cbiAgICA8L25nLWNvbnRhaW5lcj48IS0tIGVuZCBhZ2VudGFuYWx5c2lzIC0tPlxuXG4gICAgPCEtLSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgTUFOQUdFIFRBQiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnbWFuYWdlJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hbmFnZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFuYWdlLXRpdGxlXCI+QWdlbnRzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hbmFnZS1zdWJ0aXRsZVwiPnt7IG1hbmFnZVRvdGFsIH19IGFnZW50czwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tc2VhcmNoLXdyYXAtLXdpZGVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5NEEzQjhcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3LjVcIi8+PHBhdGggZD1cIk0xNi41IDE2LjVMMjEgMjFcIi8+PC9zdmc+XG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibWFuYWdlU2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25NYW5hZ2VTZWFyY2goKVwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFnZW50cy4uLlwiIGNsYXNzPVwibWFuYWdlLXNlYXJjaC1pbnB1dFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwibWFuYWdlTG9hZGluZ1wiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZVwiPkxvYWRpbmcgYWdlbnRzLi4uPC9kaXY+XG5cbiAgICAgIDwhLS0gQWdlbnRzIHRhYmxlIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFtYW5hZ2VMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1oZWFkZXIgYWdlbnRzLXRhYmxlLTRjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWNlbGxcIj5BZ2VudCBOYW1lPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1jZWxsIGFnZW50cy10YWJsZS1jZWxsLS1jZW50ZXJcIj5NZXRyaWNzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1jZWxsIGFnZW50cy10YWJsZS1jZWxsLS1jZW50ZXJcIj5Tb3VyY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWNlbGwgYWdlbnRzLXRhYmxlLWNlbGwtLWNlbnRlclwiPkFjdGlvbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29ob3J0IG9mIG1hbmFnZUNvaG9ydHM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiIGNsYXNzPVwiYWdlbnRzLXRhYmxlLXJvdyBhZ2VudHMtdGFibGUtNGNvbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLW5hbWUtd3JhcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtbmFtZVwiPnt7IGRpc3BsYXlOYW1lKGNvaG9ydC5jb2hvcnROYW1lIHx8IGNvaG9ydC5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtZGVzY1wiPnt7IGNvaG9ydC5jb2hvcnREZXNjcmlwdGlvbiB8fCBjb2hvcnQuZGVzY3JpcHRpb24gfHwgJycgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1tZXRyaWNzXCI+e3sgY29ob3J0Lm1ldHJpY3NBZGRlZCB8fCBjb2hvcnQubWV0cmljQWRkZWQgfHwgY29ob3J0Lm1ldHJpY3M/Lmxlbmd0aCB8fCAwIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtc291cmNlXCI+e3sgY29ob3J0LnNvdXJjZT8uam9pbignLCAnKSB8fCAn4oCTJyB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLWFjdGlvblwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlQ29ob3J0KGNvaG9ydC5jb2hvcnRJZCB8fCBjb2hvcnQuaWQgfHwgY29ob3J0Ll9pZClcIiBjbGFzcz1cImFnZW50LWRlbGV0ZS1idG5cIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtYW5hZ2VDb2hvcnRzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwibWFuYWdlLW5vLXJlc3VsdHNcIj5ObyBjb2hvcnRzIGZvdW5kLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTWFuYWdlIHBhZ2luYXRpb24gLS0+XG4gICAgICA8bGliLXBhZ2luYXRpb24gKm5nSWY9XCJtYW5hZ2VUb3RhbCA+IDBcIiBbaXRlbXNQZXJQYWdlXT1cIm1hbmFnZVBlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwibWFuYWdlUGFnZVwiIFt0b3RhbEl0ZW1zXT1cIm1hbmFnZVRvdGFsXCJcbiAgICAgICAgW3BhZ2luYXRpb25TaXplc109XCJtYW5hZ2VQYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwibWFuYWdlUGVyUGFnZVwiIChwYWdlQ2hhbmdlKT1cIm9uTWFuYWdlUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uTWFuYWdlUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSDilZDilZDilZAgRklMVEVSUyBEUkFXRVIg4pWQ4pWQ4pWQIC0tPlxuPGRpdiBjbGFzcz1cImRyYXdlci1vdmVybGF5XCIgKm5nSWY9XCJkcmF3ZXJPcGVuXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVyRHJhd2VyKClcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJhZi1kcmF3ZXJcIiAqbmdJZj1cImRyYXdlck9wZW5cIj5cbiAgPGRpdiBjbGFzcz1cImRyYXdlci1oZWFkZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cImRyYXdlci1oZWFkZXItdGl0bGVcIj5GaWx0ZXJzPC9zcGFuPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlRmlsdGVyRHJhd2VyKClcIiBjbGFzcz1cImRyYXdlci1jbG9zZS1idG5cIj7DlzwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XG4gICAgPHAgY2xhc3M9XCJkcmF3ZXItcGxhY2Vob2xkZXItdGV4dFwiPkZpbHRlciBjb25maWd1cmF0aW9uIGNvbWluZyBzb29uLiBVc2VzIHRoZSBzYW1lIGZpbHRlciBBUElzIGFzIHRoZSBleGlzdGluZyBhdWRpbyBwYWdlcy48L3A+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYWYtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImFmLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZUZpbHRlckRyYXdlcigpXCI+Q2xvc2U8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSDilZDilZDilZAgQ0FURUdPUlkgQU5BTFlTSVMgUE9QVVAg4pWQ4pWQ4pWQIC0tPlxuPGRpdiBjbGFzcz1cImNhcC1vdmVybGF5XCIgKm5nSWY9XCJjYXRlZ29yeVBvcHVwT3BlblwiIChjbGljayk9XCJjbG9zZUNhdGVnb3J5UG9wdXAoKVwiPjwvZGl2PlxuPGRpdiBjbGFzcz1cImNhcC1tb2RhbFwiICpuZ0lmPVwiY2F0ZWdvcnlQb3B1cE9wZW5cIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIj5cbiAgPGRpdiBjbGFzcz1cImNhcC1oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FwLXRpdGxlc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcC10aXRsZVwiPnt7IGNhdGVnb3J5QW5hbHlzaXNDYXRlZ29yeSB8fCAnQ2F0ZWdvcnknIH19IEFuYWx5c2lzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FwLXN1YnRpdGxlXCIgKm5nSWY9XCJjYXRlZ29yeUFuYWx5c2lzQXR0cmlidXRlXCI+XG4gICAgICAgIEZpbHRlcmVkIGJ5IDxzcGFuIGNsYXNzPVwiY2FwLWNoaXAtaW5saW5lXCI+e3sgY2F0ZWdvcnlBbmFseXNpc0F0dHJpYnV0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gY2xhc3M9XCJjYXAtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDYXRlZ29yeVBvcHVwKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj7DlzwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2FwLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FwLWxvYWRpbmdcIiAqbmdJZj1cImNhdGVnb3J5QW5hbHlzaXNMb2FkaW5nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FwLXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDxzcGFuPkxvYWRpbmfigKY8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2FwLWVycm9yXCIgKm5nSWY9XCIhY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmcgJiYgY2F0ZWdvcnlBbmFseXNpc0Vycm9yXCI+XG4gICAgICB7eyBjYXRlZ29yeUFuYWx5c2lzRXJyb3IgfX1cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmcgJiYgIWNhdGVnb3J5QW5hbHlzaXNFcnJvclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcC1zdW1tYXJ5XCIgKm5nSWY9XCJjYXRlZ29yeUFuYWx5c2lzUm93cy5sZW5ndGhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXAtc3VtbWFyeS1sYWJlbFwiPlRvdGFsIGNvbnZlcnNhdGlvbnM8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwLXN1bW1hcnktdmFsdWVcIj57eyBjYXRlZ29yeUFuYWx5c2lzVG90YWwgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNhcC10YWJsZS13cmFwXCIgKm5nSWY9XCJjYXRlZ29yeUFuYWx5c2lzUm93cy5sZW5ndGg7IGVsc2UgY2FwRW1wdHlcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwiY2FwLXRhYmxlXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjYXAtdGgtbmFtZVwiPkF0dHJpYnV0ZTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNhcC10aC1jb3VudFwiPkNvbnZlcnNhdGlvbnM8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjYXAtdGgtc2hhcmVcIj4lIG9mIFRvdGFsPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHIgb2YgY2F0ZWdvcnlBbmFseXNpc1Jvd3NcIj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FwLXRkLW5hbWVcIiBbdGl0bGVdPVwici5uYW1lXCI+e3sgci5uYW1lIH19PC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FwLXRkLWNvdW50XCI+e3sgci5jb3VudCB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhcC10ZC1zaGFyZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXAtYmFyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FwLWJhci1maWxsXCIgW3N0eWxlLndpZHRoLiVdPVwici5wZXJjZW50XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXAtYmFyLXBjdFwiPnt7IHIucGVyY2VudCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNjYXBFbXB0eT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcC1lbXB0eVwiPk5vIGRhdGEgYXZhaWxhYmxlIGZvciB0aGlzIHNlbGVjdGlvbi48L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjYXAtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNhcC1idG4tY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDYXRlZ29yeVBvcHVwKClcIj5DbG9zZTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
1924
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tZWNoby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1haS1hdWRpby9zcmMvbGliL2NvbXBvbmVudHMvdGFuZ28tZWNoby90YW5nby1lY2hvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFpLWF1ZGlvL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1lY2hvL3RhbmdvLWVjaG8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7Ozs7Ozs7OztBQVUxQixNQUFNLE9BQU8sa0JBQWtCO0lBd05uQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUEzTlYsSUFDSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxXQUFXLEdBQWlELGVBQWUsQ0FBQztJQUU1RSxzREFBc0Q7SUFDdEQsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQ3hCLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDZixPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2IsVUFBVSxHQUFRLEVBQUUsQ0FBQztJQUNyQixLQUFLLEdBQVEsRUFBRSxDQUFDO0lBRWhCLHNEQUFzRDtJQUN0RCxpQkFBaUIsR0FBUSxJQUFJLENBQUM7SUFDOUIsc0JBQXNCLEdBQUcs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SUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQztTQUNyRDtRQUNELE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDakIsQ0FBQzt3R0E1N0RVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLG9PQ2YvQiwwdnJEQWsxQkE7OzRGRG4wQmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGdCQUFnQjt1TkFPdEIsOEJBQThCO3NCQURqQyxXQUFXO3VCQUFDLHFDQUFxQztnQkE4aEJsRCx5QkFBeUI7c0JBRHhCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgeyBBdWRpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXRhbmdvLWVjaG8nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFuZ28tZWNoby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhbmdvLWVjaG8uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYW5nb0VjaG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5lY2hvLW92ZXJhbGwtdHJhbnNjcmlwdHMtaG9zdCcpXG4gIGdldCBoYXNPdmVyYWxsVHJhbnNjcmlwdHNIb3N0Q2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaWV3T3ZlcmFsbFRyYW5zY3JpcHRzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGN1cnJlbnRQYWdlOiAnY29udmVyc2F0aW9ucycgfCAnYWdlbnRhbmFseXNpcycgfCAnbWFuYWdlJyA9ICdjb252ZXJzYXRpb25zJztcblxuICAvLyDilIDilIAgVXNlciAvIEdsb2JhbCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY2xpZW50SWQgPSAnMTEnO1xuICBzdG9yZUlkczogc3RyaW5nW10gPSBbXTtcbiAgc3RhcnREYXRlID0gJyc7XG4gIGVuZERhdGUgPSAnJztcbiAgaGVhZGVyRGF0YTogYW55ID0ge307XG4gIHVzZXJzOiBhbnkgPSB7fTtcblxuICAvLyDilIDilIAgQ29ob3J0IFN1bW1hcnkgQ2FyZCAoT3ZlcmFsbCBUcmFuc2NyaXB0cykg4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvaG9ydFN1bW1hcnlDYXJkOiBhbnkgPSBudWxsO1xuICBpc0xvYWRpbmdDb2hvcnRTdW1tYXJ5ID0gZmFsc2U7XG5cbiAgLy8g4pSA4pSAIEF1ZGlvIFNvdXJjZSBmaWx0ZXIgKHZpc2libGUgb25seSBmb3IgT3ZlcmFsbCBUcmFuc2NyaXB0cyBjb2hvcnQpIOKUgOKUgFxuICBhdWRpb1NvdXJjZU9wdGlvbnM6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICBzZWxlY3RlZEF1ZGlvU291cmNlOiBzdHJpbmcgPSAnJztcbiAgYXVkaW9Tb3VyY2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICBnZXQgaXNPdmVyYWxsVHJhbnNjcmlwdHNDb2hvcnQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9PT0gJ092ZXJhbGxfdHJhbnNjcmlwdHNfdjInKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ292ZXJhbGwgdHJhbnNjcmlwdHMnO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQXVkaW9Tb3VyY2VMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdCA9IHRoaXMuYXVkaW9Tb3VyY2VPcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09PSB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UpO1xuICAgIHJldHVybiBvcHQ/LmxhYmVsIHx8IHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSB8fCAnU2VsZWN0JztcbiAgfVxuXG4gIHRvZ2dsZUF1ZGlvU291cmNlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5hdWRpb1NvdXJjZURyb3Bkb3duT3BlbiA9ICF0aGlzLmF1ZGlvU291cmNlRHJvcGRvd25PcGVuO1xuICB9XG5cbiAgY2xvc2VBdWRpb1NvdXJjZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuYXVkaW9Tb3VyY2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHNlbGVjdEF1ZGlvU291cmNlKG9wdDogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLmF1ZGlvU291cmNlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgaWYgKG9wdC52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlKSByZXR1cm47XG4gICAgdGhpcy5vbkF1ZGlvU291cmNlQ2hhbmdlKG9wdC52YWx1ZSk7XG4gIH1cblxuICBvbkF1ZGlvU291cmNlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ2NvbnZlcnNhdGlvbnMnKSB7XG4gICAgICB0aGlzLmNvbnZQYWdlID0gMTtcbiAgICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gICAgICB0aGlzLmZldGNoQ29ob3J0U3VtbWFyeUNhcmQoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdhZ2VudGFuYWx5c2lzJyAmJiB0aGlzLmRldGFpbFZpZXcpIHtcbiAgICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgICB0aGlzLmZldGNoQ29ob3J0Q2FyZHMoKTtcbiAgICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEF1ZGlvU291cmNlT3B0aW9ucyhyYXc6IGFueSk6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgaWYgKCFyYXcpIHJldHVybiBbXTtcbiAgICAvLyBBY2NlcHQ6IGFycmF5IG9mIHN0cmluZ3MsIGFycmF5IG9mIHt2YWx1ZSxsYWJlbH0gLyB7bmFtZSxpZH0sIG9yIG9iamVjdCBtYXBcbiAgICBsZXQgbGlzdDogYW55W10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSBsaXN0ID0gcmF3O1xuICAgIGVsc2UgaWYgKHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSBsaXN0ID0gT2JqZWN0LmtleXMocmF3KTtcblxuICAgIHJldHVybiBsaXN0XG4gICAgICAubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IFN0cmluZyhpdGVtKSwgbGFiZWw6IFN0cmluZyhpdGVtKSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA/PyBpdGVtLmlkID8/IGl0ZW0ua2V5ID8/IGl0ZW0ubmFtZSA/PyBpdGVtLmF1ZGlvU291cmNlID8/ICcnO1xuICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW0ubGFiZWwgPz8gaXRlbS5uYW1lID8/IGl0ZW0udGl0bGUgPz8gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlID8geyB2YWx1ZTogU3RyaW5nKHZhbHVlKSwgbGFiZWw6IFN0cmluZyhsYWJlbCkgfSA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoeCk6IHggaXMgeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0gPT4gISF4KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb252ZXJzYXRpb25zICh0cmFuc2NyaXB0LWxpc3QgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29udmVyc2F0aW9uczogYW55W10gPSBbXTtcbiAgY29udlBhZ2UgPSAxO1xuICBjb252UGVyUGFnZSA9IDEwO1xuICBjb252VG90YWwgPSAwO1xuICBjb252VG90YWxQYWdlcyA9IDE7XG4gIGNvbnZQYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCA1MCwgMTAwXTtcbiAgY29udkxvYWRpbmcgPSBmYWxzZTtcbiAgY29udlNlYXJjaFF1ZXJ5ID0gJyc7XG4gIGV4cGFuZGVkQ29udklkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBjb252VGFiczogeyBbY29udklkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIC8vIEFJIENoYXRcbiAgY29udkFpUmVwbHkgPSAnJztcbiAgY29udkFpTG9hZGluZyA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBZ2VudCBBbmFseXNpcyAoY29ob3J0L2F1ZGlvLXBhZ2UgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29ob3J0TGlzdDogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICBzZWxlY3RlZENvaG9ydE5hbWUgPSAnJztcbiAgY29ob3J0Q2FyZHM6IGFueVtdID0gW107XG4gIGNhcmRzTG9hZGluZyA9IGZhbHNlO1xuICBkZXRhaWxWaWV3ID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXREb25lID0gZmFsc2U7XG4gIGFuYWx5c2lzU2VhcmNoID0gJyc7XG5cbiAgZ2V0IGFjdGl2ZUNvaG9ydHMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmNvaG9ydExpc3QuZmlsdGVyKChjOiBhbnkpID0+IGMubWV0cmljc0FkZGVkID4gMCk7XG4gIH1cblxuICBnZXQgbnVtZXJpY1N0cmlwQ2FyZCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvaG9ydENhcmRzLmZpbmQoKGM6IGFueSkgPT4gYy50eXBlID09PSAnTlVNRVJJQ19HUk9VUCcpIHx8IG51bGw7XG4gIH1cblxuICBnZXQgbm9uTnVtZXJpY0NhcmRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2hvcnRDYXJkcy5maWx0ZXIoKGM6IGFueSkgPT4gYy50eXBlICE9PSAnTlVNRVJJQ19HUk9VUCcpO1xuICB9XG5cbiAgZ2V0TnVtZXJpY1RpbGVDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWxldHRlID0gWycjRTU0ODREJywgJyNGNUE2MjMnLCAnIzdDNUNGQycsICcjMTZBMzRBJywgJyMwRUE1RTknLCAnI0VDNDg5OSddO1xuICAgIHJldHVybiBwYWxldHRlW2luZGV4ICUgcGFsZXR0ZS5sZW5ndGhdO1xuICB9XG5cbiAgLy8gRGV0YWlsIGNvbnZlcnNhdGlvbnMgKGZyb20gY29ob3J0IGNhcmQgY2xpY2spXG4gIGRldGFpbENvbnZlcnNhdGlvbnM6IGFueVtdID0gW107XG4gIGRldGFpbFBhZ2UgPSAxO1xuICBkZXRhaWxQZXJQYWdlID0gMTA7XG4gIGRldGFpbFRvdGFsUGFnZXMgPSAxO1xuICBkZXRhaWxUb3RhbCA9IDA7XG4gIGRldGFpbFBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDUwLCAxMDBdO1xuICBkZXRhaWxQYWdlQ29udnM6IGFueVtdID0gW107XG4gIGRldGFpbE9wZW5JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGRldGFpbExvYWRpbmcgPSBmYWxzZTtcbiAgZGV0YWlsQ29udkRldGFpbDogYW55ID0gbnVsbDtcbiAgZGV0YWlsU2VhcmNoVmFsdWUgPSAnJztcblxuICAvLyDilIDilIAgTWFuYWdlIChjb2hvcnQgQ1JVRCBBUEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBtYW5hZ2VDb2hvcnRzOiBhbnlbXSA9IFtdO1xuICBtYW5hZ2VMb2FkaW5nID0gZmFsc2U7XG4gIG1hbmFnZVBhZ2UgPSAxO1xuICBtYW5hZ2VQZXJQYWdlID0gMTA7XG4gIG1hbmFnZVRvdGFsID0gMDtcbiAgbWFuYWdlVG90YWxQYWdlcyA9IDE7XG4gIG1hbmFnZVBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgbWFuYWdlU2VhcmNoID0gJyc7XG5cbiAgLy8g4pSA4pSAIEF1ZGlvIFBsYXllciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcGxheWluZ0NvbnZJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHdhdmVmb3JtSGVpZ2h0czogbnVtYmVyW10gPSBbXTtcblxuICBwcml2YXRlIGdlbmVyYXRlV2F2ZWZvcm0oKTogdm9pZCB7XG4gICAgLy8gR2VuZXJhdGUgfjIwMCBiYXJzIHdpdGggbmF0dXJhbCB3YXZlZm9ybSBwYXR0ZXJuXG4gICAgY29uc3QgYmFyczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7XG4gICAgICBjb25zdCBoID0gTWF0aC5tYXgoMywgTWF0aC5hYnMoTWF0aC5zaW4oaSAqIDAuMTUpICogMjggKyBNYXRoLnNpbihpICogMC40KSAqIDEyICsgTWF0aC5jb3MoaSAqIDAuMDgpICogOCkpO1xuICAgICAgYmFycy5wdXNoKE1hdGgucm91bmQoaCkpO1xuICAgIH1cbiAgICB0aGlzLndhdmVmb3JtSGVpZ2h0cyA9IGJhcnM7XG4gIH1cblxuICAvLyDilIDilIAgQ29ob3J0IERyb3Bkb3duIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb2hvcnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcblxuICAvLyBUcnVlIHdoaWxlIGFueSBjb2hvcnQtcmVsYXRlZCBmZXRjaCBpcyBpbiBmbGlnaHQuIFVzZWQgdG8gZGlzYWJsZSB0aGVcbiAgLy8gY29ob3J0IGRyb3Bkb3duIHNvIHVzZXJzIGNhbid0IHN3aXRjaCB0byBhbm90aGVyIG9wdGlvbiBtaWQtbG9hZCAod2hpY2hcbiAgLy8gd291bGQgcXVldWUgb3ZlcmxhcHBpbmcgcmVxdWVzdHMgYW5kIHByb2R1Y2UgaW5jb25zaXN0ZW50IHN0YXRlKS5cbiAgZ2V0IGlzQ29ob3J0TG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYXJkc0xvYWRpbmcgfHwgdGhpcy5kZXRhaWxMb2FkaW5nIHx8IHRoaXMuaXNMb2FkaW5nQ29ob3J0U3VtbWFyeTtcbiAgfVxuXG4gIHRvZ2dsZUNvaG9ydERyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ29ob3J0TG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuY29ob3J0RHJvcGRvd25PcGVuID0gIXRoaXMuY29ob3J0RHJvcGRvd25PcGVuO1xuICAgIGlmICh0aGlzLmNvaG9ydERyb3Bkb3duT3Blbikge1xuICAgICAgdGhpcy5jb2hvcnREcm9wZG93blNlYXJjaCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlQ29ob3J0RHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoID0gJyc7XG4gIH1cblxuICBzZWxlY3RDb2hvcnRGcm9tRHJvcGRvd24oY29ob3J0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0NvaG9ydExvYWRpbmcpIHJldHVybjtcbiAgICBjb25zdCBpZCA9IGNvaG9ydC5jb2hvcnRJZCB8fCBjb2hvcnQuaWQgfHwgY29ob3J0Ll9pZCB8fCAnJztcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcbiAgICB0aGlzLm9uQ29ob3J0RHJvcGRvd25DaGFuZ2UoaWQpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcmVkRHJvcGRvd25Db2hvcnRzKCk6IGFueVtdIHtcbiAgICBpZiAoIXRoaXMuY29ob3J0RHJvcGRvd25TZWFyY2gpIHJldHVybiB0aGlzLmNvaG9ydExpc3Q7XG4gICAgY29uc3QgcSA9IHRoaXMuY29ob3J0RHJvcGRvd25TZWFyY2gudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5jb2hvcnRMaXN0LmZpbHRlcigoYzogYW55KSA9PiAoKGMuY29ob3J0TmFtZSB8fCBjLm5hbWUgfHwgJycpIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSk7XG4gIH1cblxuICAvLyDilIDilIAgRmlsdGVycyBEcmF3ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGRyYXdlck9wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBEZWZhdWx0IHN0b3JlIGxpc3QgKHNhbWUgYXMgZXhpc3RpbmcgYXVkaW8tcGFnZS90cmFuc2NyaXB0LWxpc3QpXG4gIHByaXZhdGUgZGVmYXVsdFN0b3JlcyA9IFtcbiAgICAnMTEtMTA2MicsICcxMS0xMDc4JywgJzExLTEwODMnLCAnMTEtMTUxNScsICcxMS0xNTQnLCAnMTEtMTYyNicsXG4gICAgJzExLTE4MScsICcxMS0xOTQ3JywgJzExLTE5OTQnLCAnMTEtMjAwJywgJzExLTIwMicsICcxMS0yMTUnLFxuICAgICcxMS0yNjAnLCAnMTEtNzgnLCAnMTEtODE5J1xuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXVkaW9TZXJ2aWNlOiBBdWRpb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICkge1xuICAgIHRoaXMuZ2VuZXJhdGVXYXZlZm9ybSgpO1xuICB9XG5cbiAgLy8gU3luYyA/dmlldz1vdmVyYWxsLXRyYW5zY3JpcHRzIGluIHRoZSBVUkwgd2hlbiBBZ2VudCBBbmFseXNpcyBpcyBzaG93aW5nXG4gIC8vIHRoZSBPdmVyYWxsIFRyYW5zY3JpcHRzIGNvaG9ydCBkZXRhaWwuIFJlbW92ZWQgZm9yIGFueSBvdGhlciBjb2hvcnQgb3JcbiAgLy8gd2hlbiBsZWF2aW5nIHRoZSBkZXRhaWwgdmlldy5cbiAgLy8g4pSA4pSAIElubGluZSBkYXRlIHJhbmdlIHBpY2tlciAoT3ZlcmFsbCBUcmFuc2NyaXB0cyB2aWV3KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZWNob0RhdGVSYW5nZTogYW55ID0geyBzdGFydERhdGU6IGRheWpzKCkuc3VidHJhY3QoMzAsICdkYXknKSwgZW5kRGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5JykgfTtcbiAgZWNob0RhdGVSYW5nZXM6IGFueSA9IHtcbiAgICBUb2RheTogW2RheWpzKCksIGRheWpzKCldLFxuICAgIFllc3RlcmRheTogW2RheWpzKCkuc3VidHJhY3QoMSwgJ2RheScpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXknKV0sXG4gICAgJ1RoaXMgV2Vlayc6IFtkYXlqcygpLnN1YnRyYWN0KDcsICdkYXknKSwgZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5JyldLFxuICAgICdMYXN0IFdlZWsnOiBbZGF5anMoKS5zdWJ0cmFjdCgxNCwgJ2RheScpLnN0YXJ0T2YoJ2RheScpLCBkYXlqcygpLnN1YnRyYWN0KDgsICdkYXknKS5lbmRPZignZGF5JyldLFxuICAgICdUaGlzIE1vbnRoJzogW2RheWpzKCkuc3VidHJhY3QoMzAsICdkYXknKSwgZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5JyldLFxuICAgICdMYXN0IE1vbnRoJzogW2RheWpzKCkuc3VidHJhY3QoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKSwgZGF5anMoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKV1cbiAgfTtcblxuICBpbml0RWNob0RhdGVSYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhcnREYXRlIHx8IHRoaXMuZ2V0U3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5lbmREYXRlIHx8IHRoaXMuZ2V0RW5kRGF0ZSgpO1xuICAgIGNvbnN0IHMgPSBkYXlqcyhzdGFydCwgJ1lZWVktTU0tREQnKTtcbiAgICBjb25zdCBlID0gZGF5anMoZW5kLCAnWVlZWS1NTS1ERCcpO1xuICAgIGlmIChzLmlzVmFsaWQoKSAmJiBlLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5lY2hvRGF0ZVJhbmdlID0geyBzdGFydERhdGU6IHMsIGVuZERhdGU6IGUgfTtcbiAgICB9XG4gIH1cblxuICBvbkVjaG9EYXRlQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50Py5zdGFydERhdGUgfHwgIWV2ZW50Py5lbmREYXRlKSByZXR1cm47XG4gICAgY29uc3QgcyA9IGRheWpzKGV2ZW50LnN0YXJ0RGF0ZSk7XG4gICAgY29uc3QgZSA9IGRheWpzKGV2ZW50LmVuZERhdGUpO1xuICAgIGlmICghcy5pc1ZhbGlkKCkgfHwgIWUuaXNWYWxpZCgpKSByZXR1cm47XG4gICAgY29uc3Qgc3RhcnRTdHIgPSBzLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIGNvbnN0IGVuZFN0ciA9IGUuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgaWYgKHN0YXJ0U3RyID09PSB0aGlzLnN0YXJ0RGF0ZSAmJiBlbmRTdHIgPT09IHRoaXMuZW5kRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnRTdHI7XG4gICAgdGhpcy5lbmREYXRlID0gZW5kU3RyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKTtcbiAgICAgIGNvbnN0IGhmOiBhbnkgPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiB7fTtcbiAgICAgIGhmLmRhdGUgPSB7IHN0YXJ0RGF0ZTogc3RhcnRTdHIsIGVuZERhdGU6IGVuZFN0ciB9O1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoaGYpKTtcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dChoZik7XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdhZ2VudGFuYWx5c2lzJyAmJiB0aGlzLmRldGFpbFZpZXcpIHtcbiAgICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgICB0aGlzLmZldGNoQ29ob3J0Q2FyZHMoKTtcbiAgICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIElubGluZSByaWNoIGZpbHRlciBwb3B1cCAoT3ZlcmFsbCBUcmFuc2NyaXB0cyB2aWV3KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZWNob0ZpbHRlck9wZW4gPSBmYWxzZTtcbiAgZWNob0ZpbHRlclRhYjogJ3N0YXR1cycgfCAnY291bnRyeScgfCAncmVnaW9uJyB8ICdjbHVzdGVycycgfCAnc3RvcmVzJyB8ICdkb3dudGltZScgPSAnc3RvcmVzJztcbiAgZWNob0ZpbHRlclNlYXJjaCA9ICcnO1xuICBlY2hvRmlsdGVyU3RhdHVzOiB7IGxhYmVsOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfVtdID0gW1xuICAgIHsgbGFiZWw6ICdBY3RpdmUnLCBjaGVja2VkOiBmYWxzZSB9LFxuICAgIHsgbGFiZWw6ICdJbmFjdGl2ZScsIGNoZWNrZWQ6IGZhbHNlIH1cbiAgXTtcbiAgZWNob0ZpbHRlckNvdW50cmllczogeyBjb3VudHJ5OiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGVjaG9GaWx0ZXJSZWdpb25zOiB7IGNpdHk6IHN0cmluZzsgY2hlY2tlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgZWNob0ZpbHRlckNsdXN0ZXJzOiB7IGdyb3VwTmFtZTogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH1bXSA9IFtdO1xuICBlY2hvRmlsdGVyU3RvcmVzOiB7IHN0b3JlSWQ6IHN0cmluZzsgc3RvcmVOYW1lOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIC8vIERvd250aW1lOiBwcmVzZXQgcmFuZ2VzIChzYW1lIHNldCBhcyB0aGUgZ2xvYmFsIHRyYWZmaWMtaGVhZGVyKVxuICBlY2hvRmlsdGVyRG93bnRpbWVPcHRpb25zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfVtdID0gW1xuICAgIHsgbGFiZWw6ICcwLTEyMCBtaW5zJywgdmFsdWU6ICcwLTEyMCcsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzEyMS0zNjAgbWlucycsIHZhbHVlOiAnMTIxLTM2MCcsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzM2MS02MDAgbWlucycsIHZhbHVlOiAnMzYxLTYwMCcsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBsYWJlbDogJzYwMSsgbWlucycsIHZhbHVlOiAnNjAxKycsIGNoZWNrZWQ6IGZhbHNlIH1cbiAgXTtcblxuICBnZXQgZWNob0ZpbHRlclN0YXR1c0NvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmVjaG9GaWx0ZXJTdGF0dXMuZmlsdGVyKHMgPT4gcy5jaGVja2VkKS5sZW5ndGg7IH1cbiAgZ2V0IGVjaG9GaWx0ZXJDb3VudHJ5Q291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZWNob0ZpbHRlckNvdW50cmllcy5maWx0ZXIoYyA9PiBjLmNoZWNrZWQpLmxlbmd0aDsgfVxuICBnZXQgZWNob0ZpbHRlclJlZ2lvbkNvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmVjaG9GaWx0ZXJSZWdpb25zLmZpbHRlcihyID0+IHIuY2hlY2tlZCkubGVuZ3RoOyB9XG4gIGdldCBlY2hvRmlsdGVyQ2x1c3RlckNvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmVjaG9GaWx0ZXJDbHVzdGVycy5maWx0ZXIoYyA9PiBjLmNoZWNrZWQpLmxlbmd0aDsgfVxuICBnZXQgZWNob0ZpbHRlclN0b3JlQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZWNob0ZpbHRlclN0b3Jlcy5maWx0ZXIocyA9PiBzLmNoZWNrZWQpLmxlbmd0aDsgfVxuICBnZXQgZWNob0ZpbHRlckRvd250aW1lQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZWNob0ZpbHRlckRvd250aW1lT3B0aW9ucy5maWx0ZXIoZCA9PiBkLmNoZWNrZWQpLmxlbmd0aDsgfVxuICBnZXQgZWNob0ZpbHRlckRvd250aW1lQWN0aXZlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5lY2hvRmlsdGVyRG93bnRpbWVDb3VudCA+IDA7IH1cblxuICBsb2FkRWNob0ZpbHRlcnNGcm9tU3RvcmFnZSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJyk7XG4gICAgICBjb25zdCBoZjogYW55ID0gcmF3ID8gSlNPTi5wYXJzZShyYXcpIDoge307XG4gICAgICB0aGlzLmVjaG9GaWx0ZXJDb3VudHJpZXMgPSBBcnJheS5pc0FycmF5KGhmLmNvdW50cnkpXG4gICAgICAgID8gaGYuY291bnRyeS5tYXAoKGM6IGFueSkgPT4gKHsgY291bnRyeTogYy5jb3VudHJ5LCBjaGVja2VkOiAhIWMuY2hlY2tlZCB9KSkgOiBbXTtcbiAgICAgIHRoaXMuZWNob0ZpbHRlclJlZ2lvbnMgPSBBcnJheS5pc0FycmF5KGhmLmxvY2F0aW9uKVxuICAgICAgICA/IGhmLmxvY2F0aW9uLm1hcCgobDogYW55KSA9PiAoeyBjaXR5OiBsLmNpdHksIGNoZWNrZWQ6ICEhbC5jaGVja2VkIH0pKSA6IFtdO1xuICAgICAgdGhpcy5lY2hvRmlsdGVyQ2x1c3RlcnMgPSBBcnJheS5pc0FycmF5KGhmLmdyb3VwKVxuICAgICAgICA/IGhmLmdyb3VwLm1hcCgoZzogYW55KSA9PiAoeyBncm91cE5hbWU6IGcuZ3JvdXBOYW1lLCBjaGVja2VkOiAhIWcuY2hlY2tlZCB9KSkgOiBbXTtcbiAgICAgIHRoaXMuZWNob0ZpbHRlclN0b3JlcyA9IEFycmF5LmlzQXJyYXkoaGYuc3RvcmVzKVxuICAgICAgICA/IGhmLnN0b3Jlcy5tYXAoKHM6IGFueSkgPT4gKHsgc3RvcmVJZDogcy5zdG9yZUlkLCBzdG9yZU5hbWU6IHMuc3RvcmVOYW1lLCBjaGVja2VkOiBzLmNoZWNrZWQgIT09IGZhbHNlIH0pKSA6IFtdO1xuXG4gICAgICAvLyBSZXN0b3JlIFN0YXR1cyBzZWxlY3Rpb24gZnJvbSB0aGUgc2hhcmVkIGBzdGF0dXNgIGtleSAoc2FtZSBvbmUgdGhlXG4gICAgICAvLyBnbG9iYWwgdHJhZmZpYy1oZWFkZXIgd3JpdGVzIOKAlCBlLmcuIFtcImFjdGl2ZVwiXSkuXG4gICAgICBjb25zdCBzYXZlZFN0YXR1czogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGhmLnN0YXR1cykgPyBoZi5zdGF0dXMgOiBbXTtcbiAgICAgIGNvbnN0IHN0YXR1c1NldCA9IG5ldyBTZXQoc2F2ZWRTdGF0dXMubWFwKChzOiBzdHJpbmcpID0+IChzIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICB0aGlzLmVjaG9GaWx0ZXJTdGF0dXMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5jaGVja2VkID0gc3RhdHVzU2V0LmhhcyhzLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlc3RvcmUgRG93bnRpbWUgc2VsZWN0aW9uIGZyb20gdGhlIHNoYXJlZCBgZG93bnRpbWVgIGtleS5cbiAgICAgIGNvbnN0IHNhdmVkRG93bnRpbWU6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShoZi5kb3dudGltZSkgPyBoZi5kb3dudGltZSA6IFtdO1xuICAgICAgY29uc3QgZG93bnRpbWVTZXQgPSBuZXcgU2V0KHNhdmVkRG93bnRpbWUpO1xuICAgICAgdGhpcy5lY2hvRmlsdGVyRG93bnRpbWVPcHRpb25zLmZvckVhY2goZCA9PiB7XG4gICAgICAgIGQuY2hlY2tlZCA9IGRvd250aW1lU2V0LmhhcyhkLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICB9XG5cbiAgb3BlbkVjaG9GaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkRWNob0ZpbHRlcnNGcm9tU3RvcmFnZSgpO1xuICAgIHRoaXMuZWNob0ZpbHRlclRhYiA9ICdzdG9yZXMnO1xuICAgIHRoaXMuZWNob0ZpbHRlclNlYXJjaCA9ICcnO1xuICAgIHRoaXMuZWNob0ZpbHRlck9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gICAgLy8gUG9wdWxhdGUgQ291bnRyeSAvIFJlZ2lvbiAvIENsdXN0ZXIgb3B0aW9ucyBmcm9tIHRoZSBzYW1lIEFQSXMgdGhlXG4gICAgLy8gZ2xvYmFsIHRyYWZmaWMtaGVhZGVyIHVzZXMuIFRoZSBPdmVyYWxsIFRyYW5zY3JpcHRzIHBhZ2UgbW91bnRzIHRoZVxuICAgIC8vIHNpbmdsZVNlbGVjdCB0b29sYmFyICh0b29sYmFyLmNvbXBvbmVudC50czoyMjQpIHdoaWNoIGRvZXMgTk9UIGZldGNoXG4gICAgLy8gdGhlc2UgbGlzdHMsIHNvIHRoZSBwb3B1cCB3b3VsZCBvdGhlcndpc2Ugc2hvdyBcIk5vIG9wdGlvbnMgYXZhaWxhYmxlXCIuXG4gICAgdGhpcy5mZXRjaEVjaG9GaWx0ZXJPcHRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBlY2hvRmlsdGVyQ2xpZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnRJZCB8fCB0aGlzLnVzZXJzPy5jbGllbnRJZCB8fCAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGVjaG9GaWx0ZXJTdGF0dXNWYWx1ZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBpY2tzID0gdGhpcy5lY2hvRmlsdGVyU3RhdHVzLmZpbHRlcihzID0+IHMuY2hlY2tlZCkubWFwKHMgPT4gcy5sYWJlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICByZXR1cm4gcGlja3MubGVuZ3RoID8gcGlja3MgOiBbJ2FjdGl2ZSddO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZWNob0ZpbHRlckNoZWNrZWRDb3VudHJpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmVjaG9GaWx0ZXJDb3VudHJpZXMuZmlsdGVyKGMgPT4gYy5jaGVja2VkKS5tYXAoYyA9PiBjLmNvdW50cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZWNob0ZpbHRlckNoZWNrZWRDaXRpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmVjaG9GaWx0ZXJSZWdpb25zLmZpbHRlcihyID0+IHIuY2hlY2tlZCkubWFwKHIgPT4gci5jaXR5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGVjaG9GaWx0ZXJDaGVja2VkQ2x1c3RlcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmVjaG9GaWx0ZXJDbHVzdGVycy5maWx0ZXIoYyA9PiBjLmNoZWNrZWQpLm1hcChjID0+IGMuZ3JvdXBOYW1lKTtcbiAgfVxuXG4gIC8vIEluaXRpYWwgZmV0Y2ggd2hlbiB0aGUgcG9wdXAgb3BlbnMuIExvYWRzIGFsbCBmb3VyIGNhc2NhZGVkIGxpc3RzLlxuICBwcml2YXRlIGZldGNoRWNob0ZpbHRlck9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVjaG9GaWx0ZXJDbGllbnRJZCkgcmV0dXJuO1xuICAgIHRoaXMuZmV0Y2hFY2hvQ291bnRyaWVzKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9SZWdpb25zKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9DbHVzdGVycygpO1xuICAgIHRoaXMuZmV0Y2hFY2hvU3RvcmVzKCk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoRWNob0NvdW50cmllcygpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGguZ2V0Q291bnRyeSh7XG4gICAgICBjbGllbnRJZDogdGhpcy5lY2hvRmlsdGVyQ2xpZW50SWQsXG4gICAgICBzdGF0dXM6IHRoaXMuZWNob0ZpbHRlclN0YXR1c1ZhbHVlc1xuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDb3VudHJpZXMpO1xuICAgICAgICB0aGlzLmVjaG9GaWx0ZXJDb3VudHJpZXMgPSAocmVzPy5kYXRhPy5jb3VudHJ5RGF0YSB8fCBbXSkubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgY291bnRyeTogaXRlbS5jb3VudHJ5LFxuICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkLmhhcyhpdGVtLmNvdW50cnkpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHRoaXMuZWNob0ZpbHRlclRhYiA9PT0gJ2NvdW50cnknKSB7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICAgICAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEVjaG9SZWdpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aC5nZXRMb2NhdGlvbih7XG4gICAgICBjbGllbnRJZDogdGhpcy5lY2hvRmlsdGVyQ2xpZW50SWQsXG4gICAgICBjb3VudHJ5OiB0aGlzLmVjaG9GaWx0ZXJDaGVja2VkQ291bnRyaWVzLFxuICAgICAgY2l0eTogW10sIGdyb3VwOiBbXSxcbiAgICAgIHN0YXR1czogdGhpcy5lY2hvRmlsdGVyU3RhdHVzVmFsdWVzXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQodGhpcy5lY2hvRmlsdGVyQ2hlY2tlZENpdGllcyk7XG4gICAgICAgIHRoaXMuZWNob0ZpbHRlclJlZ2lvbnMgPSAocmVzPy5kYXRhPy5sb2NhdGlvbkRhdGEgfHwgW10pLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgIGNpdHk6IGl0ZW0uY2l0eSxcbiAgICAgICAgICBjaGVja2VkOiBzZWxlY3RlZC5oYXMoaXRlbS5jaXR5KVxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmVjaG9GaWx0ZXJUYWIgPT09ICdyZWdpb24nKSB7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICAgICAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEVjaG9DbHVzdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGguZ2V0R3JvdXBzKHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmVjaG9GaWx0ZXJDbGllbnRJZCxcbiAgICAgIGNvdW50cnk6IHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDb3VudHJpZXMsXG4gICAgICBjaXR5OiB0aGlzLmVjaG9GaWx0ZXJDaGVja2VkQ2l0aWVzLFxuICAgICAgZ3JvdXA6IFtdLFxuICAgICAgc3RhdHVzOiB0aGlzLmVjaG9GaWx0ZXJTdGF0dXNWYWx1ZXNcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCh0aGlzLmVjaG9GaWx0ZXJDaGVja2VkQ2x1c3RlcnMpO1xuICAgICAgICB0aGlzLmVjaG9GaWx0ZXJDbHVzdGVycyA9IChyZXM/LmRhdGE/Lmdyb3VwRGF0YSB8fCBbXSkubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgZ3JvdXBOYW1lOiBpdGVtLmdyb3VwTmFtZSxcbiAgICAgICAgICBjaGVja2VkOiBzZWxlY3RlZC5oYXMoaXRlbS5ncm91cE5hbWUpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHRoaXMuZWNob0ZpbHRlclRhYiA9PT0gJ2NsdXN0ZXJzJykge1xuICAgICAgICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgICAgICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdoZW4gYSBjYXNjYWRlIChjb3VudHJ5L3JlZ2lvbi9jbHVzdGVyL3N0YXR1cyBjaGFuZ2UpIHJlZmV0Y2hlcyBzdG9yZXMsXG4gIC8vIHdlIGF1dG8tY2hlY2sgZXZlcnkgcmV0dXJuZWQgc3RvcmUgc28gdGhlIHVwc3RyZWFtIGZpbHRlciBpcyBpbW1lZGlhdGVseVxuICAvLyBhcHBsaWVkLiBXaGVuIHdlJ3JlIGp1c3QgcmVmcmVzaGluZyB0aGUgc3RvcmVzIGxpc3Qgd2l0aG91dCBhIGNhc2NhZGVcbiAgLy8gKGUuZy4gaW5pdGlhbCBvcGVuKSwgd2UgcHJlc2VydmUgYW55IHByaW9yIHNlbGVjdGlvbi5cbiAgcHJpdmF0ZSBmZXRjaEVjaG9TdG9yZXMoYXV0b0NoZWNrQWxsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGguZ2V0SGVhZGVyU3RvcmVzKHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmVjaG9GaWx0ZXJDbGllbnRJZCxcbiAgICAgIGNvdW50cnk6IHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDb3VudHJpZXMsXG4gICAgICBjaXR5OiB0aGlzLmVjaG9GaWx0ZXJDaGVja2VkQ2l0aWVzLFxuICAgICAgY2x1c3RlcnM6IHRoaXMuZWNob0ZpbHRlckNoZWNrZWRDbHVzdGVycyxcbiAgICAgIHN0YXR1czogdGhpcy5lY2hvRmlsdGVyU3RhdHVzVmFsdWVzXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXJlcyB8fCByZXMuY29kZSAhPT0gMjAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0b3Jlc0RhdGEgPSByZXM/LmRhdGE/LnN0b3Jlc0RhdGEgfHwgW107XG4gICAgICAgIGNvbnN0IHByZXZpb3VzbHlDaGVja2VkID0gbmV3IFNldChcbiAgICAgICAgICB0aGlzLmVjaG9GaWx0ZXJTdG9yZXMuZmlsdGVyKHMgPT4gcy5jaGVja2VkKS5tYXAocyA9PiBzLnN0b3JlSWQpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhhZFByaW9yU2VsZWN0aW9uID0gcHJldmlvdXNseUNoZWNrZWQuc2l6ZSA+IDA7XG4gICAgICAgIHRoaXMuZWNob0ZpbHRlclN0b3JlcyA9IHN0b3Jlc0RhdGEubWFwKChzOiBhbnkpID0+ICh7XG4gICAgICAgICAgc3RvcmVJZDogcy5zdG9yZUlkLFxuICAgICAgICAgIHN0b3JlTmFtZTogcy5zdG9yZU5hbWUsXG4gICAgICAgICAgY2hlY2tlZDogYXV0b0NoZWNrQWxsXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogKGhhZFByaW9yU2VsZWN0aW9uID8gcHJldmlvdXNseUNoZWNrZWQuaGFzKHMuc3RvcmVJZCkgOiB0cnVlKVxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmVjaG9GaWx0ZXJUYWIgPT09ICdzdG9yZXMnKSB7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkRWNob0ZpbHRlclJvd3MoKTtcbiAgICAgICAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2FzY2FkZSBoYW5kbGVycyDigJQgY2FsbGVkIHdoZW4gYSByb3cgaW4gdGhlIG1hdGNoaW5nIHRhYiBpcyB0b2dnbGVkLlxuICAvLyBNaXJyb3JzIHRyYWZmaWMtaGVhZGVyLmNvbXBvbmVudC50cyB1cGRhdGVTZWxlY3RlZENvdW50cmllcy9Mb2NhdGlvbnMvR3JvdXBzLlxuICBvbkVjaG9Db3VudHJ5Q2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIENvdW50cnkgY2hhbmdlZCDihpIgaW52YWxpZGF0ZSBkb3duc3RyZWFtIGxpc3RzIGFuZCByZWZldGNoLiBBdXRvLWNoZWNrXG4gICAgLy8gdGhlIHJldHVybmVkIHN0b3JlcyBzbyB0aGUgbmV3IGdlb2dyYXBoaWMgc2NvcGUgaXMgYXBwbGllZCBpbW1lZGlhdGVseS5cbiAgICB0aGlzLmZldGNoRWNob1JlZ2lvbnMoKTtcbiAgICB0aGlzLmZldGNoRWNob0NsdXN0ZXJzKCk7XG4gICAgdGhpcy5mZXRjaEVjaG9TdG9yZXModHJ1ZSk7XG4gIH1cblxuICBvbkVjaG9SZWdpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5mZXRjaEVjaG9DbHVzdGVycygpO1xuICAgIHRoaXMuZmV0Y2hFY2hvU3RvcmVzKHRydWUpO1xuICB9XG5cbiAgb25FY2hvQ2x1c3RlckNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZldGNoRWNob1N0b3Jlcyh0cnVlKTtcbiAgfVxuXG4gIG9uRWNob1N0YXR1c0NoYW5nZSgpOiB2b2lkIHtcbiAgICAvLyBTdGF0dXMgYWZmZWN0cyBldmVyeSBsaXN0IOKAlCByZWZldGNoIGFsbC5cbiAgICB0aGlzLmZldGNoRWNob0NvdW50cmllcygpO1xuICAgIHRoaXMuZmV0Y2hFY2hvUmVnaW9ucygpO1xuICAgIHRoaXMuZmV0Y2hFY2hvQ2x1c3RlcnMoKTtcbiAgICB0aGlzLmZldGNoRWNob1N0b3Jlcyh0cnVlKTtcbiAgfVxuXG4gIC8vIERvd250aW1lIOKGkiBTdG9yZXMgY2FzY2FkZS4gTWlycm9ycyB0cmFmZmljLWhlYWRlci5kb3dudGltZUFwaSgpOlxuICAvLyBQT1NUIC9nZXQtc3RvcmUtbGlzdC12MiB3aXRoIHRoZSBjdXJyZW50IHN0b3JlIElEcyArIHNlbGVjdGVkIGRvd250aW1lXG4gIC8vIHJhbmdlcyArIGRhdGUgcmFuZ2UuIFJlc3BvbnNlIGlzIHRoZSBzdWJzZXQgb2Ygc3RvcmVzIHdob3NlIGRvd250aW1lXG4gIC8vIGZhbGxzIGluIHRoZSBzZWxlY3RlZCByYW5nZXM7IHdlIG1hcmsgb25seSB0aG9zZSBhcyBjaGVja2VkLlxuICBvbkVjaG9Eb3dudGltZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkb3dudGltZSA9IHRoaXMuZWNob0ZpbHRlckRvd250aW1lT3B0aW9ucy5maWx0ZXIoZCA9PiBkLmNoZWNrZWQpLm1hcChkID0+IGQudmFsdWUpO1xuICAgIGlmICghZG93bnRpbWUubGVuZ3RoKSB7XG4gICAgICAvLyBObyBkb3dudGltZSBmaWx0ZXIgc2VsZWN0ZWQg4oCUIHJlc3RvcmUgXCJhbGxcIiBzdGF0ZSBmb3Igc3RvcmVzLlxuICAgICAgdGhpcy5lY2hvRmlsdGVyU3RvcmVzLmZvckVhY2gocyA9PiBzLmNoZWNrZWQgPSB0cnVlKTtcbiAgICAgIGlmICh0aGlzLmVjaG9GaWx0ZXJUYWIgPT09ICdzdG9yZXMnKSB7XG4gICAgICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmVjaG9GaWx0ZXJDbGllbnRJZCxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZWNob0ZpbHRlclN0b3Jlcy5tYXAocyA9PiBzLnN0b3JlSWQpLFxuICAgICAgZG93bnRpbWUsXG4gICAgICBmcm9tRGF0ZTogdGhpcy5zdGFydERhdGUsXG4gICAgICB0b0RhdGU6IHRoaXMuZW5kRGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmF1dGguZ2V0RG93bnRpbWVIZWFkZXIob2JqKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmICghcmVzIHx8IHJlcy5jb2RlICE9PSAyMDApIHJldHVybjtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgIChyZXM/LmRhdGE/LnN0b3Jlc0RhdGEgfHwgW10pLm1hcCgoZDogYW55KSA9PiBkLnN0b3JlSWQpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWNob0ZpbHRlclN0b3Jlcy5mb3JFYWNoKHMgPT4gcy5jaGVja2VkID0gbWF0Y2hpbmdJZHMuaGFzKHMuc3RvcmVJZCkpO1xuICAgICAgICBpZiAodGhpcy5lY2hvRmlsdGVyVGFiID09PSAnc3RvcmVzJykge1xuICAgICAgICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgICAgICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlRWNob0ZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmVjaG9GaWx0ZXJPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5lY2hvRmlsdGVyU2VhcmNoID0gJyc7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGlja0VjaG9GaWx0ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWNob0ZpbHRlck9wZW4pIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZSB8IG51bGw7XG4gICAgY29uc3Qgd3JhcCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lY2hvLWZpbHRlci13cmFwJyk7XG4gICAgaWYgKHdyYXAgJiYgdGFyZ2V0ICYmICF3cmFwLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2VFY2hvRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FjaGVkIHZpc2libGUgcm93cy4gUmVjb21wdXRlZCBvbmx5IHdoZW4gdGFiL3NlYXJjaC9zb3VyY2UgZGF0YSBjaGFuZ2VcbiAgLy8gdmlhIHJlYnVpbGRFY2hvRmlsdGVyUm93cygpLiBSZWFkaW5nIGEgcGxhaW4gZmllbGQgaXMgTygxKSBmb3IgdGhlXG4gIC8vIHRlbXBsYXRlLCB2cyB0aGUgcHJldmlvdXMgZ2V0dGVyIHdoaWNoIHJlbWFwcGVkIDIwMDArIGl0ZW1zIGV2ZXJ5IENEXG4gIC8vIGN5Y2xlIGFuZCBjYXVzZWQgY2xpY2sgbGFnIHBsdXMgcmFjZSBjb25kaXRpb25zLlxuICBlY2hvRmlsdGVyVmlzaWJsZVJvd3M6IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgcmVmOiB7IGNoZWNrZWQ6IGJvb2xlYW4gfSB9W10gPSBbXTtcblxuICBwcml2YXRlIHJlYnVpbGRFY2hvRmlsdGVyUm93cygpOiB2b2lkIHtcbiAgICBjb25zdCBxID0gdGhpcy5lY2hvRmlsdGVyU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGxldCByb3dzOiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHJlZjogeyBjaGVja2VkOiBib29sZWFuIH0gfVtdID0gW107XG4gICAgc3dpdGNoICh0aGlzLmVjaG9GaWx0ZXJUYWIpIHtcbiAgICAgIGNhc2UgJ3N0YXR1cyc6XG4gICAgICAgIHJvd3MgPSB0aGlzLmVjaG9GaWx0ZXJTdGF0dXMubWFwKHMgPT4gKHsgaWQ6IHMubGFiZWwsIGxhYmVsOiBzLmxhYmVsLCByZWY6IHMgfSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvdW50cnknOlxuICAgICAgICByb3dzID0gdGhpcy5lY2hvRmlsdGVyQ291bnRyaWVzLm1hcChjID0+ICh7IGlkOiBjLmNvdW50cnksIGxhYmVsOiBjLmNvdW50cnksIHJlZjogYyB9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVnaW9uJzpcbiAgICAgICAgcm93cyA9IHRoaXMuZWNob0ZpbHRlclJlZ2lvbnMubWFwKHIgPT4gKHsgaWQ6IHIuY2l0eSwgbGFiZWw6IHIuY2l0eSwgcmVmOiByIH0pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbHVzdGVycyc6XG4gICAgICAgIHJvd3MgPSB0aGlzLmVjaG9GaWx0ZXJDbHVzdGVycy5tYXAoYyA9PiAoeyBpZDogYy5ncm91cE5hbWUsIGxhYmVsOiBjLmdyb3VwTmFtZSwgcmVmOiBjIH0pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdG9yZXMnOlxuICAgICAgICByb3dzID0gdGhpcy5lY2hvRmlsdGVyU3RvcmVzLm1hcChzID0+ICh7IGlkOiBzLnN0b3JlSWQsIGxhYmVsOiBzLnN0b3JlTmFtZSwgcmVmOiBzIH0pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkb3dudGltZSc6XG4gICAgICAgIHJvd3MgPSB0aGlzLmVjaG9GaWx0ZXJEb3dudGltZU9wdGlvbnMubWFwKGQgPT4gKHsgaWQ6IGQudmFsdWUsIGxhYmVsOiBkLmxhYmVsLCByZWY6IGQgfSkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5lY2hvRmlsdGVyVmlzaWJsZVJvd3MgPSBxID8gcm93cy5maWx0ZXIociA9PiByLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogcm93cztcbiAgfVxuXG4gIHNldEVjaG9GaWx0ZXJUYWIodGFiOiAnc3RhdHVzJyB8ICdjb3VudHJ5JyB8ICdyZWdpb24nIHwgJ2NsdXN0ZXJzJyB8ICdzdG9yZXMnIHwgJ2Rvd250aW1lJyk6IHZvaWQge1xuICAgIHRoaXMuZWNob0ZpbHRlclRhYiA9IHRhYjtcbiAgICB0aGlzLmVjaG9GaWx0ZXJTZWFyY2ggPSAnJztcbiAgICB0aGlzLnJlYnVpbGRFY2hvRmlsdGVyUm93cygpO1xuICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICB9XG5cbiAgb25FY2hvRmlsdGVyU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucmVidWlsZEVjaG9GaWx0ZXJSb3dzKCk7XG4gICAgdGhpcy5zeW5jRWNob0ZpbHRlckFsbFNlbGVjdGVkKCk7XG4gIH1cblxuICB0cmFja0VjaG9GaWx0ZXJSb3cgPSAoXzogbnVtYmVyLCByOiB7IGlkOiBzdHJpbmcgfSkgPT4gci5pZDtcblxuICAvLyBQbGFpbiBmaWVsZCwgcmVmcmVzaGVkIGJ5IHN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKSB3aGVuZXZlciByb3dzXG4gIC8vIG9yIHJvdy5jaGVja2VkIGNoYW5nZXMuIEF2b2lkcyBhIGdldHRlciB0aGF0IHJ1bnMgb24gZXZlcnkgQ0QgY3ljbGUuXG4gIGVjaG9GaWx0ZXJBbGxTZWxlY3RlZCA9IGZhbHNlO1xuXG4gIHN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZWNob0ZpbHRlclZpc2libGVSb3dzO1xuICAgIHRoaXMuZWNob0ZpbHRlckFsbFNlbGVjdGVkID0gcm93cy5sZW5ndGggPiAwICYmIHJvd3MuZXZlcnkociA9PiByLnJlZi5jaGVja2VkKTtcbiAgfVxuXG4gIGVjaG9GaWx0ZXJUb2dnbGVSb3cocmVmOiB7IGNoZWNrZWQ6IGJvb2xlYW4gfSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHJlZi5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgfVxuXG4gIGVjaG9GaWx0ZXJUb2dnbGVBbGwoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmVjaG9GaWx0ZXJWaXNpYmxlUm93cykge1xuICAgICAgci5yZWYuY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuZWNob0ZpbHRlckFsbFNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICB0aGlzLm9uRWNob0ZpbHRlclJvd0NoYW5nZSgpO1xuICB9XG5cbiAgLy8gU2luZ2xlIGVudHJ5IHBvaW50IGZvciByb3cgdG9nZ2xlcyDigJQgZGlzcGF0Y2hlcyB0aGUgY2FzY2FkZSByZWZldGNoXG4gIC8vIGJhc2VkIG9uIHRoZSBhY3RpdmUgdGFiLiBNaXJyb3JzIHRyYWZmaWMtaGVhZGVyLmNvbXBvbmVudC50cyBiZWhhdmlvdXJcbiAgLy8gd2hlcmUgY2hhbmdpbmcgYSBjb3VudHJ5IGludmFsaWRhdGVzIHJlZ2lvbnMvY2x1c3RlcnMvc3RvcmVzLCBldGMuXG4gIG9uRWNob0ZpbHRlclJvd0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNFY2hvRmlsdGVyQWxsU2VsZWN0ZWQoKTtcbiAgICBzd2l0Y2ggKHRoaXMuZWNob0ZpbHRlclRhYikge1xuICAgICAgY2FzZSAnc3RhdHVzJzogdGhpcy5vbkVjaG9TdGF0dXNDaGFuZ2UoKTsgYnJlYWs7XG4gICAgICBjYXNlICdjb3VudHJ5JzogdGhpcy5vbkVjaG9Db3VudHJ5Q2hhbmdlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAncmVnaW9uJzogdGhpcy5vbkVjaG9SZWdpb25DaGFuZ2UoKTsgYnJlYWs7XG4gICAgICBjYXNlICdjbHVzdGVycyc6IHRoaXMub25FY2hvQ2x1c3RlckNoYW5nZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd250aW1lJzogdGhpcy5vbkVjaG9Eb3dudGltZUNoYW5nZSgpOyBicmVhaztcbiAgICAgIC8vICdzdG9yZXMnIGlzIHRlcm1pbmFsIOKAlCBubyBkb3duc3RyZWFtIGRlcGVuZGVuY3lcbiAgICB9XG4gIH1cblxuICBlY2hvRmlsdGVyUmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5lY2hvRmlsdGVyU3RhdHVzLmZvckVhY2gocyA9PiBzLmNoZWNrZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5lY2hvRmlsdGVyQ291bnRyaWVzLmZvckVhY2goYyA9PiBjLmNoZWNrZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5lY2hvRmlsdGVyUmVnaW9ucy5mb3JFYWNoKHIgPT4gci5jaGVja2VkID0gZmFsc2UpO1xuICAgIHRoaXMuZWNob0ZpbHRlckNsdXN0ZXJzLmZvckVhY2goYyA9PiBjLmNoZWNrZWQgPSBmYWxzZSk7XG4gICAgdGhpcy5lY2hvRmlsdGVyU3RvcmVzLmZvckVhY2gocyA9PiBzLmNoZWNrZWQgPSB0cnVlKTtcbiAgICB0aGlzLmVjaG9GaWx0ZXJEb3dudGltZU9wdGlvbnMuZm9yRWFjaChkID0+IGQuY2hlY2tlZCA9IGZhbHNlKTtcbiAgICB0aGlzLnJlYnVpbGRFY2hvRmlsdGVyUm93cygpO1xuICAgIHRoaXMuc3luY0VjaG9GaWx0ZXJBbGxTZWxlY3RlZCgpO1xuICB9XG5cbiAgZWNob0ZpbHRlckFwcGx5KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKTtcbiAgICAgIGNvbnN0IGhmOiBhbnkgPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiB7fTtcbiAgICAgIGhmLmNvdW50cnkgPSB0aGlzLmVjaG9GaWx0ZXJDb3VudHJpZXMubWFwKGMgPT4gKHsgY291bnRyeTogYy5jb3VudHJ5LCBjaGVja2VkOiBjLmNoZWNrZWQgfSkpO1xuICAgICAgaGYubG9jYXRpb24gPSB0aGlzLmVjaG9GaWx0ZXJSZWdpb25zLm1hcChyID0+ICh7IGNpdHk6IHIuY2l0eSwgY2hlY2tlZDogci5jaGVja2VkIH0pKTtcbiAgICAgIGhmLmdyb3VwID0gdGhpcy5lY2hvRmlsdGVyQ2x1c3RlcnMubWFwKGMgPT4gKHsgZ3JvdXBOYW1lOiBjLmdyb3VwTmFtZSwgY2hlY2tlZDogYy5jaGVja2VkIH0pKTtcbiAgICAgIGhmLnN0b3JlcyA9IHRoaXMuZWNob0ZpbHRlclN0b3Jlcy5tYXAocyA9PiAoeyBzdG9yZUlkOiBzLnN0b3JlSWQsIHN0b3JlTmFtZTogcy5zdG9yZU5hbWUsIGNoZWNrZWQ6IHMuY2hlY2tlZCB9KSk7XG4gICAgICAvLyBVc2UgdGhlIHNoYXJlZCBrZXlzIChgc3RhdHVzYCwgYGRvd250aW1lYCkgc28gbG9jYWxTdG9yYWdlIHN0YXRlIHN0YXlzXG4gICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIGdsb2JhbCB0cmFmZmljLWhlYWRlci5cbiAgICAgIGNvbnN0IGNoZWNrZWRTdGF0dXMgPSB0aGlzLmVjaG9GaWx0ZXJTdGF0dXMuZmlsdGVyKHMgPT4gcy5jaGVja2VkKS5tYXAocyA9PiBzLmxhYmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaGYuc3RhdHVzID0gY2hlY2tlZFN0YXR1cy5sZW5ndGggPyBjaGVja2VkU3RhdHVzIDogWydhY3RpdmUnXTtcbiAgICAgIGhmLmRvd250aW1lID0gdGhpcy5lY2hvRmlsdGVyRG93bnRpbWVPcHRpb25zLmZpbHRlcihkID0+IGQuY2hlY2tlZCkubWFwKGQgPT4gZC52YWx1ZSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeShoZikpO1xuICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KGhmKTtcbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICB0aGlzLmNsb3NlRWNob0ZpbHRlcigpO1xuICAgIC8vIFJlZnJlc2ggZGF0YSBiYXNlZCBvbiBuZXcgc2VsZWN0aW9uc1xuICAgIHRoaXMuc3RvcmVJZHMgPSB0aGlzLmVjaG9GaWx0ZXJTdG9yZXMuZmlsdGVyKHMgPT4gcy5jaGVja2VkKS5tYXAocyA9PiBzLnN0b3JlSWQpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcycgJiYgdGhpcy5kZXRhaWxWaWV3KSB7XG4gICAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgT1ZFUkFMTF9UUkFOU0NSSVBUU19WSUVXID0gJ292ZXJhbGwtdHJhbnNjcmlwdHMnO1xuICBwcml2YXRlIHJlYWRvbmx5IE9WRVJBTExfVFJBTlNDUklQVFNfQk9EWV9DTEFTUyA9ICdlY2hvLW92ZXJhbGwtdHJhbnNjcmlwdHMnO1xuXG4gIGdldCBpc1ZpZXdPdmVyYWxsVHJhbnNjcmlwdHMoKTogYm9vbGVhbiB7XG4gICAgLy8gVVJMIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggc28gZGlyZWN0IGxvYWRzIC8gcmVmcmVzaCBvblxuICAgIC8vID92aWV3PW92ZXJhbGwtdHJhbnNjcmlwdHMgd29yayBldmVuIGJlZm9yZSBjb2hvcnQgc3RhdGUgcmVzdG9yZXMuXG4gICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3ZpZXcnKSA9PT0gdGhpcy5PVkVSQUxMX1RSQU5TQ1JJUFRTX1ZJRVcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnXG4gICAgICAmJiB0aGlzLmRldGFpbFZpZXdcbiAgICAgICYmIHRoaXMuaXNPdmVyYWxsVHJhbnNjcmlwdHNDb2hvcnQ7XG4gIH1cblxuICBwcml2YXRlIHN5bmNPdmVyYWxsVHJhbnNjcmlwdHNRdWVyeVBhcmFtKCk6IHZvaWQge1xuICAgIC8vIERlcml2ZWQgXCJzaG91bGQgYmUgYWN0aXZlXCIgZnJvbSBjb21wb25lbnQgc3RhdGVcbiAgICBjb25zdCBkZXJpdmVkID0gdGhpcy5jdXJyZW50UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnICYmIHRoaXMuZGV0YWlsVmlldyAmJiB0aGlzLmlzT3ZlcmFsbFRyYW5zY3JpcHRzQ29ob3J0O1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCd2aWV3Jyk7XG4gICAgY29uc3QgdXJsU2F5cyA9IGN1cnJlbnQgPT09IHRoaXMuT1ZFUkFMTF9UUkFOU0NSSVBUU19WSUVXO1xuICAgIC8vIEJvZHkgY2xhc3MgaXMgT04gaWYgRUlUSEVSIFVSTCBvciBkZXJpdmVkIHN0YXRlIHNheXMgc28gKGNvdmVycyB0aGVcbiAgICAvLyBicmllZiB3aW5kb3cgZHVyaW5nIGluaXRpYWwgcmVzdG9yZSB3aGVyZSBzdGF0ZSBoYXNuJ3QgY2F1Z2h0IHVwIHlldCkuXG4gICAgY29uc3QgYWN0aXZlID0gZGVyaXZlZCB8fCB1cmxTYXlzO1xuICAgIC8vIFVSTCBtdXN0IHJlZmxlY3QgY3VycmVudCBjb21wb25lbnQgc3RhdGUuIERvbid0IHVzZSB1cmxTYXlzIGFzIGFcbiAgICAvLyBmYWxsYmFjayBoZXJlIOKAlCB0aGF0IG1ha2VzIHRoZSBwYXJhbSBzdGlja3kgd2hlbiB0aGUgdXNlciBuYXZpZ2F0ZXNcbiAgICAvLyBmcm9tIE92ZXJhbGwgVHJhbnNjcmlwdHMgdG8gYW5vdGhlciBjb2hvcnQuXG4gICAgY29uc3Qgd2FudCA9IGRlcml2ZWQgPyB0aGlzLk9WRVJBTExfVFJBTlNDUklQVFNfVklFVyA6IG51bGw7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKHRoaXMuT1ZFUkFMTF9UUkFOU0NSSVBUU19CT0RZX0NMQVNTKTtcbiAgICAgIHRoaXMuaW5pdEVjaG9EYXRlUmFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuT1ZFUkFMTF9UUkFOU0NSSVBUU19CT0RZX0NMQVNTKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQgPT09IHdhbnQpIHJldHVybjtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IHZpZXc6IHdhbnQgfSxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICByZXBsYWNlVXJsOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyAxLiBHZXQgdXNlciBpbmZvXG4gICAgaWYgKCd1c2VyLWluZm8nIGluIGxvY2FsU3RvcmFnZSkge1xuICAgICAgdGhpcy51c2VycyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xuICAgICAgdGhpcy5jbGllbnRJZCA9IHRoaXMudXNlcnM/LmNsaWVudElkIHx8ICcxMSc7XG4gICAgfVxuXG4gICAgLy8gMi4gUmVzdG9yZSBmaWx0ZXJzIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgaWYgKCdoZWFkZXItZmlsdGVycycgaW4gbG9jYWxTdG9yYWdlKSB7XG4gICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSB8fCAne30nKTtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJGaWx0ZXJzPy5jbGllbnQgfHwgdGhpcy5jbGllbnRJZDtcbiAgICAgIGlmIChoZWFkZXJGaWx0ZXJzPy5kYXRlPy5zdGFydERhdGUpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSBoZWFkZXJGaWx0ZXJzLmRhdGUuc3RhcnREYXRlO1xuICAgICAgICB0aGlzLmVuZERhdGUgPSBoZWFkZXJGaWx0ZXJzLmRhdGUuZW5kRGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkZXJGaWx0ZXJzPy5zdG9yZXM/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnN0b3JlSWRzID0gdGhpcy5leHRyYWN0Q2hlY2tlZFN0b3JlcyhoZWFkZXJGaWx0ZXJzLnN0b3Jlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMmIuIFJlc3RvcmUgZGV0YWlsIHZpZXcgc3RhdGUgKHN1cnZpdmVzIGNvbXBvbmVudCByZS1pbml0IG9uIGRhdGUgY2hhbmdlKVxuICAgIHRoaXMucmVzdG9yZURldGFpbFN0YXRlKCk7XG5cbiAgICAvLyAzLiBTdWJzY3JpYmUgdG8gcXVlcnkgcGFyYW1zIGZvciB0YWIgc3dpdGNoaW5nXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICBjb25zdCBwcmV2UGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICBjb25zdCB0YWIgPSBwYXJhbXNbJ3RhYiddO1xuICAgICAgaWYgKHRhYiA9PT0gJ2FuYWx5c2lzJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gJ2FnZW50YW5hbHlzaXMnO1xuICAgICAgfSBlbHNlIGlmICh0YWIgPT09ICdtYW5hZ2UnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnbWFuYWdlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnY29udmVyc2F0aW9ucyc7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBkZXRhaWwgc3RhdGUgd2hlbiBsZWF2aW5nIEFnZW50IEFuYWx5c2lzIHRhYlxuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09ICdhZ2VudGFuYWx5c2lzJyAmJiBwcmV2UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnKSB7XG4gICAgICAgIHRoaXMuZGV0YWlsVmlldyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSAnJztcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvaG9ydE5hbWUgPSAnJztcbiAgICAgICAgdGhpcy5jbGVhckRldGFpbFN0YXRlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNPdmVyYWxsVHJhbnNjcmlwdHNRdWVyeVBhcmFtKCk7XG4gICAgICAvLyBPbmx5IHJlbG9hZCBpZiB0YWIgYWN0dWFsbHkgY2hhbmdlZCAoc2tpcCBvbiBmaXJzdCBlbWl0IOKAlCBkYXRhUmFuZ2VWYWx1ZSBoYW5kbGVzIGl0KVxuICAgICAgaWYgKHByZXZQYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlICYmIHRoaXMuX2luaXREb25lKSB7XG4gICAgICAgIHRoaXMubG9hZEN1cnJlbnRUYWIoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIDQuIFN1YnNjcmliZSB0byBnbG9iYWwgdG9vbGJhciBjaGFuZ2VzIOKAlCB0aGlzIGlzIHRoZSBNQUlOIGRhdGEgdHJpZ2dlclxuICAgIC8vICAgIChzYW1lIHBhdHRlcm4gYXMgdHJhbnNjcmlwdC1saXN0IGFuZCBhdWRpby1wYWdlKVxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICB0aGlzLmhlYWRlckRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50IHx8IHRoaXMuY2xpZW50SWQ7XG4gICAgICAgIGlmIChkYXRhPy5kYXRlPy5zdGFydERhdGUpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGRhdGEuZGF0ZS5zdGFydERhdGU7XG4gICAgICAgICAgdGhpcy5lbmREYXRlID0gZGF0YS5kYXRlLmVuZERhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGE/LnN0b3Jlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZUlkcyA9IHRoaXMuZXh0cmFjdENoZWNrZWRTdG9yZXMoZGF0YS5zdG9yZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGZXRjaCBkYXRhIGZvciBjdXJyZW50IHRhYlxuICAgICAgdGhpcy5sb2FkQ3VycmVudFRhYigpO1xuICAgICAgdGhpcy5faW5pdERvbmUgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuT1ZFUkFMTF9UUkFOU0NSSVBUU19CT0RZX0NMQVNTKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBsb2FkQ3VycmVudFRhYigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ2NvbnZlcnNhdGlvbnMnKSB7XG4gICAgICB0aGlzLmNvbnZQYWdlID0gMTtcbiAgICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gICAgICB0aGlzLmZldGNoQ29ob3J0U3VtbWFyeUNhcmQoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdhZ2VudGFuYWx5c2lzJykge1xuICAgICAgdGhpcy5sb2FkQ29ob3J0TGlzdCgpO1xuICAgICAgaWYgKHRoaXMuZGV0YWlsVmlldykge1xuICAgICAgICB0aGlzLmZldGNoQ29ob3J0U3VtbWFyeUNhcmQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdtYW5hZ2UnKSB7XG4gICAgICB0aGlzLm1hbmFnZVBhZ2UgPSAxO1xuICAgICAgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBNYXBwaW5nIChzYW1lIGFzIHRyYW5zY3JpcHQtbGlzdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgbWFwQ29udmVyc2F0aW9uKGl0ZW06IGFueSk6IGFueSB7XG4gICAgY29uc3QgcmF3VGltZSA9IGl0ZW0uVGltZXN0YW1wIHx8IGl0ZW0udGltZSB8fCAnJztcbiAgICBjb25zdCByYXdEdXJhdGlvbiA9IGl0ZW0uRHVyYXRpb24gfHwgaXRlbS5kdXJhdGlvbiB8fCAnJztcbiAgICBjb25zdCByYXdEZXNjID0gaXRlbS5TdW1tYXJ5IHx8IGl0ZW0uYXVkaW9EZXNjcmlwdGlvbiB8fCBpdGVtLnN1bW1hcnkgfHwgaXRlbS5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkgfHwgJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGlvSWQ6IGl0ZW0uZG9jX2lkIHx8IGl0ZW0uYXVkaW9JZCB8fCBpdGVtLl9pZCB8fCAnJyxcbiAgICAgIHN0b3JlSWQ6IGl0ZW0uc3RvcmVJZCB8fCAnJyxcbiAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUgfHwgJycsXG4gICAgICB1c2VyTmFtZTogaXRlbS5zdGFmZiB8fCBpdGVtLnN0YWZmSWQgfHwgaXRlbS51c2VyTmFtZSB8fCBpdGVtLnN0YWZmTmFtZSB8fCAnJyxcbiAgICAgIGxvY2F0aW9uOiBpdGVtLmxvY2F0aW9uIHx8IGl0ZW0uc3RhdGUgfHwgJycsXG4gICAgICBkYXRlOiBpdGVtLmRhdGUgfHwgJycsXG4gICAgICB0aW1lOiB0aGlzLmZvcm1hdFRpbWUocmF3VGltZSksXG4gICAgICBkdXJhdGlvbjogdGhpcy5mb3JtYXREdXJhdGlvbihyYXdEdXJhdGlvbiksXG4gICAgICBhdWRpb0Rlc2NyaXB0aW9uOiB0aGlzLmNsZWFuVHJhbnNjcmlwdGlvbihyYXdEZXNjKSxcbiAgICAgIGF1ZGlvVXJsOiBpdGVtLmF1ZGlvVXJsIHx8IGl0ZW0uYXVkaW9fdXJsIHx8ICcnLFxuICAgICAgY29udmVyc2F0aW9uRGV0YWlsczogaXRlbS5jb252ZXJzYXRpb25EZXRhaWxzIHx8IHsgYXVkaW9TdW1tYXJ5OiAnJywgdHJhbnNjcmlwdGlvbjogJycgfSxcbiAgICAgIG1ldHJpY3M6IHRoaXMucGFyc2VNZXRyaWNzKGl0ZW0ubWV0cmljcyksXG4gICAgICBhaUluc2lnaHRzOiBpdGVtLmFpSW5zaWdodHMgfHwgeyB0aXRsZTogJ0FJIEluc2lnaHRzJywgc3VtbWFyeTogW10gfSxcbiAgICAgIF9kZXRhaWxMb2FkZWQ6ICEhKGl0ZW0uYWlJbnNpZ2h0cyB8fCBpdGVtLmNvbnZlcnNhdGlvbkRldGFpbHMpLFxuICAgICAgX2RldGFpbExvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvLyBQYXJzZSBtZXRyaWNzIGZyb20gQVBJIHJlc3BvbnNlIChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gIHByaXZhdGUgcGFyc2VNZXRyaWNzKHJhdzogYW55KTogYW55W10ge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIHJhdztcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyYXcpXG4gICAgICAuZmlsdGVyKChzZWN0aW9uOiBhbnkpID0+IHNlY3Rpb24gJiYgdHlwZW9mIHNlY3Rpb24gPT09ICdvYmplY3QnICYmIHNlY3Rpb24udHlwZSlcbiAgICAgIC5tYXAoKHNlY3Rpb246IGFueSkgPT4gKHtcbiAgICAgICAgbmFtZTogc2VjdGlvbi5uYW1lIHx8ICcnLFxuICAgICAgICB0eXBlOiBzZWN0aW9uLnR5cGUgfHwgJycsXG4gICAgICAgIHZhbHVlOiBzZWN0aW9uLnZhbHVlIHx8IFtdXG4gICAgICB9KSk7XG4gIH1cblxuICAvLyBMb2FkIGNvbnZlcnNhdGlvbiBkZXRhaWwgb24gZXhwYW5kIChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gIGxvYWRDb252RGV0YWlsKGNvbnY6IGFueSk6IHZvaWQge1xuICAgIGlmICgoY29udi5fZGV0YWlsTG9hZGVkICYmIGNvbnYuYXVkaW9VcmwpIHx8IGNvbnYuX2RldGFpbExvYWRpbmcpIHJldHVybjtcbiAgICBjb252Ll9kZXRhaWxMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkID0geyBjb2hvcnRJZDogdGhpcy5zZWxlY3RlZENvaG9ydElkID8gW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0gOiBbXSwgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfTtcbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb252ZXJzYXRpb25EZXRhaWwoY29udi5hdWRpb0lkLCBwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSByZXM/LmRhdGE7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IHJhdz8uYXVkaW9JZCA/IHJhdyA6IChyYXc/LmRhdGE/LmF1ZGlvSWQgPyByYXcuZGF0YSA6IChyYXcgfHwge30pKTtcbiAgICAgICAgaWYgKGRldGFpbC5tZXRyaWNzKSBjb252Lm1ldHJpY3MgPSB0aGlzLnBhcnNlTWV0cmljcyhkZXRhaWwubWV0cmljcyk7XG4gICAgICAgIGlmIChkZXRhaWwuYWlJbnNpZ2h0cz8uc3VtbWFyeT8ubGVuZ3RoKSBjb252LmFpSW5zaWdodHMgPSBkZXRhaWwuYWlJbnNpZ2h0cztcbiAgICAgICAgaWYgKGRldGFpbC5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkpIGNvbnYuY29udmVyc2F0aW9uRGV0YWlscyA9IGRldGFpbC5jb252ZXJzYXRpb25EZXRhaWxzO1xuICAgICAgICBpZiAoZGV0YWlsLmF1ZGlvVXJsIHx8IGRldGFpbC5hdWRpb191cmwpIGNvbnYuYXVkaW9VcmwgPSBkZXRhaWwuYXVkaW9VcmwgfHwgZGV0YWlsLmF1ZGlvX3VybDtcbiAgICAgICAgY29udi5fZGV0YWlsTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgY29udi5fZGV0YWlsTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IGNvbnYuX2RldGFpbExvYWRpbmcgPSBmYWxzZTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gXCJTdGFmZjpcIiwgXCJDdXN0b21lcjpcIiBwcmVmaXhlcyBmcm9tIHRyYW5zY3JpcHRpb24gdGV4dFxuICBjbGVhblRyYW5zY3JpcHRpb24odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoL1xcW1xcZHsyfTpcXGR7Mn1cXHMqLT5cXHMqXFxkezJ9OlxcZHsyfVxcXVxccyovZywgJycpXG4gICAgICAucmVwbGFjZSgvXFxiKFN0YWZmfEN1c3RvbWVyKVxccyo6XFxzKi9naSwgJycpO1xuICB9XG5cbiAgLy8gRm9ybWF0IGR1cmF0aW9uIGZyb20gc2Vjb25kcyAoZS5nLiA1MTQg4oaSIFwiOG0gMTRzXCIpXG4gIHByaXZhdGUgZm9ybWF0RHVyYXRpb24odmFsOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghdmFsKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdG90YWxTZWMgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgaWYgKGlzTmFOKHRvdGFsU2VjKSkgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcih0b3RhbFNlYyAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcih0b3RhbFNlYyAlIDYwKTtcbiAgICByZXR1cm4gc2VjcyA+IDAgPyBgJHttaW5zfW0gJHtzZWNzfXNgIDogYCR7bWluc31tYDtcbiAgfVxuXG4gIC8vIEZvcm1hdCB0aW1lIGZyb20gSVNPIHN0cmluZyAoZS5nLiBcIjIwMjYtMDQtMDhUMjI6MDA6NDIuOTcyNzg5KzA1OjMwXCIg4oaSIFwiMTA6MDAgUE1cIilcbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiB2YWw7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywgeyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBob3VyMTI6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGV4dHJhY3RDaGVja2VkU3RvcmVzKHN0b3JlczogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgLy8gRmlsdGVyIG9ubHkgY2hlY2tlZCBzdG9yZXMsIHRoZW4gZXh0cmFjdCBzdG9yZUlkXG4gICAgY29uc3QgY2hlY2tlZCA9IHN0b3Jlcy5maWx0ZXIoKHM6IGFueSkgPT4gcy5jaGVja2VkICE9PSBmYWxzZSk7XG4gICAgcmV0dXJuIGNoZWNrZWQubWFwKChzOiBhbnkpID0+IHMuX2lkIHx8IHMuc3RvcmVJZCB8fCBzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RvcmVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlSWRzLmxlbmd0aCA+IDAgPyB0aGlzLnN0b3JlSWRzIDogdGhpcy5kZWZhdWx0U3RvcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydERhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydERhdGUgfHwgJzIwMjYtMDQtMDgnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZW5kRGF0ZSB8fCAnMjAyNi0wNC0wOCc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQmFzZVBheWxvYWQoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXSxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZ2V0U3RvcmVJZHMoKSxcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5nZXRTdGFydERhdGUoKSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZ2V0RW5kRGF0ZSgpLFxuICAgICAgaXNBSTogZmFsc2UsXG4gICAgICBhbmFseXRpY3NUeXBlOiAnYXVkaW8nLFxuICAgICAgaXNFeHBvcnQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBDT05WRVJTQVRJT05TIFRBQiAodXNlcyB0cmFuc2NyaXB0c0xpc3QgQVBJKVxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgZmV0Y2hDb252ZXJzYXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuY29udkxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIC4uLnRoaXMuYnVpbGRCYXNlUGF5bG9hZCgpLFxuICAgICAgaXNBSTogZmFsc2UsXG4gICAgICBhbmFseXRpY3NUeXBlOiAndHJhbnNjcmlwdCcsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5jb252U2VhcmNoUXVlcnkgfHwgJycsXG4gICAgICBsaW1pdDogdGhpcy5jb252UGVyUGFnZSxcbiAgICAgIF9pZDogW10sXG4gICAgICBvZmZzZXQ6IHRoaXMuY29udlBhZ2UgLSAxXG4gICAgfTtcbiAgICBpZiAodGhpcy5pc092ZXJhbGxUcmFuc2NyaXB0c0NvaG9ydCAmJiB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UpIHtcbiAgICAgIHBheWxvYWQuYXVkaW9Tb3VyY2UgPSB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hdWRpb1NlcnZpY2UudHJhbnNjcmlwdHNMaXN0KHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhPy5kYXRhIHx8IGRhdGE/LmNvbnZlcnNhdGlvbnMgfHwgW107XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9ucyA9IGxpc3QubWFwKChpdGVtOiBhbnkpID0+IHRoaXMubWFwQ29udmVyc2F0aW9uKGl0ZW0pKTtcbiAgICAgICAgdGhpcy5jb252VG90YWwgPSBkYXRhPy5jb3VudCA/PyBkYXRhPy5wYWdpbmF0aW9uPy50b3RhbCA/PyB0aGlzLmNvbnZlcnNhdGlvbnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmNvbnZUb3RhbFBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuY29udlRvdGFsIC8gdGhpcy5jb252UGVyUGFnZSkpO1xuICAgICAgICB0aGlzLmNvbnZQYWdpbmF0aW9uU2l6ZXMgPSB0aGlzLmNvbnZUb3RhbCA+IDEwID8gWzEwLCAyMCwgNTAsIDEwMF0gOiBbdGhpcy5jb252VG90YWwgfHwgMTBdO1xuICAgICAgICB0aGlzLmNvbnZQZXJQYWdlID0gdGhpcy5jb252UGFnaW5hdGlvblNpemVzLmluY2x1ZGVzKHRoaXMuY29udlBlclBhZ2UpID8gdGhpcy5jb252UGVyUGFnZSA6IHRoaXMuY29udlBhZ2luYXRpb25TaXplc1swXTtcbiAgICAgICAgLy8gQXV0by1leHBhbmQgZmlyc3RcbiAgICAgICAgaWYgKHRoaXMuY29udmVyc2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5leHBhbmRlZENvbnZJZHMgPSB7IFt0aGlzLmNvbnZlcnNhdGlvbnNbMF0uYXVkaW9JZF06IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnZMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25zID0gW107XG4gICAgICAgIHRoaXMuY29udlRvdGFsID0gMDtcbiAgICAgICAgdGhpcy5jb252VG90YWxQYWdlcyA9IDE7XG4gICAgICAgIHRoaXMuY29udkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoQ29ob3J0U3VtbWFyeUNhcmQoKTogdm9pZCB7XG4gICAgY29uc3QgY29ob3J0SWQgPSB0aGlzLnNlbGVjdGVkQ29ob3J0SWRcbiAgICAgID8gW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF1cbiAgICAgIDogKHRoaXMuaGVhZGVyRGF0YT8uY29ob3J0XG4gICAgICAgICAgPyAoQXJyYXkuaXNBcnJheSh0aGlzLmhlYWRlckRhdGEuY29ob3J0KSA/IHRoaXMuaGVhZGVyRGF0YS5jb2hvcnQgOiBbdGhpcy5oZWFkZXJEYXRhLmNvaG9ydF0pXG4gICAgICAgICAgOiBbXSk7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgc3RhcnREYXRlOiB0aGlzLmdldFN0YXJ0RGF0ZSgpLFxuICAgICAgZW5kRGF0ZTogdGhpcy5nZXRFbmREYXRlKCksXG4gICAgICBzdG9yZUlkOiB0aGlzLmdldFN0b3JlSWRzKCksXG4gICAgICBjbGllbnRJZDogW3RoaXMuY2xpZW50SWRdLFxuICAgICAgY29ob3J0SWRcbiAgICB9O1xuXG4gICAgdGhpcy5pc0xvYWRpbmdDb2hvcnRTdW1tYXJ5ID0gdHJ1ZTtcbiAgICB0aGlzLmNvaG9ydFN1bW1hcnlDYXJkID0gbnVsbDtcbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb2hvcnRTdW1tYXJ5Q2FyZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhID8/IHJlcyA/PyBudWxsO1xuICAgICAgICB0aGlzLmNvaG9ydFN1bW1hcnlDYXJkID0gZGF0YTtcblxuICAgICAgICBjb25zdCByYXcgPSBBcnJheS5pc0FycmF5KGRhdGEpXG4gICAgICAgICAgPyBkYXRhXG4gICAgICAgICAgOiAoZGF0YT8uYXVkaW9Tb3VyY2UgPz8gZGF0YT8uYXVkaW9Tb3VyY2VzID8/IGRhdGE/LmZpbHRlcnM/LmF1ZGlvU291cmNlID8/IG51bGwpO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5idWlsZEF1ZGlvU291cmNlT3B0aW9ucyhyYXcpO1xuICAgICAgICBpZiAob3B0cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmF1ZGlvU291cmNlT3B0aW9ucyA9IG9wdHM7XG4gICAgICAgICAgaWYgKCFvcHRzLnNvbWUobyA9PiBvLnZhbHVlID09PSB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UgPSBvcHRzWzBdLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nQ29ob3J0U3VtbWFyeSA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ob3J0U3VtbWFyeUNhcmQgPSBudWxsO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ0NvaG9ydFN1bW1hcnkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29udlBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb252UGFnZSA9IHBhZ2U7XG4gICAgdGhpcy5mZXRjaENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIG9uQ29udlBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udlBlclBhZ2UgPSBwYXJzZUludChzaXplKTtcbiAgICB0aGlzLmNvbnZQYWdlID0gMTtcbiAgICB0aGlzLmZldGNoQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgdG9nZ2xlQ29udkV4cGFuZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhwYW5kZWRDb252SWRzW2lkXSkge1xuICAgICAgdGhpcy5leHBhbmRlZENvbnZJZHMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbmRlZENvbnZJZHMgPSB7IFtpZF06IHRydWUgfTtcbiAgICB9XG4gIH1cblxuICBnZXRDb252SWQoY29udjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29udj8uZG9jX2lkIHx8IGNvbnY/LmF1ZGlvSWQgfHwgY29udj8uX2lkIHx8ICcnO1xuICB9XG5cbiAgZ2V0Q29udlRhYihjb252SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29udlRhYnNbY29udklkXSB8fCAnc3VtbWFyeSc7XG4gIH1cblxuICBzZXRDb252VGFiKGNvbnZJZDogc3RyaW5nLCB0YWI6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jb252VGFic1tjb252SWRdID0gdGFiO1xuICB9XG5cbiAgLy8gQUkgU2VhcmNoXG4gIHNlbmRDb252UXVlcnkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnZTZWFyY2hRdWVyeS50cmltKCkpIHJldHVybjtcbiAgICB0aGlzLmNvbnZBaUxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY29udkFpUmVwbHkgPSAnJztcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICB1c2VyX2lkOiB0aGlzLnVzZXJzPy5lbWFpbCB8fCAndXNlcicsXG4gICAgICBzZXNzaW9uX2lkOiBgRUNIT18ke0RhdGUubm93KCl9YCxcbiAgICAgIHNlc3Npb25fZGF0ZTogdGhpcy5zdGFydERhdGUsXG4gICAgICBzZXNzaW9uX3RpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gICAgICBtZXNzYWdlOiB0aGlzLmNvbnZTZWFyY2hRdWVyeSxcbiAgICAgIGFuYWx5dGljc1R5cGU6ICd0cmFuc2NyaXB0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBzZWxlY3RlZF9zdG9yZXM6IHRoaXMuZ2V0U3RvcmVJZHMoKSxcbiAgICAgICAgZGF0ZV9yYW5nZTogeyBzdGFydDogdGhpcy5zdGFydERhdGUsIGVuZDogdGhpcy5lbmREYXRlIH0sXG4gICAgICAgIHNlbGVjdGVkX3Byb2R1Y3RzOiBbJ0F1ZGlvJ11cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5hdWRpb1NlcnZpY2UuY2hhdFN0cmVhbShwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnZBaVJlcGx5ID0gdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycgPyByZXMgOiAocmVzPy5kYXRhPy5tYXAoKGQ6IGFueSkgPT4gZC50ZXh0KS5qb2luKCcnKSB8fCAnTm8gcmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5jb252QWlMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb252QWlSZXBseSA9ICdVbmFibGUgdG8gcHJvY2VzcyB5b3VyIHF1ZXJ5LiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgIHRoaXMuY29udkFpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY29udlNlYXJjaFF1ZXJ5ID0gJyc7XG4gIH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gQUdFTlQgQU5BTFlTSVMgVEFCICh1c2VzIGNvaG9ydCBBUElzKVxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgbG9hZENvaG9ydExpc3QoKTogdm9pZCB7XG4gICAgdGhpcy5hdWRpb1NlcnZpY2UubGlzdENvaG9ydHModGhpcy5jbGllbnRJZCwgMTAwLCAwKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvaG9ydExpc3QgPSByZXM/LmRhdGE/LmNvaG9ydHMgfHwgW107XG4gICAgICAgIC8vIElmIGEgY29ob3J0IHdhcyBhbHJlYWR5IHNlbGVjdGVkIChlLmcuIGZyb20gZHJvcGRvd24pLCBsb2FkIGl0cyBkYXRhXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29ob3J0SWQpIHtcbiAgICAgICAgICB0aGlzLmZldGNoQ29ob3J0Q2FyZHMoKTtcbiAgICAgICAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5jb2hvcnRMaXN0ID0gW107IH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNlbGVjdCBjb2hvcnQgZnJvbSBvdmVydmlldyBjYXJkIGNsaWNrXG4gIHNlbGVjdENvaG9ydERldGFpbChjb2hvcnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9IGNvaG9ydC5jb2hvcnRJZCB8fCBjb2hvcnQuaWQgfHwgY29ob3J0Ll9pZCB8fCAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9IGNvaG9ydC5jb2hvcnROYW1lIHx8IGNvaG9ydC5uYW1lIHx8ICcnO1xuICAgIHRoaXMuZGV0YWlsVmlldyA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZENhcmRJZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRDYXJkTmFtZSA9ICcnO1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgdGhpcy5hdWRpb1NvdXJjZU9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkQXVkaW9Tb3VyY2UgPSAnJztcbiAgICB0aGlzLnNhdmVEZXRhaWxTdGF0ZSgpO1xuICAgIHRoaXMuZmV0Y2hDb2hvcnRDYXJkcygpO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgaWYgKHRoaXMuaXNPdmVyYWxsVHJhbnNjcmlwdHNDb2hvcnQpIHtcbiAgICAgIHRoaXMuZmV0Y2hDb2hvcnRTdW1tYXJ5Q2FyZCgpO1xuICAgIH1cbiAgICB0aGlzLnN5bmNPdmVyYWxsVHJhbnNjcmlwdHNRdWVyeVBhcmFtKCk7XG4gIH1cblxuICBvbkRldGFpbFNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBjbGVhckRldGFpbFNlYXJjaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGV0YWlsU2VhcmNoVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmRldGFpbFNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgYmFja1RvT3ZlcnZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxWaWV3ID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydElkID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydE5hbWUgPSAnJztcbiAgICB0aGlzLmNvaG9ydENhcmRzID0gW107XG4gICAgdGhpcy5kZXRhaWxQYWdlQ29udnMgPSBbXTtcbiAgICB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmNsZWFyRGV0YWlsU3RhdGUoKTtcbiAgICB0aGlzLnN5bmNPdmVyYWxsVHJhbnNjcmlwdHNRdWVyeVBhcmFtKCk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyc2lzdCBkZXRhaWwgdmlldyBzdGF0ZSBhY3Jvc3MgY29tcG9uZW50IHJlLWluaXQgKGRhdGUgY2hhbmdlKSDilIDilIBcbiAgcHJpdmF0ZSBzYXZlRGV0YWlsU3RhdGUoKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWNoby1kZXRhaWwnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkZXRhaWxWaWV3OiB0aGlzLmRldGFpbFZpZXcsXG4gICAgICBjb2hvcnRJZDogdGhpcy5zZWxlY3RlZENvaG9ydElkLFxuICAgICAgY29ob3J0TmFtZTogdGhpcy5zZWxlY3RlZENvaG9ydE5hbWVcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVEZXRhaWxTdGF0ZSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZWNoby1kZXRhaWwnKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm47XG4gICAgICBjb25zdCBzdGF0ZSA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGlmIChzdGF0ZT8uZGV0YWlsVmlldyAmJiBzdGF0ZT8uY29ob3J0SWQpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxWaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvaG9ydElkID0gc3RhdGUuY29ob3J0SWQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lID0gc3RhdGUuY29ob3J0TmFtZSB8fCAnJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckRldGFpbFN0YXRlKCk6IHZvaWQge1xuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VjaG8tZGV0YWlsJyk7XG4gIH1cblxuICAvLyBDaGFuZ2UgY29ob3J0IGZyb20gZHJvcGRvd25cbiAgb25Db2hvcnREcm9wZG93bkNoYW5nZShjb2hvcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydElkID0gY29ob3J0SWQ7XG4gICAgY29uc3QgY29ob3J0ID0gdGhpcy5jb2hvcnRMaXN0LmZpbmQoKGM6IGFueSkgPT4gKGMuY29ob3J0SWQgfHwgYy5pZCB8fCBjLl9pZCkgPT09IGNvaG9ydElkKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9IGNvaG9ydD8uY29ob3J0TmFtZSB8fCBjb2hvcnQ/Lm5hbWUgfHwgJyc7XG4gICAgdGhpcy5kZXRhaWxWaWV3ID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZElkID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZENhcmROYW1lID0gJyc7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICB0aGlzLnNhdmVEZXRhaWxTdGF0ZSgpO1xuICAgIHRoaXMuYXVkaW9Tb3VyY2VPcHRpb25zID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlID0gJyc7XG4gICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgICBpZiAodGhpcy5pc092ZXJhbGxUcmFuc2NyaXB0c0NvaG9ydCkge1xuICAgICAgdGhpcy5mZXRjaENvaG9ydFN1bW1hcnlDYXJkKCk7XG4gICAgfVxuICAgIHRoaXMuc3luY092ZXJhbGxUcmFuc2NyaXB0c1F1ZXJ5UGFyYW0oKTtcbiAgfVxuXG4gIGZldGNoQ29ob3J0Q2FyZHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29ob3J0SWQpIHJldHVybjtcbiAgICB0aGlzLmNhcmRzTG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgLi4udGhpcy5idWlsZEJhc2VQYXlsb2FkKCksXG4gICAgICBjb2hvcnRUeXBlOiB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPT09ICdPdmVyYWxsX3RyYW5zY3JpcHRzX3YyJyA/IFtdIDogW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF1cbiAgICB9O1xuICAgIGlmICh0aGlzLmlzT3ZlcmFsbFRyYW5zY3JpcHRzQ29ob3J0ICYmIHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZSkge1xuICAgICAgcGF5bG9hZC5hdWRpb1NvdXJjZSA9IHRoaXMuc2VsZWN0ZWRBdWRpb1NvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb2hvcnRBbmFseXNpc0NhcmQocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb2hvcnRDYXJkcyA9IHRoaXMucGFyc2VDb2hvcnRBbmFseXNpcyhyZXM/LmRhdGE/LmNvaG9ydEFuYWx5c2lzIHx8IHt9KTtcbiAgICAgICAgdGhpcy5jYXJkc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvaG9ydENhcmRzID0gW107XG4gICAgICAgIHRoaXMuY2FyZHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBQYXJzZSBjb2hvcnQgYW5hbHlzaXMgKHNhbWUgYXMgYXVkaW8tcGFnZSlcbiAgcGFyc2VDb2hvcnRBbmFseXNpcyhhbmFseXNpczogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGNhcmRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IG51bWVyaWNSb3dzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHNraXBLZXlzID0gbmV3IFNldChbJ3RvdGFsQXVkaW9BdmFpbGFibGUnLCAnY29ob3J0VHlwZScsICdkYXRlUmFuZ2UnLCAndW5pcXVlUGl0Y2hlcyddKTtcbiAgICB0aGlzLnRvdGFsQXVkaW8gPSBhbmFseXNpcy50b3RhbEF1ZGlvQXZhaWxhYmxlIHx8IDA7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhbmFseXNpcykpIHtcbiAgICAgIGlmIChza2lwS2V5cy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBjb25zdCBzZWN0aW9uID0gYW5hbHlzaXNba2V5XTtcbiAgICAgIGlmICghc2VjdGlvbiB8fCB0eXBlb2Ygc2VjdGlvbiAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB2YWx1ZXM6IGFueVtdID0gc2VjdGlvbi52YWx1ZSB8fCBbXTtcbiAgICAgIGNvbnN0IHR5cGUgPSBzZWN0aW9uLnR5cGU7XG4gICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBDb21tb24gZmllbGRzIGZyb20gc2VjdGlvblxuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzZWN0aW9uLmNvbXB1dGF0aW9uX25vdGUgfHwgc2VjdGlvbi5jb21wdXRhdGlvbk5vdGUgfHwgc2VjdGlvbi5kZXNjcmlwdGlvbiB8fCBzZWN0aW9uLmRlc2MgfHwgJyc7XG4gICAgICBjb25zdCBzaG9ydERlc2NyaXB0aW9uID0gc2VjdGlvbi5zaG9ydERlc2NyaXB0aW9uIHx8IHNlY3Rpb24uc2hvcnRfZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgICBjb25zdCBzdGF0dXMgPSBzZWN0aW9uLnN0YXR1cyB8fCBzZWN0aW9uLnNlbnRpbWVudCB8fCAnJztcbiAgICAgIGNvbnN0IGFwcGxpY2FibGVDb3VudCA9IHNlY3Rpb24uYXBwbGljYWJsZV9jb3VudCA/PyBzZWN0aW9uLmFwcGxpY2FibGVDb3VudCA/PyBudWxsO1xuXG4gICAgICBjb25zdCBhY3R1YWxUeXBlID0gc2VjdGlvbi5hY3R1YWxfdHlwZSB8fCBzZWN0aW9uLmFjdHVhbFR5cGUgfHwgJyc7XG4gICAgICBjb25zdCB0eXBlVXBwZXIgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0eXBlLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGFjdHVhbFVwcGVyID0gdHlwZW9mIGFjdHVhbFR5cGUgPT09ICdzdHJpbmcnID8gYWN0dWFsVHlwZS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAodHlwZVVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfU0VQT1JBVE9SJyB8fCBhY3R1YWxVcHBlciA9PT0gJ0JPT0xFQU5fQkFTS0VUX1NFUE9SQVRPUicpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCB0YWdSb3dzID0gKEFycmF5LmlzQXJyYXkoc2VjdGlvbi5jb250ZW50X3RhZ3MpID8gc2VjdGlvbi5jb250ZW50X3RhZ3MgOiBbXSlcbiAgICAgICAgICAubWFwKCh0OiBhbnkpID0+ICh7IGlkOiB0Ll9pZCA/PyB0LmlkID8/ICcnLCBsYWJlbDogdC50YWcgPz8gdC5uYW1lID8/ICcnLCBjb3VudDogdC5jb3VudCA/PyAwIH0pKVxuICAgICAgICAgIC5maWx0ZXIoKHI6IGFueSkgPT4gci5sYWJlbClcbiAgICAgICAgICAuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuY291bnQgLSBhLmNvdW50KTtcbiAgICAgICAgY29uc3QgbWVhc3VyZVNyYyA9IHNlY3Rpb24ubWVhc3VyZW1lbnRzPy50ZW1wbGVfbGVuZ3Roc1xuICAgICAgICAgID8/IHNlY3Rpb24ubWVhc3VyZW1lbnRzPy5sZW5ndGhzXG4gICAgICAgICAgPz8gc2VjdGlvbi5tZWFzdXJlbWVudHM/LnZhbHVlc1xuICAgICAgICAgID8/IFtdO1xuICAgICAgICBjb25zdCBtZWFzdXJlUm93cyA9IChBcnJheS5pc0FycmF5KG1lYXN1cmVTcmMpID8gbWVhc3VyZVNyYyA6IFtdKVxuICAgICAgICAgIC5tYXAoKG06IGFueSkgPT4gKHsgaWQ6IG0uX2lkID8/IG0uaWQgPz8gJycsIGxhYmVsOiBtLm5hbWUgPz8gbS5sYWJlbCA/PyAnJywgY291bnQ6IG0uY291bnQgPz8gMCB9KSlcbiAgICAgICAgICAuZmlsdGVyKChyOiBhbnkpID0+IHIubGFiZWwpXG4gICAgICAgICAgLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLmNvdW50IC0gYS5jb3VudCk7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBjYXJkTmFtZSxcbiAgICAgICAgICB0eXBlOiAnQk9PTEVBTl9CQVNLRVRfU0VQT1JBVE9SJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgdGFnc1RpdGxlOiBjYXJkTmFtZSxcbiAgICAgICAgICB0YWdzU3VidGl0bGU6IGAke2FwcGxpY2FibGVDb3VudCA/PyAwfSBjb252ZXJzYXRpb25zYCxcbiAgICAgICAgICB0YWdSb3dzLFxuICAgICAgICAgIG1lYXN1cmVUaXRsZTogJ01lYXN1cmVtZW50cycsXG4gICAgICAgICAgbWVhc3VyZVN1YnRpdGxlOiBgJHtzZWN0aW9uLm1lYXN1cmVtZW50cz8udG90YWwgPz8gbWVhc3VyZVJvd3MubGVuZ3RofWAsXG4gICAgICAgICAgbWVhc3VyZVJvd3NcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVVcHBlciA9PT0gJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJyB8fCBhY3R1YWxVcHBlciA9PT0gJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJykge1xuICAgICAgICBjb25zdCBjYXJkTmFtZSA9IHNlY3Rpb24ubmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IGRhdGFSb3dzOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoc2VjdGlvbi5kYXRhKSA/IHNlY3Rpb24uZGF0YSA6IFtdO1xuICAgICAgICBjb25zdCB0YWJsZVJvd3MgPSBkYXRhUm93cy5tYXAoKHJvdzogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0cnM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShyb3cuYXR0cmlidXRlcykgPyByb3cuYXR0cmlidXRlcyA6IFtdO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c1NldCA9IG5ldyBTZXQoWydGVUxGSUxMRUQnLCAnTk9UX0ZVTEZJTExFRCcsICdPRkZFUkVEX0FMVEVSTkFUSVZFJ10pO1xuICAgICAgICAgIGNvbnN0IE1BWF9DSElQX0xFTiA9IDE4O1xuICAgICAgICAgIGNvbnN0IE1BWF9WSVNJQkxFID0gNDtcbiAgICAgICAgICBjb25zdCBjbGVhbmVkID0gYXR0cnMuZmlsdGVyKChhOiBzdHJpbmcpID0+ICFzdGF0dXNTZXQuaGFzKChhIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSk7XG4gICAgICAgICAgY29uc3Qgc2hvcnRDaGlwcyA9IGNsZWFuZWQuZmlsdGVyKChjOiBzdHJpbmcpID0+IGMubGVuZ3RoIDw9IE1BWF9DSElQX0xFTik7XG4gICAgICAgICAgY29uc3QgbG9uZ0NoaXBzID0gY2xlYW5lZC5maWx0ZXIoKGM6IHN0cmluZykgPT4gYy5sZW5ndGggPiBNQVhfQ0hJUF9MRU4pO1xuICAgICAgICAgIGNvbnN0IHZpc2libGUgPSBzaG9ydENoaXBzLnNsaWNlKDAsIE1BWF9WSVNJQkxFKTtcbiAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IFsuLi5zaG9ydENoaXBzLnNsaWNlKE1BWF9WSVNJQkxFKSwgLi4ubG9uZ0NoaXBzXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgICAgICAgIGJyYW5kOiByb3cuYnJhbmQgfHwgJycsXG4gICAgICAgICAgICB2aXNpYmxlQ2hpcHM6IHZpc2libGUsXG4gICAgICAgICAgICBvdmVyZmxvd0NoaXBzOiBvdmVyZmxvdyxcbiAgICAgICAgICAgIG92ZXJmbG93Q291bnQ6IG92ZXJmbG93Lmxlbmd0aCxcbiAgICAgICAgICAgIG92ZXJmbG93VG9vbHRpcDogb3ZlcmZsb3cuam9pbignLCAnKSxcbiAgICAgICAgICAgIGFsbEF0dHJpYnV0ZXM6IGNsZWFuZWQsXG4gICAgICAgICAgICBjb3VudDogcm93LmNvdW50ID8/IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IGNhcmROYW1lLFxuICAgICAgICAgIHR5cGU6ICdCT09MRUFOX0JBU0tFVF9UQUJMRScsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHRhYmxlUm93c1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJyB8fCBhY3R1YWxVcHBlciA9PT0gJ0JPT0xFQU5fQkFTS0VUX0JBUicpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBwaWVDb2xvcnMgPSBbJyMwRUE1RTknLCAnIzM4QkRGOCcsICcjN0REM0ZDJywgJyMwMjg0QzcnLCAnI0JBRTZGRCcsICcjMDc1OTg1JywgJyNFMEYyRkUnLCAnIzAzNjlBMScsICcjMjJEM0VFJ107XG4gICAgICAgIGNvbnN0IHJhd1Jvd3MgPSB2YWx1ZXNcbiAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogaXRlbS5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgcmVzcG9uc2VzOiBpdGVtLlJlc3BvbnNlcyA/PyBpdGVtLmNvdW50ID8/IDAsXG4gICAgICAgICAgICBzY29yZTogaXRlbS5zY29yZSA/PyAwXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLmZpbHRlcigocjogYW55KSA9PiByLnJlc3BvbnNlcyA+IDApXG4gICAgICAgICAgLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLnNjb3JlIC0gYS5zY29yZSk7XG4gICAgICAgIGNvbnN0IHRvdGFsUmVzcG9uc2VzID0gcmF3Um93cy5yZWR1Y2UoKHM6IG51bWJlciwgcjogYW55KSA9PiBzICsgci5yZXNwb25zZXMsIDApO1xuICAgICAgICBjb25zdCBjeCA9IDUwLCBjeSA9IDUwLCByYWRpdXMgPSA0NTtcbiAgICAgICAgbGV0IHN0YXJ0QW5nbGUgPSAtTWF0aC5QSSAvIDI7XG4gICAgICAgIGNvbnN0IHBpZVNsaWNlcyA9IHJhd1Jvd3MubWFwKChyOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyYWN0aW9uID0gdG90YWxSZXNwb25zZXMgPyByLnJlc3BvbnNlcyAvIHRvdGFsUmVzcG9uc2VzIDogMDtcbiAgICAgICAgICBjb25zdCBhbmdsZSA9IGZyYWN0aW9uICogMiAqIE1hdGguUEk7XG4gICAgICAgICAgY29uc3QgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgYW5nbGU7XG4gICAgICAgICAgY29uc3QgeDEgPSBjeCArIHJhZGl1cyAqIE1hdGguY29zKHN0YXJ0QW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHkxID0gY3kgKyByYWRpdXMgKiBNYXRoLnNpbihzdGFydEFuZ2xlKTtcbiAgICAgICAgICBjb25zdCB4MiA9IGN4ICsgcmFkaXVzICogTWF0aC5jb3MoZW5kQW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHkyID0gY3kgKyByYWRpdXMgKiBNYXRoLnNpbihlbmRBbmdsZSk7XG4gICAgICAgICAgY29uc3QgbGFyZ2VBcmMgPSBhbmdsZSA+IE1hdGguUEkgPyAxIDogMDtcbiAgICAgICAgICBsZXQgcGF0aDogc3RyaW5nO1xuICAgICAgICAgIGlmIChyYXdSb3dzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcGF0aCA9IGBNICR7Y3ggLSByYWRpdXN9ICR7Y3l9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDEgMSAke2N4ICsgcmFkaXVzfSAke2N5fSBBICR7cmFkaXVzfSAke3JhZGl1c30gMCAxIDEgJHtjeCAtIHJhZGl1c30gJHtjeX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdGggPSBgTSAke2N4fSAke2N5fSBMICR7eDF9ICR7eTF9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwICR7bGFyZ2VBcmN9IDEgJHt4Mn0gJHt5Mn0gWmA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXJ0QW5nbGUgPSBlbmRBbmdsZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHIubGFiZWwsXG4gICAgICAgICAgICByZXNwb25zZXM6IHIucmVzcG9uc2VzLFxuICAgICAgICAgICAgc2NvcmU6IHIuc2NvcmUsXG4gICAgICAgICAgICBwZXJjZW50OiBNYXRoLnJvdW5kKGZyYWN0aW9uICogMTAwKSxcbiAgICAgICAgICAgIGNvbG9yOiBwaWVDb2xvcnNbaSAlIHBpZUNvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgcGF0aFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUX0JBUicsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHBpZVNsaWNlcyxcbiAgICAgICAgICBzZWxlY3RlZFBpZUxhYmVsOiBwaWVTbGljZXNbMF0/LmxhYmVsIHx8ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgJiYgdHlwZS50b0xvd2VyQ2FzZSgpID09PSAnYm9vbGVhbl9iYXNrZXRfY2hhcnQnKSB7XG4gICAgICAgIGNvbnN0IGNhcmROYW1lID0gc2VjdGlvbi5uYW1lIHx8IGtleTtcbiAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgICAgY29uc3QgbG9va3NMaWtlS2V5d29yZEFycmF5ID0gZmlyc3RWYWx1ZSAmJiB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAmJiAoJ2JyZWFrZG93bicgaW4gZmlyc3RWYWx1ZSB8fCAnc3RhZmYnIGluIGZpcnN0VmFsdWUgfHwgJ2N1c3RvbWVyJyBpbiBmaXJzdFZhbHVlIHx8ICdrZXl3b3JkJyBpbiBmaXJzdFZhbHVlKTtcbiAgICAgICAgY29uc3Qga2V5d29yZERhdGE6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLmtleXdvcmREYXRhKVxuICAgICAgICAgID8gc2VjdGlvbi5rZXl3b3JkRGF0YVxuICAgICAgICAgIDogKEFycmF5LmlzQXJyYXkoc2VjdGlvbi5kYXRhKVxuICAgICAgICAgICAgICA/IHNlY3Rpb24uZGF0YVxuICAgICAgICAgICAgICA6IChsb29rc0xpa2VLZXl3b3JkQXJyYXkgPyB2YWx1ZXMgOiBbXSkpO1xuICAgICAgICBjb25zdCBzZW50aW1lbnRQYWxldHRlOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICBORUdBVElWRTogJyM2MEM2RkYnLFxuICAgICAgICAgIE5FVVRSQUw6ICcjQjZFM0ZGJyxcbiAgICAgICAgICBQT1NJVElWRTogJyNEOUYxRkYnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1aWxkU2xpY2VzID0gKHM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5lZyA9IHM/Lm5lZ2F0aXZlID8/IDA7XG4gICAgICAgICAgY29uc3QgbmV1ID0gcz8ubmV1dHJhbCA/PyAwO1xuICAgICAgICAgIGNvbnN0IHBvcyA9IHM/LnBvc2l0aXZlID8/IDA7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOZWdhdGl2ZScsIGtleTogJ05FR0FUSVZFJywgcGVyY2VudDogbmVnLCBjb2xvcjogc2VudGltZW50UGFsZXR0ZVsnTkVHQVRJVkUnXSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ05ldXRyYWwnLCAga2V5OiAnTkVVVFJBTCcsICBwZXJjZW50OiBuZXUsIGNvbG9yOiBzZW50aW1lbnRQYWxldHRlWydORVVUUkFMJ10gfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdQb3NpdGl2ZScsIGtleTogJ1BPU0lUSVZFJywgcGVyY2VudDogcG9zLCBjb2xvcjogc2VudGltZW50UGFsZXR0ZVsnUE9TSVRJVkUnXSB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhZmZDb2xvcnM6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgIE5FR0FUSVZFOiAnIzAwNzdFNicsXG4gICAgICAgICAgTkVVVFJBTDogJyMwMEEzRkYnLFxuICAgICAgICAgIFBPU0lUSVZFOiAnIzREQzNGRidcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY3VzdENvbG9yczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgTkVHQVRJVkU6ICcjOEFEOEZGJyxcbiAgICAgICAgICBORVVUUkFMOiAnI0JERThGRicsXG4gICAgICAgICAgUE9TSVRJVkU6ICcjRDlGMUZGJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBidWlsZFN0YWNrQmFyID0gKGxhYmVsOiBzdHJpbmcsIHM6IGFueSwgY29sb3JzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5lZyA9ICsocz8ubmVnYXRpdmUgPz8gMCk7XG4gICAgICAgICAgY29uc3QgbmV1ID0gKyhzPy5uZXV0cmFsID8/IDApO1xuICAgICAgICAgIGNvbnN0IHBvcyA9ICsocz8ucG9zaXRpdmUgPz8gMCk7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBuZWcgKyBuZXUgKyBwb3M7XG4gICAgICAgICAgY29uc3QgcGN0ID0gKHY6IG51bWJlcikgPT4gdG90YWwgPiAwID8gKygodiAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgxKSA6IDA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICBzZWdtZW50czogW1xuICAgICAgICAgICAgICB7IGtleTogJ05FR0FUSVZFJywgbGFiZWw6ICdOZWdhdGl2ZScsIGNvdW50OiBuZWcsIHBlcmNlbnQ6IHBjdChuZWcpLCBjb2xvcjogY29sb3JzWydORUdBVElWRSddIH0sXG4gICAgICAgICAgICAgIHsga2V5OiAnTkVVVFJBTCcsICBsYWJlbDogJ05ldXRyYWwnLCAgY291bnQ6IG5ldSwgcGVyY2VudDogcGN0KG5ldSksIGNvbG9yOiBjb2xvcnNbJ05FVVRSQUwnXSB9LFxuICAgICAgICAgICAgICB7IGtleTogJ1BPU0lUSVZFJywgbGFiZWw6ICdQb3NpdGl2ZScsIGNvdW50OiBwb3MsIHBlcmNlbnQ6IHBjdChwb3MpLCBjb2xvcjogY29sb3JzWydQT1NJVElWRSddIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBidWlsZExlZ2VuZCA9IChzdGFmZjogYW55LCBjdXN0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHB1c2ggPSAoZ3JvdXA6IHN0cmluZywgczogYW55LCBjb2xvcnM6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBbJ05FR0FUSVZFJywgJ05FVVRSQUwnLCAnUE9TSVRJVkUnXS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICBzZWdzLnB1c2goe1xuICAgICAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgICAgICAgIGtleTogayxcbiAgICAgICAgICAgICAgICBsYWJlbDogYCR7Z3JvdXB9IMK3ICR7ay5jaGFyQXQoMCkgKyBrLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgICAgICAgICBjb2xvcjogY29sb3JzW2tdLFxuICAgICAgICAgICAgICAgIGNvdW50OiArKHM/LltrLnRvTG93ZXJDYXNlKCldID8/IDApXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBwdXNoKCdTdGFmZicsIHN0YWZmLCBzdGFmZkNvbG9ycyk7XG4gICAgICAgICAgcHVzaCgnQ3VzdG9tZXInLCBjdXN0LCBjdXN0Q29sb3JzKTtcbiAgICAgICAgICByZXR1cm4gc2VncztcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGtleXdvcmRSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpZiAoa2V5d29yZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAga2V5d29yZFJvd3MgPSBrZXl3b3JkRGF0YS5tYXAoKGs6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnJlYWtkb3duID0gay5icmVha2Rvd24gfHwge307XG4gICAgICAgICAgICBjb25zdCBzdGFmZiA9IGsuc3RhZmYgfHwgYnJlYWtkb3duLnN0YWZmIHx8IGsuc2VudGltZW50IHx8IHsgbmVnYXRpdmU6IDAsIG5ldXRyYWw6IDAsIHBvc2l0aXZlOiAwIH07XG4gICAgICAgICAgICBjb25zdCBjdXN0ID0gay5jdXN0b21lciB8fCBicmVha2Rvd24uY3VzdG9tZXIgfHwgeyBuZWdhdGl2ZTogMCwgbmV1dHJhbDogMCwgcG9zaXRpdmU6IDAgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBrLmlkLFxuICAgICAgICAgICAgICBsYWJlbDogay5rZXl3b3JkIHx8ICcnLFxuICAgICAgICAgICAgICBjb3VudDogay5jb3VudCB8fCAwLFxuICAgICAgICAgICAgICBzZW50aW1lbnQ6IHN0YWZmLFxuICAgICAgICAgICAgICBzbGljZXM6IGJ1aWxkU2xpY2VzKHN0YWZmKSxcbiAgICAgICAgICAgICAgc3RhY2tlZEJhcnM6IFtcbiAgICAgICAgICAgICAgICBidWlsZFN0YWNrQmFyKCdTdGFmZicsIHN0YWZmLCBzdGFmZkNvbG9ycyksXG4gICAgICAgICAgICAgICAgYnVpbGRTdGFja0JhcignQ3VzdG9tZXInLCBjdXN0LCBjdXN0Q29sb3JzKVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBsZWdlbmQ6IGJ1aWxkTGVnZW5kKHN0YWZmLCBjdXN0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrOiBkZXJpdmUgZnJvbSBjb250ZW50X3RhZ3MgKyBzaGFyZWQgc3RhdHVzX3RhZ3NcbiAgICAgICAgICBjb25zdCBjb250ZW50VGFnczogYW55W10gPSBBcnJheS5pc0FycmF5KHNlY3Rpb24uY29udGVudF90YWdzKSA/IHNlY3Rpb24uY29udGVudF90YWdzIDogdmFsdWVzO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c1RhZ3M6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLnN0YXR1c190YWdzKSA/IHNlY3Rpb24uc3RhdHVzX3RhZ3MgOiBbXTtcbiAgICAgICAgICBjb25zdCB0b3RhbFN0YXR1cyA9IHN0YXR1c1RhZ3MucmVkdWNlKChzdW06IG51bWJlciwgdDogYW55KSA9PiBzdW0gKyAodC5jb3VudCB8fCAwKSwgMCk7XG4gICAgICAgICAgY29uc3Qgc2hhcmVkU2VudGltZW50OiBhbnkgPSB7IG5lZ2F0aXZlOiAwLCBuZXV0cmFsOiAwLCBwb3NpdGl2ZTogMCB9O1xuICAgICAgICAgIHN0YXR1c1RhZ3MuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrID0gKHQudGFnIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGsgPT09ICduZWdhdGl2ZScgfHwgayA9PT0gJ25ldXRyYWwnIHx8IGsgPT09ICdwb3NpdGl2ZScpIHtcbiAgICAgICAgICAgICAgc2hhcmVkU2VudGltZW50W2tdID0gdG90YWxTdGF0dXMgPyBNYXRoLnJvdW5kKCh0LmNvdW50IC8gdG90YWxTdGF0dXMpICogMTAwKSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5d29yZFJvd3MgPSBjb250ZW50VGFncy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLnRhZyA/PyBpdGVtLm5hbWUgPz8gJycsXG4gICAgICAgICAgICBjb3VudDogaXRlbS5jb3VudCA/PyBpdGVtLlJlc3BvbnNlcyA/PyAwLFxuICAgICAgICAgICAgc2VudGltZW50OiBzaGFyZWRTZW50aW1lbnQsXG4gICAgICAgICAgICBzbGljZXM6IGJ1aWxkU2xpY2VzKHNoYXJlZFNlbnRpbWVudCksXG4gICAgICAgICAgICBzdGFja2VkQmFyczogW1xuICAgICAgICAgICAgICBidWlsZFN0YWNrQmFyKCdTdGFmZicsIHNoYXJlZFNlbnRpbWVudCwgc3RhZmZDb2xvcnMpLFxuICAgICAgICAgICAgICBidWlsZFN0YWNrQmFyKCdDdXN0b21lcicsIHsgbmVnYXRpdmU6IDAsIG5ldXRyYWw6IDAsIHBvc2l0aXZlOiAwIH0sIGN1c3RDb2xvcnMpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGVnZW5kOiBidWlsZExlZ2VuZChzaGFyZWRTZW50aW1lbnQsIHsgbmVnYXRpdmU6IDAsIG5ldXRyYWw6IDAsIHBvc2l0aXZlOiAwIH0pXG4gICAgICAgICAgfSkpLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLmNvdW50IC0gYS5jb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBrZXl3b3JkUm93c1swXSB8fCBudWxsO1xuICAgICAgICBjb25zdCBmaXJzdFNsaWNlID0gZmlyc3RSb3c/LnNsaWNlcz8uZmluZCgoczogYW55KSA9PiBzLnBlcmNlbnQgPiAwKSB8fCBmaXJzdFJvdz8uc2xpY2VzPy5bMF0gfHwgbnVsbDtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IGNhcmROYW1lLFxuICAgICAgICAgIHR5cGU6ICdCT09MRUFOX0JBU0tFVF9DSEFSVCcsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGtleXdvcmRSb3dzLFxuICAgICAgICAgIHNlbGVjdGVkS2V5d29yZDogZmlyc3RSb3c/LmxhYmVsIHx8ICcnLFxuICAgICAgICAgIHNlbGVjdGVkS2V5d29yZENvdW50OiBmaXJzdFJvdz8uY291bnQgfHwgMCxcbiAgICAgICAgICBzZWxlY3RlZFNsaWNlczogZmlyc3RSb3c/LnNsaWNlcyB8fCBbXSxcbiAgICAgICAgICBzZWxlY3RlZFNlbnRpbWVudDogZmlyc3RTbGljZSxcbiAgICAgICAgICBzZWxlY3RlZFN0YWNrZWRCYXJzOiBmaXJzdFJvdz8uc3RhY2tlZEJhcnMgfHwgW10sXG4gICAgICAgICAgc2VsZWN0ZWRMZWdlbmQ6IGZpcnN0Um93Py5sZWdlbmQgfHwgW11cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdCT09MRUFOX0JBU0tFVCcpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBpc0Z1bm5lbCA9IGNhcmROYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Z1bm5lbCcpO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUJyxcbiAgICAgICAgICBpc0Z1bm5lbCxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgYm9vbGVhblJvd3M6IHZhbHVlcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGlkOiBpdGVtLl9pZCB8fCAnJyxcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICByZXNwb25zZXM6IGl0ZW0uUmVzcG9uc2VzID8/IGl0ZW0uY291bnQgPz8gMCxcbiAgICAgICAgICAgIHNjb3JlOiBpdGVtLnNjb3JlID8/IDBcbiAgICAgICAgICB9KSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIucmVzcG9uc2VzIC0gYS5yZXNwb25zZXMpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTlVNRVJJQ19TQ0FMQVInIHx8IHR5cGUgPT09ICdOVU1FUklDX0FSUkFZJykge1xuICAgICAgICBjb25zdCBpdGVtID0gdmFsdWVzWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2FsZSA9IHNlY3Rpb24uc2NhbGUgfHwge307XG4gICAgICAgIG51bWVyaWNSb3dzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uLm5hbWUgfHwga2V5LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBhdmc6IGl0ZW0uQXZnID8/IGl0ZW0uYXZnID8/IDAsXG4gICAgICAgICAgbWluOiBpdGVtLk1pbiA/PyBpdGVtLm1pbiA/PyBzY2FsZS5taW4gPz8gc2VjdGlvbi5taW4gPz8gbnVsbCxcbiAgICAgICAgICBtYXg6IGl0ZW0uTWF4ID8/IGl0ZW0ubWF4ID8/IHNjYWxlLm1heCA/PyBzZWN0aW9uLm1heCA/PyBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnU1VCSkVDVElWRScgfHwgdHlwZSA9PT0gJ1NVQkpFQ1RJVkVfQ09VTlQnKSB7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uLm5hbWUgfHwga2V5LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHN1YmplY3RpdmVSb3dzOiB2YWx1ZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBfaWQ6IGl0ZW0uX2lkIHx8ICcnLFxuICAgICAgICAgICAgcmVhc29uaW5nOiBpdGVtLnJlYXNvbmluZyB8fCAnJyxcbiAgICAgICAgICAgIHN0b3JlX2lkOiBpdGVtLnN0b3JlX2lkIHx8ICcnLFxuICAgICAgICAgICAgZGF0ZTogaXRlbS5kYXRlIHx8ICcnXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyb3VwIGFsbCBudW1lcmljIHNjb3JlcyBpbnRvIG9uZSBjYXJkXG4gICAgaWYgKG51bWVyaWNSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICBrZXk6ICdudW1lcmljU2NvcmVzJyxcbiAgICAgICAgbmFtZTogJ0F2ZXJhZ2UgU2NvcmVzJyxcbiAgICAgICAgdHlwZTogJ05VTUVSSUNfR1JPVVAnLFxuICAgICAgICBudW1lcmljUm93c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IHVuaXF1ZSBwaXRjaGVzIGNhcmQgaWYgcHJlc2VudCAoc2FtZSBhcyBhdWRpby1wYWdlKVxuICAgIGlmIChhbmFseXNpcy51bmlxdWVQaXRjaGVzICYmIEFycmF5LmlzQXJyYXkoYW5hbHlzaXMudW5pcXVlUGl0Y2hlcykpIHtcbiAgICAgIGNvbnN0IHBpdGNoSW5zZXJ0SWR4ID0gY2FyZHMubGVuZ3RoID49IDIgPyAyIDogY2FyZHMubGVuZ3RoO1xuICAgICAgY2FyZHMuc3BsaWNlKHBpdGNoSW5zZXJ0SWR4LCAwLCB7XG4gICAgICAgIGtleTogJ3VuaXF1ZVBpdGNoZXMnLFxuICAgICAgICBuYW1lOiAnUGl0Y2ggS2V5d29yZHMgVHJhY2tlcicsXG4gICAgICAgIHR5cGU6ICdVTklRVUVfUElUQ0hFUycsXG4gICAgICAgIHBpdGNoUm93czogYW5hbHlzaXMudW5pcXVlUGl0Y2hlcy5tYXAoKHA6IGFueSkgPT4gKHsgaWQ6IHAucGl0Y2hJZCwgZGVzYzogcC5kZXNjcmlwdGlvbiB9KSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjYXJkcztcbiAgfVxuXG4gIC8vIENhcmQgcm93IGNsaWNrIChzYW1lIGFzIGF1ZGlvLXBhZ2Ugb25DYXJkUm93Q2xpY2spXG4gIHNlbGVjdGVkQ2FyZElkID0gJyc7XG4gIHNlbGVjdGVkQ2FyZE5hbWUgPSAnJztcbiAgdG90YWxBdWRpbyA9IDA7XG5cbiAgLy8gUHJvZHVjdCBBdHRyaWJ1dGUgQW5hbHlzaXMg4oCUIHJvdy9jaGlwIGNsaWNrIOKGkiBjYXRlZ29yeS1hbmFseXNpcy1jYXJkXG4gIGNhdGVnb3J5UG9wdXBPcGVuID0gZmFsc2U7XG4gIGNhdGVnb3J5QW5hbHlzaXNMb2FkaW5nID0gZmFsc2U7XG4gIGNhdGVnb3J5QW5hbHlzaXNFcnJvciA9ICcnO1xuICBjYXRlZ29yeUFuYWx5c2lzQ2F0ZWdvcnkgPSAnJztcbiAgY2F0ZWdvcnlBbmFseXNpc0F0dHJpYnV0ZSA9ICcnO1xuICBjYXRlZ29yeUFuYWx5c2lzUm93czogeyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9W10gPSBbXTtcbiAgY2F0ZWdvcnlBbmFseXNpc1RvdGFsID0gMDtcblxuICBvbkNhdGVnb3J5QW5hbHlzaXNDbGljayhyb3c6IGFueSwgYXR0cmlidXRlPzogc3RyaW5nLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBzdGFydERhdGU6IHRoaXMuZ2V0U3RhcnREYXRlKCksXG4gICAgICBlbmREYXRlOiB0aGlzLmdldEVuZERhdGUoKSxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZ2V0U3RvcmVJZHMoKSxcbiAgICAgIGNvaG9ydElkOiB0aGlzLnNlbGVjdGVkQ29ob3J0SWQsXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgICBjYXRlZ29yeTogcm93LmJyYW5kIHx8ICcnXG4gICAgfTtcbiAgICBpZiAoYXR0cmlidXRlKSBwYXlsb2FkLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcblxuICAgIHRoaXMuY2F0ZWdvcnlQb3B1cE9wZW4gPSB0cnVlO1xuICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc0Vycm9yID0gJyc7XG4gICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzQ2F0ZWdvcnkgPSByb3cuYnJhbmQgfHwgJyc7XG4gICAgdGhpcy5jYXRlZ29yeUFuYWx5c2lzQXR0cmlidXRlID0gYXR0cmlidXRlIHx8ICcnO1xuICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc1Jvd3MgPSBbXTtcbiAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNUb3RhbCA9IDA7XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDYXRlZ29yeUFuYWx5c2lzQ2FyZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhID8/IHJlcyA/PyB7fTtcbiAgICAgICAgY29uc3QgcmF3TGlzdDogYW55W10gPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YVxuICAgICAgICAgIDogQXJyYXkuaXNBcnJheShkYXRhPy5yZXN1bHRzKSA/IGRhdGEucmVzdWx0c1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheShkYXRhPy52YWx1ZSkgPyBkYXRhLnZhbHVlXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KGRhdGE/LmRhdGEpID8gZGF0YS5kYXRhXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KGRhdGE/LnZhbHVlcykgPyBkYXRhLnZhbHVlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheShkYXRhPy5hdHRyaWJ1dGVzKSA/IGRhdGEuYXR0cmlidXRlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheShyZXM/LnJlc3VsdHMpID8gcmVzLnJlc3VsdHNcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IHJhd0xpc3QubWFwKChpdDogYW55KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGl0Py5jYXRlZ29yeSA/PyBpdD8ubmFtZSA/PyBpdD8ubGFiZWwgPz8gaXQ/LmF0dHJpYnV0ZSA/PyBpdD8ua2V5ID8/ICcnLFxuICAgICAgICAgIGNvdW50OiBOdW1iZXIoaXQ/LnZhbHVlID8/IGl0Py5jb3VudCA/PyBpdD8uUmVzcG9uc2VzID8/IGl0Py5yZXNwb25zZXMgPz8gMClcbiAgICAgICAgfSkpLmZpbHRlcihyID0+IHIubmFtZSk7XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSBtYXBwZWQucmVkdWNlKChzLCByKSA9PiBzICsgKHIuY291bnQgfHwgMCksIDApO1xuICAgICAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNUb3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNSb3dzID0gbWFwcGVkXG4gICAgICAgICAgLm1hcChyID0+ICh7IC4uLnIsIHBlcmNlbnQ6IHRvdGFsID8gTWF0aC5yb3VuZCgoci5jb3VudCAvIHRvdGFsKSAqIDEwMDApIC8gMTAgOiAwIH0pKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNvdW50IC0gYS5jb3VudCk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNFcnJvciA9ICdGYWlsZWQgdG8gbG9hZCBjYXRlZ29yeSBhbmFseXNpcy4nO1xuICAgICAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZUNhdGVnb3J5UG9wdXAoKTogdm9pZCB7XG4gICAgdGhpcy5jYXRlZ29yeVBvcHVwT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2F0ZWdvcnlBbmFseXNpc1Jvd3MgPSBbXTtcbiAgICB0aGlzLmNhdGVnb3J5QW5hbHlzaXNFcnJvciA9ICcnO1xuICB9XG5cbiAgb25DYXJkUm93Q2xpY2soaWQ6IGFueSwgbmFtZTogYW55KTogdm9pZCB7XG4gICAgLy8gU3RvcCBhbnkgcGxheWluZyBhdWRpb1xuICAgIGlmICh0aGlzLnBsYXlpbmdDb252SWQpIHtcbiAgICAgIGNvbnN0IGF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7dGhpcy5wbGF5aW5nQ29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgICBpZiAoYXVkaW8pIHsgYXVkaW8ucGF1c2UoKTsgYXVkaW8uY3VycmVudFRpbWUgPSAwOyB9XG4gICAgICB0aGlzLnBsYXlpbmdDb252SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkQ2FyZElkID0gaWQgfHwgJyc7XG4gICAgdGhpcy5zZWxlY3RlZENhcmROYW1lID0gaWQgPyAnJyA6IChuYW1lIHx8ICcnKTtcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgLy8gU2Nyb2xsIHRvIGNvbnZlcnNhdGlvbnMgc2VjdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VjaG9Db252ZXJzYXRpb25zJyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIG9sZCBkYXRhIGltbWVkaWF0ZWx5IHNvIHN0YWxlIHJlc3VsdHMgZG9uJ3Qgc2hvd1xuICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IFtdO1xuICAgIHRoaXMuZGV0YWlsUGFnZUNvbnZzID0gW107XG4gICAgdGhpcy5kZXRhaWxPcGVuSWQgPSBudWxsO1xuICAgIHRoaXMuZGV0YWlsVG90YWwgPSAwO1xuICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgLi4udGhpcy5idWlsZEJhc2VQYXlsb2FkKCksXG4gICAgICBjb2hvcnRUeXBlOiB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPT09ICdPdmVyYWxsX3RyYW5zY3JpcHRzX3YyJyA/IFtdIDogW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0sXG4gICAgICBsaW1pdDogdGhpcy5kZXRhaWxQZXJQYWdlLFxuICAgICAgX2lkOiB0aGlzLnNlbGVjdGVkQ2FyZElkID8gW3RoaXMuc2VsZWN0ZWRDYXJkSWRdIDogW10sXG4gICAgICBuYW1lOiB0aGlzLnNlbGVjdGVkQ2FyZE5hbWUsXG4gICAgICBvZmZzZXQ6IHRoaXMuZGV0YWlsUGFnZSAtIDEsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5kZXRhaWxTZWFyY2hWYWx1ZSB8fCAnJ1xuICAgIH07XG4gICAgaWYgKHRoaXMuaXNPdmVyYWxsVHJhbnNjcmlwdHNDb2hvcnQgJiYgdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlKSB7XG4gICAgICBwYXlsb2FkLmF1ZGlvU291cmNlID0gdGhpcy5zZWxlY3RlZEF1ZGlvU291cmNlO1xuICAgIH1cblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvbnZlcnNhdGlvbnNMaXN0KHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhPy5kYXRhIHx8IGRhdGE/LmNvbnZlcnNhdGlvbnMgfHwgW107XG4gICAgICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IGxpc3QubWFwKChpdGVtOiBhbnkpID0+IHRoaXMubWFwQ29udmVyc2F0aW9uKGl0ZW0pKTtcbiAgICAgICAgdGhpcy5kZXRhaWxUb3RhbCA9IGRhdGE/LmNvdW50ID8/IGRhdGE/LnBhZ2luYXRpb24/LnRvdGFsID8/IHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucy5sZW5ndGg7XG4gICAgICAgIHRoaXMuZGV0YWlsVG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmRldGFpbFRvdGFsIC8gdGhpcy5kZXRhaWxQZXJQYWdlKSk7XG4gICAgICAgIHRoaXMuZGV0YWlsUGFnaW5hdGlvblNpemVzID0gdGhpcy5kZXRhaWxUb3RhbCA+IDEwID8gWzEwLCAyMCwgNTAsIDEwMF0gOiBbdGhpcy5kZXRhaWxUb3RhbCB8fCAxMF07XG4gICAgICAgIHRoaXMuZGV0YWlsUGVyUGFnZSA9IHRoaXMuZGV0YWlsUGFnaW5hdGlvblNpemVzLmluY2x1ZGVzKHRoaXMuZGV0YWlsUGVyUGFnZSkgPyB0aGlzLmRldGFpbFBlclBhZ2UgOiB0aGlzLmRldGFpbFBhZ2luYXRpb25TaXplc1swXTtcbiAgICAgICAgdGhpcy5kZXRhaWxQYWdlQ29udnMgPSB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmRldGFpbFBhZ2VDb252cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kZXRhaWxPcGVuSWQgPSB0aGlzLmRldGFpbFBhZ2VDb252c1swXS5hdWRpb0lkO1xuICAgICAgICAgIHRoaXMubG9hZENvbnZEZXRhaWwodGhpcy5kZXRhaWxQYWdlQ29udnNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmRldGFpbFBhZ2VDb252cyA9IFtdO1xuICAgICAgICB0aGlzLmRldGFpbFRvdGFsUGFnZXMgPSAxO1xuICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRDb252ZXJzYXRpb25EZXRhaWwoY29udjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgYXVkaW9JZCA9IGNvbnY/LmRvY19pZCB8fCBjb252Py5hdWRpb0lkIHx8IGNvbnY/Ll9pZDtcbiAgICBpZiAoIWF1ZGlvSWQpIHJldHVybjtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvbnZlcnNhdGlvbkRldGFpbChhdWRpb0lkLCB7XG4gICAgICBjb2hvcnRJZDogW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0sXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZFxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGV0YWlsQ29udkRldGFpbCA9IHJlcz8uZGF0YSB8fCByZXM7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5kZXRhaWxDb252RGV0YWlsID0gbnVsbDsgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlRGV0YWlsQ29udihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxPcGVuSWQgPSB0aGlzLmRldGFpbE9wZW5JZCA9PT0gaWQgPyBudWxsIDogaWQ7XG4gIH1cblxuICBvbkRldGFpbFBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gcGFnZTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgb25EZXRhaWxQYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbFBlclBhZ2UgPSBwYXJzZUludChzaXplKTtcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gTUFOQUdFIFRBQiAodXNlcyBsaXN0Q29ob3J0cy9kZWxldGVDb2hvcnQgQVBJcylcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIGxvYWRNYW5hZ2VDb2hvcnRzKCk6IHZvaWQge1xuICAgIHRoaXMubWFuYWdlTG9hZGluZyA9IHRydWU7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHRoaXMubWFuYWdlUGFnZSAtIDEpICogdGhpcy5tYW5hZ2VQZXJQYWdlO1xuXG4gICAgdGhpcy5hdWRpb1NlcnZpY2UubGlzdENvaG9ydHModGhpcy5jbGllbnRJZCwgdGhpcy5tYW5hZ2VQZXJQYWdlLCBvZmZzZXQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubWFuYWdlQ29ob3J0cyA9IHJlcz8uZGF0YT8uY29ob3J0cyB8fCBbXTtcbiAgICAgICAgdGhpcy5tYW5hZ2VUb3RhbCA9IHJlcz8uZGF0YT8ucGFnaW5hdGlvbj8udG90YWwgPz8gdGhpcy5tYW5hZ2VDb2hvcnRzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5tYW5hZ2VUb3RhbFBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMubWFuYWdlVG90YWwgLyB0aGlzLm1hbmFnZVBlclBhZ2UpKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tYW5hZ2VDb2hvcnRzID0gW107XG4gICAgICAgIHRoaXMubWFuYWdlVG90YWwgPSAwO1xuICAgICAgICB0aGlzLm1hbmFnZVRvdGFsUGFnZXMgPSAxO1xuICAgICAgICB0aGlzLm1hbmFnZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uTWFuYWdlUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmFnZVBhZ2UgPSBwYWdlO1xuICAgIHRoaXMubG9hZE1hbmFnZUNvaG9ydHMoKTtcbiAgfVxuXG4gIG9uTWFuYWdlUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tYW5hZ2VQZXJQYWdlID0gcGFyc2VJbnQoc2l6ZSk7XG4gICAgdGhpcy5tYW5hZ2VQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRNYW5hZ2VDb2hvcnRzKCk7XG4gIH1cblxuICBvbk1hbmFnZVNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmFnZVBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZE1hbmFnZUNvaG9ydHMoKTtcbiAgfVxuXG4gIGRlbGV0ZUNvaG9ydChjb2hvcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29ob3J0PycpKSByZXR1cm47XG4gICAgdGhpcy5hdWRpb1NlcnZpY2UuZGVsZXRlQ29ob3J0KGNvaG9ydElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHsgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpOyB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgYWxlcnQoJ0ZhaWxlZCB0byBkZWxldGUgY29ob3J0LicpOyB9XG4gICAgfSk7XG4gIH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gQVVESU8gUExBWUVSIChzYW1lIHBhdHRlcm4gYXMgdHJhbnNjcmlwdC1saXN0KVxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgcGxheWJhY2tTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiB7IGN1cnJlbnRUaW1lOiBzdHJpbmc7IHRvdGFsVGltZTogc3RyaW5nOyBwcm9ncmVzczogbnVtYmVyIH0gfSA9IHt9O1xuICBpc011dGVkID0gZmFsc2U7XG5cbiAgdG9nZ2xlUGxheShjb252SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7Y29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgaWYgKCFhdWRpbykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBsYXlpbmdDb252SWQgPT09IGNvbnZJZCkge1xuICAgICAgYXVkaW8ucGF1c2UoKTtcbiAgICAgIHRoaXMucGxheWluZ0NvbnZJZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhdXNlIGFueSBjdXJyZW50bHkgcGxheWluZ1xuICAgICAgaWYgKHRoaXMucGxheWluZ0NvbnZJZCkge1xuICAgICAgICBjb25zdCBvdGhlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhdWRpby0ke3RoaXMucGxheWluZ0NvbnZJZH1gKSBhcyBIVE1MQXVkaW9FbGVtZW50O1xuICAgICAgICBpZiAob3RoZXIpIG90aGVyLnBhdXNlKCk7XG4gICAgICAgIHRoaXMucGxheWluZ0NvbnZJZCA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBwbGF5UHJvbWlzZSA9IGF1ZGlvLnBsYXkoKTtcbiAgICAgIGlmIChwbGF5UHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBsYXlQcm9taXNlLnRoZW4oKCkgPT4geyB0aGlzLnBsYXlpbmdDb252SWQgPSBjb252SWQ7IH0pLmNhdGNoKCgpID0+IHsgdGhpcy5wbGF5aW5nQ29udklkID0gbnVsbDsgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXlpbmdDb252SWQgPSBjb252SWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Mb2FkZWRNZXRhZGF0YShhdWRpbzogSFRNTEF1ZGlvRWxlbWVudCwgY29udklkOiBzdHJpbmcsIGFwaUR1cmF0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0pIHtcbiAgICAgIHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXSA9IHsgY3VycmVudFRpbWU6ICcwOjAwJywgdG90YWxUaW1lOiAnMDowMCcsIHByb2dyZXNzOiAwIH07XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdO1xuICAgIGlmIChpc0Zpbml0ZShhdWRpby5kdXJhdGlvbikgJiYgYXVkaW8uZHVyYXRpb24gPiAwKSB7XG4gICAgICBzdGF0ZS50b3RhbFRpbWUgPSB0aGlzLmZvcm1hdEF1ZGlvVGltZShhdWRpby5kdXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChhcGlEdXJhdGlvbikge1xuICAgICAgc3RhdGUudG90YWxUaW1lID0gYXBpRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgb25UaW1lVXBkYXRlKGF1ZGlvOiBIVE1MQXVkaW9FbGVtZW50LCBjb252SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdKSB7XG4gICAgICB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0gPSB7IGN1cnJlbnRUaW1lOiAnMDowMCcsIHRvdGFsVGltZTogJzA6MDAnLCBwcm9ncmVzczogMCB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXTtcbiAgICBzdGF0ZS5jdXJyZW50VGltZSA9IHRoaXMuZm9ybWF0QXVkaW9UaW1lKGF1ZGlvLmN1cnJlbnRUaW1lKTtcbiAgICBpZiAoaXNGaW5pdGUoYXVkaW8uZHVyYXRpb24pICYmIGF1ZGlvLmR1cmF0aW9uID4gMCkge1xuICAgICAgc3RhdGUucHJvZ3Jlc3MgPSBhdWRpby5jdXJyZW50VGltZSAvIGF1ZGlvLmR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHNlZWtBdWRpbyhldmVudDogTW91c2VFdmVudCwgY29udklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0cmFjayA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkpO1xuICAgIGNvbnN0IGF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7Y29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgaWYgKCFhdWRpbyB8fCAhaXNGaW5pdGUoYXVkaW8uZHVyYXRpb24pIHx8IGF1ZGlvLmR1cmF0aW9uIDw9IDApIHJldHVybjtcbiAgICBhdWRpby5jdXJyZW50VGltZSA9IHJhdGlvICogYXVkaW8uZHVyYXRpb247XG4gICAgLy8gVXBkYXRlIHdhdmVmb3JtIHByb2dyZXNzIGluc3RhbnRseSDigJQgcmVhc3NpZ24gb2JqZWN0IHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IHByZXYgPSB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0gfHwgeyBjdXJyZW50VGltZTogJzA6MDAnLCB0b3RhbFRpbWU6ICcwOjAwJywgcHJvZ3Jlc3M6IDAgfTtcbiAgICB0aGlzLnBsYXliYWNrU3RhdGVzID0ge1xuICAgICAgLi4udGhpcy5wbGF5YmFja1N0YXRlcyxcbiAgICAgIFtjb252SWRdOiB7IC4uLnByZXYsIHByb2dyZXNzOiByYXRpbywgY3VycmVudFRpbWU6IHRoaXMuZm9ybWF0QXVkaW9UaW1lKGF1ZGlvLmN1cnJlbnRUaW1lKSB9XG4gICAgfTtcbiAgICAvLyBJZiBub3QgYWxyZWFkeSBwbGF5aW5nLCBzdGFydCBwbGF5YmFjayBmcm9tIHRoZSBjbGlja2VkIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWluZ0NvbnZJZCAhPT0gY29udklkKSB7XG4gICAgICBjb25zdCBwbGF5UHJvbWlzZSA9IGF1ZGlvLnBsYXkoKTtcbiAgICAgIGlmIChwbGF5UHJvbWlzZSkge1xuICAgICAgICBwbGF5UHJvbWlzZS50aGVuKCgpID0+IHsgdGhpcy5wbGF5aW5nQ29udklkID0gY29udklkOyB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTXV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTXV0ZWQgPSAhdGhpcy5pc011dGVkO1xuICAgIGNvbnN0IGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2F1ZGlvJyk7XG4gICAgYXVkaW9zLmZvckVhY2goYSA9PiBhLm11dGVkID0gdGhpcy5pc011dGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QXVkaW9UaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzKSByZXR1cm4gJzA6MDAnO1xuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTtcbiAgICByZXR1cm4gYCR7bWluc306JHtzZWNzIDwgMTAgPyAnMCcgKyBzZWNzIDogc2Vjc31gO1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIEZJTFRFUlMgRFJBV0VSXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBvcGVuRmlsdGVyRHJhd2VyKCk6IHZvaWQgeyB0aGlzLmRyYXdlck9wZW4gPSB0cnVlOyB9XG4gIGNsb3NlRmlsdGVyRHJhd2VyKCk6IHZvaWQgeyB0aGlzLmRyYXdlck9wZW4gPSBmYWxzZTsgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBVVElMSVRZXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogYW55IHtcbiAgICByZXR1cm4gaXRlbT8uaWQgfHwgaXRlbT8uX2lkIHx8IGl0ZW0/LmRvY19pZCB8fCBpbmRleDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlKHN0YXR1czogc3RyaW5nKTogeyBiZzogc3RyaW5nOyBjb2xvcjogc3RyaW5nIH0ge1xuICAgIGlmICghc3RhdHVzKSByZXR1cm4geyBiZzogJycsIGNvbG9yOiAnJyB9O1xuICAgIGNvbnN0IHMgPSBzdGF0dXMudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocy5pbmNsdWRlcygncG9zaXRpdmUnKSB8fCBzLmluY2x1ZGVzKCdzdHJvbmcnKSB8fCBzLmluY2x1ZGVzKCdnb29kJykgfHwgcy5pbmNsdWRlcygnY29uZmlkZW50JykgfHwgcy5pbmNsdWRlcygnZXhjZWxsZW50JykpXG4gICAgICByZXR1cm4geyBiZzogJyNEMUZBRTUnLCBjb2xvcjogJyMwNjVGNDYnIH07XG4gICAgaWYgKHMuaW5jbHVkZXMoJ3dhcm5pbmcnKSB8fCBzLmluY2x1ZGVzKCdtb2RlcmF0ZScpIHx8IHMuaW5jbHVkZXMoJ3Jvb20gdG8gaW1wcm92ZScpIHx8IHMuaW5jbHVkZXMoJ2F2ZXJhZ2UnKSlcbiAgICAgIHJldHVybiB7IGJnOiAnI0ZFRjNDNycsIGNvbG9yOiAnIzkyNDAwRScgfTtcbiAgICBpZiAocy5pbmNsdWRlcygnbmVnYXRpdmUnKSB8fCBzLmluY2x1ZGVzKCd3ZWFrJykgfHwgcy5pbmNsdWRlcygncG9vcicpIHx8IHMuaW5jbHVkZXMoJ2NyaXRpY2FsJykpXG4gICAgICByZXR1cm4geyBiZzogJyNGRUUyRTInLCBjb2xvcjogJyM5OTFCMUInIH07XG4gICAgcmV0dXJuIHsgYmc6ICcjRjBGNEZGJywgY29sb3I6ICcjMUEyQjRCJyB9O1xuICB9XG5cbiAgZm9ybWF0TWV0cmljVmFsdWUodjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodi5zY29yZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBzID0gdi5zY29yZTtcbiAgICAgIGlmICh0eXBlb2YgcyA9PT0gJ251bWJlcicpIHJldHVybiBzICsgJyUnO1xuICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKHMpO1xuICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSB2LlRvdGFsID8/IHYudG90YWwgPz8gdi5BdmcgPz8gdi5hdmcgPz8gdi5jb3VudDtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWwuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbCAhPSBudWxsID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG4gIGdldFNjb3JlQ29sb3Ioc2NvcmU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHNjb3JlID49IDM1KSByZXR1cm4gJyMwMDc3RTYnO1xuICAgIGlmIChzY29yZSA+PSAyMCkgcmV0dXJuICcjMDBBM0ZGJztcbiAgICBpZiAoc2NvcmUgPj0gMTApIHJldHVybiAnIzREQzNGRic7XG4gICAgaWYgKHNjb3JlID49IDUpIHJldHVybiAnIzhBRDhGRic7XG4gICAgaWYgKHNjb3JlID49IDIpIHJldHVybiAnI0JERThGRic7XG4gICAgcmV0dXJuICcjRDlGMUZGJztcbiAgfVxuXG4gIGhhc1NlYXJjaE1hdGNoKGxpc3Q6IGFueVtdLCBzZWFyY2g6IHN0cmluZywga2V5MTogc3RyaW5nLCBrZXkyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXNlYXJjaCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcSA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBsaXN0LnNvbWUoaXRlbSA9PiAoKGl0ZW1ba2V5MV0gfHwgaXRlbVtrZXkyXSB8fCAnJykgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgfVxuXG4gIE1hdGggPSBNYXRoO1xuXG4gIC8vIERpc3BsYXktb25seSBsYWJlbCBvdmVycmlkZXMuIEJhY2tlbmQgdmFsdWVzIGFuZCBJRHMgYXJlIHVudG91Y2hlZC5cbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5TmFtZU92ZXJyaWRlczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgJ2N1c3RvbSBwaXRjaCBwb2ludHMgZGlzY292ZXJ5JzogJ1VuaXF1ZSBQaXRjaCBEaXNjb3ZlcnknXG4gIH07XG5cbiAgZGlzcGxheU5hbWUobmFtZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBzID0gKG5hbWUgPz8gJycpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qga2V5ID0gcy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZU92ZXJyaWRlc1trZXldIHx8IHM7XG4gIH1cblxuICAvLyDilIDilIAgQm9vbGVhbl9iYXNrZXRfY2hhcnQgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8g4pSA4pSAIEJPT0xFQU5fQkFTS0VUX1RBQkxFIG92ZXJmbG93IHRvb2x0aXAgKGZsb2F0aW5nKSDilIDilIDilIBcbiAgYmJ0VG9vbHRpcDogeyB2aXNpYmxlOiBib29sZWFuOyB4OiBudW1iZXI7IHk6IG51bWJlcjsgaXRlbXM6IHN0cmluZ1tdIH0gPSB7XG4gICAgdmlzaWJsZTogZmFsc2UsIHg6IDAsIHk6IDAsIGl0ZW1zOiBbXVxuICB9O1xuXG4gIHNob3dCYnRUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYXBwcm94V2lkdGggPSAyMjA7XG4gICAgY29uc3QgbWFyZ2luID0gMTI7XG4gICAgY29uc3QgdncgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBsZXQgeCA9IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyO1xuICAgIGNvbnN0IGhhbGZXaWR0aCA9IGFwcHJveFdpZHRoIC8gMjtcbiAgICBpZiAoeCArIGhhbGZXaWR0aCA+IHZ3IC0gbWFyZ2luKSB4ID0gdncgLSBtYXJnaW4gLSBoYWxmV2lkdGg7XG4gICAgaWYgKHggLSBoYWxmV2lkdGggPCBtYXJnaW4pIHggPSBtYXJnaW4gKyBoYWxmV2lkdGg7XG4gICAgdGhpcy5iYnRUb29sdGlwID0ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHgsXG4gICAgICB5OiByZWN0LnRvcCAtIDgsXG4gICAgICBpdGVtc1xuICAgIH07XG4gIH1cblxuICBoaWRlQmJ0VG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLmJidFRvb2x0aXAgPSB7IHZpc2libGU6IGZhbHNlLCB4OiAwLCB5OiAwLCBpdGVtczogW10gfTtcbiAgfVxuXG4gIGV4cG9ydEJidENhcmQoY2FyZDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFjYXJkIHx8ICFBcnJheS5pc0FycmF5KGNhcmQudGFibGVSb3dzKSB8fCBjYXJkLnRhYmxlUm93cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gY2FyZC50YWJsZVJvd3MubWFwKChyOiBhbnkpID0+ICh7XG4gICAgICBCcmFuZDogci5icmFuZCB8fCAnJyxcbiAgICAgIEF0dHJpYnV0ZXM6IEFycmF5LmlzQXJyYXkoci5hbGxBdHRyaWJ1dGVzKSA/IHIuYWxsQXR0cmlidXRlcy5qb2luKCcsICcpIDogJycsXG4gICAgICBDb3VudDogci5jb3VudCA/PyAwXG4gICAgfSkpO1xuICAgIGNvbnN0IHdvcmtzaGVldDogWExTWC5Xb3JrU2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQocm93cyk7XG4gICAgd29ya3NoZWV0WychY29scyddID0gW3sgd2NoOiAyOCB9LCB7IHdjaDogODAgfSwgeyB3Y2g6IDEwIH1dO1xuICAgIGNvbnN0IHdvcmtib29rOiBYTFNYLldvcmtCb29rID0geyBTaGVldHM6IHsgRGF0YTogd29ya3NoZWV0IH0sIFNoZWV0TmFtZXM6IFsnRGF0YSddIH07XG4gICAgY29uc3QgYnVmZmVyOiBhbnkgPSBYTFNYLndyaXRlKHdvcmtib29rLCB7IGJvb2tUeXBlOiAneGxzeCcsIHR5cGU6ICdhcnJheScgfSk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgIGNvbnN0IHNhZmVOYW1lID0gKGNhcmQubmFtZSB8fCAnY2FyZCcpLnRvU3RyaW5nKCkucmVwbGFjZSgvW15hLXowLTktX10rL2dpLCAnXycpO1xuICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7c2FmZU5hbWV9Lnhsc3hgKTtcbiAgfVxuXG4gIHNlbGVjdFBpZVNsaWNlKGNhcmQ6IGFueSwgc2xpY2U6IGFueSk6IHZvaWQge1xuICAgIGNhcmQuc2VsZWN0ZWRQaWVMYWJlbCA9IHNsaWNlLmxhYmVsO1xuICB9XG5cbiAgc2VsZWN0QmFza2V0S2V5d29yZChjYXJkOiBhbnksIHJvdzogYW55KTogdm9pZCB7XG4gICAgY2FyZC5zZWxlY3RlZEtleXdvcmQgPSByb3cubGFiZWw7XG4gICAgY2FyZC5zZWxlY3RlZEtleXdvcmRDb3VudCA9IHJvdy5jb3VudCB8fCAwO1xuICAgIGNhcmQuc2VsZWN0ZWRTbGljZXMgPSByb3cuc2xpY2VzIHx8IFtdO1xuICAgIGNhcmQuc2VsZWN0ZWRTZW50aW1lbnQgPSBjYXJkLnNlbGVjdGVkU2xpY2VzLmZpbmQoKHM6IGFueSkgPT4gcy5wZXJjZW50ID4gMCkgfHwgY2FyZC5zZWxlY3RlZFNsaWNlc1swXSB8fCBudWxsO1xuICAgIGNhcmQuc2VsZWN0ZWRTdGFja2VkQmFycyA9IHJvdy5zdGFja2VkQmFycyB8fCBbXTtcbiAgICBjYXJkLnNlbGVjdGVkTGVnZW5kID0gcm93LmxlZ2VuZCB8fCBbXTtcbiAgfVxuXG4gIHNlbGVjdEJhc2tldFNlbnRpbWVudChjYXJkOiBhbnksIHNsaWNlOiBhbnkpOiB2b2lkIHtcbiAgICBjYXJkLnNlbGVjdGVkU2VudGltZW50ID0gc2xpY2U7XG4gIH1cblxuICAvLyBCdWlsZCBzdHJva2UtZGFzaGFycmF5IG9mZnNldCBzZWdtZW50cyBmb3IgZG9udXQgcmluZ1xuICBnZXREb251dERhc2goc2xpY2U6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IDIgKiBNYXRoLlBJICogNDI7IC8vIHI9NDJcbiAgICBjb25zdCBsZW4gPSAoc2xpY2UucGVyY2VudCAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlO1xuICAgIHJldHVybiBgJHtsZW59ICR7Y2lyY3VtZmVyZW5jZSAtIGxlbn1gO1xuICB9XG5cbiAgZ2V0RG9udXRPZmZzZXQoaW5kZXg6IG51bWJlciwgY2FyZDogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiA0MjtcbiAgICBjb25zdCBzbGljZXMgPSBjYXJkLnNlbGVjdGVkU2xpY2VzIHx8IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgb2Zmc2V0ICs9IChzbGljZXNbaV0ucGVyY2VudCAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlO1xuICAgIH1cbiAgICByZXR1cm4gLW9mZnNldDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImVjaG8tcGFnZVwiPlxuICA8IS0tIEZsb2F0aW5nIHRvb2x0aXAgZm9yIEJPT0xFQU5fQkFTS0VUX1RBQkxFIG92ZXJmbG93IGNoaXBzIC0tPlxuICA8ZGl2IGNsYXNzPVwiYmJ0LWZsb2F0LXRvb2x0aXBcIlxuICAgICAgICpuZ0lmPVwiYmJ0VG9vbHRpcC52aXNpYmxlXCJcbiAgICAgICBbc3R5bGUubGVmdC5weF09XCJiYnRUb29sdGlwLnhcIlxuICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmJ0VG9vbHRpcC55XCI+XG4gICAgPHNwYW4gKm5nRm9yPVwibGV0IG92IG9mIGJidFRvb2x0aXAuaXRlbXNcIiBjbGFzcz1cImJidC1jaGlwLXRvb2x0aXAtaXRlbVwiPnt7IG92IH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImVjaG8tY29udGVudFwiPlxuXG4gICAgPCEtLSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgQ09OVkVSU0FUSU9OUyBUQUIg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZSA9PT0gJ2NvbnZlcnNhdGlvbnMnXCI+XG5cbiAgICAgIDwhLS0gVGFuZ28gQUkgSGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tYWktbG9nb1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNlwiIGhlaWdodD1cIjI2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI2ZmZlwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDJsMi4wOSA2LjI2TDIwIDEwbC01LjkxIDEuNzRMMTIgMThsLTIuMDktNi4yNkw0IDEwbDUuOTEtMS43NEwxMiAyelwiLz48L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS1oZWFkZXItdGV4dFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS10aXRsZVwiPlRhbmdvIEFJPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLXN1YnRpdGxlXCI+QW5hbHlzZSBjb252ZXJzYXRpb25zLCBzdG9yZXMgJiBzdGFmZiBwZXJmb3JtYW5jZTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlYXJjaCBDYXJkIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVjaG8tc2VhcmNoLWNhcmRcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJlY2hvLXNlYXJjaC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQXNrIGFueXRoaW5nLi4uICdXaGljaCBzdG9yZXMgYXJlIG5vdCBwZXJmb3JtaW5nIHdlbGw/J1wiIFsobmdNb2RlbCldPVwiY29udlNlYXJjaFF1ZXJ5XCIgKGtleXVwLmVudGVyKT1cInNlbmRDb252UXVlcnkoKVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZWNoby1zZWFyY2gtc2VuZFwiIChjbGljayk9XCJzZW5kQ29udlF1ZXJ5KClcIiBbZGlzYWJsZWRdPVwiIWNvbnZTZWFyY2hRdWVyeT8udHJpbSgpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+XG4gICAgICAgICAgICA8bGluZSB4MT1cIjIyXCIgeTE9XCIyXCIgeDI9XCIxMVwiIHkyPVwiMTNcIj48L2xpbmU+XG4gICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIyMiAyIDE1IDIyIDExIDEzIDIgOSAyMiAyXCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFJIFJlc3BvbnNlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVjaG8tYWktcmVzcG9uc2VcIiAqbmdJZj1cImNvbnZBaUxvYWRpbmcgfHwgY29udkFpUmVwbHlcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbnZBaUxvYWRpbmdcIiBjbGFzcz1cInR5cGluZ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwaW5nLWRvdFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInR5cGluZy1kb3RcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJ0eXBpbmctZG90XCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgKm5nSWY9XCIhY29udkFpTG9hZGluZyAmJiBjb252QWlSZXBseVwiIGNsYXNzPVwiZWNoby1haS10ZXh0XCI+e3sgY29udkFpUmVwbHkgfX08L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUb3RhbCBjb3VudCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLWNvbnYtY291bnRcIj57eyBjb252VG90YWwgfX0gQ29udmVyc2F0aW9uczwvZGl2PlxuXG4gICAgICA8IS0tIENvbnZlcnNhdGlvbnMgbGlzdCBhcmVhIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnZlcnNhdGlvbnMtc2VjdGlvblwiPlxuXG4gICAgICA8IS0tIExvYWRpbmcgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29udkxvYWRpbmdcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGVcIj5Mb2FkaW5nIGNvbnZlcnNhdGlvbnMuLi48L2Rpdj5cblxuICAgICAgPCEtLSBDb252ZXJzYXRpb24gY2FyZHMgKGR5bmFtaWMgZnJvbSBBUEkg4oCUIHNhbWUgcGF0dGVybiBhcyB0cmFuc2NyaXB0LWxpc3QpIC0tPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29udiBvZiBjb252ZXJzYXRpb25zOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cImNvbnYtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29udkV4cGFuZChjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtaGVhZGVyLWJvZHlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LW1ldGEtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udi1pZFwiPnt7IGNvbnYuYXVkaW9JZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZyBicmFuZFwiICpuZ0lmPVwiY29udi5zdG9yZU5hbWVcIj57eyBjb252LnN0b3JlTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi5sb2NhdGlvblwiPnt7IGNvbnYubG9jYXRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYudXNlck5hbWVcIj57eyBjb252LnVzZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LmRhdGVcIj57eyBjb252LmRhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWcgbWV0YS10YWctLWR1cmF0aW9uXCIgKm5nSWY9XCJjb252LmR1cmF0aW9uXCI+e3sgY29udi5kdXJhdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAge3sgY29udi5hdWRpb0Rlc2NyaXB0aW9uIHx8ICdObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUnIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1jaGV2cm9uXCIgW2NsYXNzLm9wZW5dPVwiZXhwYW5kZWRDb252SWRzW2NvbnYuYXVkaW9JZF1cIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk0QTNCOFwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTYgOWw2IDYgNi02XCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEV4cGFuZGVkIGJvZHkgKHVuaWZpZWQgbGF5b3V0IG1hdGNoaW5nIEFnZW50IEFuYWx5c2lzIGRlc2lnbikgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleHBhbmRlZENvbnZJZHNbY29udi5hdWRpb0lkXVwiIGNsYXNzPVwiY29udi1ib2R5LWV4cGFuZGVkXCI+XG5cbiAgICAgICAgICA8IS0tIFdhdmVmb3JtIHBsYXllciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1wbGF5ZXJcIiAqbmdJZj1cImNvbnYuYXVkaW9VcmxcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlY2hvLXBsYXktYnRuXCIgW2NsYXNzLnBsYXlpbmddPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgKGNsaWNrKT1cInRvZ2dsZVBsYXkoY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicGxheWluZ0NvbnZJZCAhPT0gY29udi5hdWRpb0lkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPjxwYXRoIGQ9XCJNOCA1djE0bDExLTd6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPjxwYXRoIGQ9XCJNNiAxOWg0VjVINnYxNHptOC0xNHYxNGg0VjVoLTR6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby13YXZlZm9ybVwiIFtjbGFzcy53Zi1wbGF5aW5nXT1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIChjbGljayk9XCJzZWVrQXVkaW8oJGV2ZW50LCBjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXdmLWJhclwiICpuZ0Zvcj1cImxldCBoIG9mIHdhdmVmb3JtSGVpZ2h0czsgbGV0IGkgPSBpbmRleFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnBsYXllZF09XCIocGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8ucHJvZ3Jlc3MgfHwgMCkgPiBpIC8gd2F2ZWZvcm1IZWlnaHRzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlY2hvLXRpbWVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWQgJiYgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8uY3VycmVudFRpbWVcIj57eyBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdLmN1cnJlbnRUaW1lIH19IC8gPC9zcGFuPnt7IHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LnRvdGFsVGltZSB8fCBjb252LmR1cmF0aW9uIHx8ICctLScgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxhdWRpbyBbaWRdPVwiJ2F1ZGlvLScgKyBjb252LmF1ZGlvSWRcIiBbc3JjXT1cImNvbnYuYXVkaW9VcmxcIiBwcmVsb2FkPVwiYXV0b1wiXG4gICAgICAgICAgICAgICh0aW1ldXBkYXRlKT1cIm9uVGltZVVwZGF0ZShhdWRpb0VsLCBjb252LmF1ZGlvSWQpXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uTG9hZGVkTWV0YWRhdGEoYXVkaW9FbCwgY29udi5hdWRpb0lkLCBjb252LmR1cmF0aW9uKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJwbGF5aW5nQ29udklkID0gbnVsbFwiICNhdWRpb0VsPjwvYXVkaW8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN1bW1hcnkgQ29udGVudCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1ib2R5LXBhZGRpbmdcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic3VtbWFyeS10ZXh0XCI+e3sgY29udi5hdWRpb0Rlc2NyaXB0aW9uIHx8IGNvbnYuY29udmVyc2F0aW9uRGV0YWlscz8uYXVkaW9TdW1tYXJ5IHx8ICdObyBzdW1tYXJ5IGF2YWlsYWJsZScgfX08L3A+XG4gICAgICAgICAgICA8IS0tIEFJIEluc2lnaHRzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnYuYWlJbnNpZ2h0cz8uc3VtbWFyeT8ubGVuZ3RoXCIgY2xhc3M9XCJhaS1pbnNpZ2h0cy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1pbnNpZ2h0cy1sYWJlbFwiPkFJIEluc2lnaHRzPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGluc2lnaHQgb2YgY29udi5haUluc2lnaHRzLnN1bW1hcnlcIiBjbGFzcz1cImFpLWluc2lnaHQtcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWluc2lnaHQtZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiaW5zaWdodC50eXBlID09PSAncG9zaXRpdmUnID8gJyMwMEEzRkYnIDogaW5zaWdodC50eXBlID09PSAnbmVnYXRpdmUnID8gJyNFRjQ0NDQnIDogJyNGNTlFMEInXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1pbnNpZ2h0LXRleHRcIj57eyBpbnNpZ2h0LnRleHQgfHwgaW5zaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBObyBkYXRhIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFjb252TG9hZGluZyAmJiBjb252ZXJzYXRpb25zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZWNoby1ub2RhdGEtc3RhdGVcIj5cbiAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIk5vIGRhdGFcIiBjbGFzcz1cImVjaG8tbm9kYXRhLWltZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1ub2RhdGEtdGl0bGVcIj5ObyBjb252ZXJzYXRpb25zIGZvdW5kPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdWJcIj5ObyBjb252ZXJzYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHNlbGVjdGVkIGRhdGUgcmFuZ2UgYW5kIHN0b3Jlcy48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgICA8bGliLXBhZ2luYXRpb24gKm5nSWY9XCJjb252VG90YWwgPiAwXCIgW2l0ZW1zUGVyUGFnZV09XCJjb252UGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjb252UGFnZVwiIFt0b3RhbEl0ZW1zXT1cImNvbnZUb3RhbFwiXG4gICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwiY29udlBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJjb252UGVyUGFnZVwiIChwYWdlQ2hhbmdlKT1cIm9uQ29udlBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvbkNvbnZQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgIDwvZGl2PiA8IS0tIGVuZCBjb252ZXJzYXRpb25zLXNlY3Rpb24gLS0+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBBR0VOVCBBTkFMWVNJUyBUQUIg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnXCI+XG5cbiAgICAgIDwhLS0g4pSA4pSAIE9WRVJWSUVXOiBBZ2VudCBDYXJkcyBHcmlkIOKUgOKUgCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGV0YWlsVmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLW92ZXJ2aWV3LWhlYWRlclwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLW92ZXJ2aWV3LXRpdGxlXCI+QW5hbHl0aWNzIE92ZXJ2aWV3PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLW92ZXJ2aWV3LXN1YnRpdGxlXCI+e3sgY29ob3J0TGlzdC5sZW5ndGggfX0gYWN0aXZlIGFnZW50czwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tc2VhcmNoLXdyYXBcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImFuYWx5c2lzU2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWdlbnRz4oCmXCIgY2xhc3M9XCJlY2hvLWlubGluZS1pbnB1dFwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29ob3J0TGlzdC5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGUtLW11dGVkXCI+TG9hZGluZyBhZ2VudHMuLi48L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWdyaWRcIiBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cIidyZXBlYXQoJyArIE1hdGgubWluKGNvaG9ydExpc3QubGVuZ3RoLCA0KSArICcsIDFmciknXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29ob3J0IG9mIGNvaG9ydExpc3Q7IHRyYWNrQnk6IHRyYWNrQnlJZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkXCIgKm5nSWY9XCIhYW5hbHlzaXNTZWFyY2ggfHwgKGNvaG9ydC5jb2hvcnROYW1lIHx8IGNvaG9ydC5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGFuYWx5c2lzU2VhcmNoLnRvTG93ZXJDYXNlKCkpXCIgKGNsaWNrKT1cInNlbGVjdENvaG9ydERldGFpbChjb2hvcnQpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtdG9wLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkLW5hbWVcIj57eyBkaXNwbGF5TmFtZShjb2hvcnQuY29ob3J0TmFtZSB8fCBjb2hvcnQubmFtZSkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtYmFkZ2UtYWN0aXZlXCI+QWN0aXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gbWV0cmljcyAmIHN0b3JlcyBiYWRnZXMgaGlkZGVuIGZvciBub3cgLS0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtc3BhY2VyXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFuYWx5dGljcy1ob3Zlci1saW5rXCI+VmlldyBhbmFseXRpY3Mg4oaSPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIOKUgOKUgCBERVRBSUw6IFNlbGVjdGVkIENvaG9ydCBNZXRyaWNzICsgQ29udmVyc2F0aW9ucyDilIDilIAgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsVmlld1wiPlxuXG4gICAgICAgIDwhLS0gSGVhZGVyOiDihpAgQmFjayArIFRpdGxlICsgQ29udmVyc2F0aW9ucyArIERyb3Bkb3duIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWhlYWRlci1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGV0YWlsLWJhY2stYnRuXCIgKGNsaWNrKT1cImJhY2tUb092ZXJ2aWV3KClcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTUgMThsLTYtNiA2LTZcIi8+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtaGVhZGVyLXRpdGxlXCI+e3sgZGlzcGxheU5hbWUoc2VsZWN0ZWRDb2hvcnROYW1lKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBBdWRpbyBTb3VyY2UgZmlsdGVyIChPdmVyYWxsIFRyYW5zY3JpcHRzIG9ubHkpIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc092ZXJhbGxUcmFuc2NyaXB0c0NvaG9ydCAmJiBhdWRpb1NvdXJjZU9wdGlvbnMubGVuZ3RoXCIgY2xhc3M9XCJhZ2VudC1kcm9wZG93bi13cmFwIG1lLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kcm9wZG93bi10cmlnZ2VyXCIgKGNsaWNrKT1cInRvZ2dsZUF1ZGlvU291cmNlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvaG9ydC1kZC10cmlnZ2VyLW5hbWVcIj57eyBzZWxlY3RlZEF1ZGlvU291cmNlTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBbc3R5bGUudHJhbnNmb3JtXT1cImF1ZGlvU291cmNlRHJvcGRvd25PcGVuID8gJ3JvdGF0ZSgxODBkZWcpJyA6ICdub25lJ1wiPjxwYXRoIGQ9XCJNNiA5bDYgNiA2LTZcIi8+PC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJhdWRpb1NvdXJjZURyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLXNjcm9sbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdCBvZiBhdWRpb1NvdXJjZU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZ2VudC1kZC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJvcHQudmFsdWUgPT09IHNlbGVjdGVkQXVkaW9Tb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEF1ZGlvU291cmNlKG9wdClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2hvcnQtZGQtaXRlbS1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kZC1uYW1lXCI+e3sgb3B0LmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJvcHQudmFsdWUgPT09IHNlbGVjdGVkQXVkaW9Tb3VyY2VcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjAgNkw5IDE3bC01LTVcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXVkaW9Tb3VyY2VEcm9wZG93bk9wZW5cIiBjbGFzcz1cImNvaG9ydC1kZC1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZUF1ZGlvU291cmNlRHJvcGRvd24oKVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtaGVhZGVyLWNvbnYtY291bnRcIj5Ub3RhbCBDb252ZXJzYXRpb25zOiB7eyB0b3RhbEF1ZGlvIH19PC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBDb2hvcnQgRHJvcGRvd24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLXdyYXBcIiBbY2xhc3MuaXMtbG9hZGluZ109XCJpc0NvaG9ydExvYWRpbmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kcm9wZG93bi10cmlnZ2VyXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzQ29ob3J0TG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNDb2hvcnRMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvaG9ydERyb3Bkb3duKClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1kb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2hvcnQtZGQtdHJpZ2dlci1uYW1lXCI+e3sgZGlzcGxheU5hbWUoc2VsZWN0ZWRDb2hvcnROYW1lKSB8fCAnU2VsZWN0IEFnZW50JyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc0NvaG9ydExvYWRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIFtzdHlsZS50cmFuc2Zvcm1dPVwiY29ob3J0RHJvcGRvd25PcGVuID8gJ3JvdGF0ZSgxODBkZWcpJyA6ICdub25lJ1wiPjxwYXRoIGQ9XCJNNiA5bDYgNiA2LTZcIi8+PC9zdmc+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0NvaG9ydExvYWRpbmdcIiBjbGFzcz1cImNvaG9ydC1kZC1zcGlubmVyXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDJhMTAgMTAgMCAwIDEgMTAgMTBcIi8+PC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJjb2hvcnREcm9wZG93bk9wZW4gJiYgIWlzQ29ob3J0TG9hZGluZ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLXNlYXJjaC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1zZWFyY2gtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImNvaG9ydERyb3Bkb3duU2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWdlbnRz4oCmXCIgY2xhc3M9XCJlY2hvLWlubGluZS1pbnB1dC0tc21hbGxcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2hvcnQtZGQtc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZERyb3Bkb3duQ29ob3J0czsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJhZ2VudC1kZC1pdGVtXCIgW2NsYXNzLnNlbGVjdGVkXT1cIihjLmNvaG9ydElkIHx8IGMuaWQgfHwgYy5faWQpID09PSBzZWxlY3RlZENvaG9ydElkXCIgKGNsaWNrKT1cInNlbGVjdENvaG9ydEZyb21Ecm9wZG93bihjKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImMubWV0cmljc0FkZGVkID4gMCA/ICcjMTBCOTgxJyA6ICcjRDBENUREJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRkLW5hbWVcIj57eyBkaXNwbGF5TmFtZShjLmNvaG9ydE5hbWUgfHwgYy5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtZGQtbWV0YVwiPnt7IGMubWV0cmljc0FkZGVkIHx8IDAgfX0gbWV0cmljczwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiKGMuY29ob3J0SWQgfHwgYy5pZCB8fCBjLl9pZCkgPT09IHNlbGVjdGVkQ29ob3J0SWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjAgNkw5IDE3bC01LTVcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkRHJvcGRvd25Db2hvcnRzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY29ob3J0LWRkLW5vLXJlc3VsdHNcIj5ObyBhZ2VudHMgZm91bmQ8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2hvcnREcm9wZG93bk9wZW4gJiYgIWlzQ29ob3J0TG9hZGluZ1wiIGNsYXNzPVwiY29ob3J0LWRkLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlQ29ob3J0RHJvcGRvd24oKVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIExvYWRpbmcgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYXJkc0xvYWRpbmdcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGUtLW11dGVkXCI+TG9hZGluZyBtZXRyaWNzLi4uPC9kaXY+XG5cbiAgICAgICAgPCEtLSBOdW1lcmljIHNjb3JlcyDigJQgZnVsbC13aWR0aCBzdGF0IHN0cmlwIGFib3ZlIGNhcmRzIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNhcmRzTG9hZGluZyAmJiBudW1lcmljU3RyaXBDYXJkPy5udW1lcmljUm93cz8ubGVuZ3RoXCIgY2xhc3M9XCJudW1lcmljLXN0YXQtc3RyaXBcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgbnVtZXJpY1N0cmlwQ2FyZC5udW1lcmljUm93czsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cIm51bWVyaWMtc3RhdC10aWxlXCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdC1jb2xvcl09XCJnZXROdW1lcmljVGlsZUNvbG9yKGkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVtZXJpYy1zdGF0LWxhYmVsXCI+e3sgcm93Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudW1lcmljLXN0YXQtdmFsdWVcIiBbc3R5bGUuY29sb3JdPVwiZ2V0TnVtZXJpY1RpbGVDb2xvcihpKVwiPlxuICAgICAgICAgICAgICB7eyByb3cuYXZnIH19PHNwYW4gKm5nSWY9XCJyb3cubWF4ICE9PSBudWxsXCIgY2xhc3M9XCJudW1lcmljLXN0YXQtbWF4XCI+L3t7IHJvdy5tYXggfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudW1lcmljLXN0YXQtc3ViXCIgKm5nSWY9XCJyb3cubWF4ICE9PSBudWxsICYmIHJvdy5taW4gIT09IG51bGxcIj5cbiAgICAgICAgICAgICAgc2NhbGUge3sgcm93Lm1pbiB9feKAk3t7IHJvdy5tYXggfX17eyByb3cuZGVzY3JpcHRpb24gPyAnIMK3ICcgKyByb3cuZGVzY3JpcHRpb24gOiAnJyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTWV0cmljIENhcmRzIChkeW5hbWljIGNvbHVtbnMgYmFzZWQgb24gY2FyZCBjb3VudCkgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhY2FyZHNMb2FkaW5nICYmIG5vbk51bWVyaWNDYXJkcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJtZXRyaWMtY2FyZHMtZHluYW1pY1wiXG4gICAgICAgICAgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCIncmVwZWF0KCcgKyBNYXRoLm1pbihub25OdW1lcmljQ2FyZHMubGVuZ3RoLCA0KSArICcsIDFmciknXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2FyZCBvZiBub25OdW1lcmljQ2FyZHM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiIGNsYXNzPVwibWV0cmljLWNhcmQtZHluYW1pY1wiXG4gICAgICAgICAgICAgICBbY2xhc3MubWV0cmljLWNhcmQtZHluYW1pYy0td2lkZV09XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9CQVInIHx8IGNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJyB8fCBjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9DSEFSVCcgfHwgKGNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUJyAmJiBjYXJkLmlzRnVubmVsKVwiXG4gICAgICAgICAgICAgICBbY2xhc3MubWV0cmljLWNhcmQtZHluYW1pYy0tZnVsbF09XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9TRVBPUkFUT1InXCI+XG4gICAgICAgICAgICA8IS0tIENhcmQgSGVhZGVyOiBUaXRsZSArIFN0YXR1cyBCYWRnZSArIEluZm8gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtdGl0bGVcIj57eyBkaXNwbGF5TmFtZShjYXJkLm5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtY2FyZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYXJkLnN0YXR1c1wiIGNsYXNzPVwibWV0cmljLXN0YXR1cy1iYWRnZVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTdGF0dXNCYWRnZShjYXJkLnN0YXR1cykuYmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFN0YXR1c0JhZGdlKGNhcmQuc3RhdHVzKS5jb2xvclwiPnt7IGNhcmQuc3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWV0cmljLWV4cG9ydC1idG5cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRSdcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBvcnQgdG8gRXhjZWxcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydEJidENhcmQoY2FyZClcIj48c3Bhbj5FeHBvcnQ8L3NwYW4+IFxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00XCIvPjxwb2x5bGluZSBwb2ludHM9XCI3IDEwIDEyIDE1IDE3IDEwXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE1XCIgeDI9XCIxMlwiIHkyPVwiM1wiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWluZm8taWNvblwiICpuZ0lmPVwiY2FyZC5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtaW5mby10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgY2FyZC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtc3VidGl0bGVcIiAqbmdJZj1cImNhcmQudHlwZSAhPT0gJ05VTUVSSUNfU0NBTEFSJyAmJiBjYXJkLnR5cGUgIT09ICdOVU1FUklDX0FSUkFZJ1wiPnt7IGNhcmQuYXBwbGljYWJsZUNvdW50ID8/IHRvdGFsQXVkaW8gfX0gY29udmVyc2F0aW9uczwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVF9UQUJMRSDigJQgYnJhbmQgcm93cyB3aXRoIGF0dHJpYnV0ZSBjaGlwcyArIGNvdW50IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC50YWJsZVJvd3NcIiBjbGFzcz1cImJidC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnQtYnJhbmRcIiBbdGl0bGVdPVwicm93LmJyYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlBbmFseXNpc0NsaWNrKHJvdywgdW5kZWZpbmVkLCAkZXZlbnQpXCI+e3sgcm93LmJyYW5kIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LWNoaXBzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBjaGlwIG9mIHJvdy52aXNpYmxlQ2hpcHNcIiBjbGFzcz1cImJidC1jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlBbmFseXNpc0NsaWNrKHJvdywgY2hpcCwgJGV2ZW50KVwiPnt7IGNoaXAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93Lm92ZXJmbG93Q291bnQgPiAwXCIgY2xhc3M9XCJiYnQtY2hpcCBiYnQtY2hpcC0tbW9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNob3dCYnRUb29sdGlwKCRldmVudCwgcm93Lm92ZXJmbG93Q2hpcHMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGlkZUJidFRvb2x0aXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhdGVnb3J5QW5hbHlzaXNDbGljayhyb3csIHVuZGVmaW5lZCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICt7eyByb3cub3ZlcmZsb3dDb3VudCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnQtY291bnRcIiAoY2xpY2spPVwib25DYXRlZ29yeUFuYWx5c2lzQ2xpY2socm93LCB1bmRlZmluZWQsICRldmVudClcIj57eyByb3cuY291bnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVF9CQVIg4oCUIGNhdGVnb3J5IGxpc3QgKyBwaWUgY2hhcnQgKyBsZWdlbmQgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNsaWNlIG9mIGNhcmQucGllU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYmItbGlzdC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJiLWxpc3Qtcm93LS1hY3RpdmVdPVwiY2FyZC5zZWxlY3RlZFBpZUxhYmVsID09PSBzbGljZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQaWVTbGljZShjYXJkLCBzbGljZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmItbGlzdC1sYWJlbFwiIFt0aXRsZV09XCJzbGljZS5sYWJlbFwiPnt7IHNsaWNlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYi1waWUtY29sXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLXBpZS13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJiYmItcGllXCIgdmlld0JveD1cIjAgMCAxMDAgMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggKm5nRm9yPVwibGV0IHNsaWNlIG9mIGNhcmQucGllU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kXT1cInNsaWNlLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwic2xpY2UuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJiYi1waWUtc2xpY2UtLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkUGllTGFiZWwgPT09IHNsaWNlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGllU2xpY2UoY2FyZCwgc2xpY2UpXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmItbGVnZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNsaWNlIG9mIGNhcmQucGllU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYi1sZWdlbmQtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJiLWxlZ2VuZC1yb3ctLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkUGllTGFiZWwgPT09IHNsaWNlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGllU2xpY2UoY2FyZCwgc2xpY2UpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmItbGVnZW5kLWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInNsaWNlLmNvbG9yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJiLWxlZ2VuZC1sYWJlbFwiPnt7IHNsaWNlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJiLWxlZ2VuZC1wY3RcIj57eyBzbGljZS5wZXJjZW50IH19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gQm9vbGVhbl9iYXNrZXRfY2hhcnQg4oCUIGtleXdvcmQgbGlzdCArIHNlbnRpbWVudCBkb251dCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9DSEFSVCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1rZXl3b3JkLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBjYXJkLmtleXdvcmRSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYmMta2V5d29yZC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJjLWtleXdvcmQtcm93LS1hY3RpdmVdPVwiY2FyZC5zZWxlY3RlZEtleXdvcmQgPT09IHJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RCYXNrZXRLZXl3b3JkKGNhcmQsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmMta2V5d29yZC1sYWJlbFwiIFt0aXRsZV09XCJyb3cubGFiZWxcIj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJjLWtleXdvcmQtY291bnRcIj57eyByb3cuY291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLWNoYXJ0LXNpZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtc3RhY2stbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBiYXIgb2YgY2FyZC5zZWxlY3RlZFN0YWNrZWRCYXJzXCIgY2xhc3M9XCJiYmMtc3RhY2stcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1zdGFjay1sYWJlbFwiPnt7IGJhci5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtc3RhY2stdHJhY2tcIiBbY2xhc3MuYmJjLXN0YWNrLXRyYWNrLS1lbXB0eV09XCJiYXIudG90YWwgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlZyBvZiBiYXIuc2VnbWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYy1zdGFjay1zZWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJzZWcucGVyY2VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInNlZy5jb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNlZy5wZXJjZW50ID49IDEwXCIgY2xhc3M9XCJiYmMtc3RhY2stc2VnLXRleHRcIj57eyBzZWcucGVyY2VudCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtc3RhY2stdG9vbHRpcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtc3RhY2stdG9vbHRpcC10aXRsZVwiPnt7IGJhci5sYWJlbCB9fSDCtyB7eyBzZWcubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLXN0YWNrLXRvb2x0aXAtYm9keVwiPnt7IHNlZy5jb3VudCB9fSAoe3sgc2VnLnBlcmNlbnQgfX0lKTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1zdGFjay1heGlzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+MCU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+MjUlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjUwJTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj43NSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+MTAwJTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1sZWdlbmQtZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNhcmQuc2VsZWN0ZWRMZWdlbmRcIiBjbGFzcz1cImJiYy1sZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJjLWxlZ2VuZC1zd2F0Y2hcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJpdGVtLmNvbG9yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJjLWxlZ2VuZC10ZXh0XCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVF9TRVBPUkFUT1Ig4oCUIHR3byBsaXN0IHBhbmVscyAoY29udGVudCB0YWdzICsgbWVhc3VyZW1lbnRzKSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9TRVBPUkFUT1InXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtZ3JpZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtcGFuZWwtaGVhZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsLXRpdGxlXCI+Q2F0ZWdvcmllczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsLXN1YlwiPnt7IGNhcmQudGFnUm93cz8ubGVuZ3RoIHx8IDAgfX0gaXRlbXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtcm93IGJicy1yb3ctY2xpY2thYmxlXCIgKm5nRm9yPVwibGV0IHIgb2YgY2FyZC50YWdSb3dzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJzLXJvdy10b3BdPVwiaSA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJicy1yb3ctc2VsZWN0ZWRdPVwiKHIuaWQgJiYgc2VsZWN0ZWRDYXJkSWQgPT09IHIuaWQpIHx8ICghci5pZCAmJiBzZWxlY3RlZENhcmROYW1lID09PSByLmxhYmVsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKHIuaWQsIHIubGFiZWwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYnMtcm93LWxhYmVsXCIgW3RpdGxlXT1cInIubGFiZWxcIj57eyByLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJzLXJvdy1jb3VudFwiPnt7IHIuY291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLWVtcHR5XCIgKm5nSWY9XCIhY2FyZC50YWdSb3dzPy5sZW5ndGhcIj5ObyBkYXRhPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzLXBhbmVsLWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1wYW5lbC10aXRsZVwiPnt7IGNhcmQubWVhc3VyZVRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtcGFuZWwtc3ViXCI+e3sgY2FyZC5tZWFzdXJlU3VidGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnMtcm93IGJicy1yb3ctY2xpY2thYmxlXCIgKm5nRm9yPVwibGV0IHIgb2YgY2FyZC5tZWFzdXJlUm93czsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJicy1yb3ctdG9wXT1cImkgPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYnMtcm93LXNlbGVjdGVkXT1cIihyLmlkICYmIHNlbGVjdGVkQ2FyZElkID09PSByLmlkKSB8fCAoIXIuaWQgJiYgc2VsZWN0ZWRDYXJkTmFtZSA9PT0gci5sYWJlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhcmRSb3dDbGljayhyLmlkLCByLmxhYmVsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJzLXJvdy1sYWJlbFwiIFt0aXRsZV09XCJyLmxhYmVsXCI+e3sgci5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJicy1yb3ctY291bnRcIj57eyByLmNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJicy1lbXB0eVwiICpuZ0lmPVwiIWNhcmQubWVhc3VyZVJvd3M/Lmxlbmd0aFwiPk5vIGRhdGE8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEJPT0xFQU5fQkFTS0VUIOKAlCBGdW5uZWwgQ2hhcnQgKGxlZnQtYWxpZ25lZCkgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVQnICYmIGNhcmQuaXNGdW5uZWxcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bm5lbC1jaGFydFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBjYXJkLmJvb2xlYW5Sb3dzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJmdW5uZWwtc3RhZ2VcIiAoY2xpY2spPVwib25DYXJkUm93Q2xpY2socm93LmlkLCByb3cubGFiZWwpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVubmVsLWJhclwiIFt0aXRsZV09XCJyb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJjYXJkLmJvb2xlYW5Sb3dzWzBdPy5yZXNwb25zZXMgPiAwID8gKHJvdy5yZXNwb25zZXMgLyBjYXJkLmJvb2xlYW5Sb3dzWzBdLnJlc3BvbnNlcyAqIDEwMCkgOiAxMDBcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTY29yZUNvbG9yKHJvdy5zY29yZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdW5uZWwtbGFiZWwtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnVubmVsLWxhYmVsXCI+e3sgcm93LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnVubmVsLXZhbHVlXCI+IDxzcGFuIGNsYXNzPVwiZnVubmVsLXZhbHVlLWNvdW50XCI+e3sgcm93LnJlc3BvbnNlcyB9fTwvc3Bhbj4gKHt7IHJvdy5zY29yZSB9fSklIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEJPT0xFQU5fQkFTS0VUIOKAlCByb3dzIHdpdGggcHJvZ3Jlc3MgYmFycyAobm9uLWZ1bm5lbCkgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVQnICYmICFjYXJkLmlzRnVubmVsXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBjYXJkLmJvb2xlYW5Sb3dzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtZXRyaWMtYm9vbC1yb3dcIiAoY2xpY2spPVwib25DYXJkUm93Q2xpY2socm93LmlkLCByb3cubGFiZWwpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1yb3ctZmxleFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1yb3ctZG90XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0U2NvcmVDb2xvcihyb3cuc2NvcmUpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1yb3ctbGFiZWxcIiBbdGl0bGVdPVwicm93LmxhYmVsXCI+e3sgcm93LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtc2NvcmUgbWV0cmljLXNjb3JlLS10ZWFsXCI+e3sgcm93LnNjb3JlIH19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLWNvdW50XCI+e3sgcm93LnJlc3BvbnNlcyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXByb2dyZXNzLXRyYWNrXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGguJV09XCJyb3cuc2NvcmVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTY29yZUNvbG9yKHJvdy5zY29yZSlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICA8IS0tIFVOSVFVRV9QSVRDSEVTIOKAlCBwaXRjaCBrZXl3b3JkcyB0cmFja2VyIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ1VOSVFVRV9QSVRDSEVTJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGl0Y2gta2V5d29yZC1jb3VudFwiPnt7IGNhcmQucGl0Y2hSb3dzPy5sZW5ndGggfHwgMCB9fSBrZXl3b3JkczwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBpdGNoIG9mIGNhcmQucGl0Y2hSb3dzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtZXRyaWMtYm9vbC1yb3dcIiAoY2xpY2spPVwib25DYXJkUm93Q2xpY2soJycsIGNhcmQua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1yb3ctZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXJvdy1kb3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIlsnIzAwQTNGRicsJyMxMEI5ODEnLCcjRjU5RTBCJywnI0VGNDQ0NCcsJyM4QjVDRjYnLCcjRUM0ODk5JywnIzA2QjZENCcsJyM4NENDMTYnLCcjRjk3MzE2JywnIzYzNjZGMSddW2kgJSAxMF1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaXRjaC1yb3ctbGFiZWxcIj57eyBwaXRjaC5pZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaXRjaC1yb3ctZGVzY1wiPnt7IHBpdGNoLmRlc2MgPyBwaXRjaC5kZXNjLnNsaWNlKDAsIDYwKSA6ICfigJMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gU1VCSkVDVElWRSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdTVUJKRUNUSVZFJyB8fCBjYXJkLnR5cGUgPT09ICdTVUJKRUNUSVZFX0NPVU5UJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViamVjdGl2ZS13cmFwXCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKCcnLCBjYXJkLmtleSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC5zdWJqZWN0aXZlUm93cz8uc2xpY2UoMCwgMilcIiBjbGFzcz1cInN1YmplY3RpdmUtcm93XCI+XG4gICAgICAgICAgICAgICAgICDigKIge3sgcm93LnJlYXNvbmluZyB8fCByb3cuc3RvcmVfaWQgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PjwhLS0gZW5kIG1ldHJpYy1jYXJkLWNvbnRlbnQgLS0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRnVsbCBuby1kYXRhIHN0YXRlOiBubyBjYXJkcyBBTkQgbm8gY29udmVyc2F0aW9ucyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjYXJkc0xvYWRpbmcgJiYgIWRldGFpbExvYWRpbmcgJiYgY29ob3J0Q2FyZHMubGVuZ3RoID09PSAwICYmIGRldGFpbFBhZ2VDb252cy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVjaG8tbm9kYXRhLXN0YXRlXCI+XG4gICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIk5vIGRhdGFcIiBjbGFzcz1cImVjaG8tbm9kYXRhLWltZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1ub2RhdGEtc3ViXCI+Tm8gYW5hbHlzaXMgZGF0YSBvciBjb252ZXJzYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHNlbGVjdGVkIGRhdGUgcmFuZ2UgYW5kIHN0b3Jlcy48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSDilIDilIAgQ29udmVyc2F0aW9ucyBTZWN0aW9uIChzaG93IHdoZW4gY2FyZHMgZXhpc3QgT1IgY29udmVyc2F0aW9ucyBleGlzdCBPUiBsb2FkaW5nKSDilIDilIAgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJlY2hvQ29udmVyc2F0aW9uc1wiIGNsYXNzPVwiY29udmVyc2F0aW9ucy1zZWN0aW9uXCIgKm5nSWY9XCJjYXJkc0xvYWRpbmcgfHwgZGV0YWlsTG9hZGluZyB8fCBjb2hvcnRDYXJkcy5sZW5ndGggPiAwIHx8IGRldGFpbFBhZ2VDb252cy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb252LXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjhcIj48cGF0aCBkPVwiTTIwIDJINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJoMTFsNSAzVjRhMiAyIDAgMCAwLTItMnpcIi8+PC9zdmc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1jb252LXNlY3Rpb24tdGl0bGVcIj5Db252ZXJzYXRpb25zPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtY29udi1zZWFyY2hcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiNy41XCIvPjxwYXRoIGQ9XCJNMTYuNSAxNi41TDIxIDIxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWwtY29udi1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY29udmVyc2F0aW9ucy4uLlwiXG4gICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRldGFpbFNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvbkRldGFpbFNlYXJjaCgpXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWwtY29udi1zZWFyY2gtY2xlYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsU2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckRldGFpbFNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCIvPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIElubGluZSBkYXRlICsgRmlsdGVyIGJ1dHRvbiAoT3ZlcmFsbCBUcmFuc2NyaXB0cyBvbmx5KSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZpZXdPdmVyYWxsVHJhbnNjcmlwdHNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8taW5saW5lLWRhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzMzIDEuNjY2NjNWNC45OTk5Nk02LjY2NjY3IDEuNjY2NjNWNC45OTk5Nk0yLjUgOC4zMzMyOUgxNy41TTQuMTY2NjcgMy4zMzMyOUgxNS44MzMzQzE2Ljc1MzggMy4zMzMyOSAxNy41IDQuMDc5NDggMTcuNSA0Ljk5OTk2VjE2LjY2NjZDMTcuNSAxNy41ODcxIDE2Ljc1MzggMTguMzMzMyAxNS44MzMzIDE4LjMzMzNINC4xNjY2N0MzLjI0NjE5IDE4LjMzMzMgMi41IDE3LjU4NzEgMi41IDE2LjY2NjZWNC45OTk5NkMyLjUgNC4wNzk0OCAzLjI0NjE5IDMuMzMzMjkgNC4xNjY2NyAzLjMzMzI5WlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWNoby1pbmxpbmUtZGF0ZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgIG5neERhdGVyYW5nZXBpY2tlck1kXG4gICAgICAgICAgICAgICAgICAgICAgIFtkcm9wc109XCInZG93bidcIlxuICAgICAgICAgICAgICAgICAgICAgICBbb3BlbnNdPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3Jhbmdlc109XCJlY2hvRGF0ZVJhbmdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9BcHBseV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlY2hvRGF0ZVJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvbkVjaG9EYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInsgZm9ybWF0OiAnREQtTU0tWVlZWScsIGZpcnN0RGF5OiAxLCBtb250aE5hbWVzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImVjaG9EYXRlcmFuZ2VcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tZmlsdGVyLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImVjaG8tZmlsdGVyLWJ0blwiIChjbGljayk9XCJlY2hvRmlsdGVyT3BlbiA/IGNsb3NlRWNob0ZpbHRlcigpIDogb3BlbkVjaG9GaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEwSDE1TTIuNSA1SDE3LjVNNy41IDE1SDEyLjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBQb3B1cCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1maWx0ZXItcG9wdXBcIiAqbmdJZj1cImVjaG9GaWx0ZXJPcGVuXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVmcC1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWZwLXRpdGxlXCI+RmlsdGVyIGJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWZwLXNlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImVmcC1zZWFyY2gtaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwiZWNob0ZpbHRlclRhYiA9PT0gJ3N0b3JlcycgPyAnU2VhcmNoIFN0b3JlcycgOiAnU2VhcmNoJ1wiIFsobmdNb2RlbCldPVwiZWNob0ZpbHRlclNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRWNob0ZpbHRlclNlYXJjaENoYW5nZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVmcC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImVmcC10YWJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwiZWNob0ZpbHRlclRhYiA9PT0gJ3N0YXR1cydcIiAoY2xpY2spPVwic2V0RWNob0ZpbHRlclRhYignc3RhdHVzJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0YXR1czwvc3Bhbj48c3BhbiBjbGFzcz1cImVmcC10YWItY291bnRcIiAqbmdJZj1cImVjaG9GaWx0ZXJTdGF0dXNDb3VudFwiPnt7IGVjaG9GaWx0ZXJTdGF0dXNDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuYWN0aXZlXT1cImVjaG9GaWx0ZXJUYWIgPT09ICdjb3VudHJ5J1wiIChjbGljayk9XCJzZXRFY2hvRmlsdGVyVGFiKCdjb3VudHJ5JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNvdW50cnk8L3NwYW4+PHNwYW4gY2xhc3M9XCJlZnAtdGFiLWNvdW50XCIgKm5nSWY9XCJlY2hvRmlsdGVyQ291bnRyeUNvdW50XCI+e3sgZWNob0ZpbHRlckNvdW50cnlDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuYWN0aXZlXT1cImVjaG9GaWx0ZXJUYWIgPT09ICdyZWdpb24nXCIgKGNsaWNrKT1cInNldEVjaG9GaWx0ZXJUYWIoJ3JlZ2lvbicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5SZWdpb248L3NwYW4+PHNwYW4gY2xhc3M9XCJlZnAtdGFiLWNvdW50XCIgKm5nSWY9XCJlY2hvRmlsdGVyUmVnaW9uQ291bnRcIj57eyBlY2hvRmlsdGVyUmVnaW9uQ291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJlY2hvRmlsdGVyVGFiID09PSAnY2x1c3RlcnMnXCIgKGNsaWNrKT1cInNldEVjaG9GaWx0ZXJUYWIoJ2NsdXN0ZXJzJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNsdXN0ZXJzPC9zcGFuPjxzcGFuIGNsYXNzPVwiZWZwLXRhYi1jb3VudFwiICpuZ0lmPVwiZWNob0ZpbHRlckNsdXN0ZXJDb3VudFwiPnt7IGVjaG9GaWx0ZXJDbHVzdGVyQ291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJlY2hvRmlsdGVyVGFiID09PSAnc3RvcmVzJ1wiIChjbGljayk9XCJzZXRFY2hvRmlsdGVyVGFiKCdzdG9yZXMnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RvcmVzPC9zcGFuPjxzcGFuIGNsYXNzPVwiZWZwLXRhYi1jb3VudFwiPnt7IGVjaG9GaWx0ZXJTdG9yZUNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwiZWNob0ZpbHRlclRhYiA9PT0gJ2Rvd250aW1lJ1wiIChjbGljayk9XCJzZXRFY2hvRmlsdGVyVGFiKCdkb3dudGltZScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Eb3dudGltZSAoSW4gTWlucyk8L3NwYW4+PHNwYW4gY2xhc3M9XCJlZnAtdGFiLWNvdW50XCIgKm5nSWY9XCJlY2hvRmlsdGVyRG93bnRpbWVDb3VudFwiPnt7IGVjaG9GaWx0ZXJEb3dudGltZUNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVmcC1wYW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZWZwLXJvdyBlZnAtcm93LWFsbFwiICpuZ0lmPVwiZWNob0ZpbHRlclZpc2libGVSb3dzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVmcC1zZWxlY3QtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJlY2hvRmlsdGVyQWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiZWNob0ZpbHRlclRvZ2dsZUFsbCgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJlZnAtc2VsZWN0LWFsbFwiPlNlbGVjdCBBbGw8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGVmcC1yb3dcIiAqbmdGb3I9XCJsZXQgciBvZiBlY2hvRmlsdGVyVmlzaWJsZVJvd3M7IHRyYWNrQnk6IHRyYWNrRWNob0ZpbHRlclJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidlZnAtcm93LScgKyByLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInIucmVmLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRWNob0ZpbHRlclJvd0NoYW5nZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidlZnAtcm93LScgKyByLmlkXCI+e3sgci5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVmcC1lbXB0eVwiICpuZ0lmPVwiIWVjaG9GaWx0ZXJWaXNpYmxlUm93cy5sZW5ndGhcIj5ObyBvcHRpb25zIGF2YWlsYWJsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWZwLWZvb3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJlZnAtcmVzZXRcIiAoY2xpY2spPVwiZWNob0ZpbHRlclJlc2V0KClcIj5SZXNldCBGaWx0ZXJzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZnAtZm9vdC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJlZnAtY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlRWNob0ZpbHRlcigpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJlZnAtYXBwbHlcIiAoY2xpY2spPVwiZWNob0ZpbHRlckFwcGx5KClcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbExvYWRpbmdcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGUtLW11dGVkXCI+TG9hZGluZy4uLjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29udiBvZiBkZXRhaWxQYWdlQ29udnM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiIGNsYXNzPVwiZGV0YWlsLWNvbnYtY2FyZFwiPlxuICAgICAgICAgICAgPCEtLSBDb252IGhlYWRlciAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVEZXRhaWxDb252KGNvbnYuYXVkaW9JZCk7IGxvYWRDb252RGV0YWlsKGNvbnYpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udi1pZFwiPnt7IGNvbnYuYXVkaW9JZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1tZXRhLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWcgYnJhbmRcIiAqbmdJZj1cImNvbnYuc3RvcmVOYW1lXCI+e3sgY29udi5zdG9yZU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi5sb2NhdGlvblwiPnt7IGNvbnYubG9jYXRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi5kYXRlXCI+e3sgY29udi5kYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYudGltZVwiPnt7IGNvbnYudGltZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWNoZXZyb25cIiBbY2xhc3Mub3Blbl09XCJkZXRhaWxPcGVuSWQgPT09IGNvbnYuYXVkaW9JZFwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk0QTNCOFwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTYgOWw2IDYgNi02XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEV4cGFuZGVkIGJvZHkgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsT3BlbklkID09PSBjb252LmF1ZGlvSWRcIiBjbGFzcz1cImNvbnYtYm9keS1leHBhbmRlZFwiPlxuICAgICAgICAgICAgICA8IS0tIFdhdmVmb3JtIHBsYXllciAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tcGxheWVyXCIgKm5nSWY9XCJjb252LmF1ZGlvVXJsXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVjaG8tcGxheS1idG5cIiBbY2xhc3MucGxheWluZ109XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiAoY2xpY2spPVwidG9nZ2xlUGxheShjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicGxheWluZ0NvbnZJZCAhPT0gY29udi5hdWRpb0lkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPjxwYXRoIGQ9XCJNOCA1djE0bDExLTd6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj48cGF0aCBkPVwiTTYgMTloNFY1SDZ2MTR6bTgtMTR2MTRoNFY1aC00elwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby13YXZlZm9ybVwiIFtjbGFzcy53Zi1wbGF5aW5nXT1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIChjbGljayk9XCJzZWVrQXVkaW8oJGV2ZW50LCBjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby13Zi1iYXJcIiAqbmdGb3I9XCJsZXQgaCBvZiB3YXZlZm9ybUhlaWdodHM7IGxldCBpID0gaW5kZXhcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGxheWVkXT1cIihwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy5wcm9ncmVzcyB8fCAwKSA+IGkgLyB3YXZlZm9ybUhlaWdodHMubGVuZ3RoXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlY2hvLXRpbWVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWQgJiYgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8uY3VycmVudFRpbWVcIj57eyBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdLmN1cnJlbnRUaW1lIH19IC8gPC9zcGFuPnt7IHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LnRvdGFsVGltZSB8fCBjb252LmR1cmF0aW9uIHx8ICctLScgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YXVkaW8gW2lkXT1cIidhdWRpby0nICsgY29udi5hdWRpb0lkXCIgW3NyY109XCJjb252LmF1ZGlvVXJsXCIgcHJlbG9hZD1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgKHRpbWV1cGRhdGUpPVwib25UaW1lVXBkYXRlKGF1ZGlvRWwsIGNvbnYuYXVkaW9JZClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uTG9hZGVkTWV0YWRhdGEoYXVkaW9FbCwgY29udi5hdWRpb0lkLCBjb252LmR1cmF0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAoZW5kZWQpPVwicGxheWluZ0NvbnZJZCA9IG51bGxcIiAjYXVkaW9FbD48L2F1ZGlvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIFRhYnMgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LXRhYnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udi10YWItYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJnZXRDb252VGFiKGNvbnYuYXVkaW9JZCkgPT09ICdzdW1tYXJ5J1wiIChjbGljayk9XCJzZXRDb252VGFiKGNvbnYuYXVkaW9JZCwgJ3N1bW1hcnknLCAkZXZlbnQpXCI+U3VtbWFyeTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb252LXRhYi1idG5cIiBbY2xhc3MuYWN0aXZlXT1cImdldENvbnZUYWIoY29udi5hdWRpb0lkKSA9PT0gJ3RyYW5zY3JpcHQnXCIgKGNsaWNrKT1cInNldENvbnZUYWIoY29udi5hdWRpb0lkLCAndHJhbnNjcmlwdCcsICRldmVudClcIj5UcmFuc2NyaXB0PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gQ29udGVudDogTGVmdCAoU3VtbWFyeS9UcmFuc2NyaXB0ICsgQUkgSW5zaWdodHMpICsgUmlnaHQgKE1ldHJpY3MpIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWNvbnRlbnQtc3BsaXRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIExlZnQgc2lkZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWNvbnRlbnQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbnZUYWIoY29udi5hdWRpb0lkKSA9PT0gJ3N1bW1hcnknXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3VtbWFyeS10ZXh0XCI+e3sgY29udi5hdWRpb0Rlc2NyaXB0aW9uIHx8IGNvbnYuY29udmVyc2F0aW9uRGV0YWlscz8uYXVkaW9TdW1tYXJ5IHx8ICdObyBzdW1tYXJ5IGF2YWlsYWJsZScgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQUkgSW5zaWdodHMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252LmFpSW5zaWdodHM/LnN1bW1hcnk/Lmxlbmd0aFwiIGNsYXNzPVwiYWktaW5zaWdodHMtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1pbnNpZ2h0cy1sYWJlbFwiPkFJIEluc2lnaHRzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW5zaWdodCBvZiBjb252LmFpSW5zaWdodHMuc3VtbWFyeVwiIGNsYXNzPVwiYWktaW5zaWdodC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1pbnNpZ2h0LWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImluc2lnaHQudHlwZSA9PT0gJ3Bvc2l0aXZlJyA/ICcjMDBBM0ZGJyA6IGluc2lnaHQudHlwZSA9PT0gJ25lZ2F0aXZlJyA/ICcjRUY0NDQ0JyA6ICcjRjU5RTBCJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1pbnNpZ2h0LXRleHRcIj57eyBpbnNpZ2h0LnRleHQgfHwgaW5zaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb252VGFiKGNvbnYuYXVkaW9JZCkgPT09ICd0cmFuc2NyaXB0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktdGV4dCBzdW1tYXJ5LXRleHQtLXByZXdyYXBcIj57eyBjbGVhblRyYW5zY3JpcHRpb24oY29udi5jb252ZXJzYXRpb25EZXRhaWxzPy50cmFuc2NyaXB0aW9uKSB8fCAnTm8gdHJhbnNjcmlwdCBhdmFpbGFibGUnIH19PC9wPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBSaWdodCBzaWRlOiBNZXRyaWNzIChvbmx5IHNob3cgdmFsdWVzIHRoYXQgaGF2ZSBkYXRhKSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWNvbnRlbnQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWNzLXBhbmVsLWxhYmVsXCI+TWV0cmljczwvZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnYubWV0cmljcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG0gb2YgY29udi5tZXRyaWNzXCIgY2xhc3M9XCJtZXRyaWMtaXRlbS13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaW5nbGUgdmFsdWU6IG5hbWUgKyB2YWx1ZSBvbiBzYW1lIHJvdyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibS52YWx1ZT8ubGVuZ3RoID09PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXNpbmdsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtc2luZ2xlLW5hbWVcIiBbdGl0bGVdPVwibS5uYW1lXCI+e3sgbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1zaW5nbGUtdmFsdWVcIiBbc3R5bGUuY29sb3JdPVwibS52YWx1ZVswXS5zY29yZSAhPT0gbnVsbCAmJiBtLnZhbHVlWzBdLnNjb3JlICE9PSB1bmRlZmluZWQgPyAnIzAwQTNGRicgOiAnIzM0NDA1NCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRNZXRyaWNWYWx1ZShtLnZhbHVlWzBdKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpcGxlIHZhbHVlczogaGVhZGVyICsgcm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibS52YWx1ZT8ubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1tdWx0aS1oZWFkZXJcIiBbdGl0bGVdPVwibS5uYW1lXCI+e3sgbS5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2IG9mIG0udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIih2LnNjb3JlICE9PSBudWxsICYmIHYuc2NvcmUgIT09IHVuZGVmaW5lZCkgfHwgKHYuVG90YWwgIT09IG51bGwgJiYgdi5Ub3RhbCAhPT0gdW5kZWZpbmVkKSB8fCAodi5BdmcgIT09IG51bGwgJiYgdi5BdmcgIT09IHVuZGVmaW5lZCkgfHwgKHYudG90YWwgIT09IG51bGwgJiYgdi50b3RhbCAhPT0gdW5kZWZpbmVkKSB8fCAodi5hdmcgIT09IG51bGwgJiYgdi5hdmcgIT09IHVuZGVmaW5lZCkgfHwgKHYuY291bnQgIT09IG51bGwgJiYgdi5jb3VudCAhPT0gdW5kZWZpbmVkKVwiIGNsYXNzPVwibWV0cmljLW11bHRpLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLW11bHRpLW5hbWVcIiBbdGl0bGVdPVwidi5uYW1lXCI+e3sgdi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLW11bHRpLXZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJ2LnNjb3JlICE9PSBudWxsICYmIHYuc2NvcmUgIT09IHVuZGVmaW5lZCA/ICcjMDBBM0ZGJyA6ICcjMzQ0MDU0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybWF0TWV0cmljVmFsdWUodikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnYubWV0cmljcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252LnN0b3JlTmFtZVwiIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLXJvd1wiPjxzcGFuIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLWxhYmVsXCI+U3RvcmU8L3NwYW4+PHNwYW4gY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stdmFsdWVcIj57eyBjb252LnN0b3JlTmFtZSB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnYuZHVyYXRpb25cIiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay1yb3dcIj48c3BhbiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay1sYWJlbFwiPkR1cmF0aW9uPC9zcGFuPjxzcGFuIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLXZhbHVlXCI+e3sgY29udi5kdXJhdGlvbiB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnYuX2RldGFpbExvYWRpbmdcIiBjbGFzcz1cIm1ldHJpYy1kZXRhaWwtbG9hZGluZ1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBObyBjb252ZXJzYXRpb25zIGZvciB0aGlzIGZpbHRlciAob25seSB3aGVuIGNhcmRzIGV4aXN0IGJ1dCBjb252cyBhcmUgZW1wdHkpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWRldGFpbExvYWRpbmcgJiYgZGV0YWlsUGFnZUNvbnZzLmxlbmd0aCA9PT0gMCAmJiBjb2hvcnRDYXJkcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdGF0ZVwiPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJObyBkYXRhXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1pbWdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1ub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXN1YlwiPk5vIGNvbnZlcnNhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVyLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgICAgIDxsaWItcGFnaW5hdGlvbiAqbmdJZj1cImRldGFpbFRvdGFsID4gMFwiIFtpdGVtc1BlclBhZ2VdPVwiZGV0YWlsUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJkZXRhaWxQYWdlXCIgW3RvdGFsSXRlbXNdPVwiZGV0YWlsVG90YWxcIlxuICAgICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwiZGV0YWlsUGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cImRldGFpbFBlclBhZ2VcIiAocGFnZUNoYW5nZSk9XCJvbkRldGFpbFBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uRGV0YWlsUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj48IS0tIGVuZCBkZXRhaWxWaWV3IC0tPlxuICAgIDwvbmctY29udGFpbmVyPjwhLS0gZW5kIGFnZW50YW5hbHlzaXMgLS0+XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBNQU5BR0UgVEFCIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFBhZ2UgPT09ICdtYW5hZ2UnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWFuYWdlLWhlYWRlclwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYW5hZ2UtdGl0bGVcIj5BZ2VudHM8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFuYWdlLXN1YnRpdGxlXCI+e3sgbWFuYWdlVG90YWwgfX0gYWdlbnRzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1zZWFyY2gtd3JhcC0td2lkZVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk0QTNCOFwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJtYW5hZ2VTZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1hbmFnZVNlYXJjaCgpXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWdlbnRzLi4uXCIgY2xhc3M9XCJtYW5hZ2Utc2VhcmNoLWlucHV0XCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJtYW5hZ2VMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWVtcHR5LXN0YXRlXCI+TG9hZGluZyBhZ2VudHMuLi48L2Rpdj5cblxuICAgICAgPCEtLSBBZ2VudHMgdGFibGUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIW1hbmFnZUxvYWRpbmdcIiBjbGFzcz1cImVjaG8tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWhlYWRlciBhZ2VudHMtdGFibGUtNGNvbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHMtdGFibGUtY2VsbFwiPkFnZW50IE5hbWU8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWNlbGwgYWdlbnRzLXRhYmxlLWNlbGwtLWNlbnRlclwiPk1ldHJpY3M8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWNlbGwgYWdlbnRzLXRhYmxlLWNlbGwtLWNlbnRlclwiPlNvdXJjZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHMtdGFibGUtY2VsbCBhZ2VudHMtdGFibGUtY2VsbC0tY2VudGVyXCI+QWN0aW9uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2hvcnQgb2YgbWFuYWdlQ29ob3J0czsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJhZ2VudHMtdGFibGUtcm93IGFnZW50cy10YWJsZS00Y29sXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtbmFtZS13cmFwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1uYW1lXCI+e3sgZGlzcGxheU5hbWUoY29ob3J0LmNvaG9ydE5hbWUgfHwgY29ob3J0Lm5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1kZXNjXCI+e3sgY29ob3J0LmNvaG9ydERlc2NyaXB0aW9uIHx8IGNvaG9ydC5kZXNjcmlwdGlvbiB8fCAnJyB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLW1ldHJpY3NcIj57eyBjb2hvcnQubWV0cmljc0FkZGVkIHx8IGNvaG9ydC5tZXRyaWNBZGRlZCB8fCBjb2hvcnQubWV0cmljcz8ubGVuZ3RoIHx8IDAgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1zb3VyY2VcIj57eyBjb2hvcnQuc291cmNlPy5qb2luKCcsICcpIHx8ICfigJMnIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtYWN0aW9uXCI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkZWxldGVDb2hvcnQoY29ob3J0LmNvaG9ydElkIHx8IGNvaG9ydC5pZCB8fCBjb2hvcnQuX2lkKVwiIGNsYXNzPVwiYWdlbnQtZGVsZXRlLWJ0blwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1hbmFnZUNvaG9ydHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJtYW5hZ2Utbm8tcmVzdWx0c1wiPk5vIGNvaG9ydHMgZm91bmQuPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNYW5hZ2UgcGFnaW5hdGlvbiAtLT5cbiAgICAgIDxsaWItcGFnaW5hdGlvbiAqbmdJZj1cIm1hbmFnZVRvdGFsID4gMFwiIFtpdGVtc1BlclBhZ2VdPVwibWFuYWdlUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJtYW5hZ2VQYWdlXCIgW3RvdGFsSXRlbXNdPVwibWFuYWdlVG90YWxcIlxuICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cIm1hbmFnZVBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJtYW5hZ2VQZXJQYWdlXCIgKHBhZ2VDaGFuZ2UpPVwib25NYW5hZ2VQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25NYW5hZ2VQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIOKVkOKVkOKVkCBGSUxURVJTIERSQVdFUiDilZDilZDilZAgLS0+XG48ZGl2IGNsYXNzPVwiZHJhd2VyLW92ZXJsYXlcIiAqbmdJZj1cImRyYXdlck9wZW5cIiAoY2xpY2spPVwiY2xvc2VGaWx0ZXJEcmF3ZXIoKVwiPjwvZGl2PlxuPGRpdiBjbGFzcz1cImFmLWRyYXdlclwiICpuZ0lmPVwiZHJhd2VyT3BlblwiPlxuICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZHJhd2VyLWhlYWRlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2VGaWx0ZXJEcmF3ZXIoKVwiIGNsYXNzPVwiZHJhd2VyLWNsb3NlLWJ0blwiPsOXPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWJvZHlcIj5cbiAgICA8cCBjbGFzcz1cImRyYXdlci1wbGFjZWhvbGRlci10ZXh0XCI+RmlsdGVyIGNvbmZpZ3VyYXRpb24gY29taW5nIHNvb24uIFVzZXMgdGhlIHNhbWUgZmlsdGVyIEFQSXMgYXMgdGhlIGV4aXN0aW5nIGF1ZGlvIHBhZ2VzLjwvcD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJhZi1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYWYtY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVyRHJhd2VyKClcIj5DbG9zZTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIOKVkOKVkOKVkCBDQVRFR09SWSBBTkFMWVNJUyBQT1BVUCDilZDilZDilZAgLS0+XG48ZGl2IGNsYXNzPVwiY2FwLW92ZXJsYXlcIiAqbmdJZj1cImNhdGVnb3J5UG9wdXBPcGVuXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlQb3B1cCgpXCI+PC9kaXY+XG48ZGl2IGNsYXNzPVwiY2FwLW1vZGFsXCIgKm5nSWY9XCJjYXRlZ29yeVBvcHVwT3BlblwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiPlxuICA8ZGl2IGNsYXNzPVwiY2FwLWhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXAtdGl0bGVzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FwLXRpdGxlXCI+e3sgY2F0ZWdvcnlBbmFseXNpc0NhdGVnb3J5IHx8ICdDYXRlZ29yeScgfX0gQW5hbHlzaXM8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXAtc3VidGl0bGVcIiAqbmdJZj1cImNhdGVnb3J5QW5hbHlzaXNBdHRyaWJ1dGVcIj5cbiAgICAgICAgRmlsdGVyZWQgYnkgPHNwYW4gY2xhc3M9XCJjYXAtY2hpcC1pbmxpbmVcIj57eyBjYXRlZ29yeUFuYWx5c2lzQXR0cmlidXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNhcC1jbG9zZVwiIChjbGljayk9XCJjbG9zZUNhdGVnb3J5UG9wdXAoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPsOXPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjYXAtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXAtbG9hZGluZ1wiICpuZ0lmPVwiY2F0ZWdvcnlBbmFseXNpc0xvYWRpbmdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXAtc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPHNwYW4+TG9hZGluZ+KApjwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXAtZXJyb3JcIiAqbmdJZj1cIiFjYXRlZ29yeUFuYWx5c2lzTG9hZGluZyAmJiBjYXRlZ29yeUFuYWx5c2lzRXJyb3JcIj5cbiAgICAgIHt7IGNhdGVnb3J5QW5hbHlzaXNFcnJvciB9fVxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjYXRlZ29yeUFuYWx5c2lzTG9hZGluZyAmJiAhY2F0ZWdvcnlBbmFseXNpc0Vycm9yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FwLXN1bW1hcnlcIiAqbmdJZj1cImNhdGVnb3J5QW5hbHlzaXNSb3dzLmxlbmd0aFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNhcC1zdW1tYXJ5LWxhYmVsXCI+VG90YWwgY29udmVyc2F0aW9uczwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXAtc3VtbWFyeS12YWx1ZVwiPnt7IGNhdGVnb3J5QW5hbHlzaXNUb3RhbCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FwLXRhYmxlLXdyYXBcIiAqbmdJZj1cImNhdGVnb3J5QW5hbHlzaXNSb3dzLmxlbmd0aDsgZWxzZSBjYXBFbXB0eVwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJjYXAtdGFibGVcIj5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNhcC10aC1uYW1lXCI+QXR0cmlidXRlPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2FwLXRoLWNvdW50XCI+Q29udmVyc2F0aW9uczwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNhcC10aC1zaGFyZVwiPiUgb2YgVG90YWw8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgciBvZiBjYXRlZ29yeUFuYWx5c2lzUm93c1wiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjYXAtdGQtbmFtZVwiIFt0aXRsZV09XCJyLm5hbWVcIj57eyByLm5hbWUgfX08L3RkPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjYXAtdGQtY291bnRcIj57eyByLmNvdW50IH19PC90ZD5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2FwLXRkLXNoYXJlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcC1iYXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXAtYmFyLWZpbGxcIiBbc3R5bGUud2lkdGguJV09XCJyLnBlcmNlbnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcC1iYXItcGN0XCI+e3sgci5wZXJjZW50IH19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2NhcEVtcHR5PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FwLWVtcHR5XCI+Tm8gZGF0YSBhdmFpbGFibGUgZm9yIHRoaXMgc2VsZWN0aW9uLjwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNhcC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiY2FwLWJ0bi1jbG9zZVwiIChjbGljayk9XCJjbG9zZUNhdGVnb3J5UG9wdXAoKVwiPkNsb3NlPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|