tango-app-ui-analyse-trax 4.0.52 → 4.0.53

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.
Files changed (18) hide show
  1. package/esm2022/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.mjs +39 -28
  2. package/esm2022/lib/components/audit-v2/gallery/audit-v2-gallery.component.mjs +8 -6
  3. package/esm2022/lib/components/audit-v2/reports/audit-v2-report-summary.mjs +39 -11
  4. package/esm2022/lib/components/audit-v2/reports/audit-v2-reports.component.mjs +38 -3
  5. package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.mjs +12 -26
  6. package/fesm2022/{tango-app-ui-analyse-trax-audit-v2.module-DSYJBHlB.mjs → tango-app-ui-analyse-trax-audit-v2.module-C4qhZrvh.mjs} +133 -71
  7. package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-C4qhZrvh.mjs.map +1 -0
  8. package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-DHocJmzJ.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-QNn2kXWN.mjs} +3 -3
  9. package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-DHocJmzJ.mjs.map → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-QNn2kXWN.mjs.map} +1 -1
  10. package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
  11. package/lib/components/add-checklist/add-checklist.component.d.ts +1 -1
  12. package/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.d.ts +5 -2
  13. package/lib/components/audit-v2/question-editor/audit-v2-question-editor.component.d.ts +1 -1
  14. package/lib/components/audit-v2/reports/audit-v2-report-summary.d.ts +28 -5
  15. package/lib/components/audit-v2/reports/audit-v2-reports.component.d.ts +5 -0
  16. package/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.d.ts +4 -10
  17. package/package.json +1 -1
  18. package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-DSYJBHlB.mjs.map +0 -1
@@ -1292,6 +1292,10 @@ export class AuditV2DashboardComponent {
1292
1292
  to: this.to || this.headerData?.date?.endDate || ''
1293
1293
  };
1294
1294
  }
1295
+ /** Flags count: the same Gallery link, only flagged submissions (?flag=1). */
1296
+ taskFlagParams(row) {
1297
+ return { ...this.taskSubmittedParams(row), flag: '1' };
1298
+ }
1295
1299
  /**
1296
1300
  * Audit / store / user detail link: the subject plus the dashboard period (from / to), so the detail
1297
1301
  * page shows the same days as the row clicked, not the header range (the dashboard keeps its own period).
@@ -1465,50 +1469,57 @@ export class AuditV2DashboardComponent {
1465
1469
  return row.raw?.lastVisitAuditId ? String(row.raw.lastVisitAuditId) : '';
1466
1470
  }
1467
1471
  /**
1468
- * Same PDF download as the detail pages' Download, for the store's latest submitted audit:
1469
- * queued, then listed under Notifications > Downloads.
1472
+ * The Gallery's Export as PDF (POST /trax/audit/gallery/download) for this store: the audit of its latest submission
1473
+ * (the audit View opens in the Gallery), the dashboard's period, every question and no other filter.
1474
+ * Queued, then listed under Notifications > Downloads.
1470
1475
  */
1471
1476
  downloadPdf(row) {
1472
- const visitId = this.pdfVisitId(row);
1473
- if (!visitId || this.pdfQueued.has(visitId)) {
1477
+ const auditId = this.galleryAuditId(row);
1478
+ const storeId = row.raw?.storeId || row.storeId;
1479
+ const key = auditId + '|' + storeId;
1480
+ if (!auditId || this.pdfQueued.has(key)) {
1474
1481
  return;
1475
1482
  }
1476
- this.pdfQueued.add(visitId);
1477
- const user = JSON.parse(localStorage.getItem('user-info') || '{}');
1478
- const storeId = row.raw?.storeId || row.storeId;
1479
- // The download name is matched as a regular expression server-side, so leave regex characters out.
1480
- const name = String(row.raw?.storeName || storeId).replace(/[\\^$.*+?()[\]{}|]/g, ' ').trim() + ' audit';
1481
- this.traxService.reportTableExport({
1482
- fromDate: this.from || this.headerData?.date?.startDate,
1483
- toDate: this.to || this.headerData?.date?.endDate,
1484
- checklistId: [visitId],
1485
- sourceCheckList_id: '',
1486
- checklistName: name,
1483
+ this.pdfQueued.add(key);
1484
+ const fromDate = this.from || this.headerData?.date?.startDate;
1485
+ this.traxService.auditGalleryDownload({
1486
+ clientId: this.headerData?.client,
1487
+ type: this.isTaskModule ? 'task' : 'audit',
1488
+ sourceCheckList_id: auditId,
1489
+ fromDate,
1490
+ toDate: this.to || this.headerData?.date?.endDate || fromDate,
1487
1491
  fileType: 'pdf',
1492
+ filtertype: 'Clusters',
1488
1493
  storeIds: [storeId],
1489
- userId: user?._id,
1490
- clientId: this.headerData?.client,
1491
- downloadInsertFrom: 'dashboard',
1492
- insertType: 'checklist',
1493
- checkListType: 'custom'
1494
+ userEmailList: [],
1495
+ questions: [],
1496
+ answerType: 'all',
1497
+ approveFilter: 'all',
1498
+ viewFlag: false,
1499
+ viewRedo: false,
1500
+ viewDisputed: false,
1501
+ previewType: 'image'
1494
1502
  }).pipe(takeUntil(this.destroy$)).subscribe({
1495
1503
  next: (res) => {
1496
- this.pdfQueued.delete(visitId);
1504
+ this.pdfQueued.delete(key);
1497
1505
  if (res?.code === 200) {
1498
- this.toast.getSuccessToast('Downloading your report. Find it under Notifications > Downloads.');
1506
+ this.toast.getSuccessToast('<div><span class="me-8">Downloading your reports</span><a href="notifications/alerts?tab=download" style="color:#99c3ff; text-decoration:underline; cursor:pointer">View</a></div>');
1507
+ }
1508
+ else {
1509
+ this.toast.getErrorToast(res?.message || 'Could not start the export');
1499
1510
  }
1500
1511
  },
1501
- error: () => {
1502
- this.pdfQueued.delete(visitId);
1503
- this.toast.getErrorToast('Something went wrong!');
1512
+ error: (e) => {
1513
+ this.pdfQueued.delete(key);
1514
+ this.toast.getErrorToast(e?.error?.message || e?.error?.error || 'Could not start the export');
1504
1515
  }
1505
1516
  });
1506
1517
  }
1507
1518
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i3.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1508
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", ngImport: i0, template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"showTrendDatePicker && grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" *ngIf=\"showPassMarkInfo\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\" *ngIf=\"showPassMarkInfo\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"showDrawerDateRange && dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { 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.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: "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"] }, { kind: "directive", type: i8.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i11.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
1519
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", ngImport: i0, template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"showTrendDatePicker && grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" *ngIf=\"showPassMarkInfo\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\" *ngIf=\"showPassMarkInfo\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- The Gallery's Export as PDF for this store's audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!galleryAuditId(row)\"\r\n [attr.aria-disabled]=\"!galleryAuditId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"galleryAuditId(row) ? 'Export this store\\'s submissions as PDF (same as the Gallery\\'s Export as PDF)' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <!-- Task mode always shows its Task Info table; the rest of Performance follows showPerformance. -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance || isTaskModule\">\r\n <div class=\"db-perftabs\" *ngIf=\"showPerformance\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && !isTaskModule && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n <!-- Task mode: Create Task opens Manage -> Task (task add permission). -->\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && isTaskModule && access.canAddTask\"\r\n routerLink=\"/manage/trax/audit-v2/manage\" [queryParams]=\"{ module: 'task' }\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n Create Task\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td>\r\n <!-- A count opens the Gallery (Type Task) on this task's flagged submissions; 0 is plain text, as Submitted. -->\r\n <a *ngIf=\"row.flags && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskFlagParams(row)\" title=\"View the flagged tasks in the Gallery\">{{ row.flags }}</a>\r\n <span *ngIf=\"!row.flags || !row.raw?.taskId\">{{ row.flags }}</span>\r\n </td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <!-- The Gallery has no redo filter to open, so ReDo is plain text. -->\r\n <td>{{ row.redo }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"showDrawerDateRange && dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { 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.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: "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"] }, { kind: "directive", type: i8.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i11.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
1509
1520
  }
1510
1521
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, decorators: [{
1511
1522
  type: Component,
1512
- args: [{ selector: 'lib-audit-v2-dashboard', template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"showTrendDatePicker && grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" *ngIf=\"showPassMarkInfo\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\" *ngIf=\"showPassMarkInfo\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"showDrawerDateRange && dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"] }]
1523
+ args: [{ selector: 'lib-audit-v2-dashboard', template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"showTrendDatePicker && grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" *ngIf=\"showPassMarkInfo\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\" *ngIf=\"showPassMarkInfo\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- The Gallery's Export as PDF for this store's audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!galleryAuditId(row)\"\r\n [attr.aria-disabled]=\"!galleryAuditId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"galleryAuditId(row) ? 'Export this store\\'s submissions as PDF (same as the Gallery\\'s Export as PDF)' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <!-- Task mode always shows its Task Info table; the rest of Performance follows showPerformance. -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance || isTaskModule\">\r\n <div class=\"db-perftabs\" *ngIf=\"showPerformance\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && !isTaskModule && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n <!-- Task mode: Create Task opens Manage -> Task (task add permission). -->\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && isTaskModule && access.canAddTask\"\r\n routerLink=\"/manage/trax/audit-v2/manage\" [queryParams]=\"{ module: 'task' }\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n Create Task\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td>\r\n <!-- A count opens the Gallery (Type Task) on this task's flagged submissions; 0 is plain text, as Submitted. -->\r\n <a *ngIf=\"row.flags && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskFlagParams(row)\" title=\"View the flagged tasks in the Gallery\">{{ row.flags }}</a>\r\n <span *ngIf=\"!row.flags || !row.raw?.taskId\">{{ row.flags }}</span>\r\n </td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <!-- The Gallery has no redo filter to open, so ReDo is plain text. -->\r\n <td>{{ row.redo }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"showDrawerDateRange && dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"] }]
1513
1524
  }], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }] });
1514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQTRCLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFvSS9ILE1BQU0sZ0JBQWdCLEdBQWM7SUFDbEMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsYUFBYSxFQUFFLEdBQUc7SUFDbEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsU0FBUyxFQUFFLEdBQUc7SUFDZCxVQUFVLEVBQUUsR0FBRztJQUNmLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsVUFBVSxFQUFFLEdBQUc7SUFDZixlQUFlLEVBQUUsRUFBRTtJQUNuQixlQUFlLEVBQUUsRUFBRTtJQUNuQixVQUFVLEVBQUUsRUFBRTtDQUNmLENBQUM7QUFxQkYsMkZBQTJGO0FBQzNGLFNBQVMsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLE9BQU87WUFDTCxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6RixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDaEMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztTQUM3RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekIsTUFBTSxLQUFLLEdBQWdCO0lBQ3pCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQzFILEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQzlHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDM0gsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUU7SUFDeEgsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTtJQUN0SSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTtDQUMzSCxDQUFDO0FBRUYseUZBQXlGO0FBQ3pGLE1BQU0sWUFBWSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBUXhDLE1BQU0sVUFBVSxHQUFvQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsdUNBQXVDLEVBQUUsQ0FBQztBQVV2SDs7Ozs7Ozs7Ozs7R0FXRztBQU1ILE1BQU0sT0FBTyx5QkFBeUI7SUE0TDFCO0lBQ0E7SUFDQTtJQUNBO0lBOUxWLG1HQUFtRztJQUNuRyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ3JCLFlBQVksR0FBRyxhQUFhLENBQUM7SUFDcEIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QiwyR0FBMkc7SUFDM0csVUFBVSxHQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLDZDQUE2QztJQUNyQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFFOUI7OztPQUdHO0lBQ0gsS0FBSyxHQUF1QixNQUFNLENBQUM7SUFDbkMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNKLE1BQU0sR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUMxQixRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsMkVBQTJFO0lBQzNFLFlBQVksR0FBZSxFQUFFLENBQUM7SUFDOUIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUMvQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ1YsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNSLEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBQ3hCLFlBQVksR0FBRyxhQUFhLENBQUM7SUFDN0IsTUFBTSxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQ3hCLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUV6QixlQUFlO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLEdBQWlCLEtBQUssQ0FBQztJQUM3QixNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ1osUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNiLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFFZiwyQkFBMkI7SUFDM0IsU0FBUyxHQUFxQixPQUFPLENBQUM7SUFDN0IsVUFBVSxHQUE0QixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVqRSx1REFBdUQ7SUFDdkQsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUVwQixxQkFBcUI7SUFDckIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQ3JCOzs7T0FHRztJQUNILEtBQUssR0FBcUMsSUFBSSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBVSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPO1FBQzVILFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQVUsQ0FBQztJQUU3RTs7O09BR0c7SUFDSCxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNWLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDVCxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRVgsZ0hBQWdIO0lBQ3hHLFNBQVMsR0FBZSxFQUFFLENBQUM7SUFDbkMsb0dBQW9HO0lBQzVGLE9BQU8sR0FBc0MsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNwSCw4RkFBOEY7SUFDdEYsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUU1QixtQkFBbUI7SUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNsQixPQUFPLEdBQW1CLEtBQUssQ0FBQztJQUNoQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsOEVBQThFO0lBQzlFLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDTCxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE9BQU8sR0FBMEM7UUFDL0MsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7UUFDcEMsNEVBQTRFO1FBQzVFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1FBQ3ZDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1FBQ3ZDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO1FBQ3RDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1FBQzVCLHlHQUF5RztRQUN6RyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtRQUNsQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtRQUNoQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtLQUNuQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsU0FBUyxHQUFjLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQy9DLFFBQVEsR0FBa0IsRUFBRSxDQUFDO0lBQzdCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsb0dBQW9HO0lBQzVGLGVBQWUsR0FBd0MsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ25ILG9FQUFvRTtJQUM1RCxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQzFCLGtFQUFrRTtJQUMxRCxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLGlGQUFpRjtJQUNoRSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUUvQyx1RUFBdUU7SUFDdkUsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4Qix3SEFBd0g7SUFDeEgsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQzVCLDBJQUEwSTtJQUMxSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsNEhBQTRIO0lBQzVILG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUM1QixPQUFPLEdBQStCLE9BQU8sQ0FBQztJQUNyQyxRQUFRLEdBQXNDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRixVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsaUhBQWlIO0lBQ2pILFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDYixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ1QsYUFBYSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxzR0FBc0c7SUFDdEcsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixXQUFXLEdBQW1CLEtBQUssQ0FBQztJQUVwQyw2RkFBNkY7SUFDcEYsYUFBYSxHQUFpQjtRQUNyQyxrQ0FBa0M7UUFDbEMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1FBQ3pILEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDL0UsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtLQUNyRSxDQUFDO0lBQ08sWUFBWSxHQUFpQjtRQUNwQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDckgsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1FBQ3JILEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO0tBQ3hILENBQUM7SUFDTyxhQUFhLEdBQWlCO1FBQ3JDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtRQUNsSCxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtRQUN0QyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUU7UUFDNUgsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUU7S0FDeEMsQ0FBQztJQUNPLFlBQVksR0FBaUI7UUFDcEMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQzdHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRTtRQUM5RyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO0tBQ3RGLENBQUM7SUFFRiwrR0FBK0c7SUFDOUYsY0FBYyxHQUFtRDtRQUNoRixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDekUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDckcsQ0FBQztJQUNlLGFBQWEsR0FBa0Q7UUFDOUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDcEcsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN2RyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDO0tBQzdDLENBQUM7SUFDZSxjQUFjLEdBQW1EO1FBQ2hGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDL0csVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFF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LENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNySSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ3BGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFL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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRWhGLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQUU7WUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFB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Q0FBQzt3R0FsN0NVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDhEQy9PdEMsNmtuREFrMUJBOzs0RkRubUJhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZvcmtKb2luLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IHsgVHJheFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90cmF4LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdWRpdEFjY2VzcywgYXVkaXRBY2Nlc3MgfSBmcm9tICcuLi9hdWRpdC12Mi1hY2Nlc3MnO1xyXG5pbXBvcnQgeyBQSUNLRVJfTE9DQUxFLCBQaWNrZWREYXRlcywgUGlja2VyUmFuZ2UsIGZyb21QaWNrZXJSYW5nZSwgcGlja2VyUmFuZ2VzLCB0b1BpY2tlclJhbmdlIH0gZnJvbSAnLi4vYXVkaXQtdjItZGF0ZXBpY2tlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0QmFuZCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICByYW5nZTogc3RyaW5nO1xyXG4gIGxvOiBudW1iZXI7XHJcbiAgaGk6IG51bWJlcjtcclxuICBzb2Z0OiBzdHJpbmc7XHJcbiAgYmc6IHN0cmluZztcclxuICBmZzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Um93IHtcclxuICBkYXRlOiBzdHJpbmc7XHJcbiAgc3RvcmVJZDogc3RyaW5nO1xyXG4gIGNpcmNsZTogc3RyaW5nO1xyXG4gIHpvbmU6IHN0cmluZztcclxuICBhb206IHN0cmluZztcclxuICAvKiogQXVkaXRzIHRoZSBzdG9yZSBzdWJtaXR0ZWQgaW4gdGhlIHBlcmlvZCAodGhleSBhZGQgdXAgdG8gdGhlIFwiQXVkaXRzIGNvbXBsZXRlZFwiIGNhcmQpLiAqL1xyXG4gIGF1ZGl0czogbnVtYmVyO1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiAndW5zY29yZWQnID0gYXVkaXRlZCwgYnV0IG5vIHF1ZXN0aW9uIG9mIGl0cyBhdWRpdHMgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiAobm8gc2NvcmUgdG8gc2hvdykuICovXHJcbiAgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0b3JlU3RhdHVzID0gJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ25hJyB8ICd1bnNjb3JlZCc7XHJcbmV4cG9ydCB0eXBlIFN0YXR1c0ZpbHRlciA9ICdhbGwnIHwgU3RvcmVTdGF0dXM7XHJcblxyXG4vKiogQSBzb3J0YWJsZSBjb2x1bW4gb2YgYSBQZXJmb3JtYW5jZSB0YWJsZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmQ29sdW1uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFNvcnRWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIG5vdGVDb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNhdCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3ViOiBzdHJpbmc7XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG4gIGRpc3B1dGVzOiBudW1iZXIgfCBudWxsO1xyXG4gIHBhc3NNYXJrOiBzdHJpbmc7XHJcbiAgc2NvcmU6IHN0cmluZztcclxuICBzY29yZVBjdDogbnVtYmVyO1xyXG4gIC8qKiAn4oCUJyB3aGVuIHRoZSBhdWRpdCBoYXMgbm8gY29tcGxpYW5jZSBzY29yaW5nIChubyBzY29yZSwgc28gbm8gcmVzdWx0KS4gKi9cclxuICByZXN1bHQ6ICdQYXNzJyB8ICdGYWlsJyB8ICfigJQnO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVBlcmZSb3cge1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG4gIHNwb2M6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXIgfCBudWxsO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFza1BlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHRhc2tzOiBzdHJpbmc7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBjb21wbGlhbmNlUGN0OiBudW1iZXI7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG4vKiogVGFzay1tb2RlIHRpbGVzLCBhcyBkaXNwbGF5ZWQgKCfigJQnIHdoZW4gdGhlIEFQSSBoYXMgbm8gdmFsdWUpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGF0cyB7XHJcbiAgYWN0aXZlVGFza3M6IHN0cmluZztcclxuICB0YXNrSW5zdGFuY2VzOiBzdHJpbmc7XHJcbiAgbm90U3VibWl0dGVkOiBzdHJpbmc7XHJcbiAgb3BlblRhc2tzOiBzdHJpbmc7XHJcbiAgaW5Qcm9ncmVzczogc3RyaW5nO1xyXG4gIHN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIGNvbXBsZXRpb25TY29yZTogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2VTY29yZTogc3RyaW5nO1xyXG4gIHRvdGFsRmxhZ3M6IHN0cmluZztcclxuICBjb21wbGV0aW9uRGVsdGE6IHN0cmluZztcclxuICBjb21wbGlhbmNlRGVsdGE6IHN0cmluZztcclxuICBmbGFnc0RlbHRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRhc2tEZWx0YUtleSA9ICdjb21wbGV0aW9uJyB8ICdjb21wbGlhbmNlJyB8ICdmbGFncyc7XHJcblxyXG4vKiogT25lIGV4cG9ydGVkIGNvbHVtbjogaGVhZGVyIHRleHQgYW5kIHRoZSBjZWxsIHZhbHVlIGZvciBhIHJvdy4gKi9cclxuaW50ZXJmYWNlIEV4cG9ydENvbHVtbjxUPiB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgdmFsdWU6IChyb3c6IFQpID0+IGFueTtcclxufVxyXG5cclxuY29uc3QgRU1QVFlfVEFTS19TVEFUUzogVGFza1N0YXRzID0ge1xyXG4gIGFjdGl2ZVRhc2tzOiAn4oCUJyxcclxuICB0YXNrSW5zdGFuY2VzOiAn4oCUJyxcclxuICBub3RTdWJtaXR0ZWQ6ICfigJQnLFxyXG4gIG9wZW5UYXNrczogJ+KAlCcsXHJcbiAgaW5Qcm9ncmVzczogJ+KAlCcsXHJcbiAgc3VibWl0dGVkOiAn4oCUJyxcclxuICBjb21wbGV0aW9uU2NvcmU6ICfigJQnLFxyXG4gIGNvbXBsaWFuY2VTY29yZTogJ+KAlCcsXHJcbiAgdG90YWxGbGFnczogJ+KAlCcsXHJcbiAgY29tcGxldGlvbkRlbHRhOiAnJyxcclxuICBjb21wbGlhbmNlRGVsdGE6ICcnLFxyXG4gIGZsYWdzRGVsdGE6ICcnXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZW5kQmFyIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBBdmVyYWdlIG9mIHRoZSBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHM7IG51bGwgd2hlbiBub25lLiAqL1xyXG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBDb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgKHRoZSBvbmVzIHRoZSBhdmVyYWdlIHJlYWRzKS4gKi9cclxuICBjb3VudDogbnVtYmVyO1xyXG4gIC8qKiBFdmVyeSBzdWJtaXR0ZWQgYXVkaXQsIHNjb3JlZCBvciBub3QuICovXHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBPbmUgZmluYW5jaWFsIHF1YXJ0ZXI6IEFwcmlsLU1hcmNoIHllYXIsIG5hbWVkIGJ5IHRoZSB5ZWFyIGl0IHN0YXJ0cyBpbiAocHJvdG90eXBlOiBBdWcgMjAyNiA9IFEyIEZZMjYpLiAqL1xyXG5pbnRlcmZhY2UgRmlzY2FsUXVhcnRlciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgZnJvbTogc3RyaW5nO1xyXG4gIHRvOiBzdHJpbmc7XHJcbiAgbW9udGhzOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBUaGUgbGFzdCBgbmAgZmluYW5jaWFsIHF1YXJ0ZXJzLCBvbGRlc3QgZmlyc3QsIGVuZGluZyB3aXRoIHRoZSBvbmUgYHRvZGF5YCBmYWxscyBpbi4gKi9cclxuZnVuY3Rpb24gZmlzY2FsUXVhcnRlcnModG9kYXkgPSBkYXlqcygpLCBuID0gNCk6IEZpc2NhbFF1YXJ0ZXJbXSB7XHJcbiAgY29uc3QgY3VycmVudCA9IHRvZGF5LnN0YXJ0T2YoJ21vbnRoJykuc3VidHJhY3QoKHRvZGF5Lm1vbnRoKCkgKyA5KSAlIDMsICdtb250aCcpO1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB7XHJcbiAgICBjb25zdCBzdGFydCA9IGN1cnJlbnQuc3VidHJhY3QoMyAqIChuIC0gMSAtIGkpLCAnbW9udGgnKTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0LmFkZCgyLCAnbW9udGgnKS5lbmRPZignbW9udGgnKTtcclxuICAgIGNvbnN0IGZ5ID0gc3RhcnQubW9udGgoKSA+PSAzID8gc3RhcnQueWVhcigpIDogc3RhcnQueWVhcigpIC0gMTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogJ1EnICsgKE1hdGguZmxvb3IoKChzdGFydC5tb250aCgpICsgOSkgJSAxMikgLyAzKSArIDEpICsgJyBGWScgKyBTdHJpbmcoZnkpLnNsaWNlKDIpLFxyXG4gICAgICBmcm9tOiBzdGFydC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgdG86IGVuZC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgbW9udGhzOiBzdGFydC5mb3JtYXQoJ01NTScpICsgJyDigJMgJyArIGVuZC5mb3JtYXQoJ01NTSBZWVlZJylcclxuICAgIH07XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKiBQYXNzIG1hcmsgYW5kIGNyaXRpY2FsIHRocmVzaG9sZCBmb3IgdGhlIGF1ZGl0IHByb2dyYW1tZSAobm8gcGVyLWF1ZGl0IHBhc3MgbWFyayBpbiB0aGUgZGF0YSB5ZXQpLiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuY29uc3QgQ1JJVElDQUxfTUFSSyA9IDYwO1xyXG5cclxuY29uc3QgQkFORFM6IEF1ZGl0QmFuZFtdID0gW1xyXG4gIHsga2V5OiAnZXhjZWxsZW50JywgbGFiZWw6ICdFeGNlbGxlbnQnLCByYW5nZTogJzkwLTEwMCUnLCBsbzogOTAsIGhpOiAxMDAsIHNvZnQ6ICcjOEZCRkE1JywgYmc6ICcjRUNGREYzJywgZmc6ICcjMDI3QTQ4JyB9LFxyXG4gIHsga2V5OiAnZ29vZCcsIGxhYmVsOiAnR29vZCcsIHJhbmdlOiAnNzUtODklJywgbG86IDc1LCBoaTogODksIHNvZnQ6ICcjOTZCNEQ2JywgYmc6ICcjRUZGOEZGJywgZmc6ICcjMTc1Q0QzJyB9LFxyXG4gIHsga2V5OiAnZmFpcicsIGxhYmVsOiAnTmVlZHMgaW1wcm92ZW1lbnQnLCByYW5nZTogJzYwLTc0JScsIGxvOiA2MCwgaGk6IDc0LCBzb2Z0OiAnI0RDQkU4QycsIGJnOiAnI0ZGRkFFQicsIGZnOiAnI0I1NDcwOCcgfSxcclxuICB7IGtleTogJ2NyaXRpY2FsJywgbGFiZWw6ICdDcml0aWNhbCcsIHJhbmdlOiAnQmVsb3cgNjAlJywgbG86IDAsIGhpOiA1OSwgc29mdDogJyNENkExOUInLCBiZzogJyNGRUYzRjInLCBmZzogJyNCNDIzMTgnIH0sXHJcbiAgeyBrZXk6ICd1bnNjb3JlZCcsIGxhYmVsOiAnTm90IHNjb3JlZCcsIHJhbmdlOiAnQ29tcGxpYW5jZSBzY29yZSBvZmYnLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNDN0Q3RkUnLCBiZzogJyNFRUY0RkYnLCBmZzogJyMzNTM4Q0QnIH0sXHJcbiAgeyBrZXk6ICduYScsIGxhYmVsOiAnTm90IGF1ZGl0ZWQnLCByYW5nZTogJ05vIHN1Ym1pc3Npb24nLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNENkRBRTAnLCBiZzogJyNGMkY0RjcnLCBmZzogJyM0NzU0NjcnIH1cclxuXTtcclxuXHJcbi8qKiBCYW5kcyB0aGF0IGhvbGQgc3RvcmVzIHdpdGhvdXQgYSBzY29yZTsgdGhleSBmaWx0ZXIgYnkgc3RhdHVzLCBub3QgYnkgc2NvcmUgcmFuZ2UuICovXHJcbmNvbnN0IFNUQVRVU19CQU5EUyA9IFsndW5zY29yZWQnLCAnbmEnXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRUeXBlT3B0aW9uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGhlbHA6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQUxMX0FVRElUUzogQXVkaXRUeXBlT3B0aW9uID0geyBrZXk6ICdhbGwnLCBsYWJlbDogJ0FsbCBBdWRpdHMnLCBoZWxwOiAnQmxlbmRlZCBzY29yZSBhY3Jvc3MgZXZlcnkgcHJvZ3JhbW1lLicgfTtcclxuXHJcbi8qKiBTdG9yZSBoaWVyYXJjaHkgcGlja3M6IGNpcmNsZSBoZWFkIC8gem9uZSBtYW5hZ2VyIC8gQU9NIG5hbWVzIGFzIHRoZSBkYXNoYm9hcmQgQVBJIHNlbmRzIHRoZW0sIHN0b3JlID0gc3RvcmVJZC4gKi9cclxuaW50ZXJmYWNlIFNjb3BlUGljayB7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHN0b3JlOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQuIFN0b3JlIGxpc3QsIHNjb3JlIGJhbmRzLCBLUElzIGFuZCB0aGUgYnktZGF0ZSB0cmVuZCBjb21lIGZyb20gdGhlIGF1ZGl0IEFQSVxyXG4gKiAoL3RyYXgvYXVkaXQvZGFzaGJvYXJkKTsgdGhlIEF1ZGl0IC8gVXNlciBQZXJmb3JtYW5jZSB0YWJzIHN0aWxsIHVzZSB0aGUgdjEgZGFzaGJvYXJkXHJcbiAqIGVuZHBvaW50cyAoY2hlY2tsaXN0UGVyZm9ybWFuY2UgLyB1c2VyUGVyZm9ybWFuY2UpLiBUYXNrIG1vZGUgKHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSkgcmVhZHNcclxuICogL3RyYXgvYXVkaXQvZGFzaGJvYXJkL3Rhc2tzOiBvbmx5IHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICogU2NvcGUgKGNsaWVudCwgc3RvcmVzLCBkYXRlcykgY29tZXMgZnJvbSB0aGUgZ2xvYmFsIGhlYWRlciBmaWx0ZXI7IHRoZSBwZXJpb2QgcGlja2VyIGNhbiBuYXJyb3cgdGhlIGRhdGVzLlxyXG4gKiBGaWx0ZXJzIGRyYXdlcjogU3RvcmUgaGllcmFyY2h5IG5hcnJvd3MgdGhlIHN0b3JlcyBhbmQgQXVkaXQgdHlwZSAoY2hlY2tsaXN0SWQpIHRoZSBhdWRpdCBvZiBldmVyeSBmZWVkIChyZWxvYWRlZFxyXG4gKiBvbiBBcHBseSk7IFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIGxvYWRlZCBzdG9yZSBsaXN0IGluIHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBRdWFydGVybHk6IHRoZSB0cmVuZCBzaG93cyB0aGUgbGFzdCBmb3VyIGZpbmFuY2lhbCBxdWFydGVycyAoYnVpbHQgZnJvbSBvbmUgbW9udGhseS1idWNrZXQgY2FsbCBvZlxyXG4gKiB0aGUgc2FtZSBBUEkpIGFuZCB0aGUgcGlja2VkIHF1YXJ0ZXIgYmVjb21lcyB0aGUgcGVyaW9kIG9mIGV2ZXJ5IGZlZWQuIEJ5IGRhdGU6IHRoZSByYW5nZSBwaWNrZXIuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kYXNoYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBQYXNzIC8gY3JpdGljYWwgbWFya3MgY29tZSBmcm9tIHRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJOyB0aGVzZSBhcmUgdGhlIGVtcHR5LXN0YXRlIGRlZmF1bHRzLiAqL1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG4gIGNyaXRpY2FsTWFyayA9IENSSVRJQ0FMX01BUks7XHJcbiAgcmVhZG9ubHkgYmFuZHMgPSBCQU5EUztcclxuICAvKiogXCJBbGwgQXVkaXRzXCIsIHRoZW4gdGhlIGNsaWVudCdzIGF1ZGl0cyAoUE9TVCAvdHJheC9hdWRpdC9saXN0KTsga2V5ID0gYXVkaXQgaWQsIHNlbnQgYXMgY2hlY2tsaXN0SWQuICovXHJcbiAgYXVkaXRUeXBlczogQXVkaXRUeXBlT3B0aW9uW10gPSBbQUxMX0FVRElUU107XHJcbiAgLyoqIENsaWVudCB0aGUgYXVkaXQgbGlzdCB3YXMgZmV0Y2hlZCBmb3IuICovXHJcbiAgcHJpdmF0ZSBhdWRpdFR5cGVzQ2xpZW50ID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmlvZCBzZWxlY3Rpb24uIGZyb20gLyB0byAoWVlZWS1NTS1ERCkgc3RhcnQgYXMgdGhlIGhlYWRlciBkYXRlIHJhbmdlIGFuZCBkcml2ZSBldmVyeSBmZWVkO1xyXG4gICAqIHRoZSByYW5nZSBwaWNrZXIgbmFycm93cyB0aGVtLCBhbmQgYSBoZWFkZXIgY2hhbmdlIHJlc2V0cyB0aGVtLlxyXG4gICAqL1xyXG4gIGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScgPSAnZGF0ZSc7XHJcbiAgcXVhcnRlciA9ICcnO1xyXG4gIHJlYWRvbmx5IGZpc2NhbCA9IGZpc2NhbFF1YXJ0ZXJzKCk7XHJcbiAgcmVhZG9ubHkgcXVhcnRlcnMgPSB0aGlzLmZpc2NhbC5tYXAocSA9PiBxLmtleSk7XHJcbiAgLyoqIFF1YXJ0ZXJseSB0cmVuZCBiYXJzLCBhbmQgdGhlIGNsaWVudCArIHN0b3JlcyB0aGV5IHdlcmUgZmV0Y2hlZCBmb3IuICovXHJcbiAgcXVhcnRlclRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcbiAgcXVhcnRlclRyZW5kTG9hZGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVhcnRlclRyZW5kU2NvcGUgPSAnJztcclxuICBmcm9tID0gJyc7XHJcbiAgdG8gPSAnJztcclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICByZWFkb25seSBwaWNrZXJMb2NhbGUgPSBQSUNLRVJfTE9DQUxFO1xyXG4gIHJlYWRvbmx5IHJhbmdlcyA9IHBpY2tlclJhbmdlcygpO1xyXG4gIHJlYWRvbmx5IHRvZGF5ID0gZGF5anMoKTtcclxuXHJcbiAgLyoqIEZpbHRlcnMuICovXHJcbiAgYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgc3RhdHVzOiBTdGF0dXNGaWx0ZXIgPSAnYWxsJztcclxuICBzZWFyY2ggPSAnJztcclxuICBzY29yZU1pbiA9IDA7XHJcbiAgc2NvcmVNYXggPSAxMDA7XHJcblxyXG4gIC8qKiBBdWRpdCAvIFRhc2sgc3dpdGNoLiAqL1xyXG4gIG1vZHVsZVRhYjogJ0F1ZGl0JyB8ICdUYXNrJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgbW9kdWxlVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdUYXNrJz4gPSBbJ0F1ZGl0JywgJ1Rhc2snXTtcclxuXHJcbiAgLyoqIFNob3duIGluIHRoZSBwYWdlIGhlYWRlcjsgc3RhbXBlZCBvbiBldmVyeSBsb2FkLiAqL1xyXG4gIGxhc3RSZWZyZXNoZWQgPSAn4oCUJztcclxuXHJcbiAgLyoqIEZpbHRlciBkcmF3ZXIuICovXHJcbiAgZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVDYXQgPSAncGVyaW9kJztcclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyIGRyYXdlcidzIGRyYWZ0IChRQSA5IE9jdCk6IE9iamVjdC5jcmVhdGUodGhpcyksIHNvIGV2ZXJ5IGdldHRlciB0aGUgZHJhd2VyIHNob3dzIHdvcmtzIG9uIHRoZSBkcmFmdCdzXHJcbiAgICogb3duIHZhbHVlcyB3aGlsZSB0aGUgcGFnZSBiZWhpbmQga2VlcHMgdGhlIGFwcGxpZWQgb25lcy4gQXBwbHkgY29waWVzIERSQUZUX0tFWVMgb250byB0aGUgcGFnZTsgQ2FuY2VsIGRyb3BzIGl0LlxyXG4gICAqL1xyXG4gIGRyYWZ0OiBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJBRlRfS0VZUyA9IFsnZ3JhaW4nLCAncXVhcnRlcicsICdmcm9tJywgJ3RvJywgJ3JhbmdlJywgJ2F1ZGl0VHlwZScsICdjaXJjbGUnLCAnem9uZScsICdhb20nLCAnc3RvcmUnLFxyXG4gICAgJ3Njb3JlTWluJywgJ3Njb3JlTWF4JywgJ3N0YXR1cycsICdzdG9yZUxpc3RPcGVuJywgJ2xpc3RCYW5kS2V5J10gYXMgY29uc3Q7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGhpZXJhcmNoeSBwaWNrcyBiZWluZyBlZGl0ZWQgaW4gdGhlIGRyYXdlciAoc3RvcmUgPSBzdG9yZUlkKS4gVGhlIGxpc3RzIGNvbWUgZnJvbSB0aGUgZGFzaGJvYXJkXHJcbiAgICogQVBJJ3Mgc3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlOyBBcHBseSBuYXJyb3dzIGV2ZXJ5IGZlZWQgdG8gdGhlIHN0b3JlcyB0aGUgcGljayBjb3ZlcnMuXHJcbiAgICovXHJcbiAgY2lyY2xlID0gJyc7XHJcbiAgem9uZSA9ICcnO1xyXG4gIGFvbSA9ICcnO1xyXG4gIHN0b3JlID0gJyc7XHJcblxyXG4gIC8qKiBTdG9yZSByb3dzIG9mIHRoZSBoZWFkZXIgc2NvcGUsIG5vdCBuYXJyb3dlZCBieSB0aGUgaGllcmFyY2h5OiB0aGUgZHJhd2VyJ3MgbGlzdHMgYW5kIGVhY2ggcGljaydzIHN0b3Jlcy4gKi9cclxuICBwcml2YXRlIHNjb3BlUm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIC8qKiBIaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBmZWVkcyB3ZXJlIGxhc3QgbG9hZGVkIHdpdGg7IHRoZSBkcmF3ZXIgZWRpdHMgYSBkcmFmdCB1bnRpbCBBcHBseS4gKi9cclxuICBwcml2YXRlIGFwcGxpZWQ6IFNjb3BlUGljayAmIHsgYXVkaXRUeXBlOiBzdHJpbmcgfSA9IHsgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJywgYXVkaXRUeXBlOiAnYWxsJyB9O1xyXG4gIC8qKiBDbGllbnQgKyBoZWFkZXIgc3RvcmVzOyBhIGNoYW5nZSByZXNldHMgdGhlIGhpZXJhcmNoeSBwaWNrcyAodGhlaXIgc3RvcmVzIG1heSBiZSBnb25lKS4gKi9cclxuICBwcml2YXRlIGhlYWRlclNjb3BlS2V5ID0gJyc7XHJcblxyXG4gIC8qKiBUYWJsZSBzdGF0ZS4gKi9cclxuICBzb3J0S2V5ID0gJ3Njb3JlJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG4gIHBhZ2UgPSAxO1xyXG4gIC8qKiBTdG9yZSBsaXN0IHBhZ2VyOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLCBhcyBvbiBldmVyeSBhdWRpdCBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBoZWFkZXJzOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW1xyXG4gICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdBdWRpdCBkYXRlJyB9LFxyXG4gICAgLy8gVGhlIGNvbHVtbiBzaG93cyB0aGUgc3RvcmUncyBuYW1lIChyb3cuc3RvcmVJZCBob2xkcyBpdDsgc2VlIHRvQXVkaXRSb3cpLlxyXG4gICAgeyBrZXk6ICdzdG9yZUlkJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LFxyXG4gICAgeyBrZXk6ICdjaXJjbGUnLCBsYWJlbDogJ0NpcmNsZSBIZWFkJyB9LFxyXG4gICAgeyBrZXk6ICd6b25lJywgbGFiZWw6ICdab25lIE1hbmFnZXInIH0sXHJcbiAgICB7IGtleTogJ2FvbScsIGxhYmVsOiAnQU9NJyB9LFxyXG4gICAgLy8gQSBzdG9yZSBjYW4gc3VibWl0IHNldmVyYWwgYXVkaXRzIGluIHRoZSBwZXJpb2Q6IHRoZSBjb2x1bW4gYWRkcyB1cCB0byBcIkF1ZGl0cyBjb21wbGV0ZWRcIiAoUUEgMTMgT2N0KS5cclxuICAgIHsga2V5OiAnYXVkaXRzJywgbGFiZWw6ICdBdWRpdHMnIH0sXHJcbiAgICB7IGtleTogJ3Njb3JlJywgbGFiZWw6ICdTY29yZScgfSxcclxuICAgIHsga2V5OiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnIH1cclxuICBdO1xyXG5cclxuICAvKipcclxuICAgKiBUYXNrIG1vZGU6IHRpbGVzIGFuZCB0aGUgVGFzayBQZXJmb3JtYW5jZSB0YWJsZSBmb3IgdGhlIHRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzXHJcbiAgICogKC90cmF4L2F1ZGl0L2Rhc2hib2FyZC90YXNrcykuIExvYWRlZCB3aGVuIHRoZSBUYXNrIHRhYiBpcyBvcGVuLCBhbmQgYWdhaW4gYWZ0ZXIgYSBoZWFkZXIgY2hhbmdlLlxyXG4gICAqL1xyXG4gIHRhc2tTdGF0czogVGFza1N0YXRzID0geyAuLi5FTVBUWV9UQVNLX1NUQVRTIH07XHJcbiAgdGFza1BlcmY6IFRhc2tQZXJmUm93W10gPSBbXTtcclxuICB0YXNrTG9hZGluZyA9IGZhbHNlO1xyXG4gIC8qKiBDaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCAobnVsbCA9IG5vdGhpbmcgdG8gY29tcGFyZSk7IGRyaXZlcyB0aGUgZGVsdGEgYXJyb3cgYW5kIGNvbG91ci4gKi9cclxuICBwcml2YXRlIHRhc2tEZWx0YVZhbHVlczogUmVjb3JkPFRhc2tEZWx0YUtleSwgbnVtYmVyIHwgbnVsbD4gPSB7IGNvbXBsZXRpb246IG51bGwsIGNvbXBsaWFuY2U6IG51bGwsIGZsYWdzOiBudWxsIH07XHJcbiAgLyoqIFRydWUgdW50aWwgdGhlIHRhc2sgZmlndXJlcyBhcmUgbG9hZGVkIGZvciB0aGUgY3VycmVudCBzY29wZS4gKi9cclxuICBwcml2YXRlIHRhc2tzU3RhbGUgPSB0cnVlO1xyXG4gIC8qKiBJZ25vcmVzIGEgdGFzayByZXNwb25zZSB0aGF0IGEgbmV3ZXIgcmVxdWVzdCBoYXMgb3ZlcnRha2VuLiAqL1xyXG4gIHByaXZhdGUgdGFza1JlcXVlc3QgPSAwO1xyXG4gIC8qKiBQREYgZG93bmxvYWRzIGluIGZsaWdodCwgYnkgdmlzaXQgaWQsIHNvIGEgZG91YmxlIGNsaWNrIHF1ZXVlcyBvbmUgcmVwb3J0LiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGRmUXVldWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBQZXJmb3JtYW5jZSBzZWN0aW9uIChoaWRkZW4gZm9yIG5vdzsgc2V0IHRydWUgdG8gc2hvdyBpdCBhZ2FpbikuICovXHJcbiAgc2hvd1BlcmZvcm1hbmNlID0gZmFsc2U7XHJcbiAgLyoqIEF1ZGl0IHNjb3JlIHRyZW5kOiB0aGUgY2FyZCdzIG93biBkYXRlIHBpY2tlciAoaGlkZGVuIGZvciBub3c7IHRoZSBoZWFkZXIgZGF0ZSBhbmQgRmlsdGVycyBzdGlsbCBzZXQgdGhlIHBlcmlvZCkuICovXHJcbiAgc2hvd1RyZW5kRGF0ZVBpY2tlciA9IGZhbHNlO1xyXG4gIC8qKiBBdWRpdCBzY29yZSB0cmVuZDogXCJCZWxvdyBwYXNzIG1hcmtcIiBwaWxsIChjYXJkICsgYmFyIGhvdmVyIHRpcCksIFwiUGFzcyBtYXJrIE4lXCIgbGVnZW5kIGFuZCBcIsK3IHBhc3MgbWFyayBOJVwiIHRleHQgKGhpZGRlbiBmb3Igbm93KS4gKi9cclxuICBzaG93UGFzc01hcmtJbmZvID0gZmFsc2U7XHJcbiAgLyoqIEZpbHRlcnMgZHJhd2VyID4gUGVyaW9kOiB0aGUgXCJEYXRlIHJhbmdlXCIgcGlja2VyIHVuZGVyIEJ5IGRhdGUgKGhpZGRlbiBmb3Igbm93OyBCeSBkYXRlIHJlYWRzIHRoZSBoZWFkZXIgZGF0ZSByYW5nZSkuICovXHJcbiAgc2hvd0RyYXdlckRhdGVSYW5nZSA9IGZhbHNlO1xyXG4gIHBlcmZUYWI6ICdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInID0gJ0F1ZGl0JztcclxuICByZWFkb25seSBwZXJmVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdTdG9yZScgfCAnVXNlcic+ID0gWydBdWRpdCcsICdTdG9yZScsICdVc2VyJ107XHJcbiAgcGVyZlBlcmlvZCA9ICcnO1xyXG4gIHBlcmZTZWFyY2ggPSAnJztcclxuICAvKiogUGVyZm9ybWFuY2UgdGFibGVzJyBwYWdlciAoc2hhcmVkIGxpYi1wYWdpbmF0aW9uLCBhcyB0aGUgb3RoZXIgYXVkaXQgbGlzdHMpOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLiAqL1xyXG4gIHBlcmZQYWdlID0gMTtcclxuICBwZXJmUGFnZVNpemUgPSAxMDtcclxuICByZWFkb25seSBwZXJmUGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG4gIC8qKiBDb2x1bW4gc29ydCBvZiB0aGUgYWN0aXZlIFBlcmZvcm1hbmNlIHRhYmxlICgnJyA9IHRoZSBBUEkncyBvcmRlcik7IHJlc2V0IHdoZW4gdGhlIHRhYiBjaGFuZ2VzLiAqL1xyXG4gIHBlcmZTb3J0S2V5ID0gJyc7XHJcbiAgcGVyZlNvcnREaXI6ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XHJcblxyXG4gIC8qKiBTb3J0YWJsZSBjb2x1bW5zIG9mIGVhY2ggUGVyZm9ybWFuY2UgdGFibGUsIGluIGRpc3BsYXkgb3JkZXIgKEFjdGlvbiBpcyBub3Qgc29ydGFibGUpLiAqL1xyXG4gIHJlYWRvbmx5IGF1ZGl0UGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIC8vIE5vIFNjaGVkdWxlZCBjb2x1bW4gKFFBIDkgT2N0KS5cclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnQXVkaXQgTmFtZScgfSwgeyBrZXk6ICdhc3NpZ25lZCcsIGxhYmVsOiAnQXNzaWduZWQgVG8nIH0sIHsga2V5OiAnc3VibWl0dGVkJywgbGFiZWw6ICdTdWJtaXR0ZWQnIH0sXHJcbiAgICB7IGtleTogJ2Rpc3B1dGVzJywgbGFiZWw6ICdEaXNwdXRlcycgfSwgeyBrZXk6ICdwYXNzTWFyaycsIGxhYmVsOiAnUGFzcyBNYXJrJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sIHsga2V5OiAncmVzdWx0JywgbGFiZWw6ICdSZXN1bHQnIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHRhc2tQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdUYXNrIE5hbWUnIH0sIHsga2V5OiAnc2NoZWR1bGVkJywgbGFiZWw6ICdTY2hlZHVsZWQnIH0sIHsga2V5OiAnY292ZXJhZ2UnLCBsYWJlbDogJ0NvdmVyYWdlJyB9LFxyXG4gICAgeyBrZXk6ICdhc3NpZ25lZCcsIGxhYmVsOiAnQXNzaWduZWQgVG8nIH0sIHsga2V5OiAnc3VibWl0dGVkJywgbGFiZWw6ICdTdWJtaXR0ZWQnIH0sIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LFxyXG4gICAgeyBrZXk6ICd0YXNrcycsIGxhYmVsOiAnVGFza3MnIH0sIHsga2V5OiAncmVkbycsIGxhYmVsOiAnUmVEbycgfSwgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdRdWVzdGlvbiBDb21wbGlhbmNlICUnIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHN0b3JlUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnc3RvcmUnLCBsYWJlbDogJ1N0b3JlIE5hbWUnIH0sIHsga2V5OiAnc3RvcmVJZCcsIGxhYmVsOiAnU3RvcmUgSUQnIH0sIHsga2V5OiAnc3BvYycsIGxhYmVsOiAnU3RvcmUgU3BvYycgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LCB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSxcclxuICAgIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcbiAgcmVhZG9ubHkgdXNlclBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ1VzZXIgTmFtZScgfSwgeyBrZXk6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAncmVkbycsIGxhYmVsOiAnUmVEbycgfSwgeyBrZXk6ICdjb21wbGV0aW9uJywgbGFiZWw6ICdDb21wbGV0aW9uICUnIH0sXHJcbiAgICB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSwgeyBrZXk6ICdwZXJmJywgbGFiZWw6ICdQZXJmb3JtYW5jZSAlJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqIFdoYXQgZWFjaCBzb3J0YWJsZSBjb2x1bW4gc29ydHMgb246IG51bWJlcnMgZm9yIGNvdW50cyBhbmQgcGVyY2VudGFnZXMsIHRleHQgb3RoZXJ3aXNlOyBudWxsIHNvcnRzIGxhc3QuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IEF1ZGl0UGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBzdWJtaXR0ZWQ6IHIgPT4gci5zdWJtaXR0ZWQsXHJcbiAgICBkaXNwdXRlczogciA9PiByLmRpc3B1dGVzLCBwYXNzTWFyazogciA9PiB0aGlzLm51bShTdHJpbmcoci5wYXNzTWFyaykucmVwbGFjZSgnJScsICcnKSksXHJcbiAgICBzY29yZTogciA9PiAoci5zY29yZSA9PT0gJ+KAlCcgPyBudWxsIDogci5zY29yZVBjdCksIHJlc3VsdDogciA9PiAoci5yZXN1bHQgPT09ICfigJQnID8gbnVsbCA6IHIucmVzdWx0KVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogVGFza1BlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgc2NoZWR1bGVkOiByID0+IHIuc2NoZWR1bGVkLCBjb3ZlcmFnZTogciA9PiByLmNvdmVyYWdlLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLFxyXG4gICAgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLCBmbGFnczogciA9PiByLmZsYWdzLCB0YXNrczogciA9PiB0aGlzLm51bShyLnJhdz8udGFza3MpLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogU3RvcmVQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgc3RvcmU6IHIgPT4gci5zdG9yZSwgc3RvcmVJZDogciA9PiByLnN0b3JlSWQsIHNwb2M6IHIgPT4gci5zcG9jLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBmbGFnczogciA9PiByLmZsYWdzLFxyXG4gICAgY29tcGxldGlvbjogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxldGlvbiksIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpLCBwZXJmOiByID0+IHRoaXMubnVtKHIucmF3Py5wZXJmb3JtYW5jZSlcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlclNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFVzZXJQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgbmFtZTogciA9PiByLm5hbWUsIGVtYWlsOiByID0+IHIuZW1haWwsIGFzc2lnbmVkOiByID0+IHIuYXNzaWduZWQsIGZsYWdzOiByID0+IHIuZmxhZ3MsIHJlZG86IHIgPT4gci5yZWRvLFxyXG4gICAgY29tcGxldGlvbjogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxldGlvbiksIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpLCBwZXJmOiByID0+IHRoaXMubnVtKHIucmF3Py5wZXJmb3JtYW5jZSlcclxuICB9O1xyXG5cclxuICBhdWRpdFBlcmY6IEF1ZGl0UGVyZlJvd1tdID0gW107XHJcbiAgc3RvcmVQZXJmOiBTdG9yZVBlcmZSb3dbXSA9IFtdO1xyXG4gIHVzZXJQZXJmOiBVc2VyUGVyZlJvd1tdID0gW107XHJcblxyXG4gIHJvd3M6IEF1ZGl0Um93W10gPSBbXTtcclxuICB0cmVuZDogVHJlbmRCYXJbXSA9IFtdO1xyXG5cclxuICAvKiogU3RhcnRzIHRydWUgc28gdGhlIGZpcnN0IHBhaW50IHNoaW1tZXJzIGluc3RlYWQgb2YgZmxhc2hpbmcgZW1wdHkgdGlsZXMgYW5kIHRhYmxlcy4gKi9cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBoZWFkZXJEYXRhOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyRW1haWxlczogc3RyaW5nW10gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2Vyc0VtYWlsLWluZm8nKSB8fCAnW10nKTtcclxuICAvKiogQ3JlYXRlIEF1ZGl0IHNob3dzIG9ubHkgd2l0aCB0aGUgQ2hlY2tsaXN0IGFkZCBwZXJtaXNzaW9uLiAqL1xyXG4gIGFjY2VzczogQXVkaXRBY2Nlc3MgPSB7IGNhbkFkZDogZmFsc2UsIGNhbkVkaXQ6IGZhbHNlIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgYXVkaXRBY2Nlc3ModGhpcy5ncykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhY2Nlc3MgPT4ge1xyXG4gICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzcztcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhPy5jbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgY29uc3QgY2xpZW50Q2hhbmdlZCA9IGRhdGEuY2xpZW50ICE9PSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB0aGlzLmhlYWRlckRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMub25IZWFkZXJTY29wZShjbGllbnRDaGFuZ2VkKTtcclxuICAgICAgICAvLyBBIHF1YXJ0ZXIgc3RheXMgcGlja2VkIGFjcm9zcyBoZWFkZXIgY2hhbmdlcyAobmV3IHN0b3JlcyAvIGNsaWVudCk7IEJ5IGRhdGUgZm9sbG93cyB0aGUgaGVhZGVyLlxyXG4gICAgICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicpIHsgdGhpcy5hcHBseVF1YXJ0ZXIodGhpcy5xdWFydGVyLCB0cnVlKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5mcm9tID0gZGF0YS5kYXRlPy5zdGFydERhdGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy50byA9IGRhdGEuZGF0ZT8uZW5kRGF0ZSB8fCAnJztcclxuICAgICAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgICAgIHRoaXMucmVsb2FkUGVyaW9kKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVhZGVyIGNoYW5nZS4gTmV3IGNsaWVudDogdGhlIGF1ZGl0IHR5cGUgc3RhcnRzIG92ZXIgYW5kIGl0cyBsaXN0IGlzIGZldGNoZWQgYWdhaW4uIE5ldyBjbGllbnQgb3JcclxuICAgKiBzdG9yZXM6IHRoZSBoaWVyYXJjaHkgcGlja3Mgc3RhcnQgb3ZlciAodGhlIG5leHQgbG9hZCByZWZpbGxzIHRoZSBsaXN0cykuIEEgZGF0ZS1vbmx5IGNoYW5nZSBrZWVwcyBib3RoLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25IZWFkZXJTY29wZShjbGllbnRDaGFuZ2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmhlYWRlckRhdGEuY2xpZW50ICsgJ3wnICsgdGhpcy5oZWFkZXJTdG9yZUlkcygpLmpvaW4oJywnKTtcclxuICAgIGlmIChrZXkgIT09IHRoaXMuaGVhZGVyU2NvcGVLZXkpIHtcclxuICAgICAgdGhpcy5oZWFkZXJTY29wZUtleSA9IGtleTtcclxuICAgICAgdGhpcy5jaXJjbGUgPSB0aGlzLnpvbmUgPSB0aGlzLmFvbSA9IHRoaXMuc3RvcmUgPSAnJztcclxuICAgICAgdGhpcy5hcHBsaWVkID0geyAuLi50aGlzLmFwcGxpZWQsIGNpcmNsZTogJycsIHpvbmU6ICcnLCBhb206ICcnLCBzdG9yZTogJycgfTtcclxuICAgIH1cclxuICAgIGlmIChjbGllbnRDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMuYXBwbGllZC5hdWRpdFR5cGUgPSAnYWxsJztcclxuICAgICAgdGhpcy5hdWRpdFR5cGVzID0gW0FMTF9BVURJVFNdO1xyXG4gICAgICB0aGlzLmxvYWRBdWRpdFR5cGVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGNsaWVudCdzIGF1ZGl0cyBmb3IgdGhlIEF1ZGl0IHR5cGUgZmlsdGVyLCBuZXdlc3QgZmlyc3QgYXMgdGhlIE1hbmFnZSBsaXN0LiAqL1xyXG4gIHByaXZhdGUgbG9hZEF1ZGl0VHlwZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGllbnRJZCA9IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgaWYgKCFjbGllbnRJZCB8fCBjbGllbnRJZCA9PT0gdGhpcy5hdWRpdFR5cGVzQ2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5hdWRpdFR5cGVzQ2xpZW50ID0gY2xpZW50SWQ7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0TGlzdCh7XHJcbiAgICAgIGNsaWVudElkLCBmcm9tRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsIHRvRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgICBsaW1pdDogNTAwLCBvZmZzZXQ6IDEsIHNlYXJjaDogJydcclxuICAgIH0pLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzPy5jb2RlICE9PSAyMDApIHsgdGhpcy5hdWRpdFR5cGVzQ2xpZW50ID0gJyc7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBsaXN0OiBhbnlbXSA9IHJlcy5kYXRhPy5yZXN1bHQgfHwgW107XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlcyA9IFtBTExfQVVESVRTXS5jb25jYXQobGlzdC5tYXAoYSA9PiAoe1xyXG4gICAgICAgIGtleTogU3RyaW5nKGEuX2lkKSxcclxuICAgICAgICBsYWJlbDogYS5jaGVja0xpc3ROYW1lIHx8ICdVbnRpdGxlZCBhdWRpdCcsXHJcbiAgICAgICAgaGVscDogKGEucHVibGlzaCA/ICdQdWJsaXNoZWQnIDogJ0RyYWZ0JykgKyAnIMK3IHBhc3MgbWFyayAnICsgKHRoaXMubnVtKGEucGFzc01hcmspID8/IFBBU1NfTUFSSykgKyAnJSdcclxuICAgICAgfSkpKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBCeSBkYXRlOiBvbmUgbW9udGggYXQgbW9zdCAodGhlIHBpY2tlcnMnIGRhdGVMaW1pdCwgaW4gZGF5cyBhZnRlciB0aGUgc3RhcnQ7IDMwID0gdXAgdG8gMzEgZGF5cykuICovXHJcbiAgcmVhZG9ubHkgbWF4UmFuZ2VEYXlzID0gMzA7XHJcblxyXG4gIC8qKiBSYW5nZSBwaWNrZXI6IGEgbmV3IHBlcmlvZCByZWxvYWRzIGV2ZXJ5IGZlZWQsIGV4Y2VwdCBpbnNpZGUgdGhlIGZpbHRlciBkcmF3ZXIsIHdoZXJlIEFwcGx5IGRvZXMuICovXHJcbiAgb25SYW5nZVBpY2tlZChlOiBQaWNrZWREYXRlcyB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBpY2tlZCA9IGZyb21QaWNrZXJSYW5nZShlKTtcclxuICAgIGlmICghcGlja2VkIHx8IChwaWNrZWQuZnJvbSA9PT0gdGhpcy5mcm9tICYmIHBpY2tlZC50byA9PT0gdGhpcy50bykpIHsgcmV0dXJuOyB9XHJcbiAgICAvLyBBIGxvbmdlciByYW5nZSAodHlwZWQsIG9yIGEgcHJlc2V0KSBpcyBjdXQgYmFjayB0byBhIG1vbnRoIGZyb20gaXRzIHN0YXJ0LlxyXG4gICAgaWYgKGRheWpzKHBpY2tlZC50bykuZGlmZihkYXlqcyhwaWNrZWQuZnJvbSksICdkYXknKSA+IHRoaXMubWF4UmFuZ2VEYXlzKSB7XHJcbiAgICAgIHBpY2tlZC50byA9IGRheWpzKHBpY2tlZC5mcm9tKS5hZGQodGhpcy5tYXhSYW5nZURheXMsICdkYXknKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UocGlja2VkLmZyb20sIHBpY2tlZC50byk7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnUGljayB1cCB0byBvbmUgbW9udGgg4oCUIHRoZSByYW5nZSBlbmRzIG9uICcgKyBkYXlqcyhwaWNrZWQudG8pLmZvcm1hdCgnREQgTU1NIFlZWVknKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZyb20gPSBwaWNrZWQuZnJvbTtcclxuICAgIHRoaXMudG8gPSBwaWNrZWQudG87XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4pIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRQZXJpb2QoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQZXJpb2QgPSAnQmFzZWQgb24gJyArIHRoaXMuZm10KHRoaXMuZnJvbSkgKyAnIC0gJyArIHRoaXMuZm10KHRoaXMudG8pO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gICAgLy8gVGFzayBmaWd1cmVzIGZvbGxvdyB0aGUgc2FtZSBzY29wZTsgZmV0Y2hlZCBub3cgaW4gVGFzayBtb2RlLCBlbHNlIHdoZW4gdGhlIHRhYiBvcGVucy5cclxuICAgIHRoaXMudGFza3NTdGFsZSA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5pc1Rhc2tNb2R1bGUpIHsgdGhpcy5sb2FkVGFza3MoKTsgfVxyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyB0aGlzLmxvYWRRdWFydGVyVHJlbmQoKTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZvdXIgcXVhcnRlciBiYXJzOiBvbmUgY2FsbCBvdmVyIHRoZSBmb3VyIHF1YXJ0ZXJzIChtb3JlIHRoYW4gMTIwIGRheXMsIHNvIHRoZSBBUEkgYnVja2V0cyB0aGVcclxuICAgKiB0cmVuZCBieSBtb250aCkgcm9sbGVkIHVwIHBlciBxdWFydGVyLCB3ZWlnaHRlZCBieSBlYWNoIG1vbnRoJ3MgYXVkaXQgY291bnQuIEZldGNoZWQgYWdhaW4gb25seVxyXG4gICAqIHdoZW4gdGhlIGNsaWVudCBvciBzdG9yZXMgY2hhbmdlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFF1YXJ0ZXJUcmVuZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5iYXNlUGF5bG9hZCgpO1xyXG4gICAgY29uc3Qga2V5ID0gc2NvcGVbJ2NsaWVudElkJ10gKyAnfCcgKyAoc2NvcGVbJ3N0b3JlSWQnXSB8fCBbXSkuam9pbignLCcpICsgJ3wnICsgKHNjb3BlWydjaGVja2xpc3RJZCddIHx8ICcnKTtcclxuICAgIGlmIChrZXkgPT09IHRoaXMucXVhcnRlclRyZW5kU2NvcGUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlID0ga2V5O1xyXG4gICAgdGhpcy5xdWFydGVyVHJlbmRMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmQoe1xyXG4gICAgICBjbGllbnRJZDogc2NvcGVbJ2NsaWVudElkJ10sIGZyb21EYXRlOiB0aGlzLmZpc2NhbFswXS5mcm9tLCB0b0RhdGU6IHRoaXMudG9kYXkuZm9ybWF0KCdZWVlZLU1NLUREJyksIHN0b3JlSWQ6IHNjb3BlWydzdG9yZUlkJ10sXHJcbiAgICAgIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG9rID0gcmVzPy5jb2RlID09PSAyMDA7XHJcbiAgICAgIGlmICghb2spIHsgdGhpcy5xdWFydGVyVHJlbmRTY29wZSA9ICcnOyB9XHJcbiAgICAgIGNvbnN0IGJ1Y2tldHM6IGFueVtdID0gb2sgPyByZXMuZGF0YT8udHJlbmQgfHwgW10gOiBbXTtcclxuICAgICAgdGhpcy5xdWFydGVyVHJlbmQgPSB0aGlzLmZpc2NhbC5tYXAocSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5RdWFydGVyID0gYnVja2V0cy5maWx0ZXIoYiA9PiBTdHJpbmcoYi5rZXkpID49IHEuZnJvbSAmJiBTdHJpbmcoYi5rZXkpIDw9IHEudG8gJiYgYi52YWx1ZSAhPT0gbnVsbCAmJiBiLnZhbHVlICE9PSB1bmRlZmluZWQpO1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gaW5RdWFydGVyLnJlZHVjZSgobiwgYikgPT4gbiArIChOdW1iZXIoYi5jb3VudCkgfHwgMCksIDApO1xyXG4gICAgICAgIGNvbnN0IHRvdGFsID0gaW5RdWFydGVyLnJlZHVjZSgobiwgYikgPT4gbiArIE51bWJlcihiLnZhbHVlKSAqIChOdW1iZXIoYi5jb3VudCkgfHwgMCksIDApO1xyXG4gICAgICAgIGNvbnN0IHN1Ym1pdHRlZCA9IGJ1Y2tldHMuZmlsdGVyKGIgPT4gU3RyaW5nKGIua2V5KSA+PSBxLmZyb20gJiYgU3RyaW5nKGIua2V5KSA8PSBxLnRvKVxyXG4gICAgICAgICAgLnJlZHVjZSgobiwgYikgPT4gbiArIChOdW1iZXIoYi5zdWJtaXR0ZWQgPz8gYi5jb3VudCkgfHwgMCksIDApO1xyXG4gICAgICAgIHJldHVybiB7IGtleTogcS5rZXksIGxhYmVsOiBxLmtleSwgdmFsdWU6IGNvdW50ID8gTWF0aC5yb3VuZCh0b3RhbCAvIGNvdW50KSA6IG51bGwsIGNvdW50LCBzdWJtaXR0ZWQgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1ha2UgYSBxdWFydGVyIHRoZSBwZXJpb2QgKHVwIHRvIHRvZGF5IGZvciB0aGUgY3VycmVudCBvbmUpOyByZWxvYWRzIHVubGVzcyB0aGUgZmlsdGVyIGRyYXdlciBpcyBvcGVuLiAqL1xyXG4gIHByaXZhdGUgYXBwbHlRdWFydGVyKGtleTogc3RyaW5nLCBmb3JjZSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5maXNjYWwuZmluZCh4ID0+IHgua2V5ID09PSBrZXkpIHx8IHRoaXMuZmlzY2FsW3RoaXMuZmlzY2FsLmxlbmd0aCAtIDFdO1xyXG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLnRvZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgY29uc3QgdG8gPSBxLnRvID4gdG9kYXkgPyB0b2RheSA6IHEudG87XHJcbiAgICBpZiAoIWZvcmNlICYmIHEua2V5ID09PSB0aGlzLnF1YXJ0ZXIgJiYgdGhpcy5mcm9tID09PSBxLmZyb20gJiYgdGhpcy50byA9PT0gdG8pIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnF1YXJ0ZXIgPSBxLmtleTtcclxuICAgIHRoaXMuZnJvbSA9IHEuZnJvbTtcclxuICAgIHRoaXMudG8gPSB0bztcclxuICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4pIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFF1YXJ0ZXJseTogYSBiYXIgKG9yIGEgcXVhcnRlciBpbiB0aGUgZmlsdGVyIGRyYXdlcikgcGlja3MgdGhhdCBxdWFydGVyLiAqL1xyXG4gIHNlbGVjdFF1YXJ0ZXIoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyYWluICE9PSAncXVhcnRlcicpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmFwcGx5UXVhcnRlcihrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSB0cmVuZCBjYXJkIHdhaXRzIGZvciB0aGUgcGFnZSBmZWVkcywgYW5kIGluIFF1YXJ0ZXJseSBhbHNvIGZvciB0aGUgcXVhcnRlciBiYXJzLiAqL1xyXG4gIGdldCB0cmVuZExvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8ICh0aGlzLmdyYWluID09PSAncXVhcnRlcicgJiYgdGhpcy5xdWFydGVyVHJlbmRMb2FkaW5nKTtcclxuICB9XHJcblxyXG4gIC8qKiBCYXJzIHRoZSB0cmVuZCBjaGFydCBkcmF3czogdGhlIGZvdXIgcXVhcnRlcnMsIG9yIHRoZSBBUEkncyBieS1kYXRlIGJ1Y2tldHMuICovXHJcbiAgZ2V0IHRyZW5kQmFycygpOiBUcmVuZEJhcltdIHtcclxuICAgIHJldHVybiB0aGlzLmdyYWluID09PSAncXVhcnRlcicgPyB0aGlzLnF1YXJ0ZXJUcmVuZCA6IHRoaXMudHJlbmQ7XHJcbiAgfVxyXG5cclxuICAvKiogTW9yZSBiYXJzIHRoYW4gZml0IHRoZWlyIGxhYmVscyAoYSBtb250aCBieSBkYXRlKTogc2VlIHNob3dYTGFiZWwuICovXHJcbiAgZ2V0IGRlbnNlVHJlbmQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50cmVuZEJhcnMubGVuZ3RoID4gMTI7XHJcbiAgfVxyXG5cclxuICAvKiogRGVuc2UgY2hhcnQ6IGEgbGFiZWwgb24gZXZlcnkgZmV3IGJhcnMgKGFib3V0IDggYWNyb3NzKSwgYWx3YXlzIG9uIHRoZSBmaXJzdCBhbmQgbGFzdDsgb3RoZXJ3aXNlIGV2ZXJ5IGJhci4gKi9cclxuICBzaG93WExhYmVsKGk6IG51bWJlciwgbGFzdDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbiA9IHRoaXMudHJlbmRCYXJzLmxlbmd0aDtcclxuICAgIGlmIChuIDw9IDEyKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKG4gLyA4KTtcclxuICAgIC8vIFRoZSBsYXN0IGxhYmVsIGFsd2F5cyBzaG93czsgdGhlIHJlZ3VsYXIgb25lIGp1c3QgYmVmb3JlIGl0IGlzIHNraXBwZWQgd2hlbiB0aGUgdHdvIHdvdWxkIHRvdWNoLlxyXG4gICAgcmV0dXJuIGxhc3QgfHwgKGkgJSBzdGVwID09PSAwICYmIG4gLSAxIC0gaSA+PSBzdGVwIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogXCJPY3Qg4oCTIERlYyAyMDI2XCIgZm9yIGEgcXVhcnRlciBrZXkuICovXHJcbiAgcXVhcnRlck1vbnRocyhrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5maXNjYWwuZmluZChxID0+IHEua2V5ID09PSBrZXkpPy5tb250aHMgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB0aWNrZWQgaW4gdGhlIGdsb2JhbCBoZWFkZXIuICovXHJcbiAgcHJpdmF0ZSBoZWFkZXJTdG9yZUlkcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gKHRoaXMuaGVhZGVyRGF0YT8uc3RvcmVzIHx8IFtdKS5maWx0ZXIoKHM6IGFueSkgPT4gcy5jaGVja2VkKS5tYXAoKHM6IGFueSkgPT4gcy5zdG9yZUlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhpZXJhcmNoeUFwcGxpZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhID0gdGhpcy5hcHBsaWVkO1xyXG4gICAgcmV0dXJuICEhKGEuY2lyY2xlIHx8IGEuem9uZSB8fCBhLmFvbSB8fCBhLnN0b3JlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWF0Y2hlc1Njb3BlKHI6IEF1ZGl0Um93LCBwaWNrOiBTY29wZVBpY2spOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoIXBpY2suY2lyY2xlIHx8IHIuY2lyY2xlID09PSBwaWNrLmNpcmNsZSkgJiYgKCFwaWNrLnpvbmUgfHwgci56b25lID09PSBwaWNrLnpvbmUpXHJcbiAgICAgICYmICghcGljay5hb20gfHwgci5hb20gPT09IHBpY2suYW9tKSAmJiAoIXBpY2suc3RvcmUgfHwgU3RyaW5nKHIucmF3Py5zdG9yZUlkKSA9PT0gcGljay5zdG9yZSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHN0b3JlcyBldmVyeSBmZWVkIHJlYWRzOiB0aGUgaGVhZGVyJ3MsIG5hcnJvd2VkIHRvIHRoZSBhcHBsaWVkIGhpZXJhcmNoeSBwaWNrLiAqL1xyXG4gIHByaXZhdGUgc2NvcGVkU3RvcmVJZHMoKTogc3RyaW5nW10ge1xyXG4gICAgaWYgKCF0aGlzLmhpZXJhcmNoeUFwcGxpZWQpIHsgcmV0dXJuIHRoaXMuaGVhZGVyU3RvcmVJZHMoKTsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHRoaXMubWF0Y2hlc1Njb3BlKHIsIHRoaXMuYXBwbGllZCkpLm1hcChyID0+IFN0cmluZyhyLnJhdz8uc3RvcmVJZCB8fCAnJykpLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXBwbGllZCBBdWRpdCB0eXBlIGFzIHRoZSBBUElzIHRha2UgaXQgKG5vdGhpbmcgZm9yIEFsbCBBdWRpdHMpLiAqL1xyXG4gIHByaXZhdGUgYXVkaXRGaWx0ZXIoKTogeyBjaGVja2xpc3RJZD86IHN0cmluZyB9IHtcclxuICAgIHJldHVybiB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlICE9PSAnYWxsJyA/IHsgY2hlY2tsaXN0SWQ6IHRoaXMuYXBwbGllZC5hdWRpdFR5cGUgfSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiYXNlUGF5bG9hZChleHRyYTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgICBzdG9yZUlkOiB0aGlzLnNjb3BlZFN0b3JlSWRzKCksXHJcbiAgICAgIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICB1c2VyRW1haWxlczogdGhpcy51c2VyRW1haWxlcyxcclxuICAgICAgbGltaXQ6IDEwMDAsXHJcbiAgICAgIG9mZnNldDogMCxcclxuICAgICAgc29ydEJ5OiAnJyxcclxuICAgICAgc29ydENvbHVtbk5hbWU6ICcnLFxyXG4gICAgICBzZWFyY2hWYWx1ZTogJycsXHJcbiAgICAgIGV4cG9ydDogZmFsc2UsXHJcbiAgICAgIC4uLmV4dHJhXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmb3VyIGZlZWRzIGxvYWQgdG9nZXRoZXI7IGEgZmFpbHVyZSBpbiBvbmUgbGVhdmVzIHRoZSBvdGhlcnMgaW50YWN0LiAqL1xyXG4gIHByaXZhdGUgbG9hZCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzYWZlID0gKG86IGFueSkgPT4gby5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKTtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5iYXNlUGF5bG9hZCgpO1xyXG4gICAgLy8gUm93cyBmZXRjaGVkIGZvciB0aGUgd2hvbGUgaGVhZGVyIHNjb3BlIHJlZmlsbCB0aGUgaGllcmFyY2h5IGxpc3RzOyBuYXJyb3dlZCBvbmVzIGRvIG5vdC5cclxuICAgIGNvbnN0IG5hcnJvd2VkID0gdGhpcy5oaWVyYXJjaHlBcHBsaWVkO1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICAvLyBUaGUgYXVkaXQgZGFzaGJvYXJkIEFQSSByZWplY3RzIHVua25vd24ga2V5cywgc28gb25seSB0aGUgc2NvcGUgaXMgc2VudC5cclxuICAgICAgZGFzaDogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkKHtcclxuICAgICAgICBjbGllbnRJZDogc2NvcGVbJ2NsaWVudElkJ10sIGZyb21EYXRlOiBzY29wZVsnZnJvbURhdGUnXSwgdG9EYXRlOiBzY29wZVsndG9EYXRlJ10sIHN0b3JlSWQ6IHNjb3BlWydzdG9yZUlkJ10sXHJcbiAgICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICAgIH0pKSxcclxuICAgICAgLy8gU2FtZSB0YWJsZXMgYXMgdGhlIGNoZWNrbGlzdCBkYXNoYm9hcmQsIGxpbWl0ZWQgc2VydmVyLXNpZGUgdG8gdGhpcyBjbGllbnQncyBhdWRpdHMuXHJcbiAgICAgIGF1ZGl0czogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q2hlY2tsaXN0UGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiAyMDAgfSkpKSxcclxuICAgICAgc3RvcmVzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRTdG9yZVBlcmZvcm1hbmNlKHRoaXMuYmFzZVBheWxvYWQoeyBsaW1pdDogMTAwMCB9KSkpLFxyXG4gICAgICB1c2Vyczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0VXNlclBlcmZvcm1hbmNlKHRoaXMuYmFzZVBheWxvYWQoeyBsaW1pdDogNTAwIH0pKSlcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHsgZGFzaCwgYXVkaXRzLCBzdG9yZXMsIHVzZXJzIH06IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gZGFzaD8uY29kZSA9PT0gMjAwID8gKGRhc2guZGF0YSB8fCB7fSkgOiB7fTtcclxuICAgICAgY29uc3QgYXVkaXRMaXN0ID0gYXVkaXRzPy5jb2RlID09PSAyMDAgPyAoYXVkaXRzLmRhdGE/LmNoZWNrbGlzdFBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG4gICAgICBjb25zdCBzdG9yZUxpc3QgPSBzdG9yZXM/LmNvZGUgPT09IDIwMCA/IChzdG9yZXMuZGF0YT8uc3RvcmVQZXJmb3JtYW5jZSB8fCBbXSkgOiBbXTtcclxuICAgICAgY29uc3QgdXNlckxpc3QgPSB1c2Vycz8uY29kZSA9PT0gMjAwID8gKHVzZXJzLmRhdGE/LnVzZXJQZXJmb3JtYW5jZSB8fCBbXSkgOiBbXTtcclxuXHJcbiAgICAgIHRoaXMucGFzc01hcmsgPSBOdW1iZXIoZGF0YS5zdW1tYXJ5Py5wYXNzTWFyaykgfHwgUEFTU19NQVJLO1xyXG4gICAgICB0aGlzLmNyaXRpY2FsTWFyayA9IE51bWJlcihkYXRhLnN1bW1hcnk/LmNyaXRpY2FsTWFyaykgfHwgQ1JJVElDQUxfTUFSSztcclxuICAgICAgdGhpcy5yb3dzID0gKGRhdGEuc3RvcmVzIHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gdGhpcy50b0F1ZGl0Um93KHMpKTtcclxuICAgICAgaWYgKCFuYXJyb3dlZCAmJiBkYXNoPy5jb2RlID09PSAyMDApIHsgdGhpcy5zY29wZVJvd3MgPSB0aGlzLnJvd3M7IH1cclxuICAgICAgdGhpcy5zdG9yZVBlcmYgPSBzdG9yZUxpc3QubWFwKChyOiBhbnkpID0+IHRoaXMudG9TdG9yZVBlcmYocikpO1xyXG4gICAgICB0aGlzLnRyZW5kID0gKGRhdGEudHJlbmQgfHwgW10pLm1hcCgoYjogYW55KSA9PiAoe1xyXG4gICAgICAgIGtleTogU3RyaW5nKGIua2V5KSwgbGFiZWw6IFN0cmluZyhiLmxhYmVsKSxcclxuICAgICAgICB2YWx1ZTogYi52YWx1ZSA9PT0gbnVsbCB8fCBiLnZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKGIudmFsdWUpLFxyXG4gICAgICAgIGNvdW50OiBOdW1iZXIoYi5jb3VudCkgfHwgMCxcclxuICAgICAgICAvLyBPbGRlciBBUEkgYnVpbGRzIHNlbmQgb25seSBjb3VudCAoZXZlcnkgYXVkaXQgd2FzIHNjb3JlZCB0aGVuKS5cclxuICAgICAgICBzdWJtaXR0ZWQ6IE51bWJlcihiLnN1Ym1pdHRlZCA/PyBiLmNvdW50KSB8fCAwXHJcbiAgICAgIH0pKTtcclxuICAgICAgdGhpcy5hdWRpdFBlcmYgPSBhdWRpdExpc3QubWFwKChyOiBhbnkpID0+IHRoaXMudG9BdWRpdFBlcmYocikpO1xyXG4gICAgICB0aGlzLnVzZXJQZXJmID0gdXNlckxpc3QubWFwKChyOiBhbnkpID0+IHRoaXMudG9Vc2VyUGVyZihyKSk7XHJcbiAgICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoZWQgPSBkYXlqcygpLmZvcm1hdCgnaGg6bW06c3MgQScpO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uZSBzdG9yZSBmcm9tIHRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJOiBzY29yZSBpcyB0aGUgbWVhbiBvZiBpdHMgY29tcGxpYW5jZS1zY29yZWQgYXVkaXRzIGluIHRoZSBwZXJpb2QsXHJcbiAgICogbnVsbCB3aGVuIG5vbmUuIEEgc3RvcmUgd2l0aCBzdWJtaXR0ZWQgYXVkaXRzIGJ1dCBubyBzY29yZSBpcyAndW5zY29yZWQnIChpdHMgYXVkaXRzIGhhdmUgbm8gcXVlc3Rpb24gd2l0aFxyXG4gICAqIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiksIG5vdCBcIk5vdCBhdWRpdGVkXCIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0b0F1ZGl0Um93KHM6IGFueSk6IEF1ZGl0Um93IHtcclxuICAgIGNvbnN0IHNjb3JlID0gdGhpcy5udW0ocz8uc2NvcmUpO1xyXG4gICAgbGV0IHN0YXR1czogU3RvcmVTdGF0dXM7XHJcbiAgICBpZiAoc2NvcmUgIT09IG51bGwpIHtcclxuICAgICAgc3RhdHVzID0gc2NvcmUgPj0gdGhpcy5wYXNzTWFyayA/ICdwYXNzJyA6ICdmYWlsJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0YXR1cyA9IHM/LnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJyB8fCAodGhpcy5udW0ocz8uYXVkaXRzKSA/PyAwKSA+IDAgPyAndW5zY29yZWQnIDogJ25hJztcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGU6IHM/Lmxhc3RBdWRpdERhdGUgPyB0aGlzLmZtdChzLmxhc3RBdWRpdERhdGUpIDogJ+KAlCcsXHJcbiAgICAgIC8vIFRoZSBzdG9yZSdzIG5hbWUgKGhpZXJhcmNoeSwgaXRzIHN1Ym1pc3Npb25zLCBvciB0aGUgc3RvcmVzIGxpc3QpOyBcIuKAlFwiIHdoZW4gaXQgaGFzIG5vbmUsIG5ldmVyIHRoZSBpZC5cclxuICAgICAgc3RvcmVJZDogcz8uc3RvcmVOYW1lIHx8ICfigJQnLFxyXG4gICAgICBjaXJjbGU6IHM/LmNpcmNsZSB8fCAn4oCUJyxcclxuICAgICAgem9uZTogcz8uem9uZSB8fCAn4oCUJyxcclxuICAgICAgYW9tOiBzPy5hb20gfHwgJ+KAlCcsXHJcbiAgICAgIGF1ZGl0czogdGhpcy5udW0ocz8uYXVkaXRzKSA/PyAwLFxyXG4gICAgICBzY29yZTogc2NvcmUgPT09IG51bGwgPyBudWxsIDogTWF0aC5yb3VuZChzY29yZSksXHJcbiAgICAgIHN0YXR1cyxcclxuICAgICAgcmF3OiBzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT25lIHN0b3JlIGZyb20gL2F1ZGl0L2Rhc2hib2FyZC9zdG9yZVBlcmZvcm1hbmNlIChhdWRpdCBjb3B5IG9mIHRoZSBjaGVja2xpc3QgZGFzaGJvYXJkJ3MgdGFibGUpOiBldmVyeSBhdWRpdFxyXG4gICAqIHZpc2l0IGluIHRoZSBwZXJpb2QsIHNvIGNvbXBsZXRpb24gPSBzdWJtaXR0ZWQgLyBhc3NpZ25lZCBhbmQgZmxhZ3MgY291bnQsIHVubGlrZSB0aGUgc2NvcmUtb25seSBzdG9yZSBsaXN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9TdG9yZVBlcmYocjogYW55KTogU3RvcmVQZXJmUm93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlSWQ6IHI/LnN0b3JlX2lkIHx8ICcnLFxyXG4gICAgICBzdG9yZTogcj8uc3RvcmVOYW1lIHx8ICfigJQnLFxyXG4gICAgICBzcG9jOiByPy51c2VyRW1haWwgfHwgJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bShyPy5jaGVja0xpc3RDb3VudCkgPz8gMCxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKHI/LmZsYWdnZWRDb3VudCksXHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMucGN0VGV4dChyPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KHI/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBwZXJmOiB0aGlzLnBjdFRleHQocj8ucGVyZm9ybWFuY2UpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXIgZmlsbCBmb3IgYSBwZXJjZW50YWdlIChudW1iZXIsIG9yIHRleHQgbGlrZSBcIjUxJVwiIC8gXCItMjUlXCIpOiBrZXB0IHRvIDAtMTAwLiBBIG5lZ2F0aXZlIHNjb3JlIChvcHRpb25cclxuICAgKiBzY29yZXMgY2FuIGJlIG5lZ2F0aXZlIHBlbmFsdGllcykgd291bGQgb3RoZXJ3aXNlIHNldCBhbiBpbnZhbGlkIG5lZ2F0aXZlIHdpZHRoLCB3aGljaCB0aGUgYnJvd3NlciBkcm9wcyxcclxuICAgKiBkcmF3aW5nIHRoZSBiYXIgZnVsbDsgaXQgaXMgZW1wdHkgaW5zdGVhZCwgd2hpbGUgdGhlIG51bWJlciBiZXNpZGUgaXQgc3RpbGwgc2hvd3MgdGhlIHJlYWwgc2NvcmUuXHJcbiAgICovXHJcbiAgYmFyV2lkdGgodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlRmxvYXQoU3RyaW5nKHZhbHVlID8/ICcnKS5yZXBsYWNlKCclJywgJycpKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG4pKSArICclJyA6ICcwJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQXVkaXRQZXJmKHI6IGFueSk6IEF1ZGl0UGVyZlJvdyB7XHJcbiAgICBjb25zdCBuYW1lID0gcj8uY2hlY2tMaXN0TmFtZSB8fCAn4oCUJztcclxuICAgIC8vIE5vIHF1ZXN0aW9uIG9mIHRoZSBhdWRpdCBoYXMgY29tcGxpYW5jZSBzY29yaW5nIG9uOiBubyBzY29yZSBhbmQgbm8gcmVzdWx0ICh0aGUgQVBJIHNlbmRzIG51bGwpLlxyXG4gICAgY29uc3Qgc2NvcmUgPSByPy5jb21wbGlhbmNlRW5hYmxlZCA9PT0gZmFsc2UgPyBudWxsIDogdGhpcy5udW0ocj8ucXVlc3Rpb25Db21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHNjb3JlUGN0ID0gc2NvcmUgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChzY29yZSk7XHJcbiAgICAvLyBUaGUgYXVkaXQncyBvd24gcGFzcyBtYXJrIHdoZW4gdGhlIEFQSSBzZW5kcyBpdCwgZWxzZSB0aGUgZGFzaGJvYXJkJ3MgKHN1bW1hcnkucGFzc01hcmspLlxyXG4gICAgY29uc3QgbWFyayA9IHRoaXMubnVtKHI/LnBhc3NNYXJrKSA/PyB0aGlzLnBhc3NNYXJrO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZSxcclxuICAgICAgaW5pdGlhbHM6IFN0cmluZyhyPy5jaGVja0xpc3RDaGFyIHx8IG5hbWUuc2xpY2UoMCwgMikpLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgIHNjaGVkdWxlZDogcj8uc2NoZWR1bGVSZXBlYXRlZFR5cGUgPyB0aGlzLnRpdGxlQ2FzZShyLnNjaGVkdWxlUmVwZWF0ZWRUeXBlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uc3RvcmVDb3VudCkgPz8gMCxcclxuICAgICAgc3VibWl0dGVkOiB0aGlzLm51bShyPy5zdWJtaXR0ZWRDaGVja2xpc3QpID8/IDAsXHJcbiAgICAgIC8vIFF1ZXN0aW9ucyB3aXRoIGEgc3RvcmUgZGlzcHV0ZSAocmFpc2VkIG9yIHJldmlld2VkKSBpbiB0aGUgcGVyaW9kOyAn4oCUJyBvbmx5IHdoZW4gdGhlIEFQSSBzZW5kcyBub25lLlxyXG4gICAgICBkaXNwdXRlczogdGhpcy5udW0ocj8uZGlzcHV0ZXMpLFxyXG4gICAgICBwYXNzTWFyazogbWFyayArICclJyxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiBzY29yZVBjdCArICclJyxcclxuICAgICAgc2NvcmVQY3QsXHJcbiAgICAgIHJlc3VsdDogc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IChzY29yZVBjdCA+PSBtYXJrID8gJ1Bhc3MnIDogJ0ZhaWwnKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1VzZXJQZXJmKHI6IGFueSk6IFVzZXJQZXJmUm93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IHI/LnVzZXJOYW1lIHx8ICfigJQnLFxyXG4gICAgICBlbWFpbDogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpID8/IDAsXHJcbiAgICAgIHJlZG86IHRoaXMubnVtKHI/LnJlZG8pID8/IDAsXHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMucGN0VGV4dChyPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KHI/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBwZXJmOiB0aGlzLnBjdFRleHQocj8ucGVyZm9ybWFuY2UpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYXNrIG1vZGU6IHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSByb3dzIGZvciB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMsIGluIHRoZVxyXG4gICAqIGN1cnJlbnQgc2NvcGUuIEEgZmFpbGVkIGNhbGwgbGVhdmVzICfigJQnIGV2ZXJ5d2hlcmUgYW5kIHJldHJpZXMgdGhlIG5leHQgdGltZSB0aGUgVGFzayB0YWIgb3BlbnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkVGFza3MoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMudGFza3NTdGFsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy50YXNrTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnRhc2tSZXF1ZXN0O1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICAvLyBUaGUgZW5kcG9pbnQgcmVqZWN0cyB1bmtub3duIGtleXMsIHNvIG9ubHkgdGhlIHNjb3BlIGlzIHNlbnQuXHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkVGFza3Moe1xyXG4gICAgICBjbGllbnRJZDogc2NvcGVbJ2NsaWVudElkJ10sIGZyb21EYXRlOiBzY29wZVsnZnJvbURhdGUnXSwgdG9EYXRlOiBzY29wZVsndG9EYXRlJ10sXHJcbiAgICAgIHN0b3JlSWQ6IHNjb3BlWydzdG9yZUlkJ10sIHVzZXJFbWFpbGVzOiBzY29wZVsndXNlckVtYWlsZXMnXSwgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMudGFza1JlcXVlc3QpIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmNvZGUgPT09IDIwMCA/IChyZXMuZGF0YSB8fCBudWxsKSA6IG51bGw7XHJcbiAgICAgIGlmICghZGF0YSkgeyB0aGlzLnRhc2tzU3RhbGUgPSB0cnVlOyB9XHJcbiAgICAgIHRoaXMudGFza1N0YXRzID0gdGhpcy50b1Rhc2tTdGF0cyhkYXRhKTtcclxuICAgICAgdGhpcy50YXNrUGVyZiA9IChkYXRhPy50YXNrcyB8fCBbXSkubWFwKCh0OiBhbnkpID0+IHRoaXMudG9UYXNrUGVyZih0KSk7XHJcbiAgICAgIHRoaXMubGFzdFJlZnJlc2hlZCA9IGRheWpzKCkuZm9ybWF0KCdoaDptbTpzcyBBJyk7XHJcbiAgICAgIHRoaXMudGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9UYXNrU3RhdHMoZDogYW55KTogVGFza1N0YXRzIHtcclxuICAgIHRoaXMudGFza0RlbHRhVmFsdWVzID0ge1xyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLm51bShkPy5kZWx0YXM/LmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLm51bShkPy5kZWx0YXM/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0oZD8uZGVsdGFzPy5mbGFncylcclxuICAgIH07XHJcbiAgICBpZiAoIWQpIHsgcmV0dXJuIHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9OyB9XHJcbiAgICBjb25zdCBjb3VudCA9ICh2OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgICByZXR1cm4gbiA9PT0gbnVsbCA/ICfigJQnIDogbi50b0xvY2FsZVN0cmluZygnZW4tVVMnKTtcclxuICAgIH07XHJcbiAgICBjb25zdCBkYXlzID0gdGhpcy5udW0oZD8ucGVyaW9kPy5wcmV2aW91cz8uZGF5cykgPz8gMTtcclxuICAgIGNvbnN0IHZzID0gZGF5cyA9PT0gMSA/ICd2cyBsYXN0IGRheScgOiAndnMgcHJldmlvdXMgJyArIGRheXMgKyAnIGRheXMnO1xyXG4gICAgY29uc3QgZGVsdGEgPSAodjogbnVtYmVyIHwgbnVsbCkgPT4gKHYgPT09IG51bGwgPyAnJyA6IE1hdGguYWJzKHYpICsgJyUgJyArIHZzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjdGl2ZVRhc2tzOiBjb3VudChkLmFjdGl2ZVRhc2tzKSxcclxuICAgICAgdGFza0luc3RhbmNlczogY291bnQoZC50YXNrSW5zdGFuY2VzKSxcclxuICAgICAgbm90U3VibWl0dGVkOiBjb3VudChkLm5vdFN1Ym1pdHRlZCksXHJcbiAgICAgIG9wZW5UYXNrczogY291bnQoZC5vcGVuVGFza3MpLFxyXG4gICAgICBpblByb2dyZXNzOiBjb3VudChkLmluUHJvZ3Jlc3MpLFxyXG4gICAgICBzdWJtaXR0ZWQ6IGNvdW50KGQuc3VibWl0dGVkKSxcclxuICAgICAgY29tcGxldGlvblNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGV0aW9uU2NvcmUpLFxyXG4gICAgICBjb21wbGlhbmNlU2NvcmU6IHRoaXMucGN0VGV4dChkLmNvbXBsaWFuY2VTY29yZSksXHJcbiAgICAgIHRvdGFsRmxhZ3M6IGNvdW50KGQudG90YWxGbGFncyksXHJcbiAgICAgIGNvbXBsZXRpb25EZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2VEZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuY29tcGxpYW5jZSksXHJcbiAgICAgIGZsYWdzRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmZsYWdzKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBPbmUgdGFzayByYWlzZWQgZnJvbSBhbiBhdWRpdDsgY29tcGxpYW5jZSBpcyAn4oCUJyB3aGlsZSB0YXNrIGluc3RhbmNlcyBjYXJyeSBubyBzY29yZS4gKi9cclxuICBwcml2YXRlIHRvVGFza1BlcmYodDogYW55KTogVGFza1BlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHQ/LnRhc2tOYW1lIHx8ICfigJQnO1xyXG4gICAgY29uc3QgY29tcGxpYW5jZSA9IHRoaXMubnVtKHQ/LmNvbXBsaWFuY2UpO1xyXG4gICAgY29uc3QgcmFpc2VkID0gdGhpcy5udW0odD8udGFza3MpO1xyXG4gICAgbGV0IHNjaGVkdWxlZCA9ICfigJQnO1xyXG4gICAgaWYgKHQ/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKSB7XHJcbiAgICAgIHNjaGVkdWxlZCA9IHRoaXMudGl0bGVDYXNlKHQuc2NoZWR1bGVSZXBlYXRlZFR5cGUpO1xyXG4gICAgfSBlbHNlIGlmICh0Py5kdWVEYXRlKSB7XHJcbiAgICAgIHNjaGVkdWxlZCA9ICdEdWUgJyArIHRoaXMuZm10KHQuZHVlRGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBpbml0aWFsczogbmFtZS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQsXHJcbiAgICAgIGNvdmVyYWdlOiB0Py5jb3ZlcmFnZSA/IHRoaXMudGl0bGVDYXNlKHQuY292ZXJhZ2UpIDogJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bSh0Py5hc3NpZ25lZCkgPz8gMCxcclxuICAgICAgc3VibWl0dGVkOiB0aGlzLm51bSh0Py5zdWJtaXR0ZWQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bSh0Py5mbGFncykgPz8gMCxcclxuICAgICAgdGFza3M6IHJhaXNlZCA9PT0gbnVsbCA/ICfigJQnIDogU3RyaW5nKHJhaXNlZCksXHJcbiAgICAgIHJlZG86IHRoaXMubnVtKHQ/LnJlZG8pID8/IDAsXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChjb21wbGlhbmNlKSxcclxuICAgICAgY29tcGxpYW5jZVBjdDogY29tcGxpYW5jZSA9PT0gbnVsbCA/IDAgOiBNYXRoLnJvdW5kKGNvbXBsaWFuY2UpLFxyXG4gICAgICByYXc6IHRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogRGVsdGEgc3R5bGluZzogYXJyb3cgZGlyZWN0aW9uLCBhbmQgY29sb3VyIGJ5IHdoZXRoZXIgdGhlIG1vdmUgaXMgZ29vZCAobW9yZSBmbGFncyBpcyBiYWQpLiAqL1xyXG4gIHRhc2tEZWx0YUNsYXNzKGtleTogVGFza0RlbHRhS2V5KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHYgPSB0aGlzLnRhc2tEZWx0YVZhbHVlc1trZXldO1xyXG4gICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gMCkgeyByZXR1cm4gJ2lzLWZsYXQnOyB9XHJcbiAgICBjb25zdCB1cCA9IHYgPiAwO1xyXG4gICAgY29uc3QgZ29vZCA9IGtleSA9PT0gJ2ZsYWdzJyA/ICF1cCA6IHVwO1xyXG4gICAgcmV0dXJuICh1cCA/ICdpcy11cCcgOiAnaXMtZG93bicpICsgJyAnICsgKGdvb2QgPyAnaXMtZ29vZCcgOiAnaXMtYmFkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG51bSh2OiBhbnkpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJykgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgY29uc3QgbiA9IE51bWJlcih2KTtcclxuICAgIHJldHVybiBpc05hTihuKSA/IG51bGwgOiBuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwY3RUZXh0KHY6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5udW0odik7XHJcbiAgICByZXR1cm4gbiA9PT0gbnVsbCA/ICfigJQnIDogTWF0aC5yb3VuZChuKSArICclJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGl0bGVDYXNlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm10KHY6IGFueSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IGRheWpzKHYpLmZvcm1hdCgnTU1NIERELCBZWVlZJykgOiAn4oCUJztcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIGFmdGVyIHNlYXJjaCwgc3RhdHVzIGFuZCBzY29yZS1iYW5kIGZpbHRlcnMuICovXHJcbiAgZ2V0IGZpbHRlcmVkUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnJvd3NcclxuICAgICAgLmZpbHRlcihyID0+IHRoaXMuc3RhdHVzID09PSAnYWxsJyB8fCByLnN0YXR1cyA9PT0gdGhpcy5zdGF0dXMpXHJcbiAgICAgIC5maWx0ZXIociA9PiB7XHJcbiAgICAgICAgaWYgKHIuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnNjb3JlTWluID09PSAwICYmIHRoaXMuc2NvcmVNYXggPT09IDEwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQSBsb3dlciBib3VuZCBvZiAwIGlzIG9wZW46IHBlbmFsdHkgc2NvcmVzIGNhbiB0YWtlIGEgc3RvcmUgYmVsb3cgMCUgKENyaXRpY2FsKS5cclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcmVNaW4gPD0gMCB8fCByLnNjb3JlID49IHRoaXMuc2NvcmVNaW4pICYmIHIuc2NvcmUgPD0gdGhpcy5zY29yZU1heDtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcihyID0+ICFxIHx8IFtyLnN0b3JlSWQsIHIuY2lyY2xlLCByLnpvbmUsIHIuYW9tLCByLnJhdz8uc3RvcmVOYW1lIHx8ICcnLCByLnJhdz8uc3RvcmVJZCB8fCAnJ10uc29tZSh2ID0+IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZShhLCBiKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmUoYTogQXVkaXRSb3csIGI6IEF1ZGl0Um93KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGRpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICBpZiAodGhpcy5zb3J0S2V5ID09PSAnc2NvcmUnKSB7XHJcbiAgICAgIC8vIE5vdC1hdWRpdGVkIHN0b3JlcyAobm8gc2NvcmUpIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhdWRpdGVkIG9uZXMsIGluIGVpdGhlciBkaXJlY3Rpb24sXHJcbiAgICAgIC8vIHNvIHRoZSBmZXcgYXVkaXRlZCBzdG9yZXMgYXJlIG5vdCBidXJpZWQgdW5kZXIgdGhvdXNhbmRzIG9mIFwiTm90IGF1ZGl0ZWRcIiByb3dzLlxyXG4gICAgICBpZiAoYS5zY29yZSA9PT0gbnVsbCB8fCBiLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGEuc2NvcmUgPT09IGIuc2NvcmUgPyAwIDogKGEuc2NvcmUgPT09IG51bGwgPyAxIDogLTEpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoYS5zY29yZSAtIGIuc2NvcmUpICogZGlyO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0gJ2F1ZGl0cycpIHtcclxuICAgICAgcmV0dXJuIChhLmF1ZGl0cyAtIGIuYXVkaXRzKSAqIGRpcjtcclxuICAgIH1cclxuICAgIGNvbnN0IGF2ID0gU3RyaW5nKGFbdGhpcy5zb3J0S2V5IGFzIGtleW9mIEF1ZGl0Um93XSA/PyAnJyk7XHJcbiAgICBjb25zdCBidiA9IFN0cmluZyhiW3RoaXMuc29ydEtleSBhcyBrZXlvZiBBdWRpdFJvd10gPz8gJycpO1xyXG4gICAgcmV0dXJuIGF2LmxvY2FsZUNvbXBhcmUoYnYpICogZGlyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoIC8gdGhpcy5wYWdlU2l6ZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2VSb3dzKCk6IEF1ZGl0Um93W10ge1xyXG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB0aGF0IGNhcnJ5IGEgc2NvcmUgaW4gdGhlIGN1cnJlbnQgcGVyaW9kLiAqL1xyXG4gIHByaXZhdGUgZ2V0IGV2YWx1YXRlZCgpOiBBdWRpdFJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zY29yZSAhPT0gbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHdpdGggYSBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCwgc2NvcmVkIG9yIG5vdC4gKi9cclxuICBwcml2YXRlIGdldCBhdWRpdGVkQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICduYScpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldCBhdmVyYWdlU2NvcmUoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBjb25zdCBldiA9IHRoaXMuZXZhbHVhdGVkO1xyXG4gICAgaWYgKCFldi5sZW5ndGgpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIHJldHVybiBNYXRoLnJvdW5kKGV2LnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoci5zY29yZSBhcyBudW1iZXIpLCAwKSAvIGV2Lmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBnZXQga3BpcygpOiBBdWRpdEtwaVtdIHtcclxuICAgIGNvbnN0IGV2ID0gdGhpcy5ldmFsdWF0ZWQ7XHJcbiAgICBjb25zdCBhdmcgPSB0aGlzLmF2ZXJhZ2VTY29yZTtcclxuICAgIGNvbnN0IHBhc3NDb3VudCA9IGV2LmZpbHRlcihyID0+IChyLnNjb3JlIGFzIG51bWJlcikgPj0gdGhpcy5wYXNzTWFyaykubGVuZ3RoO1xyXG4gICAgY29uc3QgZmFpbENvdW50ID0gZXYubGVuZ3RoIC0gcGFzc0NvdW50O1xyXG4gICAgY29uc3QgY3JpdGljYWwgPSBldi5maWx0ZXIociA9PiAoci5zY29yZSBhcyBudW1iZXIpIDwgdGhpcy5jcml0aWNhbE1hcmspLmxlbmd0aDtcclxuICAgIGNvbnN0IGFjdGl2ZVN0b3JlcyA9IHRoaXMuc3RvcmVzSW5TY29wZTtcclxuICAgIGNvbnN0IGF1ZGl0ZWQgPSB0aGlzLmF1ZGl0ZWRDb3VudDtcclxuICAgIGxldCBhdmdOb3RlID0gJ0Fjcm9zcyBhdWRpdGVkIHN0b3Jlcyc7XHJcbiAgICBpZiAoYXZnID09PSBudWxsKSB7XHJcbiAgICAgIGF2Z05vdGUgPSBhdWRpdGVkID8gJ0NvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGVzZSBhdWRpdHMnIDogJ05vIGF1ZGl0cyBpbiB0aGlzIHBlcmlvZCc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnQXZlcmFnZSBzY29yZScsXHJcbiAgICAgICAgdmFsdWU6IGF2ZyA9PT0gbnVsbCA/ICfigJQnIDogYXZnICsgJyUnLFxyXG4gICAgICAgIG5vdGU6IGF2Z05vdGUsXHJcbiAgICAgICAgbm90ZUNvbG9yOiBhdmcgIT09IG51bGwgJiYgYXZnIDwgdGhpcy5wYXNzTWFyayA/ICcjRDkyRDIwJyA6ICcjMDI3QTQ4J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdQYXNzIHJhdGUnLFxyXG4gICAgICAgIHZhbHVlOiBldi5sZW5ndGggPyBNYXRoLnJvdW5kKHBhc3NDb3VudCAvIGV2Lmxlbmd0aCAqIDEwMCkgKyAnJScgOiAn4oCUJyxcclxuICAgICAgICBub3RlOiBwYXNzQ291bnQgKyAnIHBhc3MsICcgKyBmYWlsQ291bnQgKyAnIGZhaWwnLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0NyaXRpY2FsIHN0b3JlcycsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyhjcml0aWNhbCksXHJcbiAgICAgICAgbm90ZTogJ1Njb3JlIGJlbG93ICcgKyB0aGlzLmNyaXRpY2FsTWFyayArICclJyxcclxuICAgICAgICBub3RlQ29sb3I6IGNyaXRpY2FsID8gJyNEOTJEMjAnIDogJyM2NjcwODUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICAvLyBTdWJtaXR0ZWQgYXVkaXRzLCBhcyB0aGUgdHJlbmQgY291bnRzIHRoZW07IHRoZSBub3RlIGdpdmVzIHRoZSBhY3RpdmUgc3RvcmVzIGluIHNjb3BlLlxyXG4gICAgICAgIGxhYmVsOiAnQXVkaXRzIGNvbXBsZXRlZCcsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyh0aGlzLnJvd3MucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIChOdW1iZXIoci5yYXc/LmF1ZGl0cykgfHwgMCksIDApKSxcclxuICAgICAgICBub3RlOiBhY3RpdmVTdG9yZXMgKyAoYWN0aXZlU3RvcmVzID09PSAxID8gJyBhY3RpdmUgc3RvcmUnIDogJyBhY3RpdmUgc3RvcmVzJyksXHJcbiAgICAgICAgbm90ZUNvbG9yOiAnIzY2NzA4NSdcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBwZXJpb2RMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyAmJiB0aGlzLnF1YXJ0ZXIpIHsgcmV0dXJuIHRoaXMucXVhcnRlciArICcgKCcgKyB0aGlzLnF1YXJ0ZXJNb250aHModGhpcy5xdWFydGVyKSArICcpJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm10KHRoaXMuZnJvbSkgKyAnIHRvICcgKyB0aGlzLmZtdCh0aGlzLnRvKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3RyaWJ1dGlvbiBvZiBzdG9yZXMgYWNyb3NzIHNjb3JlIGJhbmRzLiBOb3Qgc2NvcmVkIGlzIGxlZnQgb3V0IChRQSA5IE9jdCksIGFuZCBpdHMgc3RvcmVzXHJcbiAgICogd2l0aCBpdCwgc28gdGhlIHNoYXJlcyBzdGlsbCBhZGQgdXAgdG8gMTAwJS5cclxuICAgKi9cclxuICBnZXQgYmFuZFJvd3MoKTogQXJyYXk8eyBiYW5kOiBBdWRpdEJhbmQ7IGNvdW50OiBudW1iZXI7IHNoYXJlOiBzdHJpbmc7IHdpZHRoOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICd1bnNjb3JlZCcpLmxlbmd0aCB8fCAxO1xyXG4gICAgcmV0dXJuIHRoaXMuYmFuZHMuZmlsdGVyKGJhbmQgPT4gYmFuZC5rZXkgIT09ICd1bnNjb3JlZCcpLm1hcChiYW5kID0+IHtcclxuICAgICAgY29uc3QgY291bnQgPSBTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpXHJcbiAgICAgICAgPyB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgPT09IGJhbmQua2V5KS5sZW5ndGhcclxuICAgICAgICA6IHRoaXMucm93cy5maWx0ZXIociA9PiByLnNjb3JlICE9PSBudWxsICYmIHRoaXMuaW5CYW5kKHIuc2NvcmUgYXMgbnVtYmVyLCBiYW5kKSkubGVuZ3RoO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGJhbmQsXHJcbiAgICAgICAgY291bnQsXHJcbiAgICAgICAgLy8gQSBmZXcgc3RvcmVzIG91dCBvZiB0aG91c2FuZHMgcm91bmQgdG8gMCU7IHNheSBcIjwxJVwiIGluc3RlYWQgb2YgMCUgbmV4dCB0byBhIG5vbi16ZXJvIGNvdW50LlxyXG4gICAgICAgIHNoYXJlOiBjb3VudCAmJiBjb3VudCAvIHRvdGFsICogMTAwIDwgMSA/ICc8MSUnIDogTWF0aC5yb3VuZChjb3VudCAvIHRvdGFsICogMTAwKSArICclJyxcclxuICAgICAgICB3aWR0aDogKGNvdW50IC8gdG90YWwgKiAxMDApICsgJyUnXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBCYW5kIGNvbG91cnMgb2YgYSBzdG9yZSByb3c6IGJ5IHNjb3JlLCBvciB0aGUgTm90IHNjb3JlZCAvIE5vdCBhdWRpdGVkIGJhbmQgd2hlbiBpdCBoYXMgbm9uZS4gKi9cclxuICBiYW5kRm9yKHJvdzogQXVkaXRSb3cpOiBBdWRpdEJhbmQge1xyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMuYmFuZHNbdGhpcy5iYW5kcy5sZW5ndGggLSAxXTtcclxuICAgIGlmIChyb3cuc2NvcmUgPT09IG51bGwpIHsgcmV0dXJuIHRoaXMuYmFuZHMuZmluZChiID0+IGIua2V5ID09PSByb3cuc3RhdHVzKSA/PyBsYXN0OyB9XHJcbiAgICBjb25zdCBzY29yZSA9IHJvdy5zY29yZTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiAhU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGIua2V5KSAmJiB0aGlzLmluQmFuZChzY29yZSwgYikpID8/IGxhc3Q7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzY29yZSBiYW5kJ3MgcmFuZ2U7IHRoZSBsb3dlc3QgYmFuZCAobG8gMCwgQ3JpdGljYWwpIGFsc28gdGFrZXMgbmVnYXRpdmUgc2NvcmVzIChwZW5hbHR5IG9wdGlvbnMpLiAqL1xyXG4gIHByaXZhdGUgaW5CYW5kKHNjb3JlOiBudW1iZXIsIGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChiYW5kLmxvIDw9IDAgfHwgc2NvcmUgPj0gYmFuZC5sbykgJiYgc2NvcmUgPD0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIHN0YXR1c0xhYmVsKHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdwYXNzJykgeyByZXR1cm4gJ1Bhc3MnOyB9XHJcbiAgICBpZiAocm93LnN0YXR1cyA9PT0gJ2ZhaWwnKSB7IHJldHVybiAnRmFpbCc7IH1cclxuICAgIHJldHVybiByb3cuc3RhdHVzID09PSAndW5zY29yZWQnID8gJ05vdCBzY29yZWQnIDogJ05vdCBhdWRpdGVkJztcclxuICB9XHJcblxyXG4gIC8qKiBCYXIgaGVpZ2h0IGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgYXJlYS4gKi9cclxuICBiYXJIZWlnaHQoYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKGJhci52YWx1ZSA9PT0gbnVsbCA/IDIgOiBNYXRoLm1heCgzLCBiYXIudmFsdWUpKSArICclJztcclxuICB9XHJcblxyXG4gIC8qKiBIb3ZlciBjYXJkIHNpdHMganVzdCBhYm92ZSB0aGUgYmFyJ3MgdmFsdWUgbGFiZWw7IGNhcHBlZCBzbyBhIHRhbGwgYmFyJ3MgY2FyZCBzdGF5cyBpbnNpZGUgdGhlIGNoYXJ0LiAqL1xyXG4gIHRpcEJvdHRvbShiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGggPSBiYXIudmFsdWUgPT09IG51bGwgPyAyIDogTWF0aC5tYXgoMywgYmFyLnZhbHVlKTtcclxuICAgIHJldHVybiAnY2FsYygnICsgTWF0aC5taW4oaCwgNDUpICsgJyUgKyAyNnB4KSc7XHJcbiAgfVxyXG5cclxuICBiYXJGaWxsKGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGJhci52YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gJyNGMkY0RjcnOyB9XHJcbiAgICBjb25zdCBhY3RpdmUgPSBiYXIua2V5ID09PSB0aGlzLnF1YXJ0ZXI7XHJcbiAgICBpZiAoYmFyLnZhbHVlID49IHRoaXMucGFzc01hcmspIHsgcmV0dXJuIGFjdGl2ZSA/ICcjMTU3MEVGJyA6ICcjQjJEREZGJzsgfVxyXG4gICAgcmV0dXJuIGFjdGl2ZSA/ICcjRjA0NDM4JyA6ICcjRkVDRENBJztcclxuICB9XHJcblxyXG4gIHNldEdyYWluKGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScpOiB2b2lkIHtcclxuICAgIGlmIChncmFpbiA9PT0gdGhpcy5ncmFpbikgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZ3JhaW4gPSBncmFpbjtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICBpZiAoZ3JhaW4gPT09ICdxdWFydGVyJykge1xyXG4gICAgICB0aGlzLmFwcGx5UXVhcnRlcih0aGlzLnF1YXJ0ZXJzLmluY2x1ZGVzKHRoaXMucXVhcnRlcikgPyB0aGlzLnF1YXJ0ZXIgOiB0aGlzLnF1YXJ0ZXJzW3RoaXMucXVhcnRlcnMubGVuZ3RoIC0gMV0sIHRydWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBCYWNrIHRvIEJ5IGRhdGU6IHRoZSBoZWFkZXIncyByYW5nZSBhZ2Fpbi5cclxuICAgIHRoaXMuZnJvbSA9IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8IHRoaXMuZnJvbTtcclxuICAgIHRoaXMudG8gPSB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgdGhpcy50bztcclxuICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4pIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgc2V0U3RhdHVzKHN0YXR1czogU3RhdHVzRmlsdGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBzb3J0Qnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09IGtleSkge1xyXG4gICAgICB0aGlzLnNvcnREaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNvcnRLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuc29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzOiBuYXJyb3cgdGhlIHN0b3JlIGxpc3QgdG8gdGhhdCBiYW5kIChOb3QgYXVkaXRlZCAtPiB0aGVcclxuICAgKiBzdG9yZXMgd2l0aCBubyBzdWJtaXNzaW9uKSBhbmQgYnJpbmcgdGhlIGxpc3QgaW50byB2aWV3LlxyXG4gICAqL1xyXG4gIGFwcGx5QmFuZChiYW5kOiBBdWRpdEJhbmQpOiB2b2lkIHtcclxuICAgIGlmIChTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJCYW5kKCk7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gYmFuZC5rZXkgYXMgU3RvcmVTdGF0dXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjb3JlTWluID0gYmFuZC5sbztcclxuICAgICAgdGhpcy5zY29yZU1heCA9IGJhbmQuaGk7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0b3JlTGlzdE9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5saXN0QmFuZEtleSA9IGJhbmQua2V5O1xyXG4gICAgLy8gRnJvbSB0aGUgZHJhd2VyLCBBcHBseSBzY3JvbGxzIG9uY2UgaXQgY2xvc2VzLlxyXG4gICAgaWYgKHRoaXMuZmlsdGVyc09wZW4pIHsgcmV0dXJuOyB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZC1zdG9yZS1saXN0Jyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckJhbmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjb3JlTWluID0gMDtcclxuICAgIHRoaXMuc2NvcmVNYXggPSAxMDA7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFN0b3JlIGxpc3Qgb3BlbnMgYnkgZGVmYXVsdCB3aXRoIGFsbCBzdG9yZXM7IFNjb3JlIGRpc3RyaWJ1dGlvbiAtPiBWaWV3IHN0b3JlcyAob3IgYSBGaWx0ZXJzXHJcbiAgICogc2NvcmUgcmFuZ2UpIG5hcnJvd3MgaXQgdG8gYSBiYW5kLCBhbmQgdGhlIGNoaXAncyB4IGNsb3NlcyBpdC5cclxuICAgKi9cclxuICBzdG9yZUxpc3RPcGVuID0gdHJ1ZTtcclxuICAvKiogQmFuZCB0aGUgbGlzdCB3YXMgb3BlbmVkIGZvciAoJycgPSBhbGwgc3RvcmVzKS4gKi9cclxuICBsaXN0QmFuZEtleSA9ICcnO1xyXG5cclxuICBnZXQgc2hvd1N0b3JlTGlzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlTGlzdE9wZW4gfHwgdGhpcy5iYW5kRmlsdGVyQWN0aXZlIHx8IHRoaXMuc3RhdHVzICE9PSAnYWxsJztcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3ZXIgU2NvcmUgcmFuZ2U6IHRoZSBiYW5kIHRoZSBjdXJyZW50IHJhbmdlIChvciBzdGF0dXMgYmFuZCkgbWF0Y2hlcy4gKi9cclxuICBpc0JhbmRPbihiYW5kOiBBdWRpdEJhbmQpOiBib29sZWFuIHtcclxuICAgIGlmIChTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpKSB7IHJldHVybiB0aGlzLnN0YXR1cyA9PT0gYmFuZC5rZXk7IH1cclxuICAgIHJldHVybiB0aGlzLnNjb3JlTWluID09PSBiYW5kLmxvICYmIHRoaXMuc2NvcmVNYXggPT09IGJhbmQuaGk7XHJcbiAgfVxyXG5cclxuICBnZXQgYmFuZEZpbHRlckFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNjb3JlTWluICE9PSAwIHx8IHRoaXMuc2NvcmVNYXggIT09IDEwMDtcclxuICB9XHJcblxyXG4gIGdldCBiYW5kQ2hpcExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLmJhbmRzLmZpbmQoYiA9PiAhU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGIua2V5KSAmJiBiLmxvID09PSB0aGlzLnNjb3JlTWluICYmIGIuaGkgPT09IHRoaXMuc2NvcmVNYXgpO1xyXG4gICAgcmV0dXJuIGhpdCA/IGhpdC5sYWJlbCArICcgwrcgJyArIGhpdC5yYW5nZSA6ICdTY29yZSAnICsgdGhpcy5zY29yZU1pbiArICfigJMnICsgdGhpcy5zY29yZU1heCArICclJztcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZml2ZSBmaWx0ZXIgY2F0ZWdvcmllcyB0aGUgZHJhd2VyIGxpc3RzLiAqL1xyXG4gIGdldCBmaWx0ZXJDYXRzKCk6IEZpbHRlckNhdFtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiAncGVyaW9kJywgbGFiZWw6ICdQZXJpb2QnLCB2YWx1ZTogdGhpcy5wZXJpb2RMYWJlbCwgdGl0bGU6ICdQZXJpb2QnLFxyXG4gICAgICAgIHN1YjogJ1N0YXJ0cyBhcyB0aGUgZ2xvYmFsIGhlYWRlciBkYXRlIHJhbmdlOyBwaWNrIGEgcmFuZ2UgdG8gbmFycm93IGl0LicsXHJcbiAgICAgICAgZGlydHk6IGZhbHNlIH0sXHJcbiAgICAgIHsga2V5OiAnc2NvcGUnLCBsYWJlbDogJ1N0b3JlIGhpZXJhcmNoeScsIHZhbHVlOiB0aGlzLnNjb3BlTGFiZWwsIHRpdGxlOiAnU3RvcmUgaGllcmFyY2h5JyxcclxuICAgICAgICBzdWI6ICdQaWNrIHRoZSBjaXJjbGUsIHpvbmUsIEFPTSBvciBzdG9yZSB0aGUgd2hvbGUgZGFzaGJvYXJkIHJlYWRzLicsXHJcbiAgICAgICAgZGlydHk6ICEhdGhpcy5jaXJjbGUgfSxcclxuICAgICAgeyBrZXk6ICd0eXBlJywgbGFiZWw6ICdBdWRpdCB0eXBlJywgdmFsdWU6IHRoaXMuYXVkaXRUeXBlTGFiZWwsIHRpdGxlOiAnQXVkaXQgdHlwZScsXHJcbiAgICAgICAgc3ViOiAnV2hpY2ggYXVkaXQgcHJvZ3JhbW1lIHRoZSBzY29yZXMgY29tZSBmcm9tLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuYXVkaXRUeXBlICE9PSAnYWxsJyB9LFxyXG4gICAgICB7IGtleTogJ2JhbmQnLCBsYWJlbDogJ1Njb3JlIHJhbmdlJywgdmFsdWU6IHRoaXMuYmFuZENoaXBMYWJlbCwgdGl0bGU6ICdTY29yZSByYW5nZScsXHJcbiAgICAgICAgc3ViOiAnVGFwIGEgYmFuZCB0byBzZXQgdGhlIHJhbmdlIHRoZSBzdW1tYXJ5IHJlYWRzLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuYmFuZEZpbHRlckFjdGl2ZSB9LFxyXG4gICAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJywgdmFsdWU6IHRoaXMuc3RhdHVzRmlsdGVyTGFiZWwsIHRpdGxlOiAnU3RhdHVzJyxcclxuICAgICAgICBzdWI6ICdTaG93IGV2ZXJ5IHN0b3JlLCBvciBvbmx5IHRoZSBvbmVzIHRoYXQgcGFzc2VkIG9yIGZhaWxlZC4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLnN0YXR1cyAhPT0gJ2FsbCcgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVDYXRPYmooKTogRmlsdGVyQ2F0IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckNhdHMuZmluZChjID0+IGMua2V5ID09PSB0aGlzLmFjdGl2ZUNhdCkgfHwgdGhpcy5maWx0ZXJDYXRzWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlckNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbHRlcihjID0+IGMuZGlydHkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhlIGRyYXdlcidzIGhpZXJhcmNoeSBwaWNrIGNvdmVycyAod2hhdCBBcHBseSB3aWxsIGxvYWQpLiAqL1xyXG4gIGdldCBzdG9yZXNJblNjb3BlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgdGhpcykpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBTb3J0ZWQgZGlzdGluY3QgbmFtZXMsIHdpdGhvdXQgdGhlIFwi4oCUXCIgb2Ygc3RvcmVzIG91dHNpZGUgdGhlIGhpZXJhcmNoeS4gKi9cclxuICBwcml2YXRlIGRpc3RpbmN0KHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcy5maWx0ZXIodiA9PiB2ICYmIHYgIT09ICfigJQnKSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2lyY2xlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5tYXAociA9PiByLmNpcmNsZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHpvbmVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3RpbmN0KHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHIuY2lyY2xlID09PSB0aGlzLmNpcmNsZSkubWFwKHIgPT4gci56b25lKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYW9tcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUgJiYgci56b25lID09PSB0aGlzLnpvbmUpLm1hcChyID0+IHIuYW9tKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2NvcGVSZWFkaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zdG9yZXNJblNjb3BlO1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVMYWJlbCArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKTtcclxuICB9XHJcblxyXG4gIHNldE1vZHVsZVRhYih0YWI6ICdBdWRpdCcgfCAnVGFzaycpOiB2b2lkIHtcclxuICAgIGlmICh0YWIgIT09IHRoaXMubW9kdWxlVGFiKSB7XHJcbiAgICAgIC8vIFRoZSBmaXJzdCBQZXJmb3JtYW5jZSB0YWJsZSBjaGFuZ2VzIChBdWRpdCAvIFRhc2spLCBzbyBpdHMgc29ydCBzdGFydHMgb3Zlci5cclxuICAgICAgdGhpcy5wZXJmU29ydEtleSA9ICcnO1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZHVsZVRhYiA9IHRhYjtcclxuICAgIGlmICh0YWIgPT09ICdUYXNrJyAmJiB0aGlzLnRhc2tzU3RhbGUpIHsgdGhpcy5sb2FkVGFza3MoKTsgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZSA/IHRoaXMuc2NvcGVSb3dzLmZpbmQociA9PiBTdHJpbmcoci5yYXc/LnN0b3JlSWQpID09PSB0aGlzLnN0b3JlKSA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiAoc3RvcmUgPyBzdG9yZS5yYXc/LnN0b3JlTmFtZSB8fCB0aGlzLnN0b3JlIDogdGhpcy5zdG9yZSkgfHwgdGhpcy5hb20gfHwgdGhpcy56b25lIHx8IHRoaXMuY2lyY2xlIHx8ICdBbGwgc3RvcmVzJztcclxuICB9XHJcblxyXG4gIGdldCBhdWRpdFR5cGVMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdCA9IHRoaXMuYXVkaXRUeXBlcy5maW5kKHggPT4geC5rZXkgPT09IHRoaXMuYXVkaXRUeXBlKTtcclxuICAgIHJldHVybiB0ID8gdC5sYWJlbCA6ICdBbGwgQXVkaXRzJztcclxuICB9XHJcblxyXG4gIGdldCBzdGF0dXNGaWx0ZXJMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnYWxsJykgeyByZXR1cm4gJ0FsbCBzdG9yZXMnOyB9XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdwYXNzJykgeyByZXR1cm4gJ1Bhc3Mgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAndW5zY29yZWQnKSB7IHJldHVybiAnTm90IHNjb3JlZCc7IH1cclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ2ZhaWwnID8gJ0ZhaWwgc3RvcmVzJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICBvcGVuRmlsdGVycyhjYXQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnQgPSBPYmplY3QuY3JlYXRlKHRoaXMpIGFzIEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQ7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGNhdCB8fCB0aGlzLmFjdGl2ZUNhdDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGtleTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmRyYWZ0O1xyXG4gICAgY29uc3QgcGVyaW9kQ2hhbmdlZCA9ICEhZCAmJiAoZC5mcm9tICE9PSB0aGlzLmZyb20gfHwgZC50byAhPT0gdGhpcy50byk7XHJcbiAgICBpZiAoZCkge1xyXG4gICAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnk7XHJcbiAgICAgIEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQuRFJBRlRfS0VZUy5mb3JFYWNoKGsgPT4geyBzZWxmW2tdID0gKGQgYXMgYW55KVtrXTsgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY29wZUNoYW5nZWQgPSB0aGlzLmNvbW1pdFNjb3BlKCk7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICBpZiAocGVyaW9kQ2hhbmdlZCB8fCBzY29wZUNoYW5nZWQpIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gICAgLy8gU2NvcmUgcmFuZ2UgYW5kIFN0YXR1cyBvbmx5IGZpbHRlciB0aGUgc3RvcmUgbGlzdCwgc28gc2hvdyBpdC5cclxuICAgIGlmICh0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkLXN0b3JlLWxpc3QnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBNYWtlIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBsb2FkZWQgb25lczsgdHJ1ZSB3aGVuIHRoZXkgZGlmZmVyIGZyb20gYmVmb3JlLiAqL1xyXG4gIHByaXZhdGUgY29tbWl0U2NvcGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhID0gdGhpcy5hcHBsaWVkO1xyXG4gICAgY29uc3QgY2hhbmdlZCA9IGEuY2lyY2xlICE9PSB0aGlzLmNpcmNsZSB8fCBhLnpvbmUgIT09IHRoaXMuem9uZSB8fCBhLmFvbSAhPT0gdGhpcy5hb20gfHwgYS5zdG9yZSAhPT0gdGhpcy5zdG9yZVxyXG4gICAgICB8fCBhLmF1ZGl0VHlwZSAhPT0gdGhpcy5hdWRpdFR5cGU7XHJcbiAgICB0aGlzLmFwcGxpZWQgPSB7IGNpcmNsZTogdGhpcy5jaXJjbGUsIHpvbmU6IHRoaXMuem9uZSwgYW9tOiB0aGlzLmFvbSwgc3RvcmU6IHRoaXMuc3RvcmUsIGF1ZGl0VHlwZTogdGhpcy5hdWRpdFR5cGUgfTtcclxuICAgIHJldHVybiBjaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCAvIHggLyBiYWNrZHJvcDogdGhlIGRyYWZ0IGlzIGRyb3BwZWQ7IHRoZSBwYWdlIG5ldmVyIGNoYW5nZWQuICovXHJcbiAgY2FuY2VsRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnQgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc2V0IGV2ZXJ5IGZpbHRlciB0byB0aGUgZG9jdW1lbnRlZCBkZWZhdWx0cy4gKi9cclxuICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICB0aGlzLmdyYWluID0gJ2RhdGUnO1xyXG4gICAgdGhpcy5jaXJjbGUgPSAnJztcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMuc2NvcmVNaW4gPSAwO1xyXG4gICAgdGhpcy5zY29yZU1heCA9IDEwMDtcclxuICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgLy8gVGhlIGNoaXBzJyBDbGVhciBhbGwgKGRyYXdlciBjbG9zZWQpIHJlbG9hZHMgbm93OyBpbnNpZGUgdGhlIGRyYXdlciwgQXBwbHkgZG9lcy5cclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbiAmJiB0aGlzLmNvbW1pdFNjb3BlKCkpIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENoYW5naW5nIGEgbGV2ZWwgY2xlYXJzIHRoZSBsZXZlbHMgYmVsb3cgaXQuICovXHJcbiAgb25DaXJjbGVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25ab25lQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBvbkFvbUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICByZXNldFNjb3BlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaXJjbGUgPSAnJztcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmUgZHJvcGRvd246IHRoZSBzdG9yZXMgb2YgdGhlIHBpY2tlZCBBT00sIGJ5IG5hbWUgKHZhbHVlID0gc3RvcmVJZCkuICovXHJcbiAgZ2V0IHN0b3JlUGlja09wdGlvbnMoKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHN0b3JlcyA9IHRoaXMuc2NvcGVSb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB7IGNpcmNsZTogdGhpcy5jaXJjbGUsIHpvbmU6IHRoaXMuem9uZSwgYW9tOiB0aGlzLmFvbSwgc3RvcmU6ICcnIH0pKVxyXG4gICAgICAubWFwKHIgPT4gKHsgdmFsdWU6IFN0cmluZyhyLnJhdz8uc3RvcmVJZCB8fCAnJyksIGxhYmVsOiBTdHJpbmcoci5yYXc/LnN0b3JlTmFtZSB8fCAn4oCUJykgfSkpXHJcbiAgICAgIC5maWx0ZXIobyA9PiBvLnZhbHVlKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKTtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIHN0b3JlcycgfV0uY29uY2F0KHN0b3Jlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRyYXdlcidzIGN1c3RvbSBkcm9wZG93bnMgKGxpYi1hdWRpdC12Mi1zZWxlY3QpOiBcIkFsbCDigKZcIiBmaXJzdCwgdGhlbiB0aGUgbGlzdC4gKi9cclxuICBwaWNrT3B0aW9ucyhsaXN0OiBzdHJpbmdbXSwgYWxsOiBzdHJpbmcpOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIFt7IHZhbHVlOiAnJywgbGFiZWw6IGFsbCB9XS5jb25jYXQoKGxpc3QgfHwgW10pLm1hcCh2ID0+ICh7IHZhbHVlOiB2LCBsYWJlbDogdiB9KSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXJzdCBwZXJmb3JtYW5jZSB0YWIgaXMgbmFtZWQgYWZ0ZXIgdGhlIGFjdGl2ZSBtb2R1bGUuICovXHJcbiAgZ2V0IHBlcmZUYWJzRm9yTW9kdWxlKCk6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFicztcclxuICB9XHJcblxyXG4gIHBlcmZUYWJEaXNwbGF5KHRhYjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGFiID09PSAnQXVkaXQnID8gdGhpcy5tb2R1bGVUYWIgOiB0YWIpICsgJyBQZXJmb3JtYW5jZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkluZm9UaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gJ1N0b3JlcyBJbmZvJzsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiAnVXNlciBJbmZvJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMubW9kdWxlVGFiICsgJyBJbmZvJztcclxuICB9XHJcblxyXG4gIGdldCBwZXJmQ3JlYXRlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnKyBDcmVhdGUgJyArIHRoaXMubW9kdWxlVGFiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFza01vZHVsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiA9PT0gJ1Rhc2snO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkVGFza1BlcmYoKTogVGFza1BlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnRhc2tQZXJmLmZpbHRlcihyID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMudGFza1BlcmYsIHRoaXMudGFza1NvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlRhc2soXzogbnVtYmVyLCByb3c6IFRhc2tQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py50YXNrSWQgfHwgcm93Lm5hbWU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIHRyZW5kIGJ1Y2tldCBkcml2ZXMgdGhlIGhlYWRsaW5lIHNjb3JlIGFib3ZlIHRoZSBjaGFydC4gKi9cclxuICBwcml2YXRlIGdldCBmb2N1c0JhcigpOiBUcmVuZEJhciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXJUcmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcik7IH1cclxuICAgIHJldHVybiB0aGlzLnRyZW5kLmZpbmQoYiA9PiBiLmtleSA9PT0gdGhpcy5xdWFydGVyKSB8fCB0aGlzLnRyZW5kWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU2NvcmUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGIgPSB0aGlzLmZvY3VzQmFyO1xyXG4gICAgaWYgKGIgJiYgYi52YWx1ZSAhPT0gbnVsbCkgeyByZXR1cm4gYi52YWx1ZSArICclJzsgfVxyXG4gICAgLy8gV2l0aCBubyB0cmVuZCBidWNrZXRzLCB0aGUgaGVhZGxpbmUgaXMgdGhlIHBlcmlvZCBhdmVyYWdlLlxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnID09PSBudWxsID8gJ+KAlCcgOiBhdmcgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNQYXNzZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgPj0gdGhpcy5wYXNzTWFyazsgfVxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnICE9PSBudWxsICYmIGF2ZyA+PSB0aGlzLnBhc3NNYXJrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU3RhdHVzKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGNvbnN0IGhhcyA9IChiICYmIGIudmFsdWUgIT09IG51bGwpIHx8IHRoaXMuYXZlcmFnZVNjb3JlICE9PSBudWxsO1xyXG4gICAgaWYgKCFoYXMpIHsgcmV0dXJuICdObyBkYXRhJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNQYXNzZWQgPyAnUGFzcycgOiAnQmVsb3cgcGFzcyBtYXJrJztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c0xpbmUoKTogc3RyaW5nIHtcclxuICAgIC8vIFN1Ym1pdHRlZCBhdWRpdHMsIGFzIHRoZSBiYXJzIGNvdW50IHRoZW0gKFwiMTAgYXVkaXRzXCIpOyBhdWRpdGVkQ291bnQgY291bnRzIGF1ZGl0ZWQgc3RvcmVzLlxyXG4gICAgY29uc3QgbiA9IHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJ1xyXG4gICAgICA/ICh0aGlzLmZvY3VzQmFyPy5zdWJtaXR0ZWQgPz8gMClcclxuICAgICAgOiB0aGlzLnRyZW5kLnJlZHVjZSgoc3VtLCBiKSA9PiBzdW0gKyAoYi5zdWJtaXR0ZWQgfHwgMCksIDApO1xyXG4gICAgcmV0dXJuIHRoaXMucGVyaW9kTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIGF1ZGl0IGNvbXBsZXRlZCcgOiAnIGF1ZGl0cyBjb21wbGV0ZWQnKVxyXG4gICAgICArICh0aGlzLnNob3dQYXNzTWFya0luZm8gPyAnIMK3IHBhc3MgbWFyayAnICsgdGhpcy5wYXNzTWFyayArICclJyA6ICcnKTtcclxuICB9XHJcblxyXG4gIHNldFBlcmZUYWIodGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmVGFiID0gdGFiO1xyXG4gICAgdGhpcy5wZXJmU2VhcmNoID0gJyc7XHJcbiAgICB0aGlzLnBlcmZTb3J0S2V5ID0gJyc7XHJcbiAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIGluIHRoZSBvcGVuIHBlcmZvcm1hbmNlIHRhYmxlIGFmdGVyIHNlYXJjaCAvIHNvcnQgKHdoYXQgdGhlIHBhZ2VyIGNvdW50cykuICovXHJcbiAgZ2V0IHBlcmZUb3RhbCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ0F1ZGl0JykgeyByZXR1cm4gdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLmZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScgPyB0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgcGFnZSBvZiBhIHBlcmZvcm1hbmNlIHRhYmxlOyBhIHNlYXJjaCB0aGF0IHNocmlua3MgdGhlIGxpc3QgcHVsbHMgdGhlIHBhZ2UgYmFjayBpbnRvIHJhbmdlLiAqL1xyXG4gIHBlcmZQYWdlT2Y8VD4obGlzdDogVFtdKTogVFtdIHtcclxuICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxpc3QubGVuZ3RoIC8gdGhpcy5wZXJmUGFnZVNpemUpKTtcclxuICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1pbih0aGlzLnBlcmZQYWdlLCBwYWdlcyk7XHJcbiAgICByZXR1cm4gbGlzdC5zbGljZSgocGFnZSAtIDEpICogdGhpcy5wZXJmUGFnZVNpemUsIHBhZ2UgKiB0aGlzLnBlcmZQYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBvblBlcmZQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IE51bWJlcihwYWdlKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgb25QZXJmUGFnZVNpemUoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgbmV3IHNlYXJjaCBzdGFydHMgb24gcGFnZSAxLiAqL1xyXG4gIG9uUGVyZlNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIGhlYWRlciBjbGljazogc29ydCBieSB0aGF0IGNvbHVtbiwgYWdhaW4gdG8gcmV2ZXJzZSAoc2FtZSB0b2dnbGUgYXMgdGhlIHN0b3JlIGxpc3QpLiAqL1xyXG4gIHNvcnRQZXJmKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wZXJmU29ydEtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMucGVyZlNvcnREaXIgPSB0aGlzLnBlcmZTb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wZXJmU29ydEtleSA9IGtleTtcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUm93cyBpbiB0aGUgcGlja2VkIGNvbHVtbiBvcmRlciAodGhlIEFQSSdzIG9yZGVyIHdoZW4gbm9uZSBpcyBwaWNrZWQpLiBOdW1iZXJzIGNvbXBhcmUgYXMgbnVtYmVycywgdGV4dFxyXG4gICAqIGNhc2UtaW5zZW5zaXRpdmVseTsgZW1wdHkgdmFsdWVzICgn4oCUJykgc3RheSBhdCB0aGUgYm90dG9tIGluIGJvdGggZGlyZWN0aW9ucywgYXMgaW4gdGhlIHN0b3JlIGxpc3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0UGVyZlJvd3M8VD4ocm93czogVFtdLCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIChyOiBUKSA9PiBTb3J0VmFsdWU+KTogVFtdIHtcclxuICAgIGNvbnN0IGdldCA9IHZhbHVlc1t0aGlzLnBlcmZTb3J0S2V5XTtcclxuICAgIGlmICghZ2V0KSB7IHJldHVybiByb3dzOyB9XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnBlcmZTb3J0RGlyID09PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgIGNvbnN0IGVtcHR5ID0gKHY6IFNvcnRWYWx1ZSkgPT4gdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycgfHwgdiA9PT0gJ+KAlCc7XHJcbiAgICByZXR1cm4gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgYXYgPSBnZXQoYSk7XHJcbiAgICAgIGNvbnN0IGJ2ID0gZ2V0KGIpO1xyXG4gICAgICBpZiAoZW1wdHkoYXYpIHx8IGVtcHR5KGJ2KSkgeyByZXR1cm4gZW1wdHkoYXYpID09PSBlbXB0eShidikgPyAwIDogKGVtcHR5KGF2KSA/IDEgOiAtMSk7IH1cclxuICAgICAgaWYgKHR5cGVvZiBhdiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGJ2ID09PSAnbnVtYmVyJykgeyByZXR1cm4gKGF2IC0gYnYpICogZGlyOyB9XHJcbiAgICAgIHJldHVybiBTdHJpbmcoYXYpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJ2KSwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgKiBkaXI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBTdWJtaXR0ZWQgY291bnQgLT4gdGhlIEdhbGxlcnkgb24gdGhpcyBhdWRpdCdzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAqL1xyXG4gIHN1Ym1pdHRlZFBhcmFtcyhyb3c6IEF1ZGl0UGVyZlJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYXVkaXQ6IFN0cmluZyhyb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIHx8ICcnKSxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVGFzayBTdWJtaXR0ZWQgY291bnQgLT4gdGhlIEdhbGxlcnkgd2l0aCBUeXBlIFRhc2sgb24gdGhpcyB0YXNrJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuICovXHJcbiAgdGFza1N1Ym1pdHRlZFBhcmFtcyhyb3c6IFRhc2tQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhdWRpdDogU3RyaW5nKHJvdy5yYXc/LnRhc2tJZCB8fCAnJyksXHJcbiAgICAgIHR5cGU6ICd0YXNrJyxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdWRpdCAvIHN0b3JlIC8gdXNlciBkZXRhaWwgbGluazogdGhlIHN1YmplY3QgcGx1cyB0aGUgZGFzaGJvYXJkIHBlcmlvZCAoZnJvbSAvIHRvKSwgc28gdGhlIGRldGFpbFxyXG4gICAqIHBhZ2Ugc2hvd3MgdGhlIHNhbWUgZGF5cyBhcyB0aGUgcm93IGNsaWNrZWQsIG5vdCB0aGUgaGVhZGVyIHJhbmdlICh0aGUgZGFzaGJvYXJkIGtlZXBzIGl0cyBvd24gcGVyaW9kKS5cclxuICAgKi9cclxuICBkZXRhaWxQYXJhbXMoc3ViamVjdDogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uc3ViamVjdCxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiTGFiZWwodGFiOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRhYiArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZTZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gJ1NlYXJjaCBieSBTdG9yZSBOYW1lJzsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiAnU2VhcmNoIGJ5IFVzZXIgTmFtZSc7IH1cclxuICAgIHJldHVybiAnU2VhcmNoIGJ5ICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZEF1ZGl0UGVyZigpOiBBdWRpdFBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLmF1ZGl0UGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLmF1ZGl0UGVyZiwgdGhpcy5hdWRpdFNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRTdG9yZVBlcmYoKTogU3RvcmVQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy5zdG9yZVBlcmYuZmlsdGVyKHIgPT4gKHIuc3RvcmUgKyAnICcgKyByLnN0b3JlSWQgKyAnICcgKyByLnNwb2MpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5zdG9yZVBlcmYsIHRoaXMuc3RvcmVTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkVXNlclBlcmYoKTogVXNlclBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnVzZXJQZXJmLmZpbHRlcihyID0+IChyLm5hbWUgKyAnICcgKyByLmVtYWlsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMudXNlclBlcmYsIHRoaXMudXNlclNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZkF1ZGl0KF86IG51bWJlciwgcm93OiBBdWRpdFBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cubmFtZTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmU3RvcmUoXzogbnVtYmVyLCByb3c6IFN0b3JlUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZVc2VyKF86IG51bWJlciwgcm93OiBVc2VyUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LmVtYWlsO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gTnVtYmVyKHBhZ2UpIHx8IDE7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5U3RvcmUoXzogbnVtYmVyLCByb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RvcmVJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGZpbHRlckNhdHMgLyBiYW5kUm93cyBhcmUgZ2V0dGVycyB0aGF0IGJ1aWxkIG5ldyBvYmplY3RzIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24uIFdpdGhvdXQgYSBrZXlcclxuICAgKiBuZ0ZvciByZWJ1aWxkcyB0aGVpciBidXR0b25zIG9uIGVhY2ggcGFzcywgYW5kIGEgcGFzcyBiZXR3ZWVuIG1vdXNlZG93biBhbmQgbW91c2V1cCAodGhlIGhpZXJhcmNoeVxyXG4gICAqIGRyb3Bkb3duIGxpc3RlbnMgdG8gZG9jdW1lbnQ6bW91c2Vkb3duKSBzd2FsbG93cyB0aGUgY2xpY2suXHJcbiAgICovXHJcbiAgdHJhY2tCeUNhdChfOiBudW1iZXIsIGM6IEZpbHRlckNhdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYy5rZXk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5QmFuZChfOiBudW1iZXIsIGI6IHsgYmFuZDogQXVkaXRCYW5kIH0pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGIuYmFuZC5rZXk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLSBFeHBvcnQgKGNsaWVudC1zaWRlIC54bHN4IG9mIGV4YWN0bHkgdGhlIGZpbHRlcmVkIHJvd3MgYW5kIHZpc2libGUgY29sdW1ucykgLS0tLSAqL1xyXG5cclxuICBwcml2YXRlIGdldCBleHBvcnRQZXJpb2QoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZyb20gKyAnXycgKyB0aGlzLnRvO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhlYWRlciBFeHBvcnQ6IHRoZSBzdG9yZSBsaXN0IGJlbG93IHRoZSBmaWx0ZXJzLCBldmVyeSBmaWx0ZXJlZCByb3cgKGFsbCBwYWdlcyksIGl0cyB2aXNpYmxlIGNvbHVtbnMuICovXHJcbiAgZXhwb3J0U3RvcmVzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZmlsdGVyZWRSb3dzO1xyXG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCAhcm93cy5sZW5ndGgpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48QXVkaXRSb3c+W10gPSB0aGlzLmhlYWRlcnMubWFwKGggPT4gKHtcclxuICAgICAgaGVhZGVyOiBoLmxhYmVsLFxyXG4gICAgICB2YWx1ZTogKHI6IEF1ZGl0Um93KSA9PiB7XHJcbiAgICAgICAgaWYgKGgua2V5ID09PSAnc2NvcmUnKSB7IHJldHVybiByLnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByLnNjb3JlICsgJyUnOyB9XHJcbiAgICAgICAgaWYgKGgua2V5ID09PSAnc3RhdHVzJykgeyByZXR1cm4gdGhpcy5zdGF0dXNMYWJlbChyKTsgfVxyXG4gICAgICAgIHJldHVybiByW2gua2V5IGFzIGtleW9mIEF1ZGl0Um93XTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeChyb3dzLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVN0b3Jlcy0nICsgdGhpcy5leHBvcnRQZXJpb2QsICdTdG9yZSBsaXN0Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBvZiB0aGUgYWN0aXZlIHBlcmZvcm1hbmNlIHRhYiBhZnRlciBpdHMgc2VhcmNoICh3aGF0IHRoZSBcIlRvdGFsXCIgY291bnRlciBzaG93cykuICovXHJcbiAgZ2V0IHBlcmZSb3dDb3VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gdGhpcy5maWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGg7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gdGhpcy5maWx0ZXJlZFVzZXJQZXJmLmxlbmd0aDsgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy5maWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhY3RpdmUgcGVyZm9ybWFuY2UgdGFiIGlzIHN0aWxsIGxvYWRpbmcgKHRoZSBUYXNrIHRhYmxlIGhhcyBpdHMgb3duIGZlZWQpLiAqL1xyXG4gIGdldCBwZXJmTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWIgPT09ICdBdWRpdCcgJiYgdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLnRhc2tMb2FkaW5nIDogdGhpcy5sb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIEV4cG9ydDogdGhlIGFjdGl2ZSB0YWIncyBmaWx0ZXJlZCBsaXN0IHdpdGggaXRzIHZpc2libGUgY29sdW1uIGhlYWRlcnMgKEFjdGlvbiBsZWZ0IG91dCkuICovXHJcbiAgZXhwb3J0UGVyZm9ybWFuY2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wZXJmTG9hZGluZyB8fCAhdGhpcy5wZXJmUm93Q291bnQpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBwZXJpb2QgPSB0aGlzLmV4cG9ydFBlcmlvZDtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFN0b3JlUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIE5hbWUnLCB2YWx1ZTogciA9PiByLnN0b3JlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBJRCcsIHZhbHVlOiByID0+IHIuc3RvcmVJZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgU3BvYycsIHZhbHVlOiByID0+IHIuc3BvYyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgPz8gJ+KAlCcgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVN0b3JlLVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdTdG9yZSBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFVzZXJQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVXNlciBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdFbWFpbCcsIHZhbHVlOiByID0+IHIuZW1haWwgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRmxhZ3MnLCB2YWx1ZTogciA9PiByLmZsYWdzIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdSZURvJywgdmFsdWU6IHIgPT4gci5yZWRvIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGV0aW9uICUnLCB2YWx1ZTogciA9PiByLmNvbXBsZXRpb24gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsaWFuY2UgJScsIHZhbHVlOiByID0+IHIuY29tcGxpYW5jZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUGVyZm9ybWFuY2UgJScsIHZhbHVlOiByID0+IHIucGVyZiB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFVzZXJQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVVzZXItUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1VzZXIgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNUYXNrTW9kdWxlKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxUYXNrUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1Rhc2sgTmFtZScsIHZhbHVlOiByID0+IHIubmFtZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU2NoZWR1bGVkJywgdmFsdWU6IHIgPT4gci5zY2hlZHVsZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvdmVyYWdlJywgdmFsdWU6IHIgPT4gci5jb3ZlcmFnZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQgVG8nLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdWJtaXR0ZWQnLCB2YWx1ZTogciA9PiByLnN1Ym1pdHRlZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRmxhZ3MnLCB2YWx1ZTogciA9PiByLmZsYWdzIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdUYXNrcycsIHZhbHVlOiByID0+IHIudGFza3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlRG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1F1ZXN0aW9uIENvbXBsaWFuY2UgJScsIHZhbHVlOiByID0+IHIuY29tcGxpYW5jZSB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFRhc2tQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVRhc2stUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1Rhc2sgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPEF1ZGl0UGVyZlJvdz5bXSA9IFtcclxuICAgICAgeyBoZWFkZXI6ICdBdWRpdCBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQgVG8nLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnU3VibWl0dGVkJywgdmFsdWU6IHIgPT4gci5zdWJtaXR0ZWQgfSxcclxuICAgICAgeyBoZWFkZXI6ICdEaXNwdXRlcycsIHZhbHVlOiByID0+IHIuZGlzcHV0ZXMgPz8gJ+KAlCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdQYXNzIE1hcmsnLCB2YWx1ZTogciA9PiByLnBhc3NNYXJrIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnU2NvcmUnLCB2YWx1ZTogciA9PiByLnNjb3JlIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnUmVzdWx0JywgdmFsdWU6IHIgPT4gci5yZXN1bHQgfVxyXG4gICAgXTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZEF1ZGl0UGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1BdWRpdC1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnQXVkaXQgUGVyZm9ybWFuY2UnKTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIFBlci1zdG9yZSBQREYgLS0tLSAqL1xyXG5cclxuICAvKiogVGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kICh0aGUgZGFzaGJvYXJkIEFQSSdzIGxhc3RWaXNpdElkKSwgaWYgYW55LiAqL1xyXG4gIHBkZlZpc2l0SWQocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8ubGFzdFZpc2l0SWQgPyBTdHJpbmcocm93LnJhdy5sYXN0VmlzaXRJZCkgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXVkaXQgb2YgdGhhdCBsYXRlc3Qgc3VibWlzc2lvbiAobGFzdFZpc2l0QXVkaXRJZCk6IFZpZXcgb3BlbnMgaXQgaW4gdGhlIEdhbGxlcnkuICcnIHdpdGhvdXQgb25lLiAqL1xyXG4gIGdhbGxlcnlBdWRpdElkKHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/Lmxhc3RWaXNpdEF1ZGl0SWQgPyBTdHJpbmcocm93LnJhdy5sYXN0VmlzaXRBdWRpdElkKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2FtZSBQREYgZG93bmxvYWQgYXMgdGhlIGRldGFpbCBwYWdlcycgRG93bmxvYWQsIGZvciB0aGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0OlxyXG4gICAqIHF1ZXVlZCwgdGhlbiBsaXN0ZWQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy5cclxuICAgKi9cclxuICBkb3dubG9hZFBkZihyb3c6IEF1ZGl0Um93KTogdm9pZCB7XHJcbiAgICBjb25zdCB2aXNpdElkID0gdGhpcy5wZGZWaXNpdElkKHJvdyk7XHJcbiAgICBpZiAoIXZpc2l0SWQgfHwgdGhpcy5wZGZRdWV1ZWQuaGFzKHZpc2l0SWQpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5wZGZRdWV1ZWQuYWRkKHZpc2l0SWQpO1xyXG4gICAgY29uc3QgdXNlciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xyXG4gICAgY29uc3Qgc3RvcmVJZCA9IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQ7XHJcbiAgICAvLyBUaGUgZG93bmxvYWQgbmFtZSBpcyBtYXRjaGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uIHNlcnZlci1zaWRlLCBzbyBsZWF2ZSByZWdleCBjaGFyYWN0ZXJzIG91dC5cclxuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcocm93LnJhdz8uc3RvcmVOYW1lIHx8IHN0b3JlSWQpLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCAnICcpLnRyaW0oKSArICcgYXVkaXQnO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5yZXBvcnRUYWJsZUV4cG9ydCh7XHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIGNoZWNrbGlzdElkOiBbdmlzaXRJZF0sXHJcbiAgICAgIHNvdXJjZUNoZWNrTGlzdF9pZDogJycsXHJcbiAgICAgIGNoZWNrbGlzdE5hbWU6IG5hbWUsXHJcbiAgICAgIGZpbGVUeXBlOiAncGRmJyxcclxuICAgICAgc3RvcmVJZHM6IFtzdG9yZUlkXSxcclxuICAgICAgdXNlcklkOiB1c2VyPy5faWQsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgZG93bmxvYWRJbnNlcnRGcm9tOiAnZGFzaGJvYXJkJyxcclxuICAgICAgaW5zZXJ0VHlwZTogJ2NoZWNrbGlzdCcsXHJcbiAgICAgIGNoZWNrTGlzdFR5cGU6ICdjdXN0b20nXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZGZRdWV1ZWQuZGVsZXRlKHZpc2l0SWQpO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0Rvd25sb2FkaW5nIHlvdXIgcmVwb3J0LiBGaW5kIGl0IHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGRmUXVldWVkLmRlbGV0ZSh2aXNpdElkKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1NvbWV0aGluZyB3ZW50IHdyb25nIScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LWRhc2hcIj5cclxuXHJcbiAgPCEtLSBSZWZyZXNoIGxpbmUgKyBtb2R1bGUgc3dpdGNoIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkYi10b3BsaW5lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcmVmcmVzaFwiPkxhc3QgcmVmcmVzaGVkIGF0IHt7IGxhc3RSZWZyZXNoZWQgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZHVsZXN3aXRjaFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vZHVsZXRhYlwiICpuZ0Zvcj1cImxldCB0IG9mIG1vZHVsZVRhYnNcIiBbY2xhc3MubW9kdWxldGFiLW9uXT1cIm1vZHVsZVRhYiA9PT0gdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldE1vZHVsZVRhYih0KVwiPnt7IHQgfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBBVURJVCBTQ09SRUNBUkQgPT09PT09PT09PT09IC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUYXNrTW9kdWxlXCI+XHJcblxyXG4gICAgPCEtLSBDcnVtYiwgc2NvcGUgdGl0bGUsIGFjdGlvbnMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGViYXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3BldGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jcnVtYlwiPkF1ZGl0cyDigLogRGFzaGJvYXJkPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3BlXCI+e3sgc2NvcGVMYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiNFwiIHkxPVwiN1wiIHgyPVwiMjBcIiB5Mj1cIjdcIj48L2xpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjdcIiB5MT1cIjEyXCIgeDI9XCIxN1wiIHkyPVwiMTJcIj48L2xpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjEwXCIgeTE9XCIxN1wiIHgyPVwiMTRcIiB5Mj1cIjE3XCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEZpbHRlcnNcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNvdW50cGlsbFwiICpuZ0lmPVwiZmlsdGVyQ291bnRcIj57eyBmaWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8ICFmaWx0ZXJlZFJvd3MubGVuZ3RoXCJcclxuICAgICAgICB0aXRsZT1cIkRvd25sb2FkIHRoZSBzdG9yZSBsaXN0IGJlbG93IGFzIGFuIEV4Y2VsIGZpbGVcIiAoY2xpY2spPVwiZXhwb3J0U3RvcmVzKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMTZWNFwiPjwvcGF0aD5cclxuICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI3IDkgMTIgNCAxNyA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCAxNnY0aDE2di00XCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEV4cG9ydFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRmlsdGVyIGNoaXBzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWNoaXBzXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItY2hpcFwiICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlckNhdHM7IHRyYWNrQnk6IHRyYWNrQnlDYXRcIiBbY2xhc3MuaXMtZGlydHldPVwiYy5kaXJ0eVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKGMua2V5KVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hpcC1sYWJlbFwiPnt7IGMubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGlwLXZhbHVlXCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItY2xlYXJhbGxcIiAqbmdJZj1cImZpbHRlckNvdW50XCIgKGNsaWNrKT1cImNsZWFyQWxsKClcIj5DbGVhciBhbGw8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gS1BJIHRpbGVzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWtwaXNcIj5cclxuICAgICAgPCEtLSBPbGQgQ2hlY2tsaXN0IHN1bW1hcnkgY2FyZDogZmlndXJlICsgbGFiZWwgaW4gdGhlIGdyYWRpZW50IHN0cmlwLCBub3RlIGJlbG93LiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZFwiICpuZ0Zvcj1cImxldCBrcGkgb2Yga3Bpc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtaGVhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1jb3VudFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBrcGkudmFsdWUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC10ZXh0XCI+e3sga3BpLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLW5vdGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmdcIiBjbGFzcz1cImF2Mi1vY2FyZC1ub3RlXCIgW3N0eWxlLmNvbG9yXT1cImtwaS5ub3RlQ29sb3JcIj57eyBrcGkubm90ZSB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVHJlbmQgKyBkaXN0cmlidXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItZHVvXCI+XHJcbiAgICAgIDwhLS0gVHJlbmQgLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLWhlYWQgZGItY2FyZC1oZWFkLS13cmFwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZSBkYi1jYXJkLXRpdGxlLS1ncm93XCI+QXVkaXQgc2NvcmUgdHJlbmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zZWdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1zZWctdGFiXCIgW2NsYXNzLmlzLW9uXT1cImdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwic2V0R3JhaW4oJ3F1YXJ0ZXInKVwiPlF1YXJ0ZXJseTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXNlZy10YWJcIiBbY2xhc3MuaXMtb25dPVwiZ3JhaW4gPT09ICdkYXRlJ1wiIChjbGljayk9XCJzZXRHcmFpbignZGF0ZScpXCI+QnkgZGF0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1kYXRlcm93XCIgKm5nSWY9XCJzaG93VHJlbmREYXRlUGlja2VyICYmIGdyYWluID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2tcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImF2Mi1kYXRlcGljay1pY29uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIyXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjhcIiB5MT1cIjJcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF2Mi1kYXRlcGljay1pbnB1dCBkYi1kYXRlcmFuZ2VcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seSBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cInJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIiBbbWF4RGF0ZV09XCJ0b2RheVwiXHJcbiAgICAgICAgICAgICAgW2RhdGVMaW1pdF09XCJtYXhSYW5nZURheXNcIiBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiXHJcbiAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ibG9jayBkYi1zay1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cmVuZExvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZm9jdXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtc2NvcmVcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1Njb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1waWxsXCIgKm5nSWY9XCJzaG93UGFzc01hcmtJbmZvXCIgW2NsYXNzLmlzLXBhc3NdPVwiZm9jdXNQYXNzZWRcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1N0YXR1cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtbGluZVwiPnt7IGZvY3VzTGluZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZ2VuZFwiICpuZ0lmPVwic2hvd1Bhc3NNYXJrSW5mb1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1sZWdlbmQtZGFzaFwiPjwvc3Bhbj5QYXNzIG1hcmsge3sgcGFzc01hcmsgfX0lXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MFwiPjEwMCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjUwJVwiPjUwJTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MTAwJVwiPjAlPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQtYXJlYVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6MFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjUwJVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjEwMCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGFzc2xpbmVcIiBbc3R5bGUudG9wLiVdPVwiMTAwIC0gcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXJzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhci1jb2xcIiAqbmdGb3I9XCJsZXQgYmFyIG9mIHRyZW5kQmFyczsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhci12YWx1ZVwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImJhci5rZXkgPT09IHF1YXJ0ZXJcIiBbc3R5bGUuYm90dG9tXT1cImJhckhlaWdodChiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGJhci52YWx1ZSA9PT0gbnVsbCA/ICfigJQnIDogYmFyLnZhbHVlICsgJyUnIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhclwiIFtzdHlsZS5oZWlnaHRdPVwiYmFySGVpZ2h0KGJhcilcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiYXJGaWxsKGJhcilcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcFwiIFtjbGFzcy5pcy1zdGFydF09XCJmaXJzdCAmJiAhbGFzdFwiIFtjbGFzcy5pcy1lbmRdPVwibGFzdCAmJiAhZmlyc3RcIiBbc3R5bGUuYm90dG9tXT1cInRpcEJvdHRvbShiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtaGVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGJhci5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiZGItdGlwLXN1YlwiICpuZ0lmPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiPiDCtyB7eyBxdWFydGVyTW9udGhzKGJhci5rZXkpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1zY29yZVwiICpuZ0lmPVwiYmFyLnZhbHVlICE9PSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtZG90XCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtdmFsdWVcIj57eyBiYXIudmFsdWUgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLXN0YXR1c1wiICpuZ0lmPVwic2hvd1Bhc3NNYXJrSW5mb1wiIFtjbGFzcy5pcy1mYWlsXT1cImJhci52YWx1ZSA8IHBhc3NNYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPj0gcGFzc01hcmsgPyAnUGFzcycgOiAnQmVsb3cgcGFzcyBtYXJrJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtZW1wdHlcIiAqbmdJZj1cImJhci52YWx1ZSA9PT0gbnVsbFwiPk5vIHNjb3JlZCBhdWRpdHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5BdWRpdHMgY29tcGxldGVkPC9zcGFuPjxiPnt7IGJhci5zdWJtaXR0ZWQgfX08L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtcm93XCIgKm5nSWY9XCJiYXIuY291bnQgIT09IGJhci5zdWJtaXR0ZWRcIj48c3Bhbj5TY29yZWQgYXVkaXRzPC9zcGFuPjxiPnt7IGJhci5jb3VudCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5QYXNzIG1hcms8L3NwYW4+PGI+e3sgcGFzc01hcmsgfX0lPC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBBIG1vbnRoIGJ5IGRhdGUgaGFzIH4zMCBiYXJzOiBldmVyeSBmZXcgZGF5cyBnZXQgYSBsYWJlbCAoZmlyc3QgYW5kIGxhc3QgYWx3YXlzKSwgYW5kIHRoZSBhdWRpdCBjb3VudHNcclxuICAgICAgICAgICAgIG1vdmUgdG8gdGhlIGJhciB0b29sdGlwLCBzbyB0aGUgbGFiZWxzIG5ldmVyIHJ1biBpbnRvIGVhY2ggb3RoZXIuIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC14XCIgW2NsYXNzLmlzLWRlbnNlXT1cImRlbnNlVHJlbmRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGNvbFwiICpuZ0Zvcj1cImxldCBiYXIgb2YgdHJlbmRCYXJzOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGxhYmVsXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCIgW3N0eWxlLnZpc2liaWxpdHldPVwic2hvd1hMYWJlbChpLCBsYXN0KSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCI+e3sgYmFyLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhjb3VudFwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIj57eyBiYXIuc3VibWl0dGVkID8gYmFyLnN1Ym1pdHRlZCArICcgYXVkaXRzJyA6ICdubyBhdWRpdHMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tIFNjb3JlIGJhbmRzIC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1oZWFkIGRiLWNhcmQtaGVhZC0tYmFzZWxpbmVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5TY29yZSBkaXN0cmlidXRpb248L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHN0b3Jlc0luU2NvcGUgfX0gaW4gc2NvcGU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5TdG9yZXMgYnkgc2NvcmUgYmFuZCwge3sgcGVyaW9kTGFiZWwgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiIFtyb3dzXT1cIjJcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGJhclwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgICAgIDwhLS0gQSBiYW5kIHdpdGggc3RvcmVzIGtlZXBzIGEgdmlzaWJsZSBzbGl2ZXIgKDIgb2YgMzU3NiBzdG9yZXMgaXMgdW5kZXIgYSBwaXhlbCk7IHRoZSBsYXJnZXN0IGJhbmQgZ2l2ZXMgd2F5LiAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNlZ1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtzdHlsZS53aWR0aF09XCJiLndpZHRoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN0b3Jlc109XCJiLmNvdW50ID4gMFwiIFt0aXRsZV09XCJiLmJhbmQubGFiZWwgKyAnOiAnICsgYi5jb3VudFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dzXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiBiYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGxhYmVsXCI+e3sgYi5iYW5kLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRyYW5nZVwiPnt7IGIuYmFuZC5yYW5nZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY291bnRcIj57eyBiLmNvdW50IH19IHt7IGIuY291bnQgPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNoYXJlXCI+e3sgYi5zaGFyZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIFtjbGFzcy5pcy1hY3RpdmVdPVwic3RvcmVMaXN0T3BlbiAmJiBsaXN0QmFuZEtleSA9PT0gYi5iYW5kLmtleVwiIChjbGljayk9XCJhcHBseUJhbmQoYi5iYW5kKVwiPlZpZXcgc3RvcmVzPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRoaW50XCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhc2hvd1N0b3JlTGlzdFwiPkNsaWNrIDxiPlZpZXcgc3RvcmVzPC9iPiBvbiBhIGJhbmQgdG8gbGlzdCBpdHMgc3RvcmVzLjwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIGxlZGdlcjogb3BlbmVkIGZyb20gU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIChvciBhIEZpbHRlcnMgc2NvcmUgcmFuZ2UpIC0tPlxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkIGRiLWNhcmQtLXRhYmxlXCIgaWQ9XCJhZC1zdG9yZS1saXN0XCIgKm5nSWY9XCJzaG93U3RvcmVMaXN0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGVcIj5TdG9yZSBsaXN0PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5cclxuICAgICAgICAgICAge3sgZmlsdGVyZWRSb3dzLmxlbmd0aCB9fSB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoID09PSAxID8gJ3N0b3JlJyA6ICdzdG9yZXMnIH19IMK3IHt7IHBlcmlvZExhYmVsIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIGRiLXNlYXJjaFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoKClcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3JlIG9yIG93bmVyXCJcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWdtZW50ZWRcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdhbGwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnYWxsJylcIj5BbGw8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdmYWlsJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ2ZhaWwnKVwiPkZhaWw8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdwYXNzJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ3Bhc3MnKVwiPlBhc3M8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICduYSdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCduYScpXCI+Tm90IGF1ZGl0ZWQ8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJkYi10YWJsZVwiPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBoIG9mIGhlYWRlcnNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJzb3J0S2V5ID09PSBoLmtleVwiIChjbGljayk9XCJzb3J0QnkoaC5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBoLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gaC5rZXlcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+XHJcbiAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBhZ2VSb3dzOyB0cmFja0J5OiB0cmFja0J5U3RvcmVcIj5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1ub3dyYXBcIj57eyByb3cuZGF0ZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1zdG9yZWlkXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIj57eyByb3cuc3RvcmVJZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy5jaXJjbGUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy56b25lIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj57eyByb3cuYW9tIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgW2NsYXNzLmF2Mi1mYWludF09XCIhcm93LmF1ZGl0c1wiPnt7IHJvdy5hdWRpdHMgfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcm93LnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByb3cuc2NvcmUgKyAnJScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgc3RhdHVzTGFiZWwocm93KSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBWaWV3IG9wZW5zIHRoZSBHYWxsZXJ5IG9uIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAoUUEgMTEgT2N0KTsgYSBzdG9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGggbm8gc3VibWlzc2lvbiB0aGVyZSBvcGVucyBpdHMgYXVkaXQgZGV0YWlsIGluc3RlYWQgKHNhbWUgYXMgdGhlIHN0b3JlIGxpbmspLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi12aWV3YnRuXCIgKm5nSWY9XCJnYWxsZXJ5QXVkaXRJZChyb3cpIGFzIGF1ZGl0SWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2dhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBhdWRpdDogYXVkaXRJZCwgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIiB0aXRsZT1cIlZpZXcgdGhpcyBzdG9yZSdzIHN1Ym1pc3Npb25zIGluIHRoZSBHYWxsZXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi12aWV3YnRuXCIgKm5nSWY9XCIhZ2FsbGVyeUF1ZGl0SWQocm93KVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIiB0aXRsZT1cIlZpZXcgdGhpcyBzdG9yZSdzIGF1ZGl0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgVmlld1xyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gUERGIG9mIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAocXVldWVkLCB0aGVuIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1wZGZidG5cIiByb2xlPVwiYnV0dG9uXCIgW2NsYXNzLmlzLWRpc2FibGVkXT1cIiFwZGZWaXNpdElkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIXBkZlZpc2l0SWQocm93KVwiIChjbGljayk9XCJkb3dubG9hZFBkZihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicGRmVmlzaXRJZChyb3cpID8gJ0Rvd25sb2FkIHRoZSBQREYgcmVwb3J0IG9mIHRoZSBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGZvciB0aGlzIHN0b3JlJyA6ICdObyBzdWJtaXR0ZWQgYXVkaXQgZm9yIHRoaXMgc3RvcmUgaW4gdGhpcyBwZXJpb2QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA0djEyXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgMTEgMTIgMTYgMTcgMTFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDIwaDE2XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhcGFnZVJvd3MubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj5ObyBzdG9yZXMgbWF0Y2ggdGhlIGN1cnJlbnQgZmlsdGVycy48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtcGFnZXJcIiAqbmdJZj1cImZpbHRlcmVkUm93cy5sZW5ndGhcIj5cclxuICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwYWdlU2l6ZVwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnZVNpemVzXCJcclxuICAgICAgICAgIFtjdXJyZW50UGFnZV09XCJwYWdlXCIgW3RvdGFsSXRlbXNdPVwiZmlsdGVyZWRSb3dzLmxlbmd0aFwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IFRBU0sgU1VNTUFSWSA9PT09PT09PT09PT0gLS0+XHJcbiAgPCEtLSBUYXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cywgaW4gdGhlIGhlYWRlciBzY29wZSAoc2hpbW1lciB2YWx1ZXMgd2hpbGUgbG9hZGluZykuIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkYi1zdGF0c1wiICpuZ0lmPVwiaXNUYXNrTW9kdWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuYWN0aXZlVGFza3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPkFjdGl2ZSB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLnRhc2tJbnN0YW5jZXMgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+e3sgbW9kdWxlVGFiIH19IEluc3RhbmNlczwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5ub3RTdWJtaXR0ZWQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPk5vdCBTdWJtaXR0ZWQge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keSBkYi1zdGF0LWJvZHktLTJcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMub3BlblRhc2tzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPk9wZW4ge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5pblByb2dyZXNzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPkluIFByb2dyZXNzIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuc3VibWl0dGVkIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbGFiZWxcIj5TdWJtaXR0ZWQge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keSBkYi1zdGF0LWJvZHktLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5jb21wbGV0aW9uU2NvcmUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+Q29tcGxldGlvbiBTY29yZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuY29tcGxldGlvbkRlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2NvbXBsZXRpb24nKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuY29tcGxldGlvbkRlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5jb21wbGlhbmNlU2NvcmUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+Q29tcGxpYW5jZSBTY29yZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuY29tcGxpYW5jZURlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2NvbXBsaWFuY2UnKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuY29tcGxpYW5jZURlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWQgaXMtdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMudG90YWxGbGFncyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Ub3RhbCBGbGFnczwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuZmxhZ3NEZWx0YVwiIFtuZ0NsYXNzXT1cInRhc2tEZWx0YUNsYXNzKCdmbGFncycpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5mbGFnc0RlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gUEVSRk9STUFOQ0UgPT09PT09PT09PT09IC0tPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiZGItcGVyZlwiICpuZ0lmPVwic2hvd1BlcmZvcm1hbmNlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZnRhYnNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1wZXJmdGFiXCIgKm5nRm9yPVwibGV0IHQgb2YgcGVyZlRhYnNcIiBbY2xhc3MuaXMtb25dPVwicGVyZlRhYiA9PT0gdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldFBlcmZUYWIodClcIj57eyBwZXJmVGFiRGlzcGxheSh0KSB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtaGVhZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi10ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtdGl0bGVcIj5cclxuICAgICAgICAgIHt7IHBlcmZJbmZvVGl0bGUgfX1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdG90YWxcIj5cclxuICAgICAgICAgICAge3sgcGVyZlRhYiA9PT0gJ0F1ZGl0JyA/IChpc1Rhc2tNb2R1bGUgPyBmaWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IGZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aCkgOiAocGVyZlRhYiA9PT0gJ1N0b3JlJyA/IGZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aCA6IGZpbHRlcmVkVXNlclBlcmYubGVuZ3RoKSB9fSBUb3RhbFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHBlcmZQZXJpb2QgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIGRiLXBlcmYtc2VhcmNoXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInBlcmZTZWFyY2hQbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwicGVyZlNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uUGVyZlNlYXJjaCgpXCI+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIFtkaXNhYmxlZF09XCJwZXJmTG9hZGluZyB8fCAhcGVyZlJvd0NvdW50XCJcclxuICAgICAgICB0aXRsZT1cIkRvd25sb2FkIHRoaXMgdGFibGUgYXMgYW4gRXhjZWwgZmlsZVwiIChjbGljayk9XCJleHBvcnRQZXJmb3JtYW5jZSgpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE2VjRcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyA5IDEyIDQgMTcgOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTQgMTZ2NGgxNnYtNFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBFeHBvcnRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBkYi1jcmVhdGVcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgYWNjZXNzLmNhbkFkZFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgNXYxNE01IDEyaDE0XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgIHt7IHBlcmZDcmVhdGVMYWJlbCB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cInBlcmZMb2FkaW5nXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBlcmZMb2FkaW5nXCI+XHJcbiAgICA8IS0tIEF1ZGl0IFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmICFpc1Rhc2tNb2R1bGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tYXVkaXRcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBhdWRpdFBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZEF1ZGl0UGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmQXVkaXRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWF2YXRhclwiPnt7IHJvdy5pbml0aWFscyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIH0pXCI+e3sgcm93Lm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgYXVkaXQncyBkZXRhaWwgcGFnZSAoYXMgdGhlIGV5ZSBkb2VzKSBvbiBpdHMgc3VibWl0dGVkIHZpc2l0cywgYXMgdGhlIHYxIENoZWNrbGlzdCBkYXNoYm9hcmQgZGlkLiAtLT5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdy5zdWJtaXR0ZWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkLCBzdGF0dXM6ICdzdWJtaXQnIH0pXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIHZpc2l0c1wiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZFwiPjA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwhLS0gU3RvcmUgZGlzcHV0ZXMgKHF1ZXN0aW9ucykgaW4gdGhlIHBlcmlvZCwgYXMgYSBwbGFpbiBjb3VudCAoUUEgMTAgT2N0OiBubyBsaW5rKS4gLS0+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5kaXNwdXRlcyA9PT0gbnVsbFwiIGNsYXNzPVwiYXYyLWZhaW50XCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmRpc3B1dGVzICE9PSBudWxsXCI+e3sgcm93LmRpc3B1dGVzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnBhc3NNYXJrIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuc2NvcmUgPT09ICfigJQnXCJcclxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyb3cuc2NvcmUgPT09ICfigJQnID8gJ0NvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGlzIGF1ZGl0JyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRyYWNrIGRiLXRyYWNrLS02XCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5zY29yZVBjdClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjMTJCNzZBJyA6ICcjRjA0NDM4J1wiPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dFwiPnt7IHJvdy5zY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnJlc3VsdCAhPT0gJ+KAlCdcIiBjbGFzcz1cImRiLXBpbGwgZGItcGlsbC0tc3Ryb25nXCIgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyNFQ0ZERjMnIDogJyNGRUYzRjInXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnIzAyN0E0OCcgOiAnI0I0MjMxOCdcIj57eyByb3cucmVzdWx0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnJlc3VsdCA9PT0gJ+KAlCdcIiBjbGFzcz1cImF2Mi1mYWludFwiIHRpdGxlPVwiQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoaXMgYXVkaXRcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyBhdWRpdFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gYXVkaXQgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgQXVkaXQgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVGFzayBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiBpc1Rhc2tNb2R1bGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tdGFza1wiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHRhc2tQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRUYXNrUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmVGFza1wiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYXZhdGFyXCI+e3sgcm93LmluaXRpYWxzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgW3RpdGxlXT1cInJvdy5yYXc/LmF1ZGl0TmFtZSA/ICdSYWlzZWQgZnJvbSAnICsgcm93LnJhdy5hdWRpdE5hbWUgOiAnJ1wiPnt7IHJvdy5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnNjaGVkdWxlZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW1lZGl1bVwiPnt7IHJvdy5jb3ZlcmFnZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgR2FsbGVyeSAoVHlwZSBUYXNrKSBvbiB0aGlzIHRhc2sncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuc3VibWl0dGVkICYmIHJvdy5yYXc/LnRhc2tJZFwiIGNsYXNzPVwiZGItdWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2dhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInRhc2tTdWJtaXR0ZWRQYXJhbXMocm93KVwiIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIHRhc2tzIGluIHRoZSBHYWxsZXJ5XCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3cuc3VibWl0dGVkIHx8ICFyb3cucmF3Py50YXNrSWRcIj57eyByb3cuc3VibWl0dGVkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGEgY2xhc3M9XCJkYi11bGlua1wiPnt7IHJvdy5mbGFncyB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZmFpbnRcIj57eyByb3cudGFza3MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGEgY2xhc3M9XCJkYi11bGlua1wiPnt7IHJvdy5yZWRvIH19PC9hPjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRyYWNrIGRiLXRyYWNrLS02XCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlUGN0KVwiPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dFwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgYXVkaXQgdGhlIHRhc2sgd2FzIHJhaXNlZCBmcm9tLiAtLT5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyB0aGUgYXVkaXQgdGhpcyB0YXNrIHdhcyByYWlzZWQgZnJvbVwiXHJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyb3cucmF3Py5hdWRpdElkID8gJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXQnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LmF1ZGl0SWQgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFRhc2tQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+Tm8gdGFza3MgcmFpc2VkIGZyb20gYXVkaXRzIGluIHRoaXMgcGVyaW9kLjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdTdG9yZSdcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tc3RvcmVcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBzdG9yZVBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFN0b3JlUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmU3RvcmVcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmUgfSlcIj57eyByb3cuc3RvcmUgfX08L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCIgW2F2MlRpcF09XCJyb3cuc3RvcmVJZFwiPnt7IHJvdy5zdG9yZUlkIHx8ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzIGF2Mi1kaW1cIj57eyByb3cuc3BvYyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmZsYWdzID8/ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxldGlvbiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGV0aW9uKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGV0aW9uIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZSlcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5wZXJmID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnBlcmYpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LnBlcmYgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHN0b3JlXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5zdG9yZUlkIHx8IHJvdy5zdG9yZSB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gc3RvcmUgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgU3RvcmUgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVXNlciBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ1VzZXInXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXVzZXJcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiB1c2VyUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkVXNlclBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlVzZXJcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+PGEgY2xhc3M9XCJkYi1saW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvdXNlclwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBlbWFpbDogcm93LmVtYWlsIH0pXCI+e3sgcm93Lm5hbWUgfX08L2E+PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzIGF2Mi1kaW1cIj57eyByb3cuZW1haWwgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5mbGFncyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cucmVkbyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsZXRpb24gPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxldGlvbilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxldGlvbiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGlhbmNlID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsaWFuY2UpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsaWFuY2UgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cucGVyZiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5wZXJmKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5wZXJmIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyB1c2VyXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvdXNlclwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBlbWFpbDogcm93LmVtYWlsIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIHVzZXIgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgVXNlciBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTaGFyZWQgcGFnZXIgKDEwIC8gMjAgLyAzMCksIGFzIG9uIHRoZSBvdGhlciBhdWRpdCBsaXN0cy4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi1wYWdlclwiICpuZ0lmPVwicGVyZlRvdGFsXCI+XHJcbiAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBlcmZQYWdlU2l6ZVwiIFtwYWdlU2l6ZV09XCJwZXJmUGFnZVNpemVcIiBbcGFnaW5hdGlvblNpemVzXT1cInBlcmZQYWdlU2l6ZXNcIlxyXG4gICAgICAgIFtjdXJyZW50UGFnZV09XCJwZXJmUGFnZVwiIFt0b3RhbEl0ZW1zXT1cInBlcmZUb3RhbFwiIChwYWdlQ2hhbmdlKT1cIm9uUGVyZlBhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGVyZlBhZ2VTaXplKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L3NlY3Rpb24+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IEZJTFRFUiBEUkFXRVIgPT09PT09PT09PT09IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYmFja2Ryb3BcIiAqbmdJZj1cImZpbHRlcnNPcGVuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPjwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyYXdlclwiICpuZ0lmPVwiZmlsdGVyc09wZW4gJiYgZHJhZnQgYXMgZHJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItaGVhZFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZGItY291bnRwaWxsXCIgKm5nSWY9XCJkci5maWx0ZXJDb3VudFwiPnt7IGRyLmZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZWJ0blwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIiB0aXRsZT1cIkNsb3NlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWJvZHlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1uYXZcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRyYXdlci1uYXZpdGVtXCIgKm5nRm9yPVwibGV0IGMgb2YgZHIuZmlsdGVyQ2F0czsgdHJhY2tCeTogdHJhY2tCeUNhdFwiIFtjbGFzcy5uYXZpdGVtLWFjdGl2ZV09XCJhY3RpdmVDYXQgPT09IGMua2V5XCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXQoYy5rZXkpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRleHRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0aXRsZVwiPnt7IGMubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dmFsdWVcIiBbY2xhc3MuaXMtZGlydHldPVwiYy5kaXJ0eVwiPnt7IGMudmFsdWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpcnR5ZG90XCIgKm5nSWY9XCJjLmRpcnR5XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItcGFuZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5ldGl0bGVcIj57eyBkci5hY3RpdmVDYXRPYmoudGl0bGUgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWhpbnRcIj57eyBkci5hY3RpdmVDYXRPYmouc3ViIH19PC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUGVyaW9kIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdwZXJpb2QnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cImRyLnNldEdyYWluKCdxdWFydGVyJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdxdWFydGVyJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+UXVhcnRlcmx5PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+UmVhZCBvbmUgZmluYW5jaWFsIHF1YXJ0ZXIgKEFwcmls4oCTTWFyY2ggeWVhcikgYXQgYSB0aW1lLjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdkYXRlJ1wiIChjbGljayk9XCJkci5zZXRHcmFpbignZGF0ZScpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAnZGF0ZSdcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPkJ5IGRhdGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj57eyBzaG93RHJhd2VyRGF0ZVJhbmdlID8gJ1BpY2sgYSBjdXN0b20gc3RhcnQgYW5kIGVuZCBkYXRlLicgOiAnVXNlIHRoZSBoZWFkZXIgZGF0ZSByYW5nZS4nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHEgb2YgZHIucXVhcnRlcnNcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnF1YXJ0ZXIgPT09IHFcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkci5zZWxlY3RRdWFydGVyKHEpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIucXVhcnRlciA9PT0gcVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnF1YXJ0ZXIgPT09IHFcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHEgfX0gwrcge3sgcXVhcnRlck1vbnRocyhxKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1maWVsZHNcIiAqbmdJZj1cInNob3dEcmF3ZXJEYXRlUmFuZ2UgJiYgZHIuZ3JhaW4gPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+RGF0ZSByYW5nZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrIGF2Mi1kYXRlcGljay0tY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImF2Mi1kYXRlcGljay1pY29uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjJcIiB4Mj1cIjE2XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiOFwiIHkxPVwiMlwiIHgyPVwiOFwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjNcIiB5MT1cIjEwXCIgeDI9XCIyMVwiIHkyPVwiMTBcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF2Mi1kYXRlcGljay1pbnB1dCBkYi1kYXRlcmFuZ2UgZGItZGF0ZXJhbmdlLS1maWVsZFwiIG5neERhdGVyYW5nZXBpY2tlck1kIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cImRyLnJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJ0b2RheVwiIFtkYXRlTGltaXRdPVwibWF4UmFuZ2VEYXlzXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwidHJ1ZVwiIFtzaG93Q2FuY2VsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgKGRhdGVzVXBkYXRlZCk9XCJkci5vblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTY29wZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnc2NvcGUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zdGFja1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Q2lyY2xlIEhlYWQgPHNwYW4gY2xhc3M9XCJmaWVsZC1tZXRhXCI+e3sgZHIuY2lyY2xlcy5sZW5ndGggfX0gdXNlcnM8L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5jaXJjbGVcIiAobmdNb2RlbENoYW5nZSk9XCJkci5vbkNpcmNsZUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuY2lyY2xlcywgJ0FsbCBDaXJjbGVzJylcIiBhcmlhTGFiZWw9XCJDaXJjbGVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLmNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5ab25lIE1hbmFnZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLnpvbmVcIiAobmdNb2RlbENoYW5nZSk9XCJkci5vblpvbmVDaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLnpvbmVzLCAnQWxsIHpvbmVzJylcIiBhcmlhTGFiZWw9XCJab25lXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci56b25lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkFPTTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuYW9tXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25Bb21DaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLmFvbXMsICdBbGwgQU9NcycpXCIgYXJpYUxhYmVsPVwiQU9NXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci5hb21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLnN0b3JlXCIgW29wdGlvbnNdPVwiZHIuc3RvcmVQaWNrT3B0aW9uc1wiIGFyaWFMYWJlbD1cIlN0b3JlXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlYWRpbmdyb3dcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYWRpbmdsYWJlbFwiPlJlYWRpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkaW5ndmFsdWVcIj57eyBkci5zY29wZVJlYWRpbmcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItZ3Jvd1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgKGNsaWNrKT1cImRyLnJlc2V0U2NvcGUoKVwiPlJlc2V0IHRvIGFsbCBjaXJjbGVzPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEF1ZGl0IHR5cGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAndHlwZSdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHQgb2YgYXVkaXRUeXBlc1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkci5hdWRpdFR5cGUgPSB0LmtleVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHR0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCI+e3sgdC5oZWxwIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTY29yZSBiYW5kIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ2JhbmQnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIGRyLmJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuaXNCYW5kT24oYi5iYW5kKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkci5hcHBseUJhbmQoYi5iYW5kKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHR0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IGIuYmFuZC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdG1ldGFcIj57eyBiLmJhbmQucmFuZ2UgfX0gwrcge3sgYi5jb3VudCB9fSBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIHBhbmUtcmVzZXRidG5cIiAoY2xpY2spPVwiZHIuY2xlYXJCYW5kKClcIj5BbGwgc2NvcmVzPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU3RhdHVzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3N0YXR1cydcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdhbGwnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnYWxsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdhbGwnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5BbGwgc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdmYWlsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPkZhaWw8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ3Bhc3MnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+UGFzczwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ25hJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnbmEnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+Tm90IGF1ZGl0ZWQ8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgKGNsaWNrKT1cImRyLmNsZWFyQWxsKClcIj5DbGVhciBhbGw8L2J1dHRvbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0td2lkZVwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPkFwcGx5IGZpbHRlcnM8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
1525
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQTRCLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFvSS9ILE1BQU0sZ0JBQWdCLEdBQWM7SUFDbEMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsYUFBYSxFQUFFLEdBQUc7SUFDbEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsU0FBUyxFQUFFLEdBQUc7SUFDZCxVQUFVLEVBQUUsR0FBRztJQUNmLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsVUFBVSxFQUFFLEdBQUc7SUFDZixlQUFlLEVBQUUs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QUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN2RyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDO0tBQzdDLENBQUM7SUFDZSxjQUFjLEdBQW1EO1FBQ2hGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDL0csVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFF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LENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNySSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ3BGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFL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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRWhGLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQUU7WUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFB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QUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLDRCQUE0QixDQUFDLENBQUM7WUFDakcsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBLzdDVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qiw4REMvT3RDLG16cERBZzJCQTs7NEZEam5CYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgb2YsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXVkaXRBY2Nlc3MsIGF1ZGl0QWNjZXNzIH0gZnJvbSAnLi4vYXVkaXQtdjItYWNjZXNzJztcclxuaW1wb3J0IHsgUElDS0VSX0xPQ0FMRSwgUGlja2VkRGF0ZXMsIFBpY2tlclJhbmdlLCBmcm9tUGlja2VyUmFuZ2UsIHBpY2tlclJhbmdlcywgdG9QaWNrZXJSYW5nZSB9IGZyb20gJy4uL2F1ZGl0LXYyLWRhdGVwaWNrZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpdEJhbmQge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgcmFuZ2U6IHN0cmluZztcclxuICBsbzogbnVtYmVyO1xyXG4gIGhpOiBudW1iZXI7XHJcbiAgc29mdDogc3RyaW5nO1xyXG4gIGJnOiBzdHJpbmc7XHJcbiAgZmc6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpdFJvdyB7XHJcbiAgZGF0ZTogc3RyaW5nO1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBjaXJjbGU6IHN0cmluZztcclxuICB6b25lOiBzdHJpbmc7XHJcbiAgYW9tOiBzdHJpbmc7XHJcbiAgLyoqIEF1ZGl0cyB0aGUgc3RvcmUgc3VibWl0dGVkIGluIHRoZSBwZXJpb2QgKHRoZXkgYWRkIHVwIHRvIHRoZSBcIkF1ZGl0cyBjb21wbGV0ZWRcIiBjYXJkKS4gKi9cclxuICBhdWRpdHM6IG51bWJlcjtcclxuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcclxuICAvKiogJ3Vuc2NvcmVkJyA9IGF1ZGl0ZWQsIGJ1dCBubyBxdWVzdGlvbiBvZiBpdHMgYXVkaXRzIGhhcyBjb21wbGlhbmNlIHNjb3Jpbmcgb24gKG5vIHNjb3JlIHRvIHNob3cpLiAqL1xyXG4gIHN0YXR1czogU3RvcmVTdGF0dXM7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTdG9yZVN0YXR1cyA9ICdwYXNzJyB8ICdmYWlsJyB8ICduYScgfCAndW5zY29yZWQnO1xyXG5leHBvcnQgdHlwZSBTdGF0dXNGaWx0ZXIgPSAnYWxsJyB8IFN0b3JlU3RhdHVzO1xyXG5cclxuLyoqIEEgc29ydGFibGUgY29sdW1uIG9mIGEgUGVyZm9ybWFuY2UgdGFibGUuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGVyZkNvbHVtbiB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBTb3J0VmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpdEtwaSB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIG5vdGU6IHN0cmluZztcclxuICBub3RlQ29sb3I6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJDYXQge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHN1Yjogc3RyaW5nO1xyXG4gIGRpcnR5OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0UGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGluaXRpYWxzOiBzdHJpbmc7XHJcbiAgc2NoZWR1bGVkOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBkaXNwdXRlczogbnVtYmVyIHwgbnVsbDtcclxuICBwYXNzTWFyazogc3RyaW5nO1xyXG4gIHNjb3JlOiBzdHJpbmc7XHJcbiAgc2NvcmVQY3Q6IG51bWJlcjtcclxuICAvKiogJ+KAlCcgd2hlbiB0aGUgYXVkaXQgaGFzIG5vIGNvbXBsaWFuY2Ugc2NvcmluZyAobm8gc2NvcmUsIHNvIG5vIHJlc3VsdCkuICovXHJcbiAgcmVzdWx0OiAnUGFzcycgfCAnRmFpbCcgfCAn4oCUJztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVQZXJmUm93IHtcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgc3RvcmU6IHN0cmluZztcclxuICBzcG9jOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyIHwgbnVsbDtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBlbWFpbDogc3RyaW5nO1xyXG4gIGFzc2lnbmVkOiBudW1iZXI7XHJcbiAgZmxhZ3M6IG51bWJlcjtcclxuICByZWRvOiBudW1iZXI7XHJcbiAgY29tcGxldGlvbjogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBwZXJmOiBzdHJpbmc7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBjb3ZlcmFnZTogc3RyaW5nO1xyXG4gIGFzc2lnbmVkOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgZmxhZ3M6IG51bWJlcjtcclxuICB0YXNrczogc3RyaW5nO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZVBjdDogbnVtYmVyO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuLyoqIFRhc2stbW9kZSB0aWxlcywgYXMgZGlzcGxheWVkICgn4oCUJyB3aGVuIHRoZSBBUEkgaGFzIG5vIHZhbHVlKS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUYXNrU3RhdHMge1xyXG4gIGFjdGl2ZVRhc2tzOiBzdHJpbmc7XHJcbiAgdGFza0luc3RhbmNlczogc3RyaW5nO1xyXG4gIG5vdFN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIG9wZW5UYXNrczogc3RyaW5nO1xyXG4gIGluUHJvZ3Jlc3M6IHN0cmluZztcclxuICBzdWJtaXR0ZWQ6IHN0cmluZztcclxuICBjb21wbGV0aW9uU2NvcmU6IHN0cmluZztcclxuICBjb21wbGlhbmNlU2NvcmU6IHN0cmluZztcclxuICB0b3RhbEZsYWdzOiBzdHJpbmc7XHJcbiAgY29tcGxldGlvbkRlbHRhOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZURlbHRhOiBzdHJpbmc7XHJcbiAgZmxhZ3NEZWx0YTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBUYXNrRGVsdGFLZXkgPSAnY29tcGxldGlvbicgfCAnY29tcGxpYW5jZScgfCAnZmxhZ3MnO1xyXG5cclxuLyoqIE9uZSBleHBvcnRlZCBjb2x1bW46IGhlYWRlciB0ZXh0IGFuZCB0aGUgY2VsbCB2YWx1ZSBmb3IgYSByb3cuICovXHJcbmludGVyZmFjZSBFeHBvcnRDb2x1bW48VD4ge1xyXG4gIGhlYWRlcjogc3RyaW5nO1xyXG4gIHZhbHVlOiAocm93OiBUKSA9PiBhbnk7XHJcbn1cclxuXHJcbmNvbnN0IEVNUFRZX1RBU0tfU1RBVFM6IFRhc2tTdGF0cyA9IHtcclxuICBhY3RpdmVUYXNrczogJ+KAlCcsXHJcbiAgdGFza0luc3RhbmNlczogJ+KAlCcsXHJcbiAgbm90U3VibWl0dGVkOiAn4oCUJyxcclxuICBvcGVuVGFza3M6ICfigJQnLFxyXG4gIGluUHJvZ3Jlc3M6ICfigJQnLFxyXG4gIHN1Ym1pdHRlZDogJ+KAlCcsXHJcbiAgY29tcGxldGlvblNjb3JlOiAn4oCUJyxcclxuICBjb21wbGlhbmNlU2NvcmU6ICfigJQnLFxyXG4gIHRvdGFsRmxhZ3M6ICfigJQnLFxyXG4gIGNvbXBsZXRpb25EZWx0YTogJycsXHJcbiAgY29tcGxpYW5jZURlbHRhOiAnJyxcclxuICBmbGFnc0RlbHRhOiAnJ1xyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcmVuZEJhciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogQXZlcmFnZSBvZiB0aGUgY29tcGxpYW5jZS1zY29yZWQgYXVkaXRzOyBudWxsIHdoZW4gbm9uZS4gKi9cclxuICB2YWx1ZTogbnVtYmVyIHwgbnVsbDtcclxuICAvKiogQ29tcGxpYW5jZS1zY29yZWQgYXVkaXRzICh0aGUgb25lcyB0aGUgYXZlcmFnZSByZWFkcykuICovXHJcbiAgY291bnQ6IG51bWJlcjtcclxuICAvKiogRXZlcnkgc3VibWl0dGVkIGF1ZGl0LCBzY29yZWQgb3Igbm90LiAqL1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogT25lIGZpbmFuY2lhbCBxdWFydGVyOiBBcHJpbC1NYXJjaCB5ZWFyLCBuYW1lZCBieSB0aGUgeWVhciBpdCBzdGFydHMgaW4gKHByb3RvdHlwZTogQXVnIDIwMjYgPSBRMiBGWTI2KS4gKi9cclxuaW50ZXJmYWNlIEZpc2NhbFF1YXJ0ZXIge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGZyb206IHN0cmluZztcclxuICB0bzogc3RyaW5nO1xyXG4gIG1vbnRoczogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogVGhlIGxhc3QgYG5gIGZpbmFuY2lhbCBxdWFydGVycywgb2xkZXN0IGZpcnN0LCBlbmRpbmcgd2l0aCB0aGUgb25lIGB0b2RheWAgZmFsbHMgaW4uICovXHJcbmZ1bmN0aW9uIGZpc2NhbFF1YXJ0ZXJzKHRvZGF5ID0gZGF5anMoKSwgbiA9IDQpOiBGaXNjYWxRdWFydGVyW10ge1xyXG4gIGNvbnN0IGN1cnJlbnQgPSB0b2RheS5zdGFydE9mKCdtb250aCcpLnN1YnRyYWN0KCh0b2RheS5tb250aCgpICsgOSkgJSAzLCAnbW9udGgnKTtcclxuICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4ge1xyXG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50LnN1YnRyYWN0KDMgKiAobiAtIDEgLSBpKSwgJ21vbnRoJyk7XHJcbiAgICBjb25zdCBlbmQgPSBzdGFydC5hZGQoMiwgJ21vbnRoJykuZW5kT2YoJ21vbnRoJyk7XHJcbiAgICBjb25zdCBmeSA9IHN0YXJ0Lm1vbnRoKCkgPj0gMyA/IHN0YXJ0LnllYXIoKSA6IHN0YXJ0LnllYXIoKSAtIDE7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBrZXk6ICdRJyArIChNYXRoLmZsb29yKCgoc3RhcnQubW9udGgoKSArIDkpICUgMTIpIC8gMykgKyAxKSArICcgRlknICsgU3RyaW5nKGZ5KS5zbGljZSgyKSxcclxuICAgICAgZnJvbTogc3RhcnQuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHRvOiBlbmQuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIG1vbnRoczogc3RhcnQuZm9ybWF0KCdNTU0nKSArICcg4oCTICcgKyBlbmQuZm9ybWF0KCdNTU0gWVlZWScpXHJcbiAgICB9O1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKiogUGFzcyBtYXJrIGFuZCBjcml0aWNhbCB0aHJlc2hvbGQgZm9yIHRoZSBhdWRpdCBwcm9ncmFtbWUgKG5vIHBlci1hdWRpdCBwYXNzIG1hcmsgaW4gdGhlIGRhdGEgeWV0KS4gKi9cclxuY29uc3QgUEFTU19NQVJLID0gNzU7XHJcbmNvbnN0IENSSVRJQ0FMX01BUksgPSA2MDtcclxuXHJcbmNvbnN0IEJBTkRTOiBBdWRpdEJhbmRbXSA9IFtcclxuICB7IGtleTogJ2V4Y2VsbGVudCcsIGxhYmVsOiAnRXhjZWxsZW50JywgcmFuZ2U6ICc5MC0xMDAlJywgbG86IDkwLCBoaTogMTAwLCBzb2Z0OiAnIzhGQkZBNScsIGJnOiAnI0VDRkRGMycsIGZnOiAnIzAyN0E0OCcgfSxcclxuICB7IGtleTogJ2dvb2QnLCBsYWJlbDogJ0dvb2QnLCByYW5nZTogJzc1LTg5JScsIGxvOiA3NSwgaGk6IDg5LCBzb2Z0OiAnIzk2QjRENicsIGJnOiAnI0VGRjhGRicsIGZnOiAnIzE3NUNEMycgfSxcclxuICB7IGtleTogJ2ZhaXInLCBsYWJlbDogJ05lZWRzIGltcHJvdmVtZW50JywgcmFuZ2U6ICc2MC03NCUnLCBsbzogNjAsIGhpOiA3NCwgc29mdDogJyNEQ0JFOEMnLCBiZzogJyNGRkZBRUInLCBmZzogJyNCNTQ3MDgnIH0sXHJcbiAgeyBrZXk6ICdjcml0aWNhbCcsIGxhYmVsOiAnQ3JpdGljYWwnLCByYW5nZTogJ0JlbG93IDYwJScsIGxvOiAwLCBoaTogNTksIHNvZnQ6ICcjRDZBMTlCJywgYmc6ICcjRkVGM0YyJywgZmc6ICcjQjQyMzE4JyB9LFxyXG4gIHsga2V5OiAndW5zY29yZWQnLCBsYWJlbDogJ05vdCBzY29yZWQnLCByYW5nZTogJ0NvbXBsaWFuY2Ugc2NvcmUgb2ZmJywgbG86IDAsIGhpOiAxMDAsIHNvZnQ6ICcjQzdEN0ZFJywgYmc6ICcjRUVGNEZGJywgZmc6ICcjMzUzOENEJyB9LFxyXG4gIHsga2V5OiAnbmEnLCBsYWJlbDogJ05vdCBhdWRpdGVkJywgcmFuZ2U6ICdObyBzdWJtaXNzaW9uJywgbG86IDAsIGhpOiAxMDAsIHNvZnQ6ICcjRDZEQUUwJywgYmc6ICcjRjJGNEY3JywgZmc6ICcjNDc1NDY3JyB9XHJcbl07XHJcblxyXG4vKiogQmFuZHMgdGhhdCBob2xkIHN0b3JlcyB3aXRob3V0IGEgc2NvcmU7IHRoZXkgZmlsdGVyIGJ5IHN0YXR1cywgbm90IGJ5IHNjb3JlIHJhbmdlLiAqL1xyXG5jb25zdCBTVEFUVVNfQkFORFMgPSBbJ3Vuc2NvcmVkJywgJ25hJ107XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0VHlwZU9wdGlvbiB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoZWxwOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IEFMTF9BVURJVFM6IEF1ZGl0VHlwZU9wdGlvbiA9IHsga2V5OiAnYWxsJywgbGFiZWw6ICdBbGwgQXVkaXRzJywgaGVscDogJ0JsZW5kZWQgc2NvcmUgYWNyb3NzIGV2ZXJ5IHByb2dyYW1tZS4nIH07XHJcblxyXG4vKiogU3RvcmUgaGllcmFyY2h5IHBpY2tzOiBjaXJjbGUgaGVhZCAvIHpvbmUgbWFuYWdlciAvIEFPTSBuYW1lcyBhcyB0aGUgZGFzaGJvYXJkIEFQSSBzZW5kcyB0aGVtLCBzdG9yZSA9IHN0b3JlSWQuICovXHJcbmludGVyZmFjZSBTY29wZVBpY2sge1xyXG4gIGNpcmNsZTogc3RyaW5nO1xyXG4gIHpvbmU6IHN0cmluZztcclxuICBhb206IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRGFzaGJvYXJkLiBTdG9yZSBsaXN0LCBzY29yZSBiYW5kcywgS1BJcyBhbmQgdGhlIGJ5LWRhdGUgdHJlbmQgY29tZSBmcm9tIHRoZSBhdWRpdCBBUElcclxuICogKC90cmF4L2F1ZGl0L2Rhc2hib2FyZCk7IHRoZSBBdWRpdCAvIFVzZXIgUGVyZm9ybWFuY2UgdGFicyBzdGlsbCB1c2UgdGhlIHYxIGRhc2hib2FyZFxyXG4gKiBlbmRwb2ludHMgKGNoZWNrbGlzdFBlcmZvcm1hbmNlIC8gdXNlclBlcmZvcm1hbmNlKS4gVGFzayBtb2RlICh0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2UpIHJlYWRzXHJcbiAqIC90cmF4L2F1ZGl0L2Rhc2hib2FyZC90YXNrczogb25seSB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMuXHJcbiAqIFNjb3BlIChjbGllbnQsIHN0b3JlcywgZGF0ZXMpIGNvbWVzIGZyb20gdGhlIGdsb2JhbCBoZWFkZXIgZmlsdGVyOyB0aGUgcGVyaW9kIHBpY2tlciBjYW4gbmFycm93IHRoZSBkYXRlcy5cclxuICogRmlsdGVycyBkcmF3ZXI6IFN0b3JlIGhpZXJhcmNoeSBuYXJyb3dzIHRoZSBzdG9yZXMgYW5kIEF1ZGl0IHR5cGUgKGNoZWNrbGlzdElkKSB0aGUgYXVkaXQgb2YgZXZlcnkgZmVlZCAocmVsb2FkZWRcclxuICogb24gQXBwbHkpOyBTY29yZSByYW5nZSBhbmQgU3RhdHVzIG9ubHkgZmlsdGVyIHRoZSBsb2FkZWQgc3RvcmUgbGlzdCBpbiB0aGUgYnJvd3Nlci5cclxuICpcclxuICogUXVhcnRlcmx5OiB0aGUgdHJlbmQgc2hvd3MgdGhlIGxhc3QgZm91ciBmaW5hbmNpYWwgcXVhcnRlcnMgKGJ1aWx0IGZyb20gb25lIG1vbnRobHktYnVja2V0IGNhbGwgb2ZcclxuICogdGhlIHNhbWUgQVBJKSBhbmQgdGhlIHBpY2tlZCBxdWFydGVyIGJlY29tZXMgdGhlIHBlcmlvZCBvZiBldmVyeSBmZWVkLiBCeSBkYXRlOiB0aGUgcmFuZ2UgcGlja2VyLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXVkaXQtdjItZGFzaGJvYXJkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogUGFzcyAvIGNyaXRpY2FsIG1hcmtzIGNvbWUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTsgdGhlc2UgYXJlIHRoZSBlbXB0eS1zdGF0ZSBkZWZhdWx0cy4gKi9cclxuICBwYXNzTWFyayA9IFBBU1NfTUFSSztcclxuICBjcml0aWNhbE1hcmsgPSBDUklUSUNBTF9NQVJLO1xyXG4gIHJlYWRvbmx5IGJhbmRzID0gQkFORFM7XHJcbiAgLyoqIFwiQWxsIEF1ZGl0c1wiLCB0aGVuIHRoZSBjbGllbnQncyBhdWRpdHMgKFBPU1QgL3RyYXgvYXVkaXQvbGlzdCk7IGtleSA9IGF1ZGl0IGlkLCBzZW50IGFzIGNoZWNrbGlzdElkLiAqL1xyXG4gIGF1ZGl0VHlwZXM6IEF1ZGl0VHlwZU9wdGlvbltdID0gW0FMTF9BVURJVFNdO1xyXG4gIC8qKiBDbGllbnQgdGhlIGF1ZGl0IGxpc3Qgd2FzIGZldGNoZWQgZm9yLiAqL1xyXG4gIHByaXZhdGUgYXVkaXRUeXBlc0NsaWVudCA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJpb2Qgc2VsZWN0aW9uLiBmcm9tIC8gdG8gKFlZWVktTU0tREQpIHN0YXJ0IGFzIHRoZSBoZWFkZXIgZGF0ZSByYW5nZSBhbmQgZHJpdmUgZXZlcnkgZmVlZDtcclxuICAgKiB0aGUgcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlbSwgYW5kIGEgaGVhZGVyIGNoYW5nZSByZXNldHMgdGhlbS5cclxuICAgKi9cclxuICBncmFpbjogJ3F1YXJ0ZXInIHwgJ2RhdGUnID0gJ2RhdGUnO1xyXG4gIHF1YXJ0ZXIgPSAnJztcclxuICByZWFkb25seSBmaXNjYWwgPSBmaXNjYWxRdWFydGVycygpO1xyXG4gIHJlYWRvbmx5IHF1YXJ0ZXJzID0gdGhpcy5maXNjYWwubWFwKHEgPT4gcS5rZXkpO1xyXG4gIC8qKiBRdWFydGVybHkgdHJlbmQgYmFycywgYW5kIHRoZSBjbGllbnQgKyBzdG9yZXMgdGhleSB3ZXJlIGZldGNoZWQgZm9yLiAqL1xyXG4gIHF1YXJ0ZXJUcmVuZDogVHJlbmRCYXJbXSA9IFtdO1xyXG4gIHF1YXJ0ZXJUcmVuZExvYWRpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHF1YXJ0ZXJUcmVuZFNjb3BlID0gJyc7XHJcbiAgZnJvbSA9ICcnO1xyXG4gIHRvID0gJyc7XHJcbiAgcmFuZ2U6IFBpY2tlclJhbmdlIHwgbnVsbCA9IG51bGw7XHJcbiAgcmVhZG9ubHkgcGlja2VyTG9jYWxlID0gUElDS0VSX0xPQ0FMRTtcclxuICByZWFkb25seSByYW5nZXMgPSBwaWNrZXJSYW5nZXMoKTtcclxuICByZWFkb25seSB0b2RheSA9IGRheWpzKCk7XHJcblxyXG4gIC8qKiBGaWx0ZXJzLiAqL1xyXG4gIGF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gIHN0YXR1czogU3RhdHVzRmlsdGVyID0gJ2FsbCc7XHJcbiAgc2VhcmNoID0gJyc7XHJcbiAgc2NvcmVNaW4gPSAwO1xyXG4gIHNjb3JlTWF4ID0gMTAwO1xyXG5cclxuICAvKiogQXVkaXQgLyBUYXNrIHN3aXRjaC4gKi9cclxuICBtb2R1bGVUYWI6ICdBdWRpdCcgfCAnVGFzaycgPSAnQXVkaXQnO1xyXG4gIHJlYWRvbmx5IG1vZHVsZVRhYnM6IEFycmF5PCdBdWRpdCcgfCAnVGFzayc+ID0gWydBdWRpdCcsICdUYXNrJ107XHJcblxyXG4gIC8qKiBTaG93biBpbiB0aGUgcGFnZSBoZWFkZXI7IHN0YW1wZWQgb24gZXZlcnkgbG9hZC4gKi9cclxuICBsYXN0UmVmcmVzaGVkID0gJ+KAlCc7XHJcblxyXG4gIC8qKiBGaWx0ZXIgZHJhd2VyLiAqL1xyXG4gIGZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgYWN0aXZlQ2F0ID0gJ3BlcmlvZCc7XHJcbiAgLyoqXHJcbiAgICogVGhlIGZpbHRlciBkcmF3ZXIncyBkcmFmdCAoUUEgOSBPY3QpOiBPYmplY3QuY3JlYXRlKHRoaXMpLCBzbyBldmVyeSBnZXR0ZXIgdGhlIGRyYXdlciBzaG93cyB3b3JrcyBvbiB0aGUgZHJhZnQnc1xyXG4gICAqIG93biB2YWx1ZXMgd2hpbGUgdGhlIHBhZ2UgYmVoaW5kIGtlZXBzIHRoZSBhcHBsaWVkIG9uZXMuIEFwcGx5IGNvcGllcyBEUkFGVF9LRVlTIG9udG8gdGhlIHBhZ2U7IENhbmNlbCBkcm9wcyBpdC5cclxuICAgKi9cclxuICBkcmFmdDogQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERSQUZUX0tFWVMgPSBbJ2dyYWluJywgJ3F1YXJ0ZXInLCAnZnJvbScsICd0bycsICdyYW5nZScsICdhdWRpdFR5cGUnLCAnY2lyY2xlJywgJ3pvbmUnLCAnYW9tJywgJ3N0b3JlJyxcclxuICAgICdzY29yZU1pbicsICdzY29yZU1heCcsICdzdGF0dXMnLCAnc3RvcmVMaXN0T3BlbicsICdsaXN0QmFuZEtleSddIGFzIGNvbnN0O1xyXG5cclxuICAvKipcclxuICAgKiBTdG9yZSBoaWVyYXJjaHkgcGlja3MgYmVpbmcgZWRpdGVkIGluIHRoZSBkcmF3ZXIgKHN0b3JlID0gc3RvcmVJZCkuIFRoZSBsaXN0cyBjb21lIGZyb20gdGhlIGRhc2hib2FyZFxyXG4gICAqIEFQSSdzIHN0b3JlIHJvd3Mgb2YgdGhlIGhlYWRlciBzY29wZTsgQXBwbHkgbmFycm93cyBldmVyeSBmZWVkIHRvIHRoZSBzdG9yZXMgdGhlIHBpY2sgY292ZXJzLlxyXG4gICAqL1xyXG4gIGNpcmNsZSA9ICcnO1xyXG4gIHpvbmUgPSAnJztcclxuICBhb20gPSAnJztcclxuICBzdG9yZSA9ICcnO1xyXG5cclxuICAvKiogU3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlLCBub3QgbmFycm93ZWQgYnkgdGhlIGhpZXJhcmNoeTogdGhlIGRyYXdlcidzIGxpc3RzIGFuZCBlYWNoIHBpY2sncyBzdG9yZXMuICovXHJcbiAgcHJpdmF0ZSBzY29wZVJvd3M6IEF1ZGl0Um93W10gPSBbXTtcclxuICAvKiogSGllcmFyY2h5ICsgYXVkaXQgdHlwZSB0aGUgZmVlZHMgd2VyZSBsYXN0IGxvYWRlZCB3aXRoOyB0aGUgZHJhd2VyIGVkaXRzIGEgZHJhZnQgdW50aWwgQXBwbHkuICovXHJcbiAgcHJpdmF0ZSBhcHBsaWVkOiBTY29wZVBpY2sgJiB7IGF1ZGl0VHlwZTogc3RyaW5nIH0gPSB7IGNpcmNsZTogJycsIHpvbmU6ICcnLCBhb206ICcnLCBzdG9yZTogJycsIGF1ZGl0VHlwZTogJ2FsbCcgfTtcclxuICAvKiogQ2xpZW50ICsgaGVhZGVyIHN0b3JlczsgYSBjaGFuZ2UgcmVzZXRzIHRoZSBoaWVyYXJjaHkgcGlja3MgKHRoZWlyIHN0b3JlcyBtYXkgYmUgZ29uZSkuICovXHJcbiAgcHJpdmF0ZSBoZWFkZXJTY29wZUtleSA9ICcnO1xyXG5cclxuICAvKiogVGFibGUgc3RhdGUuICovXHJcbiAgc29ydEtleSA9ICdzY29yZSc7XHJcbiAgc29ydERpcjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcclxuICBwYWdlID0gMTtcclxuICAvKiogU3RvcmUgbGlzdCBwYWdlcjogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMCwgYXMgb24gZXZlcnkgYXVkaXQgbGlzdC4gKi9cclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIHJlYWRvbmx5IHBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuXHJcbiAgaGVhZGVyczogQXJyYXk8eyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtcclxuICAgIHsga2V5OiAnZGF0ZScsIGxhYmVsOiAnQXVkaXQgZGF0ZScgfSxcclxuICAgIC8vIFRoZSBjb2x1bW4gc2hvd3MgdGhlIHN0b3JlJ3MgbmFtZSAocm93LnN0b3JlSWQgaG9sZHMgaXQ7IHNlZSB0b0F1ZGl0Um93KS5cclxuICAgIHsga2V5OiAnc3RvcmVJZCcsIGxhYmVsOiAnU3RvcmUgTmFtZScgfSxcclxuICAgIHsga2V5OiAnY2lyY2xlJywgbGFiZWw6ICdDaXJjbGUgSGVhZCcgfSxcclxuICAgIHsga2V5OiAnem9uZScsIGxhYmVsOiAnWm9uZSBNYW5hZ2VyJyB9LFxyXG4gICAgeyBrZXk6ICdhb20nLCBsYWJlbDogJ0FPTScgfSxcclxuICAgIC8vIEEgc3RvcmUgY2FuIHN1Ym1pdCBzZXZlcmFsIGF1ZGl0cyBpbiB0aGUgcGVyaW9kOiB0aGUgY29sdW1uIGFkZHMgdXAgdG8gXCJBdWRpdHMgY29tcGxldGVkXCIgKFFBIDEzIE9jdCkuXHJcbiAgICB7IGtleTogJ2F1ZGl0cycsIGxhYmVsOiAnQXVkaXRzJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sXHJcbiAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyBhbmQgdGhlIFRhc2sgUGVyZm9ybWFuY2UgdGFibGUgZm9yIHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0c1xyXG4gICAqICgvdHJheC9hdWRpdC9kYXNoYm9hcmQvdGFza3MpLiBMb2FkZWQgd2hlbiB0aGUgVGFzayB0YWIgaXMgb3BlbiwgYW5kIGFnYWluIGFmdGVyIGEgaGVhZGVyIGNoYW5nZS5cclxuICAgKi9cclxuICB0YXNrU3RhdHM6IFRhc2tTdGF0cyA9IHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9O1xyXG4gIHRhc2tQZXJmOiBUYXNrUGVyZlJvd1tdID0gW107XHJcbiAgdGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAvKiogQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2QgKG51bGwgPSBub3RoaW5nIHRvIGNvbXBhcmUpOyBkcml2ZXMgdGhlIGRlbHRhIGFycm93IGFuZCBjb2xvdXIuICovXHJcbiAgcHJpdmF0ZSB0YXNrRGVsdGFWYWx1ZXM6IFJlY29yZDxUYXNrRGVsdGFLZXksIG51bWJlciB8IG51bGw+ID0geyBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsLCBmbGFnczogbnVsbCB9O1xyXG4gIC8qKiBUcnVlIHVudGlsIHRoZSB0YXNrIGZpZ3VyZXMgYXJlIGxvYWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuICovXHJcbiAgcHJpdmF0ZSB0YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAvKiogSWdub3JlcyBhIHRhc2sgcmVzcG9uc2UgdGhhdCBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gKi9cclxuICBwcml2YXRlIHRhc2tSZXF1ZXN0ID0gMDtcclxuICAvKiogUERGIGRvd25sb2FkcyBpbiBmbGlnaHQsIGJ5IHZpc2l0IGlkLCBzbyBhIGRvdWJsZSBjbGljayBxdWV1ZXMgb25lIHJlcG9ydC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZlF1ZXVlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogUGVyZm9ybWFuY2Ugc2VjdGlvbiAoaGlkZGVuIGZvciBub3c7IHNldCB0cnVlIHRvIHNob3cgaXQgYWdhaW4pLiAqL1xyXG4gIHNob3dQZXJmb3JtYW5jZSA9IGZhbHNlO1xyXG4gIC8qKiBBdWRpdCBzY29yZSB0cmVuZDogdGhlIGNhcmQncyBvd24gZGF0ZSBwaWNrZXIgKGhpZGRlbiBmb3Igbm93OyB0aGUgaGVhZGVyIGRhdGUgYW5kIEZpbHRlcnMgc3RpbGwgc2V0IHRoZSBwZXJpb2QpLiAqL1xyXG4gIHNob3dUcmVuZERhdGVQaWNrZXIgPSBmYWxzZTtcclxuICAvKiogQXVkaXQgc2NvcmUgdHJlbmQ6IFwiQmVsb3cgcGFzcyBtYXJrXCIgcGlsbCAoY2FyZCArIGJhciBob3ZlciB0aXApLCBcIlBhc3MgbWFyayBOJVwiIGxlZ2VuZCBhbmQgXCLCtyBwYXNzIG1hcmsgTiVcIiB0ZXh0IChoaWRkZW4gZm9yIG5vdykuICovXHJcbiAgc2hvd1Bhc3NNYXJrSW5mbyA9IGZhbHNlO1xyXG4gIC8qKiBGaWx0ZXJzIGRyYXdlciA+IFBlcmlvZDogdGhlIFwiRGF0ZSByYW5nZVwiIHBpY2tlciB1bmRlciBCeSBkYXRlIChoaWRkZW4gZm9yIG5vdzsgQnkgZGF0ZSByZWFkcyB0aGUgaGVhZGVyIGRhdGUgcmFuZ2UpLiAqL1xyXG4gIHNob3dEcmF3ZXJEYXRlUmFuZ2UgPSBmYWxzZTtcclxuICBwZXJmVGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgcGVyZlRhYnM6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiA9IFsnQXVkaXQnLCAnU3RvcmUnLCAnVXNlciddO1xyXG4gIHBlcmZQZXJpb2QgPSAnJztcclxuICBwZXJmU2VhcmNoID0gJyc7XHJcbiAgLyoqIFBlcmZvcm1hbmNlIHRhYmxlcycgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgYXMgdGhlIG90aGVyIGF1ZGl0IGxpc3RzKTogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMC4gKi9cclxuICBwZXJmUGFnZSA9IDE7XHJcbiAgcGVyZlBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGVyZlBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuICAvKiogQ29sdW1uIHNvcnQgb2YgdGhlIGFjdGl2ZSBQZXJmb3JtYW5jZSB0YWJsZSAoJycgPSB0aGUgQVBJJ3Mgb3JkZXIpOyByZXNldCB3aGVuIHRoZSB0YWIgY2hhbmdlcy4gKi9cclxuICBwZXJmU29ydEtleSA9ICcnO1xyXG4gIHBlcmZTb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogU29ydGFibGUgY29sdW1ucyBvZiBlYWNoIFBlcmZvcm1hbmNlIHRhYmxlLCBpbiBkaXNwbGF5IG9yZGVyIChBY3Rpb24gaXMgbm90IHNvcnRhYmxlKS4gKi9cclxuICByZWFkb25seSBhdWRpdFBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICAvLyBObyBTY2hlZHVsZWQgY29sdW1uIChRQSA5IE9jdCkuXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ0F1ZGl0IE5hbWUnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LFxyXG4gICAgeyBrZXk6ICdkaXNwdXRlcycsIGxhYmVsOiAnRGlzcHV0ZXMnIH0sIHsga2V5OiAncGFzc01hcmsnLCBsYWJlbDogJ1Bhc3MgTWFyaycgfSxcclxuICAgIHsga2V5OiAnc2NvcmUnLCBsYWJlbDogJ1Njb3JlJyB9LCB7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JyB9XHJcbiAgXTtcclxuICByZWFkb25seSB0YXNrUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnVGFzayBOYW1lJyB9LCB7IGtleTogJ3NjaGVkdWxlZCcsIGxhYmVsOiAnU2NoZWR1bGVkJyB9LCB7IGtleTogJ2NvdmVyYWdlJywgbGFiZWw6ICdDb3ZlcmFnZScgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LCB7IGtleTogJ2ZsYWdzJywgbGFiZWw6ICdGbGFncycgfSxcclxuICAgIHsga2V5OiAndGFza3MnLCBsYWJlbDogJ1Rhc2tzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxpYW5jZScsIGxhYmVsOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJyB9XHJcbiAgXTtcclxuICByZWFkb25seSBzdG9yZVBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LCB7IGtleTogJ3N0b3JlSWQnLCBsYWJlbDogJ1N0b3JlIElEJyB9LCB7IGtleTogJ3Nwb2MnLCBsYWJlbDogJ1N0b3JlIFNwb2MnIH0sXHJcbiAgICB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ2NvbXBsZXRpb24nLCBsYWJlbDogJ0NvbXBsZXRpb24gJScgfSwgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sXHJcbiAgICB7IGtleTogJ3BlcmYnLCBsYWJlbDogJ1BlcmZvcm1hbmNlICUnIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHVzZXJQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdVc2VyIE5hbWUnIH0sIHsga2V5OiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJyB9LCB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LFxyXG4gICAgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcblxyXG4gIC8qKiBXaGF0IGVhY2ggc29ydGFibGUgY29sdW1uIHNvcnRzIG9uOiBudW1iZXJzIGZvciBjb3VudHMgYW5kIHBlcmNlbnRhZ2VzLCB0ZXh0IG90aGVyd2lzZTsgbnVsbCBzb3J0cyBsYXN0LiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaXRTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBBdWRpdFBlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLFxyXG4gICAgZGlzcHV0ZXM6IHIgPT4gci5kaXNwdXRlcywgcGFzc01hcms6IHIgPT4gdGhpcy5udW0oU3RyaW5nKHIucGFzc01hcmspLnJlcGxhY2UoJyUnLCAnJykpLFxyXG4gICAgc2NvcmU6IHIgPT4gKHIuc2NvcmUgPT09ICfigJQnID8gbnVsbCA6IHIuc2NvcmVQY3QpLCByZXN1bHQ6IHIgPT4gKHIucmVzdWx0ID09PSAn4oCUJyA/IG51bGwgOiByLnJlc3VsdClcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza1NvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFRhc2tQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgbmFtZTogciA9PiByLm5hbWUsIHNjaGVkdWxlZDogciA9PiByLnNjaGVkdWxlZCwgY292ZXJhZ2U6IHIgPT4gci5jb3ZlcmFnZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCxcclxuICAgIHN1Ym1pdHRlZDogciA9PiByLnN1Ym1pdHRlZCwgZmxhZ3M6IHIgPT4gci5mbGFncywgdGFza3M6IHIgPT4gdGhpcy5udW0oci5yYXc/LnRhc2tzKSwgcmVkbzogciA9PiByLnJlZG8sXHJcbiAgICBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZVNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFN0b3JlUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIHN0b3JlOiByID0+IHIuc3RvcmUsIHN0b3JlSWQ6IHIgPT4gci5zdG9yZUlkLCBzcG9jOiByID0+IHIuc3BvYywgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgZmxhZ3M6IHIgPT4gci5mbGFncyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBVc2VyUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBlbWFpbDogciA9PiByLmVtYWlsLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBmbGFnczogciA9PiByLmZsYWdzLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuXHJcbiAgYXVkaXRQZXJmOiBBdWRpdFBlcmZSb3dbXSA9IFtdO1xyXG4gIHN0b3JlUGVyZjogU3RvcmVQZXJmUm93W10gPSBbXTtcclxuICB1c2VyUGVyZjogVXNlclBlcmZSb3dbXSA9IFtdO1xyXG5cclxuICByb3dzOiBBdWRpdFJvd1tdID0gW107XHJcbiAgdHJlbmQ6IFRyZW5kQmFyW10gPSBbXTtcclxuXHJcbiAgLyoqIFN0YXJ0cyB0cnVlIHNvIHRoZSBmaXJzdCBwYWludCBzaGltbWVycyBpbnN0ZWFkIG9mIGZsYXNoaW5nIGVtcHR5IHRpbGVzIGFuZCB0YWJsZXMuICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckVtYWlsZXM6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcnNFbWFpbC1pbmZvJykgfHwgJ1tdJyk7XHJcbiAgLyoqIENyZWF0ZSBBdWRpdCBzaG93cyBvbmx5IHdpdGggdGhlIENoZWNrbGlzdCBhZGQgcGVybWlzc2lvbi4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHtcclxuICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudENoYW5nZWQgPSBkYXRhLmNsaWVudCAhPT0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgLy8gQSBxdWFydGVyIHN0YXlzIHBpY2tlZCBhY3Jvc3MgaGVhZGVyIGNoYW5nZXMgKG5ldyBzdG9yZXMgLyBjbGllbnQpOyBCeSBkYXRlIGZvbGxvd3MgdGhlIGhlYWRlci5cclxuICAgICAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlciwgdHJ1ZSk7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuZnJvbSA9IGRhdGEuZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMudG8gPSBkYXRhLmRhdGU/LmVuZERhdGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlYWRlciBjaGFuZ2UuIE5ldyBjbGllbnQ6IHRoZSBhdWRpdCB0eXBlIHN0YXJ0cyBvdmVyIGFuZCBpdHMgbGlzdCBpcyBmZXRjaGVkIGFnYWluLiBOZXcgY2xpZW50IG9yXHJcbiAgICogc3RvcmVzOiB0aGUgaGllcmFyY2h5IHBpY2tzIHN0YXJ0IG92ZXIgKHRoZSBuZXh0IGxvYWQgcmVmaWxscyB0aGUgbGlzdHMpLiBBIGRhdGUtb25seSBjaGFuZ2Uga2VlcHMgYm90aC5cclxuICAgKi9cclxuICBwcml2YXRlIG9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJEYXRhLmNsaWVudCArICd8JyArIHRoaXMuaGVhZGVyU3RvcmVJZHMoKS5qb2luKCcsJyk7XHJcbiAgICBpZiAoa2V5ICE9PSB0aGlzLmhlYWRlclNjb3BlS2V5KSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyU2NvcGVLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuY2lyY2xlID0gdGhpcy56b25lID0gdGhpcy5hb20gPSB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZCA9IHsgLi4udGhpcy5hcHBsaWVkLCBjaXJjbGU6ICcnLCB6b25lOiAnJywgYW9tOiAnJywgc3RvcmU6ICcnIH07XHJcbiAgICB9XHJcbiAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgICB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlcyA9IFtBTExfQVVESVRTXTtcclxuICAgICAgdGhpcy5sb2FkQXVkaXRUeXBlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjbGllbnQncyBhdWRpdHMgZm9yIHRoZSBBdWRpdCB0eXBlIGZpbHRlciwgbmV3ZXN0IGZpcnN0IGFzIHRoZSBNYW5hZ2UgbGlzdC4gKi9cclxuICBwcml2YXRlIGxvYWRBdWRpdFR5cGVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2xpZW50SWQgPSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgIGlmICghY2xpZW50SWQgfHwgY2xpZW50SWQgPT09IHRoaXMuYXVkaXRUeXBlc0NsaWVudCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYXVkaXRUeXBlc0NsaWVudCA9IGNsaWVudElkO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdExpc3Qoe1xyXG4gICAgICBjbGllbnRJZCwgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLCB0b0RhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgbGltaXQ6IDUwMCwgb2Zmc2V0OiAxLCBzZWFyY2g6ICcnXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcz8uY29kZSAhPT0gMjAwKSB7IHRoaXMuYXVkaXRUeXBlc0NsaWVudCA9ICcnOyByZXR1cm47IH1cclxuICAgICAgY29uc3QgbGlzdDogYW55W10gPSByZXMuZGF0YT8ucmVzdWx0IHx8IFtdO1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZXMgPSBbQUxMX0FVRElUU10uY29uY2F0KGxpc3QubWFwKGEgPT4gKHtcclxuICAgICAgICBrZXk6IFN0cmluZyhhLl9pZCksXHJcbiAgICAgICAgbGFiZWw6IGEuY2hlY2tMaXN0TmFtZSB8fCAnVW50aXRsZWQgYXVkaXQnLFxyXG4gICAgICAgIGhlbHA6IChhLnB1Ymxpc2ggPyAnUHVibGlzaGVkJyA6ICdEcmFmdCcpICsgJyDCtyBwYXNzIG1hcmsgJyArICh0aGlzLm51bShhLnBhc3NNYXJrKSA/PyBQQVNTX01BUkspICsgJyUnXHJcbiAgICAgIH0pKSk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQnkgZGF0ZTogb25lIG1vbnRoIGF0IG1vc3QgKHRoZSBwaWNrZXJzJyBkYXRlTGltaXQsIGluIGRheXMgYWZ0ZXIgdGhlIHN0YXJ0OyAzMCA9IHVwIHRvIDMxIGRheXMpLiAqL1xyXG4gIHJlYWRvbmx5IG1heFJhbmdlRGF5cyA9IDMwO1xyXG5cclxuICAvKiogUmFuZ2UgcGlja2VyOiBhIG5ldyBwZXJpb2QgcmVsb2FkcyBldmVyeSBmZWVkLCBleGNlcHQgaW5zaWRlIHRoZSBmaWx0ZXIgZHJhd2VyLCB3aGVyZSBBcHBseSBkb2VzLiAqL1xyXG4gIG9uUmFuZ2VQaWNrZWQoZTogUGlja2VkRGF0ZXMgfCBudWxsKTogdm9pZCB7XHJcbiAgICBjb25zdCBwaWNrZWQgPSBmcm9tUGlja2VyUmFuZ2UoZSk7XHJcbiAgICBpZiAoIXBpY2tlZCB8fCAocGlja2VkLmZyb20gPT09IHRoaXMuZnJvbSAmJiBwaWNrZWQudG8gPT09IHRoaXMudG8pKSB7IHJldHVybjsgfVxyXG4gICAgLy8gQSBsb25nZXIgcmFuZ2UgKHR5cGVkLCBvciBhIHByZXNldCkgaXMgY3V0IGJhY2sgdG8gYSBtb250aCBmcm9tIGl0cyBzdGFydC5cclxuICAgIGlmIChkYXlqcyhwaWNrZWQudG8pLmRpZmYoZGF5anMocGlja2VkLmZyb20pLCAnZGF5JykgPiB0aGlzLm1heFJhbmdlRGF5cykge1xyXG4gICAgICBwaWNrZWQudG8gPSBkYXlqcyhwaWNrZWQuZnJvbSkuYWRkKHRoaXMubWF4UmFuZ2VEYXlzLCAnZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHBpY2tlZC5mcm9tLCBwaWNrZWQudG8pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BpY2sgdXAgdG8gb25lIG1vbnRoIOKAlCB0aGUgcmFuZ2UgZW5kcyBvbiAnICsgZGF5anMocGlja2VkLnRvKS5mb3JtYXQoJ0REIE1NTSBZWVlZJykpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcm9tID0gcGlja2VkLmZyb207XHJcbiAgICB0aGlzLnRvID0gcGlja2VkLnRvO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsb2FkUGVyaW9kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGVyaW9kID0gJ0Jhc2VkIG9uICcgKyB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyAtICcgKyB0aGlzLmZtdCh0aGlzLnRvKTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICAgIC8vIFRhc2sgZmlndXJlcyBmb2xsb3cgdGhlIHNhbWUgc2NvcGU7IGZldGNoZWQgbm93IGluIFRhc2sgbW9kZSwgZWxzZSB3aGVuIHRoZSB0YWIgb3BlbnMuXHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaXNUYXNrTW9kdWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicpIHsgdGhpcy5sb2FkUXVhcnRlclRyZW5kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmb3VyIHF1YXJ0ZXIgYmFyczogb25lIGNhbGwgb3ZlciB0aGUgZm91ciBxdWFydGVycyAobW9yZSB0aGFuIDEyMCBkYXlzLCBzbyB0aGUgQVBJIGJ1Y2tldHMgdGhlXHJcbiAgICogdHJlbmQgYnkgbW9udGgpIHJvbGxlZCB1cCBwZXIgcXVhcnRlciwgd2VpZ2h0ZWQgYnkgZWFjaCBtb250aCdzIGF1ZGl0IGNvdW50LiBGZXRjaGVkIGFnYWluIG9ubHlcclxuICAgKiB3aGVuIHRoZSBjbGllbnQgb3Igc3RvcmVzIGNoYW5nZS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRRdWFydGVyVHJlbmQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIGNvbnN0IGtleSA9IHNjb3BlWydjbGllbnRJZCddICsgJ3wnICsgKHNjb3BlWydzdG9yZUlkJ10gfHwgW10pLmpvaW4oJywnKSArICd8JyArIChzY29wZVsnY2hlY2tsaXN0SWQnXSB8fCAnJyk7XHJcbiAgICBpZiAoa2V5ID09PSB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5xdWFydGVyVHJlbmRTY29wZSA9IGtleTtcclxuICAgIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogdGhpcy5maXNjYWxbMF0uZnJvbSwgdG9EYXRlOiB0aGlzLnRvZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLFxyXG4gICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgIH0pLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvayA9IHJlcz8uY29kZSA9PT0gMjAwO1xyXG4gICAgICBpZiAoIW9rKSB7IHRoaXMucXVhcnRlclRyZW5kU2NvcGUgPSAnJzsgfVxyXG4gICAgICBjb25zdCBidWNrZXRzOiBhbnlbXSA9IG9rID8gcmVzLmRhdGE/LnRyZW5kIHx8IFtdIDogW107XHJcbiAgICAgIHRoaXMucXVhcnRlclRyZW5kID0gdGhpcy5maXNjYWwubWFwKHEgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluUXVhcnRlciA9IGJ1Y2tldHMuZmlsdGVyKGIgPT4gU3RyaW5nKGIua2V5KSA+PSBxLmZyb20gJiYgU3RyaW5nKGIua2V5KSA8PSBxLnRvICYmIGIudmFsdWUgIT09IG51bGwgJiYgYi52YWx1ZSAhPT0gdW5kZWZpbmVkKTtcclxuICAgICAgICBjb25zdCBjb3VudCA9IGluUXVhcnRlci5yZWR1Y2UoKG4sIGIpID0+IG4gKyAoTnVtYmVyKGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICBjb25zdCB0b3RhbCA9IGluUXVhcnRlci5yZWR1Y2UoKG4sIGIpID0+IG4gKyBOdW1iZXIoYi52YWx1ZSkgKiAoTnVtYmVyKGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSBidWNrZXRzLmZpbHRlcihiID0+IFN0cmluZyhiLmtleSkgPj0gcS5mcm9tICYmIFN0cmluZyhiLmtleSkgPD0gcS50bylcclxuICAgICAgICAgIC5yZWR1Y2UoKG4sIGIpID0+IG4gKyAoTnVtYmVyKGIuc3VibWl0dGVkID8/IGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICByZXR1cm4geyBrZXk6IHEua2V5LCBsYWJlbDogcS5rZXksIHZhbHVlOiBjb3VudCA/IE1hdGgucm91bmQodG90YWwgLyBjb3VudCkgOiBudWxsLCBjb3VudCwgc3VibWl0dGVkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBNYWtlIGEgcXVhcnRlciB0aGUgcGVyaW9kICh1cCB0byB0b2RheSBmb3IgdGhlIGN1cnJlbnQgb25lKTsgcmVsb2FkcyB1bmxlc3MgdGhlIGZpbHRlciBkcmF3ZXIgaXMgb3Blbi4gKi9cclxuICBwcml2YXRlIGFwcGx5UXVhcnRlcihrZXk6IHN0cmluZywgZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuZmlzY2FsLmZpbmQoeCA9PiB4LmtleSA9PT0ga2V5KSB8fCB0aGlzLmZpc2NhbFt0aGlzLmZpc2NhbC5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy50b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIGNvbnN0IHRvID0gcS50byA+IHRvZGF5ID8gdG9kYXkgOiBxLnRvO1xyXG4gICAgaWYgKCFmb3JjZSAmJiBxLmtleSA9PT0gdGhpcy5xdWFydGVyICYmIHRoaXMuZnJvbSA9PT0gcS5mcm9tICYmIHRoaXMudG8gPT09IHRvKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5xdWFydGVyID0gcS5rZXk7XHJcbiAgICB0aGlzLmZyb20gPSBxLmZyb207XHJcbiAgICB0aGlzLnRvID0gdG87XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBRdWFydGVybHk6IGEgYmFyIChvciBhIHF1YXJ0ZXIgaW4gdGhlIGZpbHRlciBkcmF3ZXIpIHBpY2tzIHRoYXQgcXVhcnRlci4gKi9cclxuICBzZWxlY3RRdWFydGVyKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiAhPT0gJ3F1YXJ0ZXInKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5hcHBseVF1YXJ0ZXIoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgdHJlbmQgY2FyZCB3YWl0cyBmb3IgdGhlIHBhZ2UgZmVlZHMsIGFuZCBpbiBRdWFydGVybHkgYWxzbyBmb3IgdGhlIHF1YXJ0ZXIgYmFycy4gKi9cclxuICBnZXQgdHJlbmRMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInICYmIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFycyB0aGUgdHJlbmQgY2hhcnQgZHJhd3M6IHRoZSBmb3VyIHF1YXJ0ZXJzLCBvciB0aGUgQVBJJ3MgYnktZGF0ZSBidWNrZXRzLiAqL1xyXG4gIGdldCB0cmVuZEJhcnMoKTogVHJlbmRCYXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInID8gdGhpcy5xdWFydGVyVHJlbmQgOiB0aGlzLnRyZW5kO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1vcmUgYmFycyB0aGFuIGZpdCB0aGVpciBsYWJlbHMgKGEgbW9udGggYnkgZGF0ZSk6IHNlZSBzaG93WExhYmVsLiAqL1xyXG4gIGdldCBkZW5zZVRyZW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlbmRCYXJzLmxlbmd0aCA+IDEyO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbnNlIGNoYXJ0OiBhIGxhYmVsIG9uIGV2ZXJ5IGZldyBiYXJzIChhYm91dCA4IGFjcm9zcyksIGFsd2F5cyBvbiB0aGUgZmlyc3QgYW5kIGxhc3Q7IG90aGVyd2lzZSBldmVyeSBiYXIuICovXHJcbiAgc2hvd1hMYWJlbChpOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnRyZW5kQmFycy5sZW5ndGg7XHJcbiAgICBpZiAobiA8PSAxMikgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgY29uc3Qgc3RlcCA9IE1hdGguY2VpbChuIC8gOCk7XHJcbiAgICAvLyBUaGUgbGFzdCBsYWJlbCBhbHdheXMgc2hvd3M7IHRoZSByZWd1bGFyIG9uZSBqdXN0IGJlZm9yZSBpdCBpcyBza2lwcGVkIHdoZW4gdGhlIHR3byB3b3VsZCB0b3VjaC5cclxuICAgIHJldHVybiBsYXN0IHx8IChpICUgc3RlcCA9PT0gMCAmJiBuIC0gMSAtIGkgPj0gc3RlcCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFwiT2N0IOKAkyBEZWMgMjAyNlwiIGZvciBhIHF1YXJ0ZXIga2V5LiAqL1xyXG4gIHF1YXJ0ZXJNb250aHMoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlzY2FsLmZpbmQocSA9PiBxLmtleSA9PT0ga2V5KT8ubW9udGhzIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGlja2VkIGluIHRoZSBnbG9iYWwgaGVhZGVyLiAqL1xyXG4gIHByaXZhdGUgaGVhZGVyU3RvcmVJZHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmhlYWRlckRhdGE/LnN0b3JlcyB8fCBbXSkuZmlsdGVyKChzOiBhbnkpID0+IHMuY2hlY2tlZCkubWFwKChzOiBhbnkpID0+IHMuc3RvcmVJZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoaWVyYXJjaHlBcHBsaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIHJldHVybiAhIShhLmNpcmNsZSB8fCBhLnpvbmUgfHwgYS5hb20gfHwgYS5zdG9yZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hdGNoZXNTY29wZShyOiBBdWRpdFJvdywgcGljazogU2NvcGVQaWNrKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCFwaWNrLmNpcmNsZSB8fCByLmNpcmNsZSA9PT0gcGljay5jaXJjbGUpICYmICghcGljay56b25lIHx8IHIuem9uZSA9PT0gcGljay56b25lKVxyXG4gICAgICAmJiAoIXBpY2suYW9tIHx8IHIuYW9tID09PSBwaWNrLmFvbSkgJiYgKCFwaWNrLnN0b3JlIHx8IFN0cmluZyhyLnJhdz8uc3RvcmVJZCkgPT09IHBpY2suc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzdG9yZXMgZXZlcnkgZmVlZCByZWFkczogdGhlIGhlYWRlcidzLCBuYXJyb3dlZCB0byB0aGUgYXBwbGllZCBoaWVyYXJjaHkgcGljay4gKi9cclxuICBwcml2YXRlIHNjb3BlZFN0b3JlSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghdGhpcy5oaWVyYXJjaHlBcHBsaWVkKSB7IHJldHVybiB0aGlzLmhlYWRlclN0b3JlSWRzKCk7IH1cclxuICAgIHJldHVybiB0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB0aGlzLmFwcGxpZWQpKS5tYXAociA9PiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFwcGxpZWQgQXVkaXQgdHlwZSBhcyB0aGUgQVBJcyB0YWtlIGl0IChub3RoaW5nIGZvciBBbGwgQXVkaXRzKS4gKi9cclxuICBwcml2YXRlIGF1ZGl0RmlsdGVyKCk6IHsgY2hlY2tsaXN0SWQ/OiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSAhPT0gJ2FsbCcgPyB7IGNoZWNrbGlzdElkOiB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlIH0gOiB7fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmFzZVBheWxvYWQoZXh0cmE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgc3RvcmVJZDogdGhpcy5zY29wZWRTdG9yZUlkcygpLFxyXG4gICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKCksXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgdXNlckVtYWlsZXM6IHRoaXMudXNlckVtYWlsZXMsXHJcbiAgICAgIGxpbWl0OiAxMDAwLFxyXG4gICAgICBvZmZzZXQ6IDAsXHJcbiAgICAgIHNvcnRCeTogJycsXHJcbiAgICAgIHNvcnRDb2x1bW5OYW1lOiAnJyxcclxuICAgICAgc2VhcmNoVmFsdWU6ICcnLFxyXG4gICAgICBleHBvcnQ6IGZhbHNlLFxyXG4gICAgICAuLi5leHRyYVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZm91ciBmZWVkcyBsb2FkIHRvZ2V0aGVyOyBhIGZhaWx1cmUgaW4gb25lIGxlYXZlcyB0aGUgb3RoZXJzIGludGFjdC4gKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2FmZSA9IChvOiBhbnkpID0+IG8ucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIC8vIFJvd3MgZmV0Y2hlZCBmb3IgdGhlIHdob2xlIGhlYWRlciBzY29wZSByZWZpbGwgdGhlIGhpZXJhcmNoeSBsaXN0czsgbmFycm93ZWQgb25lcyBkbyBub3QuXHJcbiAgICBjb25zdCBuYXJyb3dlZCA9IHRoaXMuaGllcmFyY2h5QXBwbGllZDtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgLy8gVGhlIGF1ZGl0IGRhc2hib2FyZCBBUEkgcmVqZWN0cyB1bmtub3duIGtleXMsIHNvIG9ubHkgdGhlIHNjb3BlIGlzIHNlbnQuXHJcbiAgICAgIGRhc2g6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZCh7XHJcbiAgICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLCBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLFxyXG4gICAgICAgIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgICB9KSksXHJcbiAgICAgIC8vIFNhbWUgdGFibGVzIGFzIHRoZSBjaGVja2xpc3QgZGFzaGJvYXJkLCBsaW1pdGVkIHNlcnZlci1zaWRlIHRvIHRoaXMgY2xpZW50J3MgYXVkaXRzLlxyXG4gICAgICBhdWRpdHM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdENoZWNrbGlzdFBlcmZvcm1hbmNlKHRoaXMuYmFzZVBheWxvYWQoeyBsaW1pdDogMjAwIH0pKSksXHJcbiAgICAgIHN0b3Jlczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U3RvcmVQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDEwMDAgfSkpKSxcclxuICAgICAgdXNlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFVzZXJQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDUwMCB9KSkpXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh7IGRhc2gsIGF1ZGl0cywgc3RvcmVzLCB1c2VycyB9OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IGRhc2g/LmNvZGUgPT09IDIwMCA/IChkYXNoLmRhdGEgfHwge30pIDoge307XHJcbiAgICAgIGNvbnN0IGF1ZGl0TGlzdCA9IGF1ZGl0cz8uY29kZSA9PT0gMjAwID8gKGF1ZGl0cy5kYXRhPy5jaGVja2xpc3RQZXJmb3JtYW5jZSB8fCBbXSkgOiBbXTtcclxuICAgICAgY29uc3Qgc3RvcmVMaXN0ID0gc3RvcmVzPy5jb2RlID09PSAyMDAgPyAoc3RvcmVzLmRhdGE/LnN0b3JlUGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcbiAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlcnM/LmNvZGUgPT09IDIwMCA/ICh1c2Vycy5kYXRhPy51c2VyUGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcblxyXG4gICAgICB0aGlzLnBhc3NNYXJrID0gTnVtYmVyKGRhdGEuc3VtbWFyeT8ucGFzc01hcmspIHx8IFBBU1NfTUFSSztcclxuICAgICAgdGhpcy5jcml0aWNhbE1hcmsgPSBOdW1iZXIoZGF0YS5zdW1tYXJ5Py5jcml0aWNhbE1hcmspIHx8IENSSVRJQ0FMX01BUks7XHJcbiAgICAgIHRoaXMucm93cyA9IChkYXRhLnN0b3JlcyB8fCBbXSkubWFwKChzOiBhbnkpID0+IHRoaXMudG9BdWRpdFJvdyhzKSk7XHJcbiAgICAgIGlmICghbmFycm93ZWQgJiYgZGFzaD8uY29kZSA9PT0gMjAwKSB7IHRoaXMuc2NvcGVSb3dzID0gdGhpcy5yb3dzOyB9XHJcbiAgICAgIHRoaXMuc3RvcmVQZXJmID0gc3RvcmVMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvU3RvcmVQZXJmKHIpKTtcclxuICAgICAgdGhpcy50cmVuZCA9IChkYXRhLnRyZW5kIHx8IFtdKS5tYXAoKGI6IGFueSkgPT4gKHtcclxuICAgICAgICBrZXk6IFN0cmluZyhiLmtleSksIGxhYmVsOiBTdHJpbmcoYi5sYWJlbCksXHJcbiAgICAgICAgdmFsdWU6IGIudmFsdWUgPT09IG51bGwgfHwgYi52YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihiLnZhbHVlKSxcclxuICAgICAgICBjb3VudDogTnVtYmVyKGIuY291bnQpIHx8IDAsXHJcbiAgICAgICAgLy8gT2xkZXIgQVBJIGJ1aWxkcyBzZW5kIG9ubHkgY291bnQgKGV2ZXJ5IGF1ZGl0IHdhcyBzY29yZWQgdGhlbikuXHJcbiAgICAgICAgc3VibWl0dGVkOiBOdW1iZXIoYi5zdWJtaXR0ZWQgPz8gYi5jb3VudCkgfHwgMFxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuYXVkaXRQZXJmID0gYXVkaXRMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvQXVkaXRQZXJmKHIpKTtcclxuICAgICAgdGhpcy51c2VyUGVyZiA9IHVzZXJMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvVXNlclBlcmYocikpO1xyXG4gICAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICAgICAgdGhpcy5sYXN0UmVmcmVzaGVkID0gZGF5anMoKS5mb3JtYXQoJ2hoOm1tOnNzIEEnKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbmUgc3RvcmUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTogc2NvcmUgaXMgdGhlIG1lYW4gb2YgaXRzIGNvbXBsaWFuY2Utc2NvcmVkIGF1ZGl0cyBpbiB0aGUgcGVyaW9kLFxyXG4gICAqIG51bGwgd2hlbiBub25lLiBBIHN0b3JlIHdpdGggc3VibWl0dGVkIGF1ZGl0cyBidXQgbm8gc2NvcmUgaXMgJ3Vuc2NvcmVkJyAoaXRzIGF1ZGl0cyBoYXZlIG5vIHF1ZXN0aW9uIHdpdGhcclxuICAgKiBjb21wbGlhbmNlIHNjb3Jpbmcgb24pLCBub3QgXCJOb3QgYXVkaXRlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9BdWRpdFJvdyhzOiBhbnkpOiBBdWRpdFJvdyB7XHJcbiAgICBjb25zdCBzY29yZSA9IHRoaXMubnVtKHM/LnNjb3JlKTtcclxuICAgIGxldCBzdGF0dXM6IFN0b3JlU3RhdHVzO1xyXG4gICAgaWYgKHNjb3JlICE9PSBudWxsKSB7XHJcbiAgICAgIHN0YXR1cyA9IHNjb3JlID49IHRoaXMucGFzc01hcmsgPyAncGFzcycgOiAnZmFpbCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdGF0dXMgPSBzPy5zdGF0dXMgPT09ICd1bnNjb3JlZCcgfHwgKHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCkgPiAwID8gJ3Vuc2NvcmVkJyA6ICduYSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkYXRlOiBzPy5sYXN0QXVkaXREYXRlID8gdGhpcy5mbXQocy5sYXN0QXVkaXREYXRlKSA6ICfigJQnLFxyXG4gICAgICAvLyBUaGUgc3RvcmUncyBuYW1lIChoaWVyYXJjaHksIGl0cyBzdWJtaXNzaW9ucywgb3IgdGhlIHN0b3JlcyBsaXN0KTsgXCLigJRcIiB3aGVuIGl0IGhhcyBub25lLCBuZXZlciB0aGUgaWQuXHJcbiAgICAgIHN0b3JlSWQ6IHM/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgY2lyY2xlOiBzPy5jaXJjbGUgfHwgJ+KAlCcsXHJcbiAgICAgIHpvbmU6IHM/LnpvbmUgfHwgJ+KAlCcsXHJcbiAgICAgIGFvbTogcz8uYW9tIHx8ICfigJQnLFxyXG4gICAgICBhdWRpdHM6IHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IE1hdGgucm91bmQoc2NvcmUpLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHJhdzogc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uZSBzdG9yZSBmcm9tIC9hdWRpdC9kYXNoYm9hcmQvc3RvcmVQZXJmb3JtYW5jZSAoYXVkaXQgY29weSBvZiB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCdzIHRhYmxlKTogZXZlcnkgYXVkaXRcclxuICAgKiB2aXNpdCBpbiB0aGUgcGVyaW9kLCBzbyBjb21wbGV0aW9uID0gc3VibWl0dGVkIC8gYXNzaWduZWQgYW5kIGZsYWdzIGNvdW50LCB1bmxpa2UgdGhlIHNjb3JlLW9ubHkgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRvU3RvcmVQZXJmKHI6IGFueSk6IFN0b3JlUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZUlkOiByPy5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmU6IHI/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgc3BvYzogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFyIGZpbGwgZm9yIGEgcGVyY2VudGFnZSAobnVtYmVyLCBvciB0ZXh0IGxpa2UgXCI1MSVcIiAvIFwiLTI1JVwiKToga2VwdCB0byAwLTEwMC4gQSBuZWdhdGl2ZSBzY29yZSAob3B0aW9uXHJcbiAgICogc2NvcmVzIGNhbiBiZSBuZWdhdGl2ZSBwZW5hbHRpZXMpIHdvdWxkIG90aGVyd2lzZSBzZXQgYW4gaW52YWxpZCBuZWdhdGl2ZSB3aWR0aCwgd2hpY2ggdGhlIGJyb3dzZXIgZHJvcHMsXHJcbiAgICogZHJhd2luZyB0aGUgYmFyIGZ1bGw7IGl0IGlzIGVtcHR5IGluc3RlYWQsIHdoaWxlIHRoZSBudW1iZXIgYmVzaWRlIGl0IHN0aWxsIHNob3dzIHRoZSByZWFsIHNjb3JlLlxyXG4gICAqL1xyXG4gIGJhcldpZHRoKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZSA/PyAnJykucmVwbGFjZSgnJScsICcnKSk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBuKSkgKyAnJScgOiAnMCUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b0F1ZGl0UGVyZihyOiBhbnkpOiBBdWRpdFBlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHI/LmNoZWNrTGlzdE5hbWUgfHwgJ+KAlCc7XHJcbiAgICAvLyBObyBxdWVzdGlvbiBvZiB0aGUgYXVkaXQgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbjogbm8gc2NvcmUgYW5kIG5vIHJlc3VsdCAodGhlIEFQSSBzZW5kcyBudWxsKS5cclxuICAgIGNvbnN0IHNjb3JlID0gcj8uY29tcGxpYW5jZUVuYWJsZWQgPT09IGZhbHNlID8gbnVsbCA6IHRoaXMubnVtKHI/LnF1ZXN0aW9uQ29tcGxpYW5jZSk7XHJcbiAgICBjb25zdCBzY29yZVBjdCA9IHNjb3JlID09PSBudWxsID8gMCA6IE1hdGgucm91bmQoc2NvcmUpO1xyXG4gICAgLy8gVGhlIGF1ZGl0J3Mgb3duIHBhc3MgbWFyayB3aGVuIHRoZSBBUEkgc2VuZHMgaXQsIGVsc2UgdGhlIGRhc2hib2FyZCdzIChzdW1tYXJ5LnBhc3NNYXJrKS5cclxuICAgIGNvbnN0IG1hcmsgPSB0aGlzLm51bShyPy5wYXNzTWFyaykgPz8gdGhpcy5wYXNzTWFyaztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGluaXRpYWxzOiBTdHJpbmcocj8uY2hlY2tMaXN0Q2hhciB8fCBuYW1lLnNsaWNlKDAsIDIpKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQ6IHI/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlID8gdGhpcy50aXRsZUNhc2Uoci5zY2hlZHVsZVJlcGVhdGVkVHlwZSkgOiAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LnN0b3JlQ291bnQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0ocj8uc3VibWl0dGVkQ2hlY2tsaXN0KSA/PyAwLFxyXG4gICAgICAvLyBRdWVzdGlvbnMgd2l0aCBhIHN0b3JlIGRpc3B1dGUgKHJhaXNlZCBvciByZXZpZXdlZCkgaW4gdGhlIHBlcmlvZDsgJ+KAlCcgb25seSB3aGVuIHRoZSBBUEkgc2VuZHMgbm9uZS5cclxuICAgICAgZGlzcHV0ZXM6IHRoaXMubnVtKHI/LmRpc3B1dGVzKSxcclxuICAgICAgcGFzc01hcms6IG1hcmsgKyAnJScsXHJcbiAgICAgIHNjb3JlOiBzY29yZSA9PT0gbnVsbCA/ICfigJQnIDogc2NvcmVQY3QgKyAnJScsXHJcbiAgICAgIHNjb3JlUGN0LFxyXG4gICAgICByZXN1bHQ6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiAoc2NvcmVQY3QgPj0gbWFyayA/ICdQYXNzJyA6ICdGYWlsJyksXHJcbiAgICAgIHJhdzogclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9Vc2VyUGVyZihyOiBhbnkpOiBVc2VyUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lOiByPy51c2VyTmFtZSB8fCAn4oCUJyxcclxuICAgICAgZW1haWw6IHI/LnVzZXJFbWFpbCB8fCAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LmNoZWNrTGlzdENvdW50KSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0ocj8uZmxhZ2dlZENvdW50KSA/PyAwLFxyXG4gICAgICByZWRvOiB0aGlzLm51bShyPy5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2Ugcm93cyBmb3IgdGhlIHRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzLCBpbiB0aGVcclxuICAgKiBjdXJyZW50IHNjb3BlLiBBIGZhaWxlZCBjYWxsIGxlYXZlcyAn4oCUJyBldmVyeXdoZXJlIGFuZCByZXRyaWVzIHRoZSBuZXh0IHRpbWUgdGhlIFRhc2sgdGFiIG9wZW5zLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRhc2tzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhlYWRlckRhdGEpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSBmYWxzZTtcclxuICAgIHRoaXMudGFza0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy50YXNrUmVxdWVzdDtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5iYXNlUGF5bG9hZCgpO1xyXG4gICAgLy8gVGhlIGVuZHBvaW50IHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZFRhc2tzKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLFxyXG4gICAgICBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLCB1c2VyRW1haWxlczogc2NvcGVbJ3VzZXJFbWFpbGVzJ10sIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnRhc2tSZXF1ZXN0KSB7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGEgfHwgbnVsbCkgOiBudWxsO1xyXG4gICAgICBpZiAoIWRhdGEpIHsgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTsgfVxyXG4gICAgICB0aGlzLnRhc2tTdGF0cyA9IHRoaXMudG9UYXNrU3RhdHMoZGF0YSk7XHJcbiAgICAgIHRoaXMudGFza1BlcmYgPSAoZGF0YT8udGFza3MgfHwgW10pLm1hcCgodDogYW55KSA9PiB0aGlzLnRvVGFza1BlcmYodCkpO1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoZWQgPSBkYXlqcygpLmZvcm1hdCgnaGg6bW06c3MgQScpO1xyXG4gICAgICB0aGlzLnRhc2tMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvVGFza1N0YXRzKGQ6IGFueSk6IFRhc2tTdGF0cyB7XHJcbiAgICB0aGlzLnRhc2tEZWx0YVZhbHVlcyA9IHtcclxuICAgICAgY29tcGxldGlvbjogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGlhbmNlKSxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKGQ/LmRlbHRhcz8uZmxhZ3MpXHJcbiAgICB9O1xyXG4gICAgaWYgKCFkKSB7IHJldHVybiB7IC4uLkVNUFRZX1RBU0tfU1RBVFMgfTsgfVxyXG4gICAgY29uc3QgY291bnQgPSAodjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm51bSh2KTtcclxuICAgICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IG4udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGF5cyA9IHRoaXMubnVtKGQ/LnBlcmlvZD8ucHJldmlvdXM/LmRheXMpID8/IDE7XHJcbiAgICBjb25zdCB2cyA9IGRheXMgPT09IDEgPyAndnMgbGFzdCBkYXknIDogJ3ZzIHByZXZpb3VzICcgKyBkYXlzICsgJyBkYXlzJztcclxuICAgIGNvbnN0IGRlbHRhID0gKHY6IG51bWJlciB8IG51bGwpID0+ICh2ID09PSBudWxsID8gJycgOiBNYXRoLmFicyh2KSArICclICcgKyB2cyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3RpdmVUYXNrczogY291bnQoZC5hY3RpdmVUYXNrcyksXHJcbiAgICAgIHRhc2tJbnN0YW5jZXM6IGNvdW50KGQudGFza0luc3RhbmNlcyksXHJcbiAgICAgIG5vdFN1Ym1pdHRlZDogY291bnQoZC5ub3RTdWJtaXR0ZWQpLFxyXG4gICAgICBvcGVuVGFza3M6IGNvdW50KGQub3BlblRhc2tzKSxcclxuICAgICAgaW5Qcm9ncmVzczogY291bnQoZC5pblByb2dyZXNzKSxcclxuICAgICAgc3VibWl0dGVkOiBjb3VudChkLnN1Ym1pdHRlZCksXHJcbiAgICAgIGNvbXBsZXRpb25TY29yZTogdGhpcy5wY3RUZXh0KGQuY29tcGxldGlvblNjb3JlKSxcclxuICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGlhbmNlU2NvcmUpLFxyXG4gICAgICB0b3RhbEZsYWdzOiBjb3VudChkLnRvdGFsRmxhZ3MpLFxyXG4gICAgICBjb21wbGV0aW9uRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnc0RlbHRhOiBkZWx0YSh0aGlzLnRhc2tEZWx0YVZhbHVlcy5mbGFncylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogT25lIHRhc2sgcmFpc2VkIGZyb20gYW4gYXVkaXQ7IGNvbXBsaWFuY2UgaXMgJ+KAlCcgd2hpbGUgdGFzayBpbnN0YW5jZXMgY2Fycnkgbm8gc2NvcmUuICovXHJcbiAgcHJpdmF0ZSB0b1Rhc2tQZXJmKHQ6IGFueSk6IFRhc2tQZXJmUm93IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0Py50YXNrTmFtZSB8fCAn4oCUJztcclxuICAgIGNvbnN0IGNvbXBsaWFuY2UgPSB0aGlzLm51bSh0Py5jb21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHJhaXNlZCA9IHRoaXMubnVtKHQ/LnRhc2tzKTtcclxuICAgIGxldCBzY2hlZHVsZWQgPSAn4oCUJztcclxuICAgIGlmICh0Py5zY2hlZHVsZVJlcGVhdGVkVHlwZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSB0aGlzLnRpdGxlQ2FzZSh0LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKTtcclxuICAgIH0gZWxzZSBpZiAodD8uZHVlRGF0ZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSAnRHVlICcgKyB0aGlzLmZtdCh0LmR1ZURhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZSxcclxuICAgICAgaW5pdGlhbHM6IG5hbWUuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKSxcclxuICAgICAgc2NoZWR1bGVkLFxyXG4gICAgICBjb3ZlcmFnZTogdD8uY292ZXJhZ2UgPyB0aGlzLnRpdGxlQ2FzZSh0LmNvdmVyYWdlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0odD8uYXNzaWduZWQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0odD8uc3VibWl0dGVkKSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0odD8uZmxhZ3MpID8/IDAsXHJcbiAgICAgIHRhc2tzOiByYWlzZWQgPT09IG51bGwgPyAn4oCUJyA6IFN0cmluZyhyYWlzZWQpLFxyXG4gICAgICByZWRvOiB0aGlzLm51bSh0Py5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLnBjdFRleHQoY29tcGxpYW5jZSksXHJcbiAgICAgIGNvbXBsaWFuY2VQY3Q6IGNvbXBsaWFuY2UgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChjb21wbGlhbmNlKSxcclxuICAgICAgcmF3OiB0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbHRhIHN0eWxpbmc6IGFycm93IGRpcmVjdGlvbiwgYW5kIGNvbG91ciBieSB3aGV0aGVyIHRoZSBtb3ZlIGlzIGdvb2QgKG1vcmUgZmxhZ3MgaXMgYmFkKS4gKi9cclxuICB0YXNrRGVsdGFDbGFzcyhrZXk6IFRhc2tEZWx0YUtleSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2ID0gdGhpcy50YXNrRGVsdGFWYWx1ZXNba2V5XTtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IDApIHsgcmV0dXJuICdpcy1mbGF0JzsgfVxyXG4gICAgY29uc3QgdXAgPSB2ID4gMDtcclxuICAgIGNvbnN0IGdvb2QgPSBrZXkgPT09ICdmbGFncycgPyAhdXAgOiB1cDtcclxuICAgIHJldHVybiAodXAgPyAnaXMtdXAnIDogJ2lzLWRvd24nKSArICcgJyArIChnb29kID8gJ2lzLWdvb2QnIDogJ2lzLWJhZCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBudW0odjogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIGNvbnN0IG4gPSBOdW1iZXIodik7XHJcbiAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGN0VGV4dCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IE1hdGgucm91bmQobikgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FzZSh2OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZtdCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ01NTSBERCwgWVlZWScpIDogJ+KAlCc7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBhZnRlciBzZWFyY2gsIHN0YXR1cyBhbmQgc2NvcmUtYmFuZCBmaWx0ZXJzLiAqL1xyXG4gIGdldCBmaWx0ZXJlZFJvd3MoKTogQXVkaXRSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLnN0YXR1cyA9PT0gJ2FsbCcgfHwgci5zdGF0dXMgPT09IHRoaXMuc3RhdHVzKVxyXG4gICAgICAuZmlsdGVyKHIgPT4ge1xyXG4gICAgICAgIGlmIChyLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZU1pbiA9PT0gMCAmJiB0aGlzLnNjb3JlTWF4ID09PSAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEEgbG93ZXIgYm91bmQgb2YgMCBpcyBvcGVuOiBwZW5hbHR5IHNjb3JlcyBjYW4gdGFrZSBhIHN0b3JlIGJlbG93IDAlIChDcml0aWNhbCkuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3JlTWluIDw9IDAgfHwgci5zY29yZSA+PSB0aGlzLnNjb3JlTWluKSAmJiByLnNjb3JlIDw9IHRoaXMuc2NvcmVNYXg7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIociA9PiAhcSB8fCBbci5zdG9yZUlkLCByLmNpcmNsZSwgci56b25lLCByLmFvbSwgci5yYXc/LnN0b3JlTmFtZSB8fCAnJywgci5yYXc/LnN0b3JlSWQgfHwgJyddLnNvbWUodiA9PiBTdHJpbmcodikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB0aGlzLmNvbXBhcmUoYSwgYikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlKGE6IEF1ZGl0Um93LCBiOiBBdWRpdFJvdyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0gJ3Njb3JlJykge1xyXG4gICAgICAvLyBOb3QtYXVkaXRlZCBzdG9yZXMgKG5vIHNjb3JlKSBhbHdheXMgY29tZSBhZnRlciB0aGUgYXVkaXRlZCBvbmVzLCBpbiBlaXRoZXIgZGlyZWN0aW9uLFxyXG4gICAgICAvLyBzbyB0aGUgZmV3IGF1ZGl0ZWQgc3RvcmVzIGFyZSBub3QgYnVyaWVkIHVuZGVyIHRob3VzYW5kcyBvZiBcIk5vdCBhdWRpdGVkXCIgcm93cy5cclxuICAgICAgaWYgKGEuc2NvcmUgPT09IG51bGwgfHwgYi5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBhLnNjb3JlID09PSBiLnNjb3JlID8gMCA6IChhLnNjb3JlID09PSBudWxsID8gMSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKGEuc2NvcmUgLSBiLnNjb3JlKSAqIGRpcjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09ICdhdWRpdHMnKSB7XHJcbiAgICAgIHJldHVybiAoYS5hdWRpdHMgLSBiLmF1ZGl0cykgKiBkaXI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhdiA9IFN0cmluZyhhW3RoaXMuc29ydEtleSBhcyBrZXlvZiBBdWRpdFJvd10gPz8gJycpO1xyXG4gICAgY29uc3QgYnYgPSBTdHJpbmcoYlt0aGlzLnNvcnRLZXkgYXMga2V5b2YgQXVkaXRSb3ddID8/ICcnKTtcclxuICAgIHJldHVybiBhdi5sb2NhbGVDb21wYXJlKGJ2KSAqIGRpcjtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZTtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhhdCBjYXJyeSBhIHNjb3JlIGluIHRoZSBjdXJyZW50IHBlcmlvZC4gKi9cclxuICBwcml2YXRlIGdldCBldmFsdWF0ZWQoKTogQXVkaXRSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2NvcmUgIT09IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB3aXRoIGEgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QsIHNjb3JlZCBvciBub3QuICovXHJcbiAgcHJpdmF0ZSBnZXQgYXVkaXRlZENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnbmEnKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgYXZlcmFnZVNjb3JlKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgZXYgPSB0aGlzLmV2YWx1YXRlZDtcclxuICAgIGlmICghZXYubGVuZ3RoKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChldi5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKHIuc2NvcmUgYXMgbnVtYmVyKSwgMCkgLyBldi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGtwaXMoKTogQXVkaXRLcGlbXSB7XHJcbiAgICBjb25zdCBldiA9IHRoaXMuZXZhbHVhdGVkO1xyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICBjb25zdCBwYXNzQ291bnQgPSBldi5maWx0ZXIociA9PiAoci5zY29yZSBhcyBudW1iZXIpID49IHRoaXMucGFzc01hcmspLmxlbmd0aDtcclxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGV2Lmxlbmd0aCAtIHBhc3NDb3VudDtcclxuICAgIGNvbnN0IGNyaXRpY2FsID0gZXYuZmlsdGVyKHIgPT4gKHIuc2NvcmUgYXMgbnVtYmVyKSA8IHRoaXMuY3JpdGljYWxNYXJrKS5sZW5ndGg7XHJcbiAgICBjb25zdCBhY3RpdmVTdG9yZXMgPSB0aGlzLnN0b3Jlc0luU2NvcGU7XHJcbiAgICBjb25zdCBhdWRpdGVkID0gdGhpcy5hdWRpdGVkQ291bnQ7XHJcbiAgICBsZXQgYXZnTm90ZSA9ICdBY3Jvc3MgYXVkaXRlZCBzdG9yZXMnO1xyXG4gICAgaWYgKGF2ZyA9PT0gbnVsbCkge1xyXG4gICAgICBhdmdOb3RlID0gYXVkaXRlZCA/ICdDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhlc2UgYXVkaXRzJyA6ICdObyBhdWRpdHMgaW4gdGhpcyBwZXJpb2QnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0F2ZXJhZ2Ugc2NvcmUnLFxyXG4gICAgICAgIHZhbHVlOiBhdmcgPT09IG51bGwgPyAn4oCUJyA6IGF2ZyArICclJyxcclxuICAgICAgICBub3RlOiBhdmdOb3RlLFxyXG4gICAgICAgIG5vdGVDb2xvcjogYXZnICE9PSBudWxsICYmIGF2ZyA8IHRoaXMucGFzc01hcmsgPyAnI0Q5MkQyMCcgOiAnIzAyN0E0OCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnUGFzcyByYXRlJyxcclxuICAgICAgICB2YWx1ZTogZXYubGVuZ3RoID8gTWF0aC5yb3VuZChwYXNzQ291bnQgLyBldi5sZW5ndGggKiAxMDApICsgJyUnIDogJ+KAlCcsXHJcbiAgICAgICAgbm90ZTogcGFzc0NvdW50ICsgJyBwYXNzLCAnICsgZmFpbENvdW50ICsgJyBmYWlsJyxcclxuICAgICAgICBub3RlQ29sb3I6ICcjNjY3MDg1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdDcml0aWNhbCBzdG9yZXMnLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcoY3JpdGljYWwpLFxyXG4gICAgICAgIG5vdGU6ICdTY29yZSBiZWxvdyAnICsgdGhpcy5jcml0aWNhbE1hcmsgKyAnJScsXHJcbiAgICAgICAgbm90ZUNvbG9yOiBjcml0aWNhbCA/ICcjRDkyRDIwJyA6ICcjNjY3MDg1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgLy8gU3VibWl0dGVkIGF1ZGl0cywgYXMgdGhlIHRyZW5kIGNvdW50cyB0aGVtOyB0aGUgbm90ZSBnaXZlcyB0aGUgYWN0aXZlIHN0b3JlcyBpbiBzY29wZS5cclxuICAgICAgICBsYWJlbDogJ0F1ZGl0cyBjb21wbGV0ZWQnLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcodGhpcy5yb3dzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoTnVtYmVyKHIucmF3Py5hdWRpdHMpIHx8IDApLCAwKSksXHJcbiAgICAgICAgbm90ZTogYWN0aXZlU3RvcmVzICsgKGFjdGl2ZVN0b3JlcyA9PT0gMSA/ICcgYWN0aXZlIHN0b3JlJyA6ICcgYWN0aXZlIHN0b3JlcycpLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyaW9kTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicgJiYgdGhpcy5xdWFydGVyKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXIgKyAnICgnICsgdGhpcy5xdWFydGVyTW9udGhzKHRoaXMucXVhcnRlcikgKyAnKSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyB0byAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXN0cmlidXRpb24gb2Ygc3RvcmVzIGFjcm9zcyBzY29yZSBiYW5kcy4gTm90IHNjb3JlZCBpcyBsZWZ0IG91dCAoUUEgOSBPY3QpLCBhbmQgaXRzIHN0b3Jlc1xyXG4gICAqIHdpdGggaXQsIHNvIHRoZSBzaGFyZXMgc3RpbGwgYWRkIHVwIHRvIDEwMCUuXHJcbiAgICovXHJcbiAgZ2V0IGJhbmRSb3dzKCk6IEFycmF5PHsgYmFuZDogQXVkaXRCYW5kOyBjb3VudDogbnVtYmVyOyBzaGFyZTogc3RyaW5nOyB3aWR0aDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAndW5zY29yZWQnKS5sZW5ndGggfHwgMTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbHRlcihiYW5kID0+IGJhbmQua2V5ICE9PSAndW5zY29yZWQnKS5tYXAoYmFuZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KVxyXG4gICAgICAgID8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzID09PSBiYW5kLmtleSkubGVuZ3RoXHJcbiAgICAgICAgOiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zY29yZSAhPT0gbnVsbCAmJiB0aGlzLmluQmFuZChyLnNjb3JlIGFzIG51bWJlciwgYmFuZCkpLmxlbmd0aDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBiYW5kLFxyXG4gICAgICAgIGNvdW50LFxyXG4gICAgICAgIC8vIEEgZmV3IHN0b3JlcyBvdXQgb2YgdGhvdXNhbmRzIHJvdW5kIHRvIDAlOyBzYXkgXCI8MSVcIiBpbnN0ZWFkIG9mIDAlIG5leHQgdG8gYSBub24temVybyBjb3VudC5cclxuICAgICAgICBzaGFyZTogY291bnQgJiYgY291bnQgLyB0b3RhbCAqIDEwMCA8IDEgPyAnPDElJyA6IE1hdGgucm91bmQoY291bnQgLyB0b3RhbCAqIDEwMCkgKyAnJScsXHJcbiAgICAgICAgd2lkdGg6IChjb3VudCAvIHRvdGFsICogMTAwKSArICclJ1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFuZCBjb2xvdXJzIG9mIGEgc3RvcmUgcm93OiBieSBzY29yZSwgb3IgdGhlIE5vdCBzY29yZWQgLyBOb3QgYXVkaXRlZCBiYW5kIHdoZW4gaXQgaGFzIG5vbmUuICovXHJcbiAgYmFuZEZvcihyb3c6IEF1ZGl0Um93KTogQXVkaXRCYW5kIHtcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJhbmRzW3RoaXMuYmFuZHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAocm93LnNjb3JlID09PSBudWxsKSB7IHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiBiLmtleSA9PT0gcm93LnN0YXR1cykgPz8gbGFzdDsgfVxyXG4gICAgY29uc3Qgc2NvcmUgPSByb3cuc2NvcmU7XHJcbiAgICByZXR1cm4gdGhpcy5iYW5kcy5maW5kKGIgPT4gIVNUQVRVU19CQU5EUy5pbmNsdWRlcyhiLmtleSkgJiYgdGhpcy5pbkJhbmQoc2NvcmUsIGIpKSA/PyBsYXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgc2NvcmUgYmFuZCdzIHJhbmdlOyB0aGUgbG93ZXN0IGJhbmQgKGxvIDAsIENyaXRpY2FsKSBhbHNvIHRha2VzIG5lZ2F0aXZlIHNjb3JlcyAocGVuYWx0eSBvcHRpb25zKS4gKi9cclxuICBwcml2YXRlIGluQmFuZChzY29yZTogbnVtYmVyLCBiYW5kOiBBdWRpdEJhbmQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoYmFuZC5sbyA8PSAwIHx8IHNjb3JlID49IGJhbmQubG8pICYmIHNjb3JlIDw9IGJhbmQuaGk7XHJcbiAgfVxyXG5cclxuICBzdGF0dXNMYWJlbChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuICdQYXNzJzsgfVxyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdmYWlsJykgeyByZXR1cm4gJ0ZhaWwnOyB9XHJcbiAgICByZXR1cm4gcm93LnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJyA/ICdOb3Qgc2NvcmVkJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICAvKiogQmFyIGhlaWdodCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGNoYXJ0IGFyZWEuICovXHJcbiAgYmFySGVpZ2h0KGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChiYXIudmFsdWUgPT09IG51bGwgPyAyIDogTWF0aC5tYXgoMywgYmFyLnZhbHVlKSkgKyAnJSc7XHJcbiAgfVxyXG5cclxuICAvKiogSG92ZXIgY2FyZCBzaXRzIGp1c3QgYWJvdmUgdGhlIGJhcidzIHZhbHVlIGxhYmVsOyBjYXBwZWQgc28gYSB0YWxsIGJhcidzIGNhcmQgc3RheXMgaW5zaWRlIHRoZSBjaGFydC4gKi9cclxuICB0aXBCb3R0b20oYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoID0gYmFyLnZhbHVlID09PSBudWxsID8gMiA6IE1hdGgubWF4KDMsIGJhci52YWx1ZSk7XHJcbiAgICByZXR1cm4gJ2NhbGMoJyArIE1hdGgubWluKGgsIDQ1KSArICclICsgMjZweCknO1xyXG4gIH1cclxuXHJcbiAgYmFyRmlsbChiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIGlmIChiYXIudmFsdWUgPT09IG51bGwpIHsgcmV0dXJuICcjRjJGNEY3JzsgfVxyXG4gICAgY29uc3QgYWN0aXZlID0gYmFyLmtleSA9PT0gdGhpcy5xdWFydGVyO1xyXG4gICAgaWYgKGJhci52YWx1ZSA+PSB0aGlzLnBhc3NNYXJrKSB7IHJldHVybiBhY3RpdmUgPyAnIzE1NzBFRicgOiAnI0IyRERGRic7IH1cclxuICAgIHJldHVybiBhY3RpdmUgPyAnI0YwNDQzOCcgOiAnI0ZFQ0RDQSc7XHJcbiAgfVxyXG5cclxuICBzZXRHcmFpbihncmFpbjogJ3F1YXJ0ZXInIHwgJ2RhdGUnKTogdm9pZCB7XHJcbiAgICBpZiAoZ3JhaW4gPT09IHRoaXMuZ3JhaW4pIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmdyYWluID0gZ3JhaW47XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKGdyYWluID09PSAncXVhcnRlcicpIHtcclxuICAgICAgdGhpcy5hcHBseVF1YXJ0ZXIodGhpcy5xdWFydGVycy5pbmNsdWRlcyh0aGlzLnF1YXJ0ZXIpID8gdGhpcy5xdWFydGVyIDogdGhpcy5xdWFydGVyc1t0aGlzLnF1YXJ0ZXJzLmxlbmd0aCAtIDFdLCB0cnVlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQmFjayB0byBCeSBkYXRlOiB0aGUgaGVhZGVyJ3MgcmFuZ2UgYWdhaW4uXHJcbiAgICB0aGlzLmZyb20gPSB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCB0aGlzLmZyb207XHJcbiAgICB0aGlzLnRvID0gdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8IHRoaXMudG87XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIHNldFN0YXR1cyhzdGF0dXM6IFN0YXR1c0ZpbHRlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0S2V5ID09PSBrZXkpIHtcclxuICAgICAgdGhpcy5zb3J0RGlyID0gdGhpcy5zb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3J0S2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLnNvcnREaXIgPSAnYXNjJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjb3JlIGRpc3RyaWJ1dGlvbiAtPiBWaWV3IHN0b3JlczogbmFycm93IHRoZSBzdG9yZSBsaXN0IHRvIHRoYXQgYmFuZCAoTm90IGF1ZGl0ZWQgLT4gdGhlXHJcbiAgICogc3RvcmVzIHdpdGggbm8gc3VibWlzc2lvbikgYW5kIGJyaW5nIHRoZSBsaXN0IGludG8gdmlldy5cclxuICAgKi9cclxuICBhcHBseUJhbmQoYmFuZDogQXVkaXRCYW5kKTogdm9pZCB7XHJcbiAgICBpZiAoU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KSkge1xyXG4gICAgICB0aGlzLmNsZWFyQmFuZCgpO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IGJhbmQua2V5IGFzIFN0b3JlU3RhdHVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZU1pbiA9IGJhbmQubG87XHJcbiAgICAgIHRoaXMuc2NvcmVNYXggPSBiYW5kLmhpO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZUxpc3RPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMubGlzdEJhbmRLZXkgPSBiYW5kLmtleTtcclxuICAgIC8vIEZyb20gdGhlIGRyYXdlciwgQXBwbHkgc2Nyb2xscyBvbmNlIGl0IGNsb3Nlcy5cclxuICAgIGlmICh0aGlzLmZpbHRlcnNPcGVuKSB7IHJldHVybjsgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWQtc3RvcmUtbGlzdCcpPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSkpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJCYW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY29yZU1pbiA9IDA7XHJcbiAgICB0aGlzLnNjb3JlTWF4ID0gMTAwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBTdG9yZSBsaXN0IG9wZW5zIGJ5IGRlZmF1bHQgd2l0aCBhbGwgc3RvcmVzOyBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXMgKG9yIGEgRmlsdGVyc1xyXG4gICAqIHNjb3JlIHJhbmdlKSBuYXJyb3dzIGl0IHRvIGEgYmFuZCwgYW5kIHRoZSBjaGlwJ3MgeCBjbG9zZXMgaXQuXHJcbiAgICovXHJcbiAgc3RvcmVMaXN0T3BlbiA9IHRydWU7XHJcbiAgLyoqIEJhbmQgdGhlIGxpc3Qgd2FzIG9wZW5lZCBmb3IgKCcnID0gYWxsIHN0b3JlcykuICovXHJcbiAgbGlzdEJhbmRLZXkgPSAnJztcclxuXHJcbiAgZ2V0IHNob3dTdG9yZUxpc3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZUxpc3RPcGVuIHx8IHRoaXMuYmFuZEZpbHRlckFjdGl2ZSB8fCB0aGlzLnN0YXR1cyAhPT0gJ2FsbCc7XHJcbiAgfVxyXG5cclxuICAvKiogRHJhd2VyIFNjb3JlIHJhbmdlOiB0aGUgYmFuZCB0aGUgY3VycmVudCByYW5nZSAob3Igc3RhdHVzIGJhbmQpIG1hdGNoZXMuICovXHJcbiAgaXNCYW5kT24oYmFuZDogQXVkaXRCYW5kKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KSkgeyByZXR1cm4gdGhpcy5zdGF0dXMgPT09IGJhbmQua2V5OyB9XHJcbiAgICByZXR1cm4gdGhpcy5zY29yZU1pbiA9PT0gYmFuZC5sbyAmJiB0aGlzLnNjb3JlTWF4ID09PSBiYW5kLmhpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhbmRGaWx0ZXJBY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29yZU1pbiAhPT0gMCB8fCB0aGlzLnNjb3JlTWF4ICE9PSAxMDA7XHJcbiAgfVxyXG5cclxuICBnZXQgYmFuZENoaXBMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaGl0ID0gdGhpcy5iYW5kcy5maW5kKGIgPT4gIVNUQVRVU19CQU5EUy5pbmNsdWRlcyhiLmtleSkgJiYgYi5sbyA9PT0gdGhpcy5zY29yZU1pbiAmJiBiLmhpID09PSB0aGlzLnNjb3JlTWF4KTtcclxuICAgIHJldHVybiBoaXQgPyBoaXQubGFiZWwgKyAnIMK3ICcgKyBoaXQucmFuZ2UgOiAnU2NvcmUgJyArIHRoaXMuc2NvcmVNaW4gKyAn4oCTJyArIHRoaXMuc2NvcmVNYXggKyAnJSc7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGZpdmUgZmlsdGVyIGNhdGVnb3JpZXMgdGhlIGRyYXdlciBsaXN0cy4gKi9cclxuICBnZXQgZmlsdGVyQ2F0cygpOiBGaWx0ZXJDYXRbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogJ3BlcmlvZCcsIGxhYmVsOiAnUGVyaW9kJywgdmFsdWU6IHRoaXMucGVyaW9kTGFiZWwsIHRpdGxlOiAnUGVyaW9kJyxcclxuICAgICAgICBzdWI6ICdTdGFydHMgYXMgdGhlIGdsb2JhbCBoZWFkZXIgZGF0ZSByYW5nZTsgcGljayBhIHJhbmdlIHRvIG5hcnJvdyBpdC4nLFxyXG4gICAgICAgIGRpcnR5OiBmYWxzZSB9LFxyXG4gICAgICB7IGtleTogJ3Njb3BlJywgbGFiZWw6ICdTdG9yZSBoaWVyYXJjaHknLCB2YWx1ZTogdGhpcy5zY29wZUxhYmVsLCB0aXRsZTogJ1N0b3JlIGhpZXJhcmNoeScsXHJcbiAgICAgICAgc3ViOiAnUGljayB0aGUgY2lyY2xlLCB6b25lLCBBT00gb3Igc3RvcmUgdGhlIHdob2xlIGRhc2hib2FyZCByZWFkcy4nLFxyXG4gICAgICAgIGRpcnR5OiAhIXRoaXMuY2lyY2xlIH0sXHJcbiAgICAgIHsga2V5OiAndHlwZScsIGxhYmVsOiAnQXVkaXQgdHlwZScsIHZhbHVlOiB0aGlzLmF1ZGl0VHlwZUxhYmVsLCB0aXRsZTogJ0F1ZGl0IHR5cGUnLFxyXG4gICAgICAgIHN1YjogJ1doaWNoIGF1ZGl0IHByb2dyYW1tZSB0aGUgc2NvcmVzIGNvbWUgZnJvbS4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLmF1ZGl0VHlwZSAhPT0gJ2FsbCcgfSxcclxuICAgICAgeyBrZXk6ICdiYW5kJywgbGFiZWw6ICdTY29yZSByYW5nZScsIHZhbHVlOiB0aGlzLmJhbmRDaGlwTGFiZWwsIHRpdGxlOiAnU2NvcmUgcmFuZ2UnLFxyXG4gICAgICAgIHN1YjogJ1RhcCBhIGJhbmQgdG8gc2V0IHRoZSByYW5nZSB0aGUgc3VtbWFyeSByZWFkcy4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfSxcclxuICAgICAgeyBrZXk6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycsIHZhbHVlOiB0aGlzLnN0YXR1c0ZpbHRlckxhYmVsLCB0aXRsZTogJ1N0YXR1cycsXHJcbiAgICAgICAgc3ViOiAnU2hvdyBldmVyeSBzdG9yZSwgb3Igb25seSB0aGUgb25lcyB0aGF0IHBhc3NlZCBvciBmYWlsZWQuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5zdGF0dXMgIT09ICdhbGwnIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlQ2F0T2JqKCk6IEZpbHRlckNhdCB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbmQoYyA9PiBjLmtleSA9PT0gdGhpcy5hY3RpdmVDYXQpIHx8IHRoaXMuZmlsdGVyQ2F0c1swXTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2F0cy5maWx0ZXIoYyA9PiBjLmRpcnR5KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgcGljayBjb3ZlcnMgKHdoYXQgQXBwbHkgd2lsbCBsb2FkKS4gKi9cclxuICBnZXQgc3RvcmVzSW5TY29wZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHRoaXMubWF0Y2hlc1Njb3BlKHIsIHRoaXMpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU29ydGVkIGRpc3RpbmN0IG5hbWVzLCB3aXRob3V0IHRoZSBcIuKAlFwiIG9mIHN0b3JlcyBvdXRzaWRlIHRoZSBoaWVyYXJjaHkuICovXHJcbiAgcHJpdmF0ZSBkaXN0aW5jdCh2YWx1ZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMuZmlsdGVyKHYgPT4gdiAmJiB2ICE9PSAn4oCUJykpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNpcmNsZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MubWFwKHIgPT4gci5jaXJjbGUpKTtcclxuICB9XHJcblxyXG4gIGdldCB6b25lcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUpLm1hcChyID0+IHIuem9uZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFvbXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gci5jaXJjbGUgPT09IHRoaXMuY2lyY2xlICYmIHIuem9uZSA9PT0gdGhpcy56b25lKS5tYXAociA9PiByLmFvbSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlUmVhZGluZygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMuc3RvcmVzSW5TY29wZTtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJyk7XHJcbiAgfVxyXG5cclxuICBzZXRNb2R1bGVUYWIodGFiOiAnQXVkaXQnIHwgJ1Rhc2snKTogdm9pZCB7XHJcbiAgICBpZiAodGFiICE9PSB0aGlzLm1vZHVsZVRhYikge1xyXG4gICAgICAvLyBUaGUgZmlyc3QgUGVyZm9ybWFuY2UgdGFibGUgY2hhbmdlcyAoQXVkaXQgLyBUYXNrKSwgc28gaXRzIHNvcnQgc3RhcnRzIG92ZXIuXHJcbiAgICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2R1bGVUYWIgPSB0YWI7XHJcbiAgICBpZiAodGFiID09PSAnVGFzaycgJiYgdGhpcy50YXNrc1N0YWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICB9XHJcblxyXG4gIGdldCBzY29wZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmUgPyB0aGlzLnNjb3BlUm93cy5maW5kKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkKSA9PT0gdGhpcy5zdG9yZSkgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gKHN0b3JlID8gc3RvcmUucmF3Py5zdG9yZU5hbWUgfHwgdGhpcy5zdG9yZSA6IHRoaXMuc3RvcmUpIHx8IHRoaXMuYW9tIHx8IHRoaXMuem9uZSB8fCB0aGlzLmNpcmNsZSB8fCAnQWxsIHN0b3Jlcyc7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaXRUeXBlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLmF1ZGl0VHlwZXMuZmluZCh4ID0+IHgua2V5ID09PSB0aGlzLmF1ZGl0VHlwZSk7XHJcbiAgICByZXR1cm4gdCA/IHQubGFiZWwgOiAnQWxsIEF1ZGl0cyc7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdHVzRmlsdGVyTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2FsbCcpIHsgcmV0dXJuICdBbGwgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuICdQYXNzIHN0b3Jlcyc7IH1cclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJykgeyByZXR1cm4gJ05vdCBzY29yZWQnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09ICdmYWlsJyA/ICdGYWlsIHN0b3JlcycgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbHRlcnMoY2F0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKSBhcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50O1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBjYXQgfHwgdGhpcy5hY3RpdmVDYXQ7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBrZXk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkID0gdGhpcy5kcmFmdDtcclxuICAgIGNvbnN0IHBlcmlvZENoYW5nZWQgPSAhIWQgJiYgKGQuZnJvbSAhPT0gdGhpcy5mcm9tIHx8IGQudG8gIT09IHRoaXMudG8pO1xyXG4gICAgaWYgKGQpIHtcclxuICAgICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55O1xyXG4gICAgICBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50LkRSQUZUX0tFWVMuZm9yRWFjaChrID0+IHsgc2VsZltrXSA9IChkIGFzIGFueSlba107IH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2NvcGVDaGFuZ2VkID0gdGhpcy5jb21taXRTY29wZSgpO1xyXG4gICAgdGhpcy5kcmFmdCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKHBlcmlvZENoYW5nZWQgfHwgc2NvcGVDaGFuZ2VkKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICAgIC8vIFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIHN0b3JlIGxpc3QsIHNvIHNob3cgaXQuXHJcbiAgICBpZiAodGhpcy5iYW5kRmlsdGVyQWN0aXZlIHx8IHRoaXMuc3RhdHVzICE9PSAnYWxsJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZC1zdG9yZS1saXN0Jyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSB0aGUgZHJhd2VyJ3MgaGllcmFyY2h5ICsgYXVkaXQgdHlwZSB0aGUgbG9hZGVkIG9uZXM7IHRydWUgd2hlbiB0aGV5IGRpZmZlciBmcm9tIGJlZm9yZS4gKi9cclxuICBwcml2YXRlIGNvbW1pdFNjb3BlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSBhLmNpcmNsZSAhPT0gdGhpcy5jaXJjbGUgfHwgYS56b25lICE9PSB0aGlzLnpvbmUgfHwgYS5hb20gIT09IHRoaXMuYW9tIHx8IGEuc3RvcmUgIT09IHRoaXMuc3RvcmVcclxuICAgICAgfHwgYS5hdWRpdFR5cGUgIT09IHRoaXMuYXVkaXRUeXBlO1xyXG4gICAgdGhpcy5hcHBsaWVkID0geyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiB0aGlzLnN0b3JlLCBhdWRpdFR5cGU6IHRoaXMuYXVkaXRUeXBlIH07XHJcbiAgICByZXR1cm4gY2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8qKiBDYW5jZWwgLyB4IC8gYmFja2Ryb3A6IHRoZSBkcmFmdCBpcyBkcm9wcGVkOyB0aGUgcGFnZSBuZXZlciBjaGFuZ2VkLiAqL1xyXG4gIGNhbmNlbEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBldmVyeSBmaWx0ZXIgdG8gdGhlIGRvY3VtZW50ZWQgZGVmYXVsdHMuICovXHJcbiAgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgdGhpcy5ncmFpbiA9ICdkYXRlJztcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnNjb3JlTWluID0gMDtcclxuICAgIHRoaXMuc2NvcmVNYXggPSAxMDA7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIC8vIFRoZSBjaGlwcycgQ2xlYXIgYWxsIChkcmF3ZXIgY2xvc2VkKSByZWxvYWRzIG5vdzsgaW5zaWRlIHRoZSBkcmF3ZXIsIEFwcGx5IGRvZXMuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4gJiYgdGhpcy5jb21taXRTY29wZSgpKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBDaGFuZ2luZyBhIGxldmVsIGNsZWFycyB0aGUgbGV2ZWxzIGJlbG93IGl0LiAqL1xyXG4gIG9uQ2lyY2xlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b25lID0gJyc7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIG9uWm9uZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25Bb21DaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlIGRyb3Bkb3duOiB0aGUgc3RvcmVzIG9mIHRoZSBwaWNrZWQgQU9NLCBieSBuYW1lICh2YWx1ZSA9IHN0b3JlSWQpLiAqL1xyXG4gIGdldCBzdG9yZVBpY2tPcHRpb25zKCk6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLnNjb3BlUm93c1xyXG4gICAgICAuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgeyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiAnJyB9KSlcclxuICAgICAgLm1hcChyID0+ICh7IHZhbHVlOiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpLCBsYWJlbDogU3RyaW5nKHIucmF3Py5zdG9yZU5hbWUgfHwgJ+KAlCcpIH0pKVxyXG4gICAgICAuZmlsdGVyKG8gPT4gby52YWx1ZSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogJ0FsbCBzdG9yZXMnIH1dLmNvbmNhdChzdG9yZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkcmF3ZXIncyBjdXN0b20gZHJvcGRvd25zIChsaWItYXVkaXQtdjItc2VsZWN0KTogXCJBbGwg4oCmXCIgZmlyc3QsIHRoZW4gdGhlIGxpc3QuICovXHJcbiAgcGlja09wdGlvbnMobGlzdDogc3RyaW5nW10sIGFsbDogc3RyaW5nKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiBhbGwgfV0uY29uY2F0KChsaXN0IHx8IFtdKS5tYXAodiA9PiAoeyB2YWx1ZTogdiwgbGFiZWw6IHYgfSkpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmlyc3QgcGVyZm9ybWFuY2UgdGFiIGlzIG5hbWVkIGFmdGVyIHRoZSBhY3RpdmUgbW9kdWxlLiAqL1xyXG4gIGdldCBwZXJmVGFic0Zvck1vZHVsZSgpOiBBcnJheTwnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYnM7XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiRGlzcGxheSh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRhYiA9PT0gJ0F1ZGl0JyA/IHRoaXMubW9kdWxlVGFiIDogdGFiKSArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZJbmZvVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuICdTdG9yZXMgSW5mbyc7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gJ1VzZXIgSW5mbyc7IH1cclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiArICcgSW5mbyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkNyZWF0ZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJysgQ3JlYXRlICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBpc1Rhc2tNb2R1bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVUYWIgPT09ICdUYXNrJztcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFRhc2tQZXJmKCk6IFRhc2tQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy50YXNrUGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnRhc2tQZXJmLCB0aGlzLnRhc2tTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZUYXNrKF86IG51bWJlciwgcm93OiBUYXNrUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8udGFza0lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCB0cmVuZCBidWNrZXQgZHJpdmVzIHRoZSBoZWFkbGluZSBzY29yZSBhYm92ZSB0aGUgY2hhcnQuICovXHJcbiAgcHJpdmF0ZSBnZXQgZm9jdXNCYXIoKTogVHJlbmRCYXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyByZXR1cm4gdGhpcy5xdWFydGVyVHJlbmQuZmluZChiID0+IGIua2V5ID09PSB0aGlzLnF1YXJ0ZXIpOyB9XHJcbiAgICByZXR1cm4gdGhpcy50cmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcikgfHwgdGhpcy50cmVuZFswXTtcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1Njb3JlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgKyAnJSc7IH1cclxuICAgIC8vIFdpdGggbm8gdHJlbmQgYnVja2V0cywgdGhlIGhlYWRsaW5lIGlzIHRoZSBwZXJpb2QgYXZlcmFnZS5cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyA9PT0gbnVsbCA/ICfigJQnIDogYXZnICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzUGFzc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBpZiAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB7IHJldHVybiBiLnZhbHVlID49IHRoaXMucGFzc01hcms7IH1cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyAhPT0gbnVsbCAmJiBhdmcgPj0gdGhpcy5wYXNzTWFyaztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1N0YXR1cygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBjb25zdCBoYXMgPSAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB8fCB0aGlzLmF2ZXJhZ2VTY29yZSAhPT0gbnVsbDtcclxuICAgIGlmICghaGFzKSB7IHJldHVybiAnTm8gZGF0YSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZvY3VzUGFzc2VkID8gJ1Bhc3MnIDogJ0JlbG93IHBhc3MgbWFyayc7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNMaW5lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBTdWJtaXR0ZWQgYXVkaXRzLCBhcyB0aGUgYmFycyBjb3VudCB0aGVtIChcIjEwIGF1ZGl0c1wiKTsgYXVkaXRlZENvdW50IGNvdW50cyBhdWRpdGVkIHN0b3Jlcy5cclxuICAgIGNvbnN0IG4gPSB0aGlzLmdyYWluID09PSAncXVhcnRlcidcclxuICAgICAgPyAodGhpcy5mb2N1c0Jhcj8uc3VibWl0dGVkID8/IDApXHJcbiAgICAgIDogdGhpcy50cmVuZC5yZWR1Y2UoKHN1bSwgYikgPT4gc3VtICsgKGIuc3VibWl0dGVkIHx8IDApLCAwKTtcclxuICAgIHJldHVybiB0aGlzLnBlcmlvZExhYmVsICsgJyDCtyAnICsgbiArIChuID09PSAxID8gJyBhdWRpdCBjb21wbGV0ZWQnIDogJyBhdWRpdHMgY29tcGxldGVkJylcclxuICAgICAgKyAodGhpcy5zaG93UGFzc01hcmtJbmZvID8gJyDCtyBwYXNzIG1hcmsgJyArIHRoaXMucGFzc01hcmsgKyAnJScgOiAnJyk7XHJcbiAgfVxyXG5cclxuICBzZXRQZXJmVGFiKHRhYjogJ0F1ZGl0JyB8ICdTdG9yZScgfCAnVXNlcicpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlRhYiA9IHRhYjtcclxuICAgIHRoaXMucGVyZlNlYXJjaCA9ICcnO1xyXG4gICAgdGhpcy5wZXJmU29ydEtleSA9ICcnO1xyXG4gICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBpbiB0aGUgb3BlbiBwZXJmb3JtYW5jZSB0YWJsZSBhZnRlciBzZWFyY2ggLyBzb3J0ICh3aGF0IHRoZSBwYWdlciBjb3VudHMpLiAqL1xyXG4gIGdldCBwZXJmVG90YWwoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdBdWRpdCcpIHsgcmV0dXJuIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy5maWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFiID09PSAnU3RvcmUnID8gdGhpcy5maWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkVXNlclBlcmYubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IHBhZ2Ugb2YgYSBwZXJmb3JtYW5jZSB0YWJsZTsgYSBzZWFyY2ggdGhhdCBzaHJpbmtzIHRoZSBsaXN0IHB1bGxzIHRoZSBwYWdlIGJhY2sgaW50byByYW5nZS4gKi9cclxuICBwZXJmUGFnZU9mPFQ+KGxpc3Q6IFRbXSk6IFRbXSB7XHJcbiAgICBjb25zdCBwYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaXN0Lmxlbmd0aCAvIHRoaXMucGVyZlBhZ2VTaXplKSk7XHJcbiAgICBjb25zdCBwYWdlID0gTWF0aC5taW4odGhpcy5wZXJmUGFnZSwgcGFnZXMpO1xyXG4gICAgcmV0dXJuIGxpc3Quc2xpY2UoKHBhZ2UgLSAxKSAqIHRoaXMucGVyZlBhZ2VTaXplLCBwYWdlICogdGhpcy5wZXJmUGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgb25QZXJmUGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSBOdW1iZXIocGFnZSkgfHwgMTtcclxuICB9XHJcblxyXG4gIG9uUGVyZlBhZ2VTaXplKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZVNpemUgPSBOdW1iZXIoc2l6ZSkgfHwgMTA7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBBIG5ldyBzZWFyY2ggc3RhcnRzIG9uIHBhZ2UgMS4gKi9cclxuICBvblBlcmZTZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBQZXJmb3JtYW5jZSBoZWFkZXIgY2xpY2s6IHNvcnQgYnkgdGhhdCBjb2x1bW4sIGFnYWluIHRvIHJldmVyc2UgKHNhbWUgdG9nZ2xlIGFzIHRoZSBzdG9yZSBsaXN0KS4gKi9cclxuICBzb3J0UGVyZihrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGVyZlNvcnRLZXkgPT09IGtleSkge1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gdGhpcy5wZXJmU29ydERpciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGVyZlNvcnRLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMucGVyZlNvcnREaXIgPSAnYXNjJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJvd3MgaW4gdGhlIHBpY2tlZCBjb2x1bW4gb3JkZXIgKHRoZSBBUEkncyBvcmRlciB3aGVuIG5vbmUgaXMgcGlja2VkKS4gTnVtYmVycyBjb21wYXJlIGFzIG51bWJlcnMsIHRleHRcclxuICAgKiBjYXNlLWluc2Vuc2l0aXZlbHk7IGVtcHR5IHZhbHVlcyAoJ+KAlCcpIHN0YXkgYXQgdGhlIGJvdHRvbSBpbiBib3RoIGRpcmVjdGlvbnMsIGFzIGluIHRoZSBzdG9yZSBsaXN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFBlcmZSb3dzPFQ+KHJvd3M6IFRbXSwgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCAocjogVCkgPT4gU29ydFZhbHVlPik6IFRbXSB7XHJcbiAgICBjb25zdCBnZXQgPSB2YWx1ZXNbdGhpcy5wZXJmU29ydEtleV07XHJcbiAgICBpZiAoIWdldCkgeyByZXR1cm4gcm93czsgfVxyXG4gICAgY29uc3QgZGlyID0gdGhpcy5wZXJmU29ydERpciA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICBjb25zdCBlbXB0eSA9ICh2OiBTb3J0VmFsdWUpID0+IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnIHx8IHYgPT09ICfigJQnO1xyXG4gICAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGF2ID0gZ2V0KGEpO1xyXG4gICAgICBjb25zdCBidiA9IGdldChiKTtcclxuICAgICAgaWYgKGVtcHR5KGF2KSB8fCBlbXB0eShidikpIHsgcmV0dXJuIGVtcHR5KGF2KSA9PT0gZW1wdHkoYnYpID8gMCA6IChlbXB0eShhdikgPyAxIDogLTEpOyB9XHJcbiAgICAgIGlmICh0eXBlb2YgYXYgPT09ICdudW1iZXInICYmIHR5cGVvZiBidiA9PT0gJ251bWJlcicpIHsgcmV0dXJuIChhdiAtIGJ2KSAqIGRpcjsgfVxyXG4gICAgICByZXR1cm4gU3RyaW5nKGF2KS5sb2NhbGVDb21wYXJlKFN0cmluZyhidiksIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pICogZGlyO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3VibWl0dGVkIGNvdW50IC0+IHRoZSBHYWxsZXJ5IG9uIHRoaXMgYXVkaXQncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gKi9cclxuICBzdWJtaXR0ZWRQYXJhbXMocm93OiBBdWRpdFBlcmZSb3cpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGF1ZGl0OiBTdHJpbmcocm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB8fCAnJyksXHJcbiAgICAgIGZyb206IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJyxcclxuICAgICAgdG86IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRhc2sgU3VibWl0dGVkIGNvdW50IC0+IHRoZSBHYWxsZXJ5IHdpdGggVHlwZSBUYXNrIG9uIHRoaXMgdGFzaydzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAqL1xyXG4gIHRhc2tTdWJtaXR0ZWRQYXJhbXMocm93OiBUYXNrUGVyZlJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYXVkaXQ6IFN0cmluZyhyb3cucmF3Py50YXNrSWQgfHwgJycpLFxyXG4gICAgICB0eXBlOiAndGFzaycsXHJcbiAgICAgIGZyb206IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJyxcclxuICAgICAgdG86IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIEZsYWdzIGNvdW50OiB0aGUgc2FtZSBHYWxsZXJ5IGxpbmssIG9ubHkgZmxhZ2dlZCBzdWJtaXNzaW9ucyAoP2ZsYWc9MSkuICovXHJcbiAgdGFza0ZsYWdQYXJhbXMocm93OiBUYXNrUGVyZlJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy50YXNrU3VibWl0dGVkUGFyYW1zKHJvdyksIGZsYWc6ICcxJyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXVkaXQgLyBzdG9yZSAvIHVzZXIgZGV0YWlsIGxpbms6IHRoZSBzdWJqZWN0IHBsdXMgdGhlIGRhc2hib2FyZCBwZXJpb2QgKGZyb20gLyB0byksIHNvIHRoZSBkZXRhaWxcclxuICAgKiBwYWdlIHNob3dzIHRoZSBzYW1lIGRheXMgYXMgdGhlIHJvdyBjbGlja2VkLCBub3QgdGhlIGhlYWRlciByYW5nZSAodGhlIGRhc2hib2FyZCBrZWVwcyBpdHMgb3duIHBlcmlvZCkuXHJcbiAgICovXHJcbiAgZGV0YWlsUGFyYW1zKHN1YmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnN1YmplY3QsXHJcbiAgICAgIGZyb206IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJyxcclxuICAgICAgdG86IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcGVyZlRhYkxhYmVsKHRhYjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0YWIgKyAnIFBlcmZvcm1hbmNlJztcclxuICB9XHJcblxyXG4gIGdldCBwZXJmU2VhcmNoUGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuICdTZWFyY2ggYnkgU3RvcmUgTmFtZSc7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gJ1NlYXJjaCBieSBVc2VyIE5hbWUnOyB9XHJcbiAgICByZXR1cm4gJ1NlYXJjaCBieSAnICsgdGhpcy5tb2R1bGVUYWI7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRBdWRpdFBlcmYoKTogQXVkaXRQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy5hdWRpdFBlcmYuZmlsdGVyKHIgPT4gci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5hdWRpdFBlcmYsIHRoaXMuYXVkaXRTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkU3RvcmVQZXJmKCk6IFN0b3JlUGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMuc3RvcmVQZXJmLmZpbHRlcihyID0+IChyLnN0b3JlICsgJyAnICsgci5zdG9yZUlkICsgJyAnICsgci5zcG9jKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMuc3RvcmVQZXJmLCB0aGlzLnN0b3JlU29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFVzZXJQZXJmKCk6IFVzZXJQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy51c2VyUGVyZi5maWx0ZXIociA9PiAoci5uYW1lICsgJyAnICsgci5lbWFpbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnVzZXJQZXJmLCB0aGlzLnVzZXJTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZBdWRpdChfOiBudW1iZXIsIHJvdzogQXVkaXRQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93Lm5hbWU7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlN0b3JlKF86IG51bWJlciwgcm93OiBTdG9yZVBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdG9yZUlkIHx8IHJvdy5zdG9yZTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmVXNlcihfOiBudW1iZXIsIHJvdzogVXNlclBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5lbWFpbDtcclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IE51bWJlcihwYWdlKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBOdW1iZXIoc2l6ZSkgfHwgMTA7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVN0b3JlKF86IG51bWJlciwgcm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0b3JlSWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBmaWx0ZXJDYXRzIC8gYmFuZFJvd3MgYXJlIGdldHRlcnMgdGhhdCBidWlsZCBuZXcgb2JqZWN0cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uLiBXaXRob3V0IGEga2V5XHJcbiAgICogbmdGb3IgcmVidWlsZHMgdGhlaXIgYnV0dG9ucyBvbiBlYWNoIHBhc3MsIGFuZCBhIHBhc3MgYmV0d2VlbiBtb3VzZWRvd24gYW5kIG1vdXNldXAgKHRoZSBoaWVyYXJjaHlcclxuICAgKiBkcm9wZG93biBsaXN0ZW5zIHRvIGRvY3VtZW50Om1vdXNlZG93bikgc3dhbGxvd3MgdGhlIGNsaWNrLlxyXG4gICAqL1xyXG4gIHRyYWNrQnlDYXQoXzogbnVtYmVyLCBjOiBGaWx0ZXJDYXQpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGMua2V5O1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUJhbmQoXzogbnVtYmVyLCBiOiB7IGJhbmQ6IEF1ZGl0QmFuZCB9KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBiLmJhbmQua2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gRXhwb3J0IChjbGllbnQtc2lkZSAueGxzeCBvZiBleGFjdGx5IHRoZSBmaWx0ZXJlZCByb3dzIGFuZCB2aXNpYmxlIGNvbHVtbnMpIC0tLS0gKi9cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZXhwb3J0UGVyaW9kKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mcm9tICsgJ18nICsgdGhpcy50bztcclxuICB9XHJcblxyXG4gIC8qKiBIZWFkZXIgRXhwb3J0OiB0aGUgc3RvcmUgbGlzdCBiZWxvdyB0aGUgZmlsdGVycywgZXZlcnkgZmlsdGVyZWQgcm93IChhbGwgcGFnZXMpLCBpdHMgdmlzaWJsZSBjb2x1bW5zLiAqL1xyXG4gIGV4cG9ydFN0b3JlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmZpbHRlcmVkUm93cztcclxuICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgIXJvd3MubGVuZ3RoKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPEF1ZGl0Um93PltdID0gdGhpcy5oZWFkZXJzLm1hcChoID0+ICh7XHJcbiAgICAgIGhlYWRlcjogaC5sYWJlbCxcclxuICAgICAgdmFsdWU6IChyOiBBdWRpdFJvdykgPT4ge1xyXG4gICAgICAgIGlmIChoLmtleSA9PT0gJ3Njb3JlJykgeyByZXR1cm4gci5zY29yZSA9PT0gbnVsbCA/ICfigJQnIDogci5zY29yZSArICclJzsgfVxyXG4gICAgICAgIGlmIChoLmtleSA9PT0gJ3N0YXR1cycpIHsgcmV0dXJuIHRoaXMuc3RhdHVzTGFiZWwocik7IH1cclxuICAgICAgICByZXR1cm4gcltoLmtleSBhcyBrZXlvZiBBdWRpdFJvd107XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3gocm93cywgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1TdG9yZXMtJyArIHRoaXMuZXhwb3J0UGVyaW9kLCAnU3RvcmUgbGlzdCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvd3Mgb2YgdGhlIGFjdGl2ZSBwZXJmb3JtYW5jZSB0YWIgYWZ0ZXIgaXRzIHNlYXJjaCAod2hhdCB0aGUgXCJUb3RhbFwiIGNvdW50ZXIgc2hvd3MpLiAqL1xyXG4gIGdldCBwZXJmUm93Q291bnQoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuIHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoOyB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHsgcmV0dXJuIHRoaXMuZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMuZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYWN0aXZlIHBlcmZvcm1hbmNlIHRhYiBpcyBzdGlsbCBsb2FkaW5nICh0aGUgVGFzayB0YWJsZSBoYXMgaXRzIG93biBmZWVkKS4gKi9cclxuICBnZXQgcGVyZkxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFiID09PSAnQXVkaXQnICYmIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy50YXNrTG9hZGluZyA6IHRoaXMubG9hZGluZztcclxuICB9XHJcblxyXG4gIC8qKiBQZXJmb3JtYW5jZSBFeHBvcnQ6IHRoZSBhY3RpdmUgdGFiJ3MgZmlsdGVyZWQgbGlzdCB3aXRoIGl0cyB2aXNpYmxlIGNvbHVtbiBoZWFkZXJzIChBY3Rpb24gbGVmdCBvdXQpLiAqL1xyXG4gIGV4cG9ydFBlcmZvcm1hbmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGVyZkxvYWRpbmcgfHwgIXRoaXMucGVyZlJvd0NvdW50KSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgcGVyaW9kID0gdGhpcy5leHBvcnRQZXJpb2Q7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxTdG9yZVBlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBOYW1lJywgdmFsdWU6IHIgPT4gci5zdG9yZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgSUQnLCB2YWx1ZTogciA9PiByLnN0b3JlSWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIFNwb2MnLCB2YWx1ZTogciA9PiByLnNwb2MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRmxhZ3MnLCB2YWx1ZTogciA9PiByLmZsYWdzID8/ICfigJQnIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGV0aW9uICUnLCB2YWx1ZTogciA9PiByLmNvbXBsZXRpb24gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsaWFuY2UgJScsIHZhbHVlOiByID0+IHIuY29tcGxpYW5jZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUGVyZm9ybWFuY2UgJScsIHZhbHVlOiByID0+IHIucGVyZiB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFN0b3JlUGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1TdG9yZS1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnU3RvcmUgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxVc2VyUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1VzZXIgTmFtZScsIHZhbHVlOiByID0+IHIubmFtZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRW1haWwnLCB2YWx1ZTogciA9PiByLmVtYWlsIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCcsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0ZsYWdzJywgdmFsdWU6IHIgPT4gci5mbGFncyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUmVEbycsIHZhbHVlOiByID0+IHIucmVkbyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxldGlvbiAlJywgdmFsdWU6IHIgPT4gci5jb21wbGV0aW9uIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGlhbmNlICUnLCB2YWx1ZTogciA9PiByLmNvbXBsaWFuY2UgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1BlcmZvcm1hbmNlICUnLCB2YWx1ZTogciA9PiByLnBlcmYgfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRVc2VyUGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1Vc2VyLVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdVc2VyIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzVGFza01vZHVsZSkge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48VGFza1BlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdUYXNrIE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1NjaGVkdWxlZCcsIHZhbHVlOiByID0+IHIuc2NoZWR1bGVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb3ZlcmFnZScsIHZhbHVlOiByID0+IHIuY292ZXJhZ2UgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkIFRvJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU3VibWl0dGVkJywgdmFsdWU6IHIgPT4gci5zdWJtaXR0ZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0ZsYWdzJywgdmFsdWU6IHIgPT4gci5mbGFncyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnVGFza3MnLCB2YWx1ZTogciA9PiByLnRhc2tzIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdSZURvJywgdmFsdWU6IHIgPT4gci5yZWRvIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdRdWVzdGlvbiBDb21wbGlhbmNlICUnLCB2YWx1ZTogciA9PiByLmNvbXBsaWFuY2UgfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRUYXNrUGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1UYXNrLVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdUYXNrIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxBdWRpdFBlcmZSb3c+W10gPSBbXHJcbiAgICAgIHsgaGVhZGVyOiAnQXVkaXQgTmFtZScsIHZhbHVlOiByID0+IHIubmFtZSB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkIFRvJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1N1Ym1pdHRlZCcsIHZhbHVlOiByID0+IHIuc3VibWl0dGVkIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnRGlzcHV0ZXMnLCB2YWx1ZTogciA9PiByLmRpc3B1dGVzID8/ICfigJQnIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnUGFzcyBNYXJrJywgdmFsdWU6IHIgPT4gci5wYXNzTWFyayB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Njb3JlJywgdmFsdWU6IHIgPT4gci5zY29yZSB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Jlc3VsdCcsIHZhbHVlOiByID0+IHIucmVzdWx0IH1cclxuICAgIF07XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRBdWRpdFBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtQXVkaXQtUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ0F1ZGl0IFBlcmZvcm1hbmNlJyk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLSBQZXItc3RvcmUgUERGIC0tLS0gKi9cclxuXHJcbiAgLyoqIFRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAodGhlIGRhc2hib2FyZCBBUEkncyBsYXN0VmlzaXRJZCksIGlmIGFueS4gKi9cclxuICBwZGZWaXNpdElkKHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/Lmxhc3RWaXNpdElkID8gU3RyaW5nKHJvdy5yYXcubGFzdFZpc2l0SWQpIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGF1ZGl0IG9mIHRoYXQgbGF0ZXN0IHN1Ym1pc3Npb24gKGxhc3RWaXNpdEF1ZGl0SWQpOiBWaWV3IG9wZW5zIGl0IGluIHRoZSBHYWxsZXJ5LiAnJyB3aXRob3V0IG9uZS4gKi9cclxuICBnYWxsZXJ5QXVkaXRJZChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5sYXN0VmlzaXRBdWRpdElkID8gU3RyaW5nKHJvdy5yYXcubGFzdFZpc2l0QXVkaXRJZCkgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBHYWxsZXJ5J3MgRXhwb3J0IGFzIFBERiAoUE9TVCAvdHJheC9hdWRpdC9nYWxsZXJ5L2Rvd25sb2FkKSBmb3IgdGhpcyBzdG9yZTogdGhlIGF1ZGl0IG9mIGl0cyBsYXRlc3Qgc3VibWlzc2lvblxyXG4gICAqICh0aGUgYXVkaXQgVmlldyBvcGVucyBpbiB0aGUgR2FsbGVyeSksIHRoZSBkYXNoYm9hcmQncyBwZXJpb2QsIGV2ZXJ5IHF1ZXN0aW9uIGFuZCBubyBvdGhlciBmaWx0ZXIuXHJcbiAgICogUXVldWVkLCB0aGVuIGxpc3RlZCB1bmRlciBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzLlxyXG4gICAqL1xyXG4gIGRvd25sb2FkUGRmKHJvdzogQXVkaXRSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IGF1ZGl0SWQgPSB0aGlzLmdhbGxlcnlBdWRpdElkKHJvdyk7XHJcbiAgICBjb25zdCBzdG9yZUlkID0gcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZDtcclxuICAgIGNvbnN0IGtleSA9IGF1ZGl0SWQgKyAnfCcgKyBzdG9yZUlkO1xyXG4gICAgaWYgKCFhdWRpdElkIHx8IHRoaXMucGRmUXVldWVkLmhhcyhrZXkpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5wZGZRdWV1ZWQuYWRkKGtleSk7XHJcbiAgICBjb25zdCBmcm9tRGF0ZSA9IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5RG93bmxvYWQoe1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIHR5cGU6IHRoaXMuaXNUYXNrTW9kdWxlID8gJ3Rhc2snIDogJ2F1ZGl0JyxcclxuICAgICAgc291cmNlQ2hlY2tMaXN0X2lkOiBhdWRpdElkLFxyXG4gICAgICBmcm9tRGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCBmcm9tRGF0ZSxcclxuICAgICAgZmlsZVR5cGU6ICdwZGYnLFxyXG4gICAgICBmaWx0ZXJ0eXBlOiAnQ2x1c3RlcnMnLFxyXG4gICAgICBzdG9yZUlkczogW3N0b3JlSWRdLFxyXG4gICAgICB1c2VyRW1haWxMaXN0OiBbXSxcclxuICAgICAgcXVlc3Rpb25zOiBbXSxcclxuICAgICAgYW5zd2VyVHlwZTogJ2FsbCcsXHJcbiAgICAgIGFwcHJvdmVGaWx0ZXI6ICdhbGwnLFxyXG4gICAgICB2aWV3RmxhZzogZmFsc2UsXHJcbiAgICAgIHZpZXdSZWRvOiBmYWxzZSxcclxuICAgICAgdmlld0Rpc3B1dGVkOiBmYWxzZSxcclxuICAgICAgcHJldmlld1R5cGU6ICdpbWFnZSdcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnBkZlF1ZXVlZC5kZWxldGUoa2V5KTtcclxuICAgICAgICBpZiAocmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgICAnPGRpdj48c3BhbiBjbGFzcz1cIm1lLThcIj5Eb3dubG9hZGluZyB5b3VyIHJlcG9ydHM8L3NwYW4+PGEgaHJlZj1cIm5vdGlmaWNhdGlvbnMvYWxlcnRzP3RhYj1kb3dubG9hZFwiIHN0eWxlPVwiY29sb3I6Izk5YzNmZjsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgY3Vyc29yOnBvaW50ZXJcIj5WaWV3PC9hPjwvZGl2PidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChyZXM/Lm1lc3NhZ2UgfHwgJ0NvdWxkIG5vdCBzdGFydCB0aGUgZXhwb3J0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMucGRmUXVldWVkLmRlbGV0ZShrZXkpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlPy5lcnJvcj8ubWVzc2FnZSB8fCBlPy5lcnJvcj8uZXJyb3IgfHwgJ0NvdWxkIG5vdCBzdGFydCB0aGUgZXhwb3J0Jyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXYyLXBhZ2UgYXVkaXQtZGFzaFwiPlxyXG5cclxuICA8IS0tIFJlZnJlc2ggbGluZSArIG1vZHVsZSBzd2l0Y2ggLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRiLXRvcGxpbmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1yZWZyZXNoXCI+TGFzdCByZWZyZXNoZWQgYXQge3sgbGFzdFJlZnJlc2hlZCB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kdWxlc3dpdGNoXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibW9kdWxldGFiXCIgKm5nRm9yPVwibGV0IHQgb2YgbW9kdWxlVGFic1wiIFtjbGFzcy5tb2R1bGV0YWItb25dPVwibW9kdWxlVGFiID09PSB0XCJcclxuICAgICAgICAoY2xpY2spPVwic2V0TW9kdWxlVGFiKHQpXCI+e3sgdCB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IEFVRElUIFNDT1JFQ0FSRCA9PT09PT09PT09PT0gLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1Rhc2tNb2R1bGVcIj5cclxuXHJcbiAgICA8IS0tIENydW1iLCBzY29wZSB0aXRsZSwgYWN0aW9ucyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZWJhclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGV0ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNydW1iXCI+QXVkaXRzIOKAuiBEYXNoYm9hcmQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGVcIj57eyBzY29wZUxhYmVsIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCI0XCIgeTE9XCI3XCIgeDI9XCIyMFwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiN1wiIHkxPVwiMTJcIiB4Mj1cIjE3XCIgeTI9XCIxMlwiPjwvbGluZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTBcIiB5MT1cIjE3XCIgeDI9XCIxNFwiIHkyPVwiMTdcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRmlsdGVyc1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY291bnRwaWxsXCIgKm5nSWY9XCJmaWx0ZXJDb3VudFwiPnt7IGZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgIWZpbHRlcmVkUm93cy5sZW5ndGhcIlxyXG4gICAgICAgIHRpdGxlPVwiRG93bmxvYWQgdGhlIHN0b3JlIGxpc3QgYmVsb3cgYXMgYW4gRXhjZWwgZmlsZVwiIChjbGljayk9XCJleHBvcnRTdG9yZXMoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0xMiAxNlY0XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRXhwb3J0XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGaWx0ZXIgY2hpcHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItY2hpcHNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1jaGlwXCIgKm5nRm9yPVwibGV0IGMgb2YgZmlsdGVyQ2F0czsgdHJhY2tCeTogdHJhY2tCeUNhdFwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCJcclxuICAgICAgICAoY2xpY2spPVwib3BlbkZpbHRlcnMoYy5rZXkpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGlwLWxhYmVsXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoaXAtdmFsdWVcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1jbGVhcmFsbFwiICpuZ0lmPVwiZmlsdGVyQ291bnRcIiAoY2xpY2spPVwiY2xlYXJBbGwoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBLUEkgdGlsZXMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGIta3Bpc1wiPlxyXG4gICAgICA8IS0tIE9sZCBDaGVja2xpc3Qgc3VtbWFyeSBjYXJkOiBmaWd1cmUgKyBsYWJlbCBpbiB0aGUgZ3JhZGllbnQgc3RyaXAsIG5vdGUgYmVsb3cuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkXCIgKm5nRm9yPVwibGV0IGtwaSBvZiBrcGlzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1oZWFkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWNvdW50XCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGtwaS52YWx1ZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLXRleHRcIj57eyBrcGkubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tbm90ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZ1wiIGNsYXNzPVwiYXYyLW9jYXJkLW5vdGVcIiBbc3R5bGUuY29sb3JdPVwia3BpLm5vdGVDb2xvclwiPnt7IGtwaS5ub3RlIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUcmVuZCArIGRpc3RyaWJ1dGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1kdW9cIj5cclxuICAgICAgPCEtLSBUcmVuZCAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtaGVhZCBkYi1jYXJkLWhlYWQtLXdyYXBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5BdWRpdCBzY29yZSB0cmVuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNlZ1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXNlZy10YWJcIiBbY2xhc3MuaXMtb25dPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZXRHcmFpbigncXVhcnRlcicpXCI+UXVhcnRlcmx5PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItc2VnLXRhYlwiIFtjbGFzcy5pcy1vbl09XCJncmFpbiA9PT0gJ2RhdGUnXCIgKGNsaWNrKT1cInNldEdyYWluKCdkYXRlJylcIj5CeSBkYXRlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWRhdGVyb3dcIiAqbmdJZj1cInNob3dUcmVuZERhdGVQaWNrZXIgJiYgZ3JhaW4gPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1kYXRlcGlja1wiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjJcIiB4Mj1cIjE2XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiOFwiIHkxPVwiMlwiIHgyPVwiOFwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjNcIiB5MT1cIjEwXCIgeDI9XCIyMVwiIHkyPVwiMTBcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IGRiLWRhdGVyYW5nZVwiIG5neERhdGVyYW5nZXBpY2tlck1kIHJlYWRvbmx5IGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFsobmdNb2RlbCldPVwicmFuZ2VcIiBbbG9jYWxlXT1cInBpY2tlckxvY2FsZVwiIFttYXhEYXRlXT1cInRvZGF5XCJcclxuICAgICAgICAgICAgICBbZGF0ZUxpbWl0XT1cIm1heFJhbmdlRGF5c1wiIFtyYW5nZXNdPVwicmFuZ2VzXCIgW3Nob3dDdXN0b21SYW5nZUxhYmVsXT1cInRydWVcIiBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2tlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2VdPVwidHJ1ZVwiIFthdXRvQXBwbHldPVwidHJ1ZVwiIFtzaG93Q2FuY2VsXT1cImZhbHNlXCIgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCJcclxuICAgICAgICAgICAgICAoZGF0ZXNVcGRhdGVkKT1cIm9uUmFuZ2VQaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0cmVuZExvYWRpbmdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdGl0bGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLWJsb2NrIGRiLXNrLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRyZW5kTG9hZGluZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1mb2N1c1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1zY29yZVwiIFtjbGFzcy5pcy1mYWlsXT1cIiFmb2N1c1Bhc3NlZFwiPnt7IGZvY3VzU2NvcmUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWZvY3VzLXBpbGxcIiAqbmdJZj1cInNob3dQYXNzTWFya0luZm9cIiBbY2xhc3MuaXMtcGFzc109XCJmb2N1c1Bhc3NlZFwiIFtjbGFzcy5pcy1mYWlsXT1cIiFmb2N1c1Bhc3NlZFwiPnt7IGZvY3VzU3RhdHVzIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1saW5lXCI+e3sgZm9jdXNMaW5lIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbGVnZW5kXCIgKm5nSWY9XCJzaG93UGFzc01hcmtJbmZvXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWxlZ2VuZC1kYXNoXCI+PC9zcGFuPlBhc3MgbWFyayB7eyBwYXNzTWFyayB9fSVcclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQteVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRvcDowXCI+MTAwJTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6NTAlXCI+NTAlPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRvcDoxMDAlXCI+MCU8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC1hcmVhXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZ3JpZGxpbmVcIiBzdHlsZT1cInRvcDowXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6NTAlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6MTAwJVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1wYXNzbGluZVwiIFtzdHlsZS50b3AuJV09XCIxMDAgLSBwYXNzTWFya1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhcnNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFyLWNvbFwiICpuZ0Zvcj1cImxldCBiYXIgb2YgdHJlbmRCYXJzOyBsZXQgZmlyc3QgPSBmaXJzdDsgbGV0IGxhc3QgPSBsYXN0XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1waWNrYWJsZV09XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cInNlbGVjdFF1YXJ0ZXIoYmFyLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFyLXZhbHVlXCIgKm5nSWY9XCIhZGVuc2VUcmVuZFwiIFtjbGFzcy5pcy1hY3RpdmVdPVwiYmFyLmtleSA9PT0gcXVhcnRlclwiIFtzdHlsZS5ib3R0b21dPVwiYmFySGVpZ2h0KGJhcilcIj5cclxuICAgICAgICAgICAgICAgICAge3sgYmFyLnZhbHVlID09PSBudWxsID8gJ+KAlCcgOiBiYXIudmFsdWUgKyAnJScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFyXCIgW3N0eWxlLmhlaWdodF09XCJiYXJIZWlnaHQoYmFyKVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhckZpbGwoYmFyKVwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwXCIgW2NsYXNzLmlzLXN0YXJ0XT1cImZpcnN0ICYmICFsYXN0XCIgW2NsYXNzLmlzLWVuZF09XCJsYXN0ICYmICFmaXJzdFwiIFtzdHlsZS5ib3R0b21dPVwidGlwQm90dG9tKGJhcilcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1oZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgYmFyLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJkYi10aXAtc3ViXCIgKm5nSWY9XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+IMK3IHt7IHF1YXJ0ZXJNb250aHMoYmFyLmtleSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXNjb3JlXCIgKm5nSWY9XCJiYXIudmFsdWUgIT09IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRpcC1kb3RcIiBbY2xhc3MuaXMtZmFpbF09XCJiYXIudmFsdWUgPCBwYXNzTWFya1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRpcC12YWx1ZVwiPnt7IGJhci52YWx1ZSB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtc3RhdHVzXCIgKm5nSWY9XCJzaG93UGFzc01hcmtJbmZvXCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgcGFzc01hcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGJhci52YWx1ZSA+PSBwYXNzTWFyayA/ICdQYXNzJyA6ICdCZWxvdyBwYXNzIG1hcmsnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1lbXB0eVwiICpuZ0lmPVwiYmFyLnZhbHVlID09PSBudWxsXCI+Tm8gc2NvcmVkIGF1ZGl0czwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiPjxzcGFuPkF1ZGl0cyBjb21wbGV0ZWQ8L3NwYW4+PGI+e3sgYmFyLnN1Ym1pdHRlZCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIiAqbmdJZj1cImJhci5jb3VudCAhPT0gYmFyLnN1Ym1pdHRlZFwiPjxzcGFuPlNjb3JlZCBhdWRpdHM8L3NwYW4+PGI+e3sgYmFyLmNvdW50IH19PC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiPjxzcGFuPlBhc3MgbWFyazwvc3Bhbj48Yj57eyBwYXNzTWFyayB9fSU8L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEEgbW9udGggYnkgZGF0ZSBoYXMgfjMwIGJhcnM6IGV2ZXJ5IGZldyBkYXlzIGdldCBhIGxhYmVsIChmaXJzdCBhbmQgbGFzdCBhbHdheXMpLCBhbmQgdGhlIGF1ZGl0IGNvdW50c1xyXG4gICAgICAgICAgICAgbW92ZSB0byB0aGUgYmFyIHRvb2x0aXAsIHNvIHRoZSBsYWJlbHMgbmV2ZXIgcnVuIGludG8gZWFjaCBvdGhlci4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXhcIiBbY2xhc3MuaXMtZGVuc2VdPVwiZGVuc2VUcmVuZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGFydC14Y29sXCIgKm5nRm9yPVwibGV0IGJhciBvZiB0cmVuZEJhcnM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtjbGFzcy5pcy1waWNrYWJsZV09XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cInNlbGVjdFF1YXJ0ZXIoYmFyLmtleSlcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGFydC14bGFiZWxcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImJhci5rZXkgPT09IHF1YXJ0ZXJcIiBbc3R5bGUudmlzaWJpbGl0eV09XCJzaG93WExhYmVsKGksIGxhc3QpID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIj57eyBiYXIubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGNvdW50XCIgKm5nSWY9XCIhZGVuc2VUcmVuZFwiPnt7IGJhci5zdWJtaXR0ZWQgPyBiYXIuc3VibWl0dGVkICsgJyBhdWRpdHMnIDogJ25vIGF1ZGl0cycgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gU2NvcmUgYmFuZHMgLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZCBkYi1jYXJkLS10aWdodFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLWhlYWQgZGItY2FyZC1oZWFkLS1iYXNlbGluZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGUgZGItY2FyZC10aXRsZS0tZ3Jvd1wiPlNjb3JlIGRpc3RyaWJ1dGlvbjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+e3sgc3RvcmVzSW5TY29wZSB9fSBpbiBzY29wZTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPlN0b3JlcyBieSBzY29yZSBiYW5kLCB7eyBwZXJpb2RMYWJlbCB9fTwvZGl2PlxyXG5cclxuICAgICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCIgW3Jvd3NdPVwiMlwiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kYmFyXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPCEtLSBBIGJhbmQgd2l0aCBzdG9yZXMga2VlcHMgYSB2aXNpYmxlIHNsaXZlciAoMiBvZiAzNTc2IHN0b3JlcyBpcyB1bmRlciBhIHBpeGVsKTsgdGhlIGxhcmdlc3QgYmFuZCBnaXZlcyB3YXkuIC0tPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kc2VnXCIgKm5nRm9yPVwibGV0IGIgb2YgYmFuZFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlCYW5kXCIgW3N0eWxlLndpZHRoXT1cImIud2lkdGhcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5oYXMtc3RvcmVzXT1cImIuY291bnQgPiAwXCIgW3RpdGxlXT1cImIuYmFuZC5sYWJlbCArICc6ICcgKyBiLmNvdW50XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZHJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZHJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kbGFiZWxcIj57eyBiLmJhbmQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHJhbmdlXCI+e3sgYi5iYW5kLnJhbmdlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRjb3VudFwiPnt7IGIuY291bnQgfX0ge3sgYi5jb3VudCA9PT0gMSA/ICdzdG9yZScgOiAnc3RvcmVzJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kc2hhcmVcIj57eyBiLnNoYXJlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzdG9yZUxpc3RPcGVuICYmIGxpc3RCYW5kS2V5ID09PSBiLmJhbmQua2V5XCIgKGNsaWNrKT1cImFwcGx5QmFuZChiLmJhbmQpXCI+VmlldyBzdG9yZXM8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGhpbnRcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFzaG93U3RvcmVMaXN0XCI+Q2xpY2sgPGI+VmlldyBzdG9yZXM8L2I+IG9uIGEgYmFuZCB0byBsaXN0IGl0cyBzdG9yZXMuPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgbGVkZ2VyOiBvcGVuZWQgZnJvbSBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXMgKG9yIGEgRmlsdGVycyBzY29yZSByYW5nZSkgLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGFibGVcIiBpZD1cImFkLXN0b3JlLWxpc3RcIiAqbmdJZj1cInNob3dTdG9yZUxpc3RcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZGdlci1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZGdlci10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZVwiPlN0b3JlIGxpc3Q8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPlxyXG4gICAgICAgICAgICB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoIH19IHt7IGZpbHRlcmVkUm93cy5sZW5ndGggPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX0gwrcge3sgcGVyaW9kTGFiZWwgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggZGItc2VhcmNoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwic2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmUgb3Igb3duZXJcIlxyXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlZ21lbnRlZFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2FsbCdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdhbGwnKVwiPkFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2ZhaWwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnZmFpbCcpXCI+RmFpbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ3Bhc3MnXCIgKGNsaWNrKT1cInNldFN0YXR1cygncGFzcycpXCI+UGFzczwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ25hJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ25hJylcIj5Ob3QgYXVkaXRlZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXRhYmxlXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGggb2YgaGVhZGVyc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInNvcnRLZXkgPT09IGgua2V5XCIgKGNsaWNrKT1cInNvcnRCeShoLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIHt7IGgubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSBoLmtleVwiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj5cclxuICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZVJvd3M7IHRyYWNrQnk6IHRyYWNrQnlTdG9yZVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW5vd3JhcFwiPnt7IHJvdy5kYXRlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXN0b3JlaWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiPnt7IHJvdy5zdG9yZUlkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LmNpcmNsZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LnpvbmUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy5hb20gfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBbY2xhc3MuYXYyLWZhaW50XT1cIiFyb3cuYXVkaXRzXCI+e3sgcm93LmF1ZGl0cyB8fCAn4oCUJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1waWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFuZEZvcihyb3cpLmJnXCIgW3N0eWxlLmNvbG9yXT1cImJhbmRGb3Iocm93KS5mZ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyByb3cuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHJvdy5zY29yZSArICclJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1waWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFuZEZvcihyb3cpLmJnXCIgW3N0eWxlLmNvbG9yXT1cImJhbmRGb3Iocm93KS5mZ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdGF0dXNMYWJlbChyb3cpIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFZpZXcgb3BlbnMgdGhlIEdhbGxlcnkgb24gdGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kIChRQSAxMSBPY3QpOyBhIHN0b3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBubyBzdWJtaXNzaW9uIHRoZXJlIG9wZW5zIGl0cyBhdWRpdCBkZXRhaWwgaW5zdGVhZCAoc2FtZSBhcyB0aGUgc3RvcmUgbGluaykuIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXZpZXdidG5cIiAqbmdJZj1cImdhbGxlcnlBdWRpdElkKHJvdykgYXMgYXVkaXRJZFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGF1ZGl0OiBhdWRpdElkLCBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiIHRpdGxlPVwiVmlldyB0aGlzIHN0b3JlJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIEdhbGxlcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXZpZXdidG5cIiAqbmdJZj1cIiFnYWxsZXJ5QXVkaXRJZChyb3cpXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiIHRpdGxlPVwiVmlldyB0aGlzIHN0b3JlJ3MgYXVkaXRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgR2FsbGVyeSdzIEV4cG9ydCBhcyBQREYgZm9yIHRoaXMgc3RvcmUncyBhdWRpdCBpbiB0aGUgcGVyaW9kIChxdWV1ZWQsIHRoZW4gdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2FkcykuIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXBkZmJ0blwiIHJvbGU9XCJidXR0b25cIiBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiIWdhbGxlcnlBdWRpdElkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWdhbGxlcnlBdWRpdElkKHJvdylcIiAoY2xpY2spPVwiZG93bmxvYWRQZGYocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdhbGxlcnlBdWRpdElkKHJvdykgPyAnRXhwb3J0IHRoaXMgc3RvcmVcXCdzIHN1Ym1pc3Npb25zIGFzIFBERiAoc2FtZSBhcyB0aGUgR2FsbGVyeVxcJ3MgRXhwb3J0IGFzIFBERiknIDogJ05vIHN1Ym1pdHRlZCBhdWRpdCBmb3IgdGhpcyBzdG9yZSBpbiB0aGlzIHBlcmlvZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDR2MTJcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyAxMSAxMiAxNiAxNyAxMVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgMjBoMTZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFwYWdlUm93cy5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPk5vIHN0b3JlcyBtYXRjaCB0aGUgY3VycmVudCBmaWx0ZXJzLjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gU2hhcmVkIHBhZ2VyICgxMCAvIDIwIC8gMzApLCBhcyBvbiB0aGUgb3RoZXIgYXVkaXQgbGlzdHMuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi1wYWdlclwiICpuZ0lmPVwiZmlsdGVyZWRSb3dzLmxlbmd0aFwiPlxyXG4gICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdlU2l6ZXNcIlxyXG4gICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VcIiBbdG90YWxJdGVtc109XCJmaWx0ZXJlZFJvd3MubGVuZ3RoXCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvc2VjdGlvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gVEFTSyBTVU1NQVJZID09PT09PT09PT09PSAtLT5cclxuICA8IS0tIFRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzLCBpbiB0aGUgaGVhZGVyIHNjb3BlIChzaGltbWVyIHZhbHVlcyB3aGlsZSBsb2FkaW5nKS4gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRiLXN0YXRzXCIgKm5nSWY9XCJpc1Rhc2tNb2R1bGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5hY3RpdmVUYXNrcyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWxhYmVsXCI+QWN0aXZlIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJvZHlcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMudGFza0luc3RhbmNlcyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj57eyBtb2R1bGVUYWIgfX0gSW5zdGFuY2VzPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJpZ1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLm5vdFN1Ym1pdHRlZCB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWxhYmVsXCI+Tm90IFN1Ym1pdHRlZCB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5IGRiLXN0YXQtYm9keS0tMlwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5vcGVuVGFza3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+T3BlbiB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmluUHJvZ3Jlc3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+SW4gUHJvZ3Jlc3Mge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5zdWJtaXR0ZWQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPlN1Ym1pdHRlZCB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5IGRiLXN0YXQtYm9keS0tM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWNlbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmNvbXBsZXRpb25TY29yZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Db21wbGV0aW9uIFNjb3JlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1kZWx0YVwiICpuZ0lmPVwiIXRhc2tMb2FkaW5nICYmIHRhc2tTdGF0cy5jb21wbGV0aW9uRGVsdGFcIiBbbmdDbGFzc109XCJ0YXNrRGVsdGFDbGFzcygnY29tcGxldGlvbicpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5jb21wbGV0aW9uRGVsdGEgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWNlbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmNvbXBsaWFuY2VTY29yZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Db21wbGlhbmNlIFNjb3JlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1kZWx0YVwiICpuZ0lmPVwiIXRhc2tMb2FkaW5nICYmIHRhc2tTdGF0cy5jb21wbGlhbmNlRGVsdGFcIiBbbmdDbGFzc109XCJ0YXNrRGVsdGFDbGFzcygnY29tcGxpYW5jZScpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5jb21wbGlhbmNlRGVsdGEgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWNlbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZCBpcy11bmRlcmxpbmVcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy50b3RhbEZsYWdzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPlRvdGFsIEZsYWdzPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1kZWx0YVwiICpuZ0lmPVwiIXRhc2tMb2FkaW5nICYmIHRhc2tTdGF0cy5mbGFnc0RlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2ZsYWdzJylcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI0IDYgMTAgMTIgMTQgOCAyMCAxNlwiPjwvcG9seWxpbmU+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDE2IDIwIDE2IDIwIDExXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgdGFza1N0YXRzLmZsYWdzRGVsdGEgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBQRVJGT1JNQU5DRSA9PT09PT09PT09PT0gLS0+XHJcbiAgPCEtLSBUYXNrIG1vZGUgYWx3YXlzIHNob3dzIGl0cyBUYXNrIEluZm8gdGFibGU7IHRoZSByZXN0IG9mIFBlcmZvcm1hbmNlIGZvbGxvd3Mgc2hvd1BlcmZvcm1hbmNlLiAtLT5cclxuICA8c2VjdGlvbiBjbGFzcz1cImRiLXBlcmZcIiAqbmdJZj1cInNob3dQZXJmb3JtYW5jZSB8fCBpc1Rhc2tNb2R1bGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmdGFic1wiICpuZ0lmPVwic2hvd1BlcmZvcm1hbmNlXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItcGVyZnRhYlwiICpuZ0Zvcj1cImxldCB0IG9mIHBlcmZUYWJzXCIgW2NsYXNzLmlzLW9uXT1cInBlcmZUYWIgPT09IHRcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRQZXJmVGFiKHQpXCI+e3sgcGVyZlRhYkRpc3BsYXkodCkgfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLWhlYWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtdGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXRpdGxlXCI+XHJcbiAgICAgICAgICB7eyBwZXJmSW5mb1RpdGxlIH19XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRvdGFsXCI+XHJcbiAgICAgICAgICAgIHt7IHBlcmZUYWIgPT09ICdBdWRpdCcgPyAoaXNUYXNrTW9kdWxlID8gZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiBmaWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGgpIDogKHBlcmZUYWIgPT09ICdTdG9yZScgPyBmaWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGggOiBmaWx0ZXJlZFVzZXJQZXJmLmxlbmd0aCkgfX0gVG90YWxcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj57eyBwZXJmUGVyaW9kIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBkYi1wZXJmLXNlYXJjaFwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwZXJmU2VhcmNoUGxhY2Vob2xkZXJcIiBbKG5nTW9kZWwpXT1cInBlcmZTZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvblBlcmZTZWFyY2goKVwiPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiBbZGlzYWJsZWRdPVwicGVyZkxvYWRpbmcgfHwgIXBlcmZSb3dDb3VudFwiXHJcbiAgICAgICAgdGl0bGU9XCJEb3dubG9hZCB0aGlzIHRhYmxlIGFzIGFuIEV4Y2VsIGZpbGVcIiAoY2xpY2spPVwiZXhwb3J0UGVyZm9ybWFuY2UoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0xMiAxNlY0XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRXhwb3J0XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gZGItY3JlYXRlXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmICFpc1Rhc2tNb2R1bGUgJiYgYWNjZXNzLmNhbkFkZFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgNXYxNE01IDEyaDE0XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgIHt7IHBlcmZDcmVhdGVMYWJlbCB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPCEtLSBUYXNrIG1vZGU6IENyZWF0ZSBUYXNrIG9wZW5zIE1hbmFnZSAtPiBUYXNrICh0YXNrIGFkZCBwZXJtaXNzaW9uKS4gLS0+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBkYi1jcmVhdGVcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgaXNUYXNrTW9kdWxlICYmIGFjY2Vzcy5jYW5BZGRUYXNrXCJcclxuICAgICAgICByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZVwiIFtxdWVyeVBhcmFtc109XCJ7IG1vZHVsZTogJ3Rhc2snIH1cIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0xMiA1djE0TTUgMTJoMTRcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgQ3JlYXRlIFRhc2tcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJwZXJmTG9hZGluZ1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwZXJmTG9hZGluZ1wiPlxyXG4gICAgPCEtLSBBdWRpdCBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiAhaXNUYXNrTW9kdWxlXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLWF1ZGl0XCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgYXVkaXRQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRBdWRpdFBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZkF1ZGl0XCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1hdmF0YXJcIj57eyByb3cuaW5pdGlhbHMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB9KVwiPnt7IHJvdy5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIGF1ZGl0J3MgZGV0YWlsIHBhZ2UgKGFzIHRoZSBleWUgZG9lcykgb24gaXRzIHN1Ym1pdHRlZCB2aXNpdHMsIGFzIHRoZSB2MSBDaGVja2xpc3QgZGFzaGJvYXJkIGRpZC4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuc3VibWl0dGVkXCIgY2xhc3M9XCJkYi11bGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCwgc3RhdHVzOiAnc3VibWl0JyB9KVwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlZpZXcgdGhlIHN1Ym1pdHRlZCB2aXNpdHNcIj57eyByb3cuc3VibWl0dGVkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJvdy5zdWJtaXR0ZWRcIj4wPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8IS0tIFN0b3JlIGRpc3B1dGVzIChxdWVzdGlvbnMpIGluIHRoZSBwZXJpb2QsIGFzIGEgcGxhaW4gY291bnQgKFFBIDEwIE9jdDogbm8gbGluaykuIC0tPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuZGlzcHV0ZXMgPT09IG51bGxcIiBjbGFzcz1cImF2Mi1mYWludFwiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5kaXNwdXRlcyAhPT0gbnVsbFwiPnt7IHJvdy5kaXNwdXRlcyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5wYXNzTWFyayB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnNjb3JlID09PSAn4oCUJ1wiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwicm93LnNjb3JlID09PSAn4oCUJyA/ICdDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhpcyBhdWRpdCcgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10cmFjayBkYi10cmFjay0tNlwiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuc2NvcmVQY3QpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnIzEyQjc2QScgOiAnI0YwNDQzOCdcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHRcIj57eyByb3cuc2NvcmUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5yZXN1bHQgIT09ICfigJQnXCIgY2xhc3M9XCJkYi1waWxsIGRiLXBpbGwtLXN0cm9uZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjRUNGREYzJyA6ICcjRkVGM0YyJ1wiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyMwMjdBNDgnIDogJyNCNDIzMTgnXCI+e3sgcm93LnJlc3VsdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5yZXN1bHQgPT09ICfigJQnXCIgY2xhc3M9XCJhdjItZmFpbnRcIiB0aXRsZT1cIkNvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGlzIGF1ZGl0XCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgYXVkaXRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIGF1ZGl0IG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIEF1ZGl0IFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRhc2sgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgaXNUYXNrTW9kdWxlXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXRhc2tcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiB0YXNrUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkVGFza1BlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlRhc2tcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWF2YXRhclwiPnt7IHJvdy5pbml0aWFscyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIFt0aXRsZV09XCJyb3cucmF3Py5hdWRpdE5hbWUgPyAnUmFpc2VkIGZyb20gJyArIHJvdy5yYXcuYXVkaXROYW1lIDogJydcIj57eyByb3cubmFtZSB9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5zY2hlZHVsZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1tZWRpdW1cIj57eyByb3cuY292ZXJhZ2UgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIEdhbGxlcnkgKFR5cGUgVGFzaykgb24gdGhpcyB0YXNrJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuIC0tPlxyXG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwicm93LnN1Ym1pdHRlZCAmJiByb3cucmF3Py50YXNrSWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJ0YXNrU3VibWl0dGVkUGFyYW1zKHJvdylcIiB0aXRsZT1cIlZpZXcgdGhlIHN1Ym1pdHRlZCB0YXNrcyBpbiB0aGUgR2FsbGVyeVwiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZCB8fCAhcm93LnJhdz8udGFza0lkXCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gQSBjb3VudCBvcGVucyB0aGUgR2FsbGVyeSAoVHlwZSBUYXNrKSBvbiB0aGlzIHRhc2sncyBmbGFnZ2VkIHN1Ym1pc3Npb25zOyAwIGlzIHBsYWluIHRleHQsIGFzIFN1Ym1pdHRlZC4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuZmxhZ3MgJiYgcm93LnJhdz8udGFza0lkXCIgY2xhc3M9XCJkYi11bGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwidGFza0ZsYWdQYXJhbXMocm93KVwiIHRpdGxlPVwiVmlldyB0aGUgZmxhZ2dlZCB0YXNrcyBpbiB0aGUgR2FsbGVyeVwiPnt7IHJvdy5mbGFncyB9fTwvYT5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3cuZmxhZ3MgfHwgIXJvdy5yYXc/LnRhc2tJZFwiPnt7IHJvdy5mbGFncyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWZhaW50XCI+e3sgcm93LnRhc2tzIH19PC90ZD5cclxuICAgICAgICAgICAgPCEtLSBUaGUgR2FsbGVyeSBoYXMgbm8gcmVkbyBmaWx0ZXIgdG8gb3Blbiwgc28gUmVEbyBpcyBwbGFpbiB0ZXh0LiAtLT5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5yZWRvIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdHJhY2sgZGItdHJhY2stLTZcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsaWFuY2VQY3QpXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0XCI+e3sgcm93LmNvbXBsaWFuY2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8IS0tIE9wZW5zIHRoZSBhdWRpdCB0aGUgdGFzayB3YXMgcmFpc2VkIGZyb20uIC0tPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHRoZSBhdWRpdCB0aGlzIHRhc2sgd2FzIHJhaXNlZCBmcm9tXCJcclxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJvdy5yYXc/LmF1ZGl0SWQgPyAnL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uYXVkaXRJZCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkVGFza1BlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj5ObyB0YXNrcyByYWlzZWQgZnJvbSBhdWRpdHMgaW4gdGhpcyBwZXJpb2QuPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ1N0b3JlJ1wiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS1zdG9yZVwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHN0b3JlUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkU3RvcmVQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZTdG9yZVwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5zdG9yZUlkIHx8IHJvdy5zdG9yZSB9KVwiPnt7IHJvdy5zdG9yZSB9fTwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzIGF2Mi1kaW1cIiBbYXYyVGlwXT1cInJvdy5zdG9yZUlkXCI+e3sgcm93LnN0b3JlSWQgfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiPnt7IHJvdy5zcG9jIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgPz8gJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGV0aW9uID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsZXRpb24pXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsZXRpb24gfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnBlcmYgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cucGVyZilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cucGVyZiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgc3RvcmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyBzdG9yZSBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBTdG9yZSBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBVc2VyIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnVXNlcidcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tdXNlclwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHVzZXJQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRVc2VyUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmVXNlclwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj48YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC91c2VyXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGVtYWlsOiByb3cuZW1haWwgfSlcIj57eyByb3cubmFtZSB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiPnt7IHJvdy5lbWFpbCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmZsYWdzIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5yZWRvIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxldGlvbiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGV0aW9uKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGV0aW9uIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZSlcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5wZXJmID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnBlcmYpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LnBlcmYgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHVzZXJcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC91c2VyXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGVtYWlsOiByb3cuZW1haWwgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFVzZXJQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gdXNlciBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBVc2VyIFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXBhZ2VyXCIgKm5nSWY9XCJwZXJmVG90YWxcIj5cclxuICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGVyZlBhZ2VTaXplXCIgW3BhZ2VTaXplXT1cInBlcmZQYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGVyZlBhZ2VTaXplc1wiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBlcmZQYWdlXCIgW3RvdGFsSXRlbXNdPVwicGVyZlRvdGFsXCIgKHBhZ2VDaGFuZ2UpPVwib25QZXJmUGFnZSgkZXZlbnQpXCJcclxuICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QZXJmUGFnZVNpemUoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvc2VjdGlvbj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gRklMVEVSIERSQVdFUiA9PT09PT09PT09PT0gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1iYWNrZHJvcFwiICpuZ0lmPVwiZmlsdGVyc09wZW5cIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+PC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItZHJhd2VyXCIgKm5nSWY9XCJmaWx0ZXJzT3BlbiAmJiBkcmFmdCBhcyBkclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1oZWFkXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZHJhd2VyLXRpdGxlXCI+RmlsdGVyczwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jb3VudHBpbGxcIiAqbmdJZj1cImRyLmZpbHRlckNvdW50XCI+e3sgZHIuZmlsdGVyQ291bnQgfX08L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlYnRuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItYm9keVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLW5hdlwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBkci5maWx0ZXJDYXRzOyB0cmFja0J5OiB0cmFja0J5Q2F0XCIgW2NsYXNzLm5hdml0ZW0tYWN0aXZlXT1cImFjdGl2ZUNhdCA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdChjLmtleSlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGV4dFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRpdGxlXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ2YWx1ZVwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHlkb3RcIiAqbmdJZj1cImMuZGlydHlcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1wYW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGRyLmFjdGl2ZUNhdE9iai50aXRsZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5laGludFwiPnt7IGRyLmFjdGl2ZUNhdE9iai5zdWIgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBQZXJpb2QgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3BlcmlvZCdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwiZHIuc2V0R3JhaW4oJ3F1YXJ0ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5RdWFydGVybHk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5SZWFkIG9uZSBmaW5hbmNpYWwgcXVhcnRlciAoQXByaWzigJNNYXJjaCB5ZWFyKSBhdCBhIHRpbWUuPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCIgKGNsaWNrKT1cImRyLnNldEdyYWluKCdkYXRlJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdkYXRlJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+QnkgZGF0ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPnt7IHNob3dEcmF3ZXJEYXRlUmFuZ2UgPyAnUGljayBhIGN1c3RvbSBzdGFydCBhbmQgZW5kIGRhdGUuJyA6ICdVc2UgdGhlIGhlYWRlciBkYXRlIHJhbmdlLicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImRyLmdyYWluID09PSAncXVhcnRlcidcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgcSBvZiBkci5xdWFydGVyc1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIucXVhcnRlciA9PT0gcVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRyLnNlbGVjdFF1YXJ0ZXIocSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5xdWFydGVyID09PSBxXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIucXVhcnRlciA9PT0gcVwiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgcSB9fSDCtyB7eyBxdWFydGVyTW9udGhzKHEpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWZpZWxkc1wiICpuZ0lmPVwic2hvd0RyYXdlckRhdGVSYW5nZSAmJiBkci5ncmFpbiA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EYXRlIHJhbmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2sgYXYyLWRhdGVwaWNrLS1jb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IGRiLWRhdGVyYW5nZSBkYi1kYXRlcmFuZ2UtLWZpZWxkXCIgbmd4RGF0ZXJhbmdlcGlja2VyTWQgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFsobmdNb2RlbCldPVwiZHIucmFuZ2VcIiBbbG9jYWxlXT1cInBpY2tlckxvY2FsZVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cInRvZGF5XCIgW2RhdGVMaW1pdF09XCJtYXhSYW5nZURheXNcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidyaWdodCdcIiAoZGF0ZXNVcGRhdGVkKT1cImRyLm9uUmFuZ2VQaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFNjb3BlIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdzY29wZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXN0YWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5DaXJjbGUgSGVhZCA8c3BhbiBjbGFzcz1cImZpZWxkLW1ldGFcIj57eyBkci5jaXJjbGVzLmxlbmd0aCB9fSB1c2Vyczwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLmNpcmNsZVwiIChuZ01vZGVsQ2hhbmdlKT1cImRyLm9uQ2lyY2xlQ2hhbmdlKClcIiBbb3B0aW9uc109XCJkci5waWNrT3B0aW9ucyhkci5jaXJjbGVzLCAnQWxsIENpcmNsZXMnKVwiIGFyaWFMYWJlbD1cIkNpcmNsZVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiICpuZ0lmPVwiZHIuY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlpvbmUgTWFuYWdlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuem9uZVwiIChuZ01vZGVsQ2hhbmdlKT1cImRyLm9uWm9uZUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuem9uZXMsICdBbGwgem9uZXMnKVwiIGFyaWFMYWJlbD1cIlpvbmVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLnpvbmVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QU9NPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5hb21cIiAobmdNb2RlbENoYW5nZSk9XCJkci5vbkFvbUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuYW9tcywgJ0FsbCBBT01zJylcIiBhcmlhTGFiZWw9XCJBT01cIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLmFvbVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TdG9yZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuc3RvcmVcIiBbb3B0aW9uc109XCJkci5zdG9yZVBpY2tPcHRpb25zXCIgYXJpYUxhYmVsPVwiU3RvcmVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVhZGluZ3Jvd1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVhZGluZ2xhYmVsXCI+UmVhZGluZzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYWRpbmd2YWx1ZVwiPnt7IGRyLnNjb3BlUmVhZGluZyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1ncm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItYmFuZGxpbmtcIiAoY2xpY2spPVwiZHIucmVzZXRTY29wZSgpXCI+UmVzZXQgdG8gYWxsIGNpcmNsZXM8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gQXVkaXQgdHlwZSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICd0eXBlJ1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgdCBvZiBhdWRpdFR5cGVzXCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImRyLmF1ZGl0VHlwZSA9IHQua2V5XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdHRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgdC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdG1ldGFcIj57eyB0LmhlbHAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNjb3JlIGJhbmQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnYmFuZCdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IGIgb2YgZHIuYmFuZFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlCYW5kXCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5pc0JhbmRPbihiLmJhbmQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImRyLmFwcGx5QmFuZChiLmJhbmQpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImIuYmFuZC5zb2Z0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdHRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgYi5iYW5kLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bWV0YVwiPnt7IGIuYmFuZC5yYW5nZSB9fSDCtyB7eyBiLmNvdW50IH19IHN0b3Jlczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc20gcGFuZS1yZXNldGJ0blwiIChjbGljayk9XCJkci5jbGVhckJhbmQoKVwiPkFsbCBzY29yZXM8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnc3RhdHVzJ1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ2FsbCdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdhbGwnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdhbGwnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ2FsbCdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPkFsbCBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdmYWlsJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ2ZhaWwnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdmYWlsJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdmYWlsJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+RmFpbDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ3Bhc3MnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygncGFzcycpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ3Bhc3MnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ3Bhc3MnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5QYXNzPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnbmEnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnbmEnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICduYSdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnbmEnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5Ob3QgYXVkaXRlZDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiZHIuY2xlYXJBbGwoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS13aWRlXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCI+QXBwbHkgZmlsdGVyczwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuIl19