tango-app-ui-manage-billing 3.3.30 → 3.3.32

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.
@@ -848,10 +848,10 @@ export class BrandInvoicesComponent {
848
848
  this.router.navigate(['/manage/billing']);
849
849
  }
850
850
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandInvoicesComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.GlobalStateService }, { token: i4.PageInfoService }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
851
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandInvoicesComponent, selector: "lib-brand-invoices", ngImport: i0, template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n </div>\n\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <!-- Pending Approval is internal pipeline \u2014 hidden for client login.\n Pending Payment + Paid are shown to clients. -->\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"!isClient\">\n <span class=\"status-dot dot-warning\"></span>\n <span class=\"status-text\">{{ pendingApproval }} Pending Approval</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-primary\"></span>\n <span class=\"status-text\">{{ pendingPayment }} Pending Payment</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-success\"></span>\n <span class=\"status-text\">{{ paid }} Paid</span>\n </div>\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"invoiceNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 editing is disabled' : 'Edit Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && deleteInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 delete is disabled' : 'Delete Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td colspan=\"4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td *ngIf=\"!isClient\"></td>\n </tr>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i8.EstimatesComponent, selector: "lib-estimates", inputs: ["clientId"] }, { kind: "component", type: i9.DailyPricingComponent, selector: "lib-daily-pricing", inputs: ["clientId"] }, { kind: "component", type: i10.BillingGroupsComponent, selector: "lib-billing-groups", inputs: ["clientId"] }, { kind: "component", type: i11.PlansSubscriptionComponent, selector: "lib-plans-subscription" }, { kind: "component", type: i12.PurchaseOrderComponent, selector: "lib-purchase-order", inputs: ["clientId"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }, { kind: "pipe", type: i6.DatePipe, name: "date" }] });
851
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandInvoicesComponent, selector: "lib-brand-invoices", ngImport: i0, template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n </div>\n\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <!-- Pending Approval is internal pipeline \u2014 hidden for client login.\n Pending Payment + Paid are shown to clients. -->\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"!isClient\">\n <span class=\"status-dot dot-warning\"></span>\n <span class=\"status-text\">{{ pendingApproval }} Pending Approval</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-primary\"></span>\n <span class=\"status-text\">{{ pendingPayment }} Pending Payment</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-success\"></span>\n <span class=\"status-text\">{{ paid }} Paid</span>\n </div>\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"invoiceNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 editing is disabled' : 'Edit Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && deleteInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 delete is disabled' : 'Delete Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <!-- Leading span covers INVOICE# + PERIOD + GENERATED, plus\n BILLING GROUP for non-client views (that column is hidden\n for clients). Without the isClient adjustment the totals\n shifted one column right on client login. -->\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i8.EstimatesComponent, selector: "lib-estimates", inputs: ["clientId"] }, { kind: "component", type: i9.DailyPricingComponent, selector: "lib-daily-pricing", inputs: ["clientId"] }, { kind: "component", type: i10.BillingGroupsComponent, selector: "lib-billing-groups", inputs: ["clientId"] }, { kind: "component", type: i11.PlansSubscriptionComponent, selector: "lib-plans-subscription" }, { kind: "component", type: i12.PurchaseOrderComponent, selector: "lib-purchase-order", inputs: ["clientId"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }, { kind: "pipe", type: i6.DatePipe, name: "date" }] });
852
852
  }
853
853
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandInvoicesComponent, decorators: [{
854
854
  type: Component,
855
- args: [{ selector: 'lib-brand-invoices', template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n </div>\n\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <!-- Pending Approval is internal pipeline \u2014 hidden for client login.\n Pending Payment + Paid are shown to clients. -->\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"!isClient\">\n <span class=\"status-dot dot-warning\"></span>\n <span class=\"status-text\">{{ pendingApproval }} Pending Approval</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-primary\"></span>\n <span class=\"status-text\">{{ pendingPayment }} Pending Payment</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-success\"></span>\n <span class=\"status-text\">{{ paid }} Paid</span>\n </div>\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"invoiceNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 editing is disabled' : 'Edit Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && deleteInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 delete is disabled' : 'Delete Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td colspan=\"4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td *ngIf=\"!isClient\"></td>\n </tr>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\n"] }]
855
+ args: [{ selector: 'lib-brand-invoices', template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n </div>\n\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <!-- Pending Approval is internal pipeline \u2014 hidden for client login.\n Pending Payment + Paid are shown to clients. -->\n <div class=\"d-flex align-items-center gap-2\" *ngIf=\"!isClient\">\n <span class=\"status-dot dot-warning\"></span>\n <span class=\"status-text\">{{ pendingApproval }} Pending Approval</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-primary\"></span>\n <span class=\"status-text\">{{ pendingPayment }} Pending Payment</span>\n </div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"status-dot dot-success\"></span>\n <span class=\"status-text\">{{ paid }} Paid</span>\n </div>\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"invoiceNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 editing is disabled' : 'Edit Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isInvoiceLocked(inv)\"\n [class.locked-action]=\"isInvoiceLocked(inv)\"\n (click)=\"!isInvoiceLocked(inv) && deleteInvoice(inv)\"\n [ngbTooltip]=\"isInvoiceLocked(inv) ? 'Approved invoice \u2014 delete is disabled' : 'Delete Invoice'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <!-- Leading span covers INVOICE# + PERIOD + GENERATED, plus\n BILLING GROUP for non-client views (that column is hidden\n for clients). Without the isClient adjustment the totals\n shifted one column right on client login. -->\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\n </div>\n</div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\n"] }]
856
856
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.GlobalStateService }, { type: i4.PageInfoService }, { type: i5.NgbModal }] });
857
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtaW52b2ljZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5kLWludm9pY2VzL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9icmFuZC1pbnZvaWNlcy9icmFuZC1pbnZvaWNlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDL0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7QUFDeEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBT3ZGLE1BQU0sT0FBTyxzQkFBc0I7SUF1RnZCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRDtJQUNDO0lBQ0E7SUE3Rk8sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFMUMsT0FBTyxHQUFXLEVBQUUsQ0FBQztJQUNyQixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFD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QUUsRUFBRTt3QkFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsOEJBQThCLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN0QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNsQixNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQzt3QkFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBcDFCVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwwRENuQm5DLCt5Z0RBNmxCTTs7NEZEMWtCTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi90YW5nby1tYW5hZ2UtYmlsbGluZy9yZXF1ZXN0LWNvbmZpcm1hdGlvbi9yZXF1ZXN0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnZXJhdGVJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcmVnZXJhdGUtaW52b2ljZS9yZWdlcmF0ZS1pbnZvaWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50U3RhdHVzY2hhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcGF5bWVudC1zdGF0dXNjaGFuZ2UvcGF5bWVudC1zdGF0dXNjaGFuZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZWRpdC1pbnZvaWNlL2VkaXQtaW52b2ljZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbnZvaWNlUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uL2ludm9pY2UtcHJldmlldy9pbnZvaWNlLXByZXZpZXcuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyYW5kLWludm9pY2VzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCcmFuZEludm9pY2VzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBicmFuZElkOiBzdHJpbmcgPSAnJztcbiAgYnJhbmROYW1lOiBzdHJpbmcgPSAnJztcbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEludm9pY2VzIGlzIHRoZSBicmFuZC1kZXRhaWwgbGFuZGluZyB0YWIgKG1hdGNoZXMgdGhlIHByb3RvdHlwZSB0YWIgb3JkZXI6XG4gIC8vIEludm9pY2VzIOKGkiBFc3RpbWF0ZSDihpIgQmlsbGluZyBCcmVha2Rvd24g4oaSIFBsYW5zICYgU3Vic2NyaXB0aW9uIOKGkiBCaWxsaW5nXG4gIC8vIFNldHRpbmdzKS5cbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyA9ICdpbnZvaWNlcyc7XG5cbiAgLy8gQ2xpZW50IGluZm9cbiAgY2xpZW50SW5mbzogYW55ID0ge307XG5cbiAgLy8gU3VtbWFyeVxuICB0b3RhbEludm9pY2VzOiBudW1iZXIgPSAwO1xuICB0b3RhbEludm9pY2VkOiBudW1iZXIgPSAwO1xuICBwZW5kaW5nQXBwcm92YWw6IG51bWJlciA9IDA7XG4gIHBlbmRpbmdQYXltZW50OiBudW1iZXIgPSAwO1xuICBwYWlkOiBudW1iZXIgPSAwO1xuICAvLyBGb290ZXIgdG90YWxzIG92ZXIgdGhlIGZ1bGwgZmlsdGVyZWQgc2V0IChmcm9tIGJhY2tlbmQgc3VtbWFyeSkuXG4gIHRvdGFsU3RvcmVzOiBudW1iZXIgPSAwO1xuICB0b3RhbEFtb3VudEV4Y2xHc3Q6IG51bWJlciA9IDA7XG4gIHRvdGFsQW1vdW50SW5jbEdzdDogbnVtYmVyID0gMDtcblxuICAvLyBUYWJsZVxuICBpbnZvaWNlTGlzdDogYW55ID0gW107XG4gIGludm9pY2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgaW52b2ljZU5vRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuICBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xuICBpdGVtc1BlclBhZ2U6IG51bWJlciA9IDEwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMCwgNTAsIDEwMCwgNTAwXTtcbiAgc29ydENvbHVtTmFtZTogc3RyaW5nID0gJ2JpbGxpbmdEYXRlJztcbiAgc29ydEJ5OiBudW1iZXIgPSAtMTtcbiAgYWN0aXZlRmlsdGVyOiBzdHJpbmcgPSAnQWxsJztcbiAgZmlsdGVyVGFicyA9IFsnQWxsJywgJ1BlbmRpbmcgQXBwcm92YWwnLCAnUGVuZGluZyBQYXltZW50JywgJ1BhaWQnXTtcbiAgLy8gSW52b2ljZSB0eXBlIHN1Yi10b2dnbGU6ICdhbGwnID0gcmVndWxhciBJTlYtKiwgJ2FkdmFuY2UnID0gVElOVi0qLlxuICBpbnZvaWNlVHlwZTogJ2FsbCcgfCAnYWR2YW5jZScgPSAnYWxsJztcbiAgLy8gSGVhZGVyIGNhcmRzIChPdXRzdGFuZGluZyAvIE92ZXJkdWUgLyBQZW5kaW5nIFBheW1lbnQpIHNwbGl0IGJ5IEdTVCwgaW4g4oK5LlxuICBpbnZvaWNlQ2FyZHMgPSB7XG4gICAgb3V0c3RhbmRpbmdFeGNsQW1vdW50OiAwLCBvdXRzdGFuZGluZ0luY2xBbW91bnQ6IDAsIG91dHN0YW5kaW5nQ291bnQ6IDAsXG4gICAgb3ZlcmR1ZUV4Y2xBbW91bnQ6IDAsIG92ZXJkdWVJbmNsQW1vdW50OiAwLCBvdmVyZHVlQ291bnQ6IDAsXG4gICAgcGVuZGluZ1BheW1lbnRFeGNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IDAsIHBlbmRpbmdQYXltZW50Q291bnQ6IDAsXG4gIH07XG5cbiAgZHVyYXRpb25GaWx0ZXI6IHN0cmluZyA9ICdwcmV2JztcblxuICAvLyBNdWx0aS1zZWxlY3QgYXBwcm92YWwgLyBkb3dubG9hZFxuICBzZWxlY3RlZEludm9pY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtBcHByb3Zpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVsa0Rvd25sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRmxhdCB1c2VyLWFjY2VzcyBvYmplY3QsIGNhY2hlZCBmcm9tIGdzLnVzZXJBY2Nlc3MuIFJlYWRzIGxpa2VcbiAgLy8gdXNlckFjY2Vzcy5UYW5nb0FkbWluX2NzbUFwcHJvdmFsX2lzRWRpdCBldGMuXG4gIHVzZXJBY2Nlc3M6IGFueSA9IHt9O1xuXG4gIC8vIENsaWVudCB1c2VycyBzZWUgYSByZWFkLW9ubHksIHJlc3RyaWN0ZWQgdmlldzogb25seSBJbnZvaWNlcyArIFBsYW5zICZcbiAgLy8gU3Vic2NyaXB0aW9uIHRhYnMsIG5vIGVkaXQvYWN0aW9uIGNvbnRyb2xzLCBzY29wZWQgdG8gdGhlaXIgb3duIGNsaWVudElkLlxuICBpc0NsaWVudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG1vbnRoRmlsdGVyOiBzdHJpbmcgPSAnJztcbiAgeWVhckZpbHRlcjogc3RyaW5nID0gJyc7XG5cbiAgaW52b2ljZUZpbHRlck9iamVjdCA9IFtcbiAgICB7IERlc2NyaXB0aW9uOiAnU3RhdHVzJywgdHlwZTogJ3NpbmdsZScsIElzc3VlczogW3sgaWQ6ICdwZW5kaW5nQXBwcm92YWwnLCB0ZXh0OiAnUGVuZGluZyBBcHByb3ZhbCcgfSwgeyBpZDogJ3BlbmRpbmdQYXltZW50JywgdGV4dDogJ1BlbmRpbmcgUGF5bWVudCcgfSwgeyBpZDogJ3BhaWQnLCB0ZXh0OiAnUGFpZCcgfV0gfSxcbiAgICB7IERlc2NyaXB0aW9uOiAnRHVyYXRpb24nLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbeyBpZDogJ2N1cnJlbnQnLCB0ZXh0OiAnQ3VycmVudCBNb250aCcgfSwgeyBpZDogJ3ByZXYnLCB0ZXh0OiAnUHJldmlvdXMgTW9udGgnIH0sIHsgaWQ6ICdsYXN0MycsIHRleHQ6ICdMYXN0IDMgTW9udGhzJyB9LCB7IGlkOiAnbGFzdDYnLCB0ZXh0OiAnTGFzdCA2IE1vbnRocycgfSwgeyBpZDogJ2xhc3QxMicsIHRleHQ6ICdMYXN0IDEgWWVhcicgfV0gfSxcbiAgICB7IERlc2NyaXB0aW9uOiAnTW9udGgnLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbXG4gICAgICB7IGlkOiAnMScsIHRleHQ6ICdKYW51YXJ5JyB9LCB7IGlkOiAnMicsIHRleHQ6ICdGZWJydWFyeScgfSwgeyBpZDogJzMnLCB0ZXh0OiAnTWFyY2gnIH0sXG4gICAgICB7IGlkOiAnNCcsIHRleHQ6ICdBcHJpbCcgfSwgeyBpZDogJzUnLCB0ZXh0OiAnTWF5JyB9LCB7IGlkOiAnNicsIHRleHQ6ICdKdW5lJyB9LFxuICAgICAgeyBpZDogJzcnLCB0ZXh0OiAnSnVseScgfSwgeyBpZDogJzgnLCB0ZXh0OiAnQXVndXN0JyB9LCB7IGlkOiAnOScsIHRleHQ6ICdTZXB0ZW1iZXInIH0sXG4gICAgICB7IGlkOiAnMTAnLCB0ZXh0OiAnT2N0b2JlcicgfSwgeyBpZDogJzExJywgdGV4dDogJ05vdmVtYmVyJyB9LCB7IGlkOiAnMTInLCB0ZXh0OiAnRGVjZW1iZXInIH1cbiAgICBdIH0sXG4gICAgeyBEZXNjcmlwdGlvbjogJ1llYXInLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiAoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCB5ZWFyczogeyBpZDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW107XG4gICAgICBmb3IgKGxldCB5ID0gY3VycmVudFllYXIgKyAxOyB5ID49IGN1cnJlbnRZZWFyIC0gNTsgeS0tKSB7XG4gICAgICAgIHllYXJzLnB1c2goeyBpZDogU3RyaW5nKHkpLCB0ZXh0OiBTdHJpbmcoeSkgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geWVhcnM7XG4gICAgfSkoKSB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcbiAgKSB7XG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcbiAgICAgICAgdGhpcy5icmFuZElkID0gZGF0YS5jbGllbnQ7XG4gICAgICAgIHRoaXMubG9hZENsaWVudEluZm8oKTtcbiAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBDYWNoZSB0aGUgdXNlcidzIGZsYXQtYWNjZXNzIG9iamVjdCBzbyBzeW5jaHJvbm91cyBtZXRob2RzIChidWxrIGZpbHRlcnMsXG4gICAgLy8gcGVuZGluZ0luU2VsZWN0aW9uKSBjYW4gZ2F0ZSBieSBzdGFnZS1zcGVjaWZpYyBwZXJtaXNzaW9uIHdpdGhvdXQgYXN5bmMuXG4gICAgdGhpcy5ncy51c2VyQWNjZXNzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFjY2VzczogYW55KSA9PiB7XG4gICAgICB0aGlzLnVzZXJBY2Nlc3MgPSBhY2Nlc3MgfHwge307XG4gICAgICB0aGlzLmlzQ2xpZW50ID0gKGFjY2Vzcz8udXNlclR5cGUgfHwgJycpID09PSAnY2xpZW50JztcbiAgICAgIC8vIEEgY2xpZW50IHVzZXIgbGFuZHMgZGlyZWN0bHkgb24gdGhlaXIgb3duIGJyYW5kIHZpZXcgKG5vIEJyYW5kcyBsaXN0IHRvXG4gICAgICAvLyBuYXZpZ2F0ZSBmcm9tKSwgc28gcmVzb2x2ZSB0aGVpciBjbGllbnRJZCBmcm9tIHRoZWlyIHByb2ZpbGUgYW5kIHNjb3BlXG4gICAgICAvLyB0aGUgdGFicyB0byBJbnZvaWNlcyArIFBsYW5zICYgU3Vic2NyaXB0aW9uLCBkZWZhdWx0aW5nIHRvIEludm9pY2VzLlxuICAgICAgaWYgKHRoaXMuaXNDbGllbnQgJiYgIXRoaXMuYnJhbmRJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHVzZXJJbmZvID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XG4gICAgICAgICAgaWYgKHVzZXJJbmZvPy5jbGllbnRJZCkge1xuICAgICAgICAgICAgdGhpcy5icmFuZElkID0gU3RyaW5nKHVzZXJJbmZvLmNsaWVudElkKTtcbiAgICAgICAgICAgIGlmICghWydpbnZvaWNlcycsICdwbGFucy1zdWJzY3JpcHRpb24nXS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkVGFiKSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2ludm9pY2VzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZENsaWVudEluZm8oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogaWdub3JlIG1hbGZvcm1lZCB1c2VyLWluZm8gKi8gfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGFicyBhIGNsaWVudCB1c2VyIGlzIGFsbG93ZWQgdG8gc2VlIChldmVyeXRoaW5nIGZvciB0YW5nbyB1c2VycykuXG4gIGdldCB2aXNpYmxlVGFicygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGllbnRcbiAgICAgID8gWydpbnZvaWNlcycsICdwbGFucy1zdWJzY3JpcHRpb24nXVxuICAgICAgOiBbJ2ludm9pY2VzJywgJ2VzdGltYXRlJywgJ2RhaWx5LXByaWNpbmcnLCAncGxhbnMtc3Vic2NyaXB0aW9uJywgJ2JpbGxpbmctZ3JvdXBzJywgJ3B1cmNoYXNlLW9yZGVyJ107XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZXRQYWdlRGF0YSgpIHtcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKHRoaXMuYnJhbmROYW1lIHx8ICdCcmFuZCBJbnZvaWNlcycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0RGVzY3JpcHRpb24oJ1ZpZXcgYW5kIG1hbmFnZSBicmFuZCBpbnZvaWNlcycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xuICAgICAgeyB0aXRsZTogJ01hbmFnZScsIHBhdGg6ICcvbWFuYWdlJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcbiAgICAgIHsgdGl0bGU6ICdNYW5hZ2UnLCBwYXRoOiAnL21hbmFnZScsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgIHsgdGl0bGU6ICdCaWxsaW5nJywgcGF0aDogJy9tYW5hZ2UvYmlsbGluZycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXG4gICAgICB7IHRpdGxlOiAnQmlsbGluZycsIHBhdGg6ICcvbWFuYWdlL2JpbGxpbmcnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgXSk7XG4gIH1cblxuICBsb2FkQ2xpZW50SW5mbygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldENsaWVudEJpbGxpbmdJbmZvKHsgY2xpZW50SWQ6IHRoaXMuYnJhbmRJZCB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5jbGllbnRJbmZvID0gcmVzLmRhdGE7XG4gICAgICAgICAgdGhpcy5icmFuZE5hbWUgPSB0aGlzLmNsaWVudEluZm8uY2xpZW50TmFtZSB8fCAnJztcbiAgICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRJbnZvaWNlcygpIHtcbiAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5pbnZvaWNlTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5pbnZvaWNlTm9EYXRhID0gZmFsc2U7XG5cbiAgICBsZXQgc3RhdHVzRmlsdGVyOiBhbnkgPSBbXTtcbiAgICBsZXQgcGF5bWVudFN0YXR1c0ZpbHRlcjogYW55ID0gW107XG5cbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIEFwcHJvdmFsJykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydwZW5kaW5nQ3NtJywgJ3BlbmRpbmdGaW5hbmNlJywgJ3BlbmRpbmdBcHByb3ZhbCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIFBheW1lbnQnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ2FwcHJvdmVkJ107XG4gICAgICBwYXltZW50U3RhdHVzRmlsdGVyID0gWyd1bnBhaWQnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGFpZCcpIHtcbiAgICAgIHBheW1lbnRTdGF0dXNGaWx0ZXIgPSBbJ3BhaWQnXTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmJyYW5kSWQsXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBzdGF0dXM6IHN0YXR1c0ZpbHRlcixcbiAgICAgIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIsXG4gICAgICBkdXJhdGlvbkZpbHRlcjogdGhpcy5kdXJhdGlvbkZpbHRlcixcbiAgICAgIG1vbnRoRmlsdGVyOiB0aGlzLm1vbnRoRmlsdGVyLFxuICAgICAgeWVhckZpbHRlcjogdGhpcy55ZWFyRmlsdGVyLFxuICAgICAgaW52b2ljZVR5cGU6IHRoaXMuaW52b2ljZVR5cGUsXG4gICAgICBleHBvcnQ6IGZhbHNlXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnJhbmRJbnZvaWNlTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIGlmIChlPy5kYXRhPy5jb3VudCkge1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VMaXN0ID0gZS5kYXRhPy5kYXRhO1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IGUuZGF0YT8uY291bnQ7XG5cbiAgICAgICAgICBpZiAoZS5kYXRhPy5jbGllbnRJbmZvKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWVudEluZm8gPSBlLmRhdGEuY2xpZW50SW5mbztcbiAgICAgICAgICAgIHRoaXMuYnJhbmROYW1lID0gdGhpcy5jbGllbnRJbmZvLmNsaWVudE5hbWUgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGUuZGF0YT8uc3VtbWFyeTtcbiAgICAgICAgICBpZiAoc3VtbWFyeSkge1xuICAgICAgICAgICAgdGhpcy50b3RhbEludm9pY2VzID0gc3VtbWFyeS50b3RhbEludm9pY2VzIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsSW52b2ljZWQgPSBzdW1tYXJ5LnRvdGFsSW52b2ljZWQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0FwcHJvdmFsID0gc3VtbWFyeS5wZW5kaW5nQXBwcm92YWwgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1BheW1lbnQgPSBzdW1tYXJ5LnBlbmRpbmdQYXltZW50IHx8IDA7XG4gICAgICAgICAgICB0aGlzLnBhaWQgPSBzdW1tYXJ5LnBhaWQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxTdG9yZXMgPSBzdW1tYXJ5LnRvdGFsU3RvcmVzIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsQW1vdW50RXhjbEdzdCA9IHN1bW1hcnkudG90YWxBbW91bnRFeGNsR3N0IHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsQW1vdW50SW5jbEdzdCA9IHN1bW1hcnkudG90YWxBbW91bnRJbmNsR3N0IHx8IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2FyZHMgPSBlLmRhdGE/LmNhcmRzO1xuICAgICAgICAgIGlmIChjYXJkcykge1xuICAgICAgICAgICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nRXhjbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nSW5jbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdJbmNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nQ291bnQ6IGNhcmRzLm91dHN0YW5kaW5nQ291bnQgfHwgMCxcbiAgICAgICAgICAgICAgb3ZlcmR1ZUV4Y2xBbW91bnQ6IGNhcmRzLm92ZXJkdWVFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG92ZXJkdWVJbmNsQW1vdW50OiBjYXJkcy5vdmVyZHVlSW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBvdmVyZHVlQ291bnQ6IGNhcmRzLm92ZXJkdWVDb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEV4Y2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50RXhjbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50SW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudENvdW50OiBjYXJkcy5wZW5kaW5nUGF5bWVudENvdW50IHx8IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW52b2ljZUxpc3QgPSBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgIC8vIE5vIGludm9pY2VzIGZvciB0aGUgY3VycmVudCBmaWx0ZXIvdG9nZ2xlIOKAlCB6ZXJvIG91dCB0aGUgY2FyZHMgYW5kXG4gICAgICAgICAgLy8gc3VtbWFyeSBjb3VudGVycyBzbyB0aGV5IGRvbid0IHNob3cgc3RhbGUgdmFsdWVzIGZyb20gYSBwcmlvciBsb2FkLlxuICAgICAgICAgIHRoaXMucmVzZXRJbnZvaWNlU3VtbWFyeSgpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAvLyBBIDIwNCAobm8gZGF0YSkgY2FuIHN1cmZhY2UgaGVyZSB0b28g4oCUIHJlc2V0IHRoZSBjYXJkcy9zdW1tYXJ5LlxuICAgICAgICB0aGlzLnJlc2V0SW52b2ljZVN1bW1hcnkoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBaZXJvIHRoZSBoZWFkZXIgY2FyZHMgKyBzdW1tYXJ5IGNvdW50ZXJzICh1c2VkIHdoZW4gdGhlIGxpc3QgaGFzIG5vIGRhdGEpLlxuICBwcml2YXRlIHJlc2V0SW52b2ljZVN1bW1hcnkoKSB7XG4gICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICBvdXRzdGFuZGluZ0V4Y2xBbW91bnQ6IDAsIG91dHN0YW5kaW5nSW5jbEFtb3VudDogMCwgb3V0c3RhbmRpbmdDb3VudDogMCxcbiAgICAgIG92ZXJkdWVFeGNsQW1vdW50OiAwLCBvdmVyZHVlSW5jbEFtb3VudDogMCwgb3ZlcmR1ZUNvdW50OiAwLFxuICAgICAgcGVuZGluZ1BheW1lbnRFeGNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IDAsIHBlbmRpbmdQYXltZW50Q291bnQ6IDAsXG4gICAgfTtcbiAgICB0aGlzLnRvdGFsSW52b2ljZXMgPSAwO1xuICAgIHRoaXMudG90YWxJbnZvaWNlZCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nQXBwcm92YWwgPSAwO1xuICAgIHRoaXMucGVuZGluZ1BheW1lbnQgPSAwO1xuICAgIHRoaXMucGFpZCA9IDA7XG4gICAgdGhpcy50b3RhbFN0b3JlcyA9IDA7XG4gICAgdGhpcy50b3RhbEFtb3VudEV4Y2xHc3QgPSAwO1xuICAgIHRoaXMudG90YWxBbW91bnRJbmNsR3N0ID0gMDtcbiAgfVxuXG4gIHNldEZpbHRlcihmaWx0ZXI6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gZmlsdGVyO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICAvLyBJbnZvaWNlIHR5cGUgc3ViLXRvZ2dsZTogYWxsIChyZWd1bGFyKSB2cyBhZHZhbmNlIChUSU5WLSopLiBSZWxvYWRzIHRoZSBsaXN0LFxuICAvLyBzdW1tYXJ5IGFuZCBjYXJkcy5cbiAgc2VsZWN0SW52b2ljZVR5cGUodHlwZTogJ2FsbCcgfCAnYWR2YW5jZScpIHtcbiAgICBpZiAodGhpcy5pbnZvaWNlVHlwZSA9PT0gdHlwZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLmludm9pY2VUeXBlID0gdHlwZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIHNvcnREYXRhKGNvbHVtbjogc3RyaW5nKSB7XG4gICAgdGhpcy5zb3J0Q29sdW1OYW1lID0gY29sdW1uO1xuICAgIHRoaXMuc29ydEJ5ICo9IC0xO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhcnNlSW50KHBhZ2VPZmZzZXQpO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnBhZ2VTaXplID0gcGFyc2VJbnQocGFnZVNpemUpO1xuICAgIC8vIEtlZXAgaXRlbXNQZXJQYWdlIGluIHN5bmMgd2l0aCB0aGUgY2hvc2VuIHNpemUg4oCUIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xcbiAgICAvLyBkZXJpdmVzIGl0cyBwYWdlIGNvdW50IGZyb20gaXRlbXNQZXJQYWdlLCBzbyBhIHN0YWxlIHZhbHVlIChhbHdheXMgMTApXG4gICAgLy8gbWFkZSB0aGUgcGFnZSBudW1iZXJzIHdyb25nIGZvciBhbnkgc2l6ZSBvdGhlciB0aGFuIDEwLlxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgbGV0IHN0YXR1c0ZpbHRlcjogYW55ID0gW107XG4gICAgbGV0IHBheW1lbnRTdGF0dXNGaWx0ZXI6IGFueSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGVuZGluZyBBcHByb3ZhbCcpIHtcbiAgICAgIHN0YXR1c0ZpbHRlciA9IFsncGVuZGluZ0NzbScsICdwZW5kaW5nRmluYW5jZScsICdwZW5kaW5nQXBwcm92YWwnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGVuZGluZyBQYXltZW50Jykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydhcHByb3ZlZCddO1xuICAgICAgcGF5bWVudFN0YXR1c0ZpbHRlciA9IFsndW5wYWlkJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZUZpbHRlciA9PT0gJ1BhaWQnKSB7XG4gICAgICBwYXltZW50U3RhdHVzRmlsdGVyID0gWydwYWlkJ107XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5icmFuZElkLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIHN0YXR1czogc3RhdHVzRmlsdGVyLFxuICAgICAgcGF5bWVudFN0YXR1czogcGF5bWVudFN0YXR1c0ZpbHRlcixcbiAgICAgIGR1cmF0aW9uRmlsdGVyOiB0aGlzLmR1cmF0aW9uRmlsdGVyLFxuICAgICAgbW9udGhGaWx0ZXI6IHRoaXMubW9udGhGaWx0ZXIsXG4gICAgICB5ZWFyRmlsdGVyOiB0aGlzLnllYXJGaWx0ZXIsXG4gICAgICBpbnZvaWNlVHlwZTogdGhpcy5pbnZvaWNlVHlwZSxcbiAgICAgIGV4cG9ydDogdHJ1ZVxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJyYW5kSW52b2ljZUxpc3RFeHBvcnQoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgJ2JyYW5kLWludm9pY2VzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU29tZXRoaW5nIHdlbnQgV3JvbmcuLicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlJbnZvaWNlRmlsdGVycyhldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXR1cycpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5Jc3N1ZXM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuSXNzdWVzLmlkO1xuICAgICAgICAgICAgaWYgKGlkID09PSAncGVuZGluZ0FwcHJvdmFsJykgdGhpcy5hY3RpdmVGaWx0ZXIgPSAnUGVuZGluZyBBcHByb3ZhbCc7XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ3BlbmRpbmdQYXltZW50JykgdGhpcy5hY3RpdmVGaWx0ZXIgPSAnUGVuZGluZyBQYXltZW50JztcbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID09PSAncGFpZCcpIHRoaXMuYWN0aXZlRmlsdGVyID0gJ1BhaWQnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUZpbHRlciA9ICdBbGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ0R1cmF0aW9uJykge1xuICAgICAgICAgIHRoaXMuZHVyYXRpb25GaWx0ZXIgPSBlbGVtZW50Lklzc3Vlcz8uaWQgfHwgJ2N1cnJlbnQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnTW9udGgnKSB7XG4gICAgICAgICAgdGhpcy5tb250aEZpbHRlciA9IGVsZW1lbnQuSXNzdWVzPy5pZCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1llYXInKSB7XG4gICAgICAgICAgdGhpcy55ZWFyRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIGdldEludm9pY2VTdGF0dXMoaW52b2ljZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdQZW5kaW5nIENTTSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSByZXR1cm4gJ1BlbmRpbmcgRmluYW5jZSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICAvLyBMZWdhY3kgcHJlLXBpcGVsaW5lIHZhbHVlLCBqdXN0IGluIGNhc2UgdW4tbWlncmF0ZWQgcm93cyBzdGlsbCBleGlzdC5cbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFydGlhbCcpIHJldHVybiAnUGFydGlhbCc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3VucGFpZCcpIHJldHVybiAnUGVuZGluZyBQYXltZW50JztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFpZCcpIHJldHVybiAnUGFpZCc7XG4gICAgcmV0dXJuIGludm9pY2Uuc3RhdHVzO1xuICB9XG5cbiAgZ2V0U3RhdHVzQ2xhc3MoaW52b2ljZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nJztcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nRmluYW5jZScpIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtaW5mbyc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC1kYXJrJztcbiAgICAvLyBMZWdhY3kgcHJlLXBpcGVsaW5lIHZhbHVlIGZhbGxzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHdhcm5pbmcgc3R5bGUuXG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZycpIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtd2FybmluZyc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3BhaWQnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3MnO1xuICAgIGlmIChpbnZvaWNlLnBheW1lbnRTdGF0dXMgPT09ICdwYXJ0aWFsJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAndW5wYWlkJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5JztcbiAgICByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LWRhbmdlcic7XG4gIH1cblxuICAvLyBPdXRzdGFuZGluZyBiYWxhbmNlIG9uIHRoaXMgaW52b2ljZS4gVXNlZCB0byByZW5kZXIgYW4gaW5saW5lXG4gIC8vIFwi4oK5IFggcGVuZGluZ1wiIG5vdGUgdW5kZXIgdGhlIHN0YXR1cyBiYWRnZSBzbyByZXZpZXdlcnMgc2VlIHRoZVxuICAvLyBzaG9ydGZhbGwgYXQgYSBnbGFuY2UuXG4gIHBlbmRpbmdBbW91bnQoaW52b2ljZTogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihpbnZvaWNlPy50b3RhbEFtb3VudCkgfHwgMDtcbiAgICBjb25zdCBwYWlkID0gTnVtYmVyKGludm9pY2U/LnBhaWRBbW91bnQpIHx8IDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgucm91bmQoKHRvdGFsIC0gcGFpZCkgKiAxMDApIC8gMTAwKTtcbiAgfVxuXG4gIGhhc1BlbmRpbmcoaW52b2ljZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFpZCA9IE51bWJlcihpbnZvaWNlPy5wYWlkQW1vdW50KSB8fCAwO1xuICAgIHJldHVybiBwYWlkID4gMCAmJiB0aGlzLnBlbmRpbmdBbW91bnQoaW52b2ljZSkgPiAwO1xuICB9XG5cbiAgLy8gTWlycm9yIHRoZSBiYWNrZW5kIHN5bWJvbCBtYXAgc28gZWFjaCBpbnZvaWNlIHJvdyByZW5kZXJzIGluIGl0cyBvd25cbiAgLy8gY3VycmVuY3kgKHdhcyBoYXJkY29kZWQgdG8g4oK5KS5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeVN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAn4oK5JyxcbiAgICBkb2xsYXI6ICckJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsXG4gICAgZXVybzogJ+KCrCcsXG4gICAgYWVkOiAnQUVEJyxcbiAgfTtcblxuICBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbmN5U3ltYm9sc1tpbnY/LmN1cnJlbmN5IHx8ICcnXSB8fCAnJCc7XG4gIH1cblxuICAvLyBMb2NrZWQgYWZ0ZXIgZmluYWwgYXBwcm92YWwg4oCUIEVkaXQvRGVsZXRlIG11c3Qgbm90IG11dGF0ZSBhIGZpbmFsaXNlZCBpbnZvaWNlLlxuICAvLyBUaGUgYmFja2VuZCBlbmZvcmNlcyB0aGUgc2FtZSBjaGVjayAodXBkYXRlSW52b2ljZSAvIGRlbGV0ZUludm9pY2UpIHNvIHRoZVxuICAvLyBsb2NrIGNhbid0IGJlIGJ5cGFzc2VkIGJ5IGhpdHRpbmcgdGhlIEFQSSBkaXJlY3RseS5cbiAgaXNJbnZvaWNlTG9ja2VkKGludjogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGludj8uc3RhdHVzID09PSAnYXBwcm92ZWQnO1xuICB9XG5cbiAgLy8gVHJ1ZSB3aGVuIHRoZSBpbnZvaWNlIGlzIGluIGEgcHJlLWFwcHJvdmFsIHN0YWdlIEFORCB0aGUgY3VycmVudCB1c2VyXG4gIC8vIGhhcyB0aGUgbWF0Y2hpbmcgVGFuZ29BZG1pbiBwZXJtaXNzaW9uIGZvciB0aGF0IHN0YWdlLlxuICAvLyB1c2VyQWNjZXNzIGlzIHRoZSBmbGF0IG9iamVjdCBzZXJ2ZWQgYnkgR2xvYmFsU3RhdGVTZXJ2aWNlLnVzZXJBY2Nlc3MkLFxuICAvLyBlLmcuIHsgVGFuZ29BZG1pbl9jc21BcHByb3ZhbF9pc0VkaXQ6IHRydWUsIC4uLiB9XG4gIGNhbkFwcHJvdmUoaW52OiBhbnksIHVzZXJBY2Nlc3M6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdXNlckFjY2VzcykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFN1cGVyYWRtaW4gYnlwYXNzOiBjYW4gYXBwcm92ZSBhdCBhbnkgc3RhZ2UgcmVnYXJkbGVzcyBvZiBwZXItbW9kdWxlIHBlcm1pc3Npb25zLlxuICAgIGlmICh1c2VyQWNjZXNzLnJvbGUgPT09ICdzdXBlcmFkbWluJykge1xuICAgICAgcmV0dXJuIFsncGVuZGluZ0NzbScsICdwZW5kaW5nRmluYW5jZScsICdwZW5kaW5nQXBwcm92YWwnXS5pbmNsdWRlcyhpbnY/LnN0YXR1cyk7XG4gICAgfVxuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdDc20nKSByZXR1cm4gISF1c2VyQWNjZXNzLlRhbmdvQWRtaW5fY3NtQXBwcm92YWxfaXNFZGl0O1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykgcmV0dXJuICEhdXNlckFjY2Vzcy5UYW5nb0FkbWluX2ZpbmFuY2VBcHByb3ZhbF9pc0VkaXQ7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICEhdXNlckFjY2Vzcy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVG9vbHRpcCAvIGJ1dHRvbiBsYWJlbCBmb3IgdGhlIHBlci1yb3cgYXBwcm92ZSBpY29uLCBieSBjdXJyZW50IHN0YWdlLlxuICBnZXRBcHByb3ZlVG9vbHRpcChpbnY6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0NzbScpIHJldHVybiAnQXBwcm92ZSBhcyBDU00nO1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykgcmV0dXJuICdBcHByb3ZlIGFzIEZpbmFuY2UnO1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdBcHByb3ZhbCcpIHJldHVybiAnRmluYWwgQXBwcm92ZSc7XG4gICAgcmV0dXJuICdBcHByb3ZlIEludm9pY2UnO1xuICB9XG5cbiAgLy8gSHVtYW4gbGFiZWwgZm9yIGVhY2ggcGlwZWxpbmUgc3RhdHVzIOKAlCB1c2VkIGluIHRoZSBjb25maXJtYXRpb24gcG9wdXAnc1xuICAvLyBcImZyb20g4oaSIHRvXCIgYnJlYWtkb3duIHNvIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGF0IGVhY2ggYXBwcm92ZSBkb2VzLlxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlTGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIHBlbmRpbmdDc206ICdQZW5kaW5nIENTTScsXG4gICAgcGVuZGluZ0ZpbmFuY2U6ICdQZW5kaW5nIEZpbmFuY2UnLFxuICAgIHBlbmRpbmdBcHByb3ZhbDogJ1BlbmRpbmcgQXBwcm92YWwnLFxuICAgIGFwcHJvdmVkOiAnQXBwcm92ZWQnLFxuICB9O1xuXG4gIC8vIFRoZSBzaW5nbGUgbmV4dC1zdGFnZSBzdGVwIGZvciBlYWNoIHByZS1hcHByb3ZhbCBzdGF0dXMuIE1pcnJvcnMgdGhlXG4gIC8vIGJhY2tlbmQgdHJhbnNpdGlvbnMgaW4gYXBwcm92ZUludm9pY2VDc20vRmluYW5jZS9BcHByb3ZhbC5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZU5leHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgcGVuZGluZ0NzbTogJ3BlbmRpbmdGaW5hbmNlJyxcbiAgICBwZW5kaW5nRmluYW5jZTogJ3BlbmRpbmdBcHByb3ZhbCcsXG4gICAgcGVuZGluZ0FwcHJvdmFsOiAnYXBwcm92ZWQnLFxuICB9O1xuXG4gIC8vIENvbGxhcHNlIGEgbGlzdCBvZiBpbnZvaWNlcyBpbnRvIFt7ZnJvbSwgdG8sIGNvdW50fSwgLi4uXSBzb3J0ZWQgYnkgdGhlXG4gIC8vIHBpcGVsaW5lIG9yZGVyLCBzbyB0aGUgcG9wdXAgbGlzdHMgQ1NNIGZpcnN0IHRoZW4gRmluYW5jZSB0aGVuIEFwcHJvdmFsLlxuICBwcml2YXRlIGJ1aWxkVHJhbnNpdGlvbnMoaW52b2ljZXM6IGFueVtdKTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfVtdIHtcbiAgICBjb25zdCBvcmRlciA9IFsncGVuZGluZ0NzbScsICdwZW5kaW5nRmluYW5jZScsICdwZW5kaW5nQXBwcm92YWwnXTtcbiAgICBjb25zdCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBpbnZvaWNlcy5mb3JFYWNoKChpbnYpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGludj8uc3RhdHVzO1xuICAgICAgaWYgKHRoaXMuc3RhZ2VOZXh0W3N0YXR1c10pIHtcbiAgICAgICAgY291bnRzW3N0YXR1c10gPSAoY291bnRzW3N0YXR1c10gfHwgMCkgKyAxO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvcmRlclxuICAgICAgLmZpbHRlcigocykgPT4gY291bnRzW3NdKVxuICAgICAgLm1hcCgocykgPT4gKHtcbiAgICAgICAgZnJvbTogdGhpcy5zdGFnZUxhYmVsc1tzXSxcbiAgICAgICAgdG86IHRoaXMuc3RhZ2VMYWJlbHNbdGhpcy5zdGFnZU5leHRbc11dLFxuICAgICAgICBjb3VudDogY291bnRzW3NdLFxuICAgICAgfSkpO1xuICB9XG5cbiAgLy8gQ2FsbHMgdGhlIGRlZGljYXRlZCB0cmFuc2l0aW9uIGVuZHBvaW50IGZvciBlYWNoIHByZS1hcHByb3ZhbCBzdGFnZS5cbiAgLy8gRmluYWwtc3RhZ2UgYXBwcm92YWwgKHBlbmRpbmdBcHByb3ZhbCDihpIgYXBwcm92ZWQpIG11c3QgTk9UIGdvIHRocm91Z2hcbiAgLy8gaW52b2ljZURvd25sb2FkIOKAlCB0aGF0IGVuZHBvaW50IGlzIGZvciBQREYgZ2VuZXJhdGlvbiBhbmQgb25seSBhZHZhbmNlc1xuICAvLyBzdGF0dXMgYXMgYSBzaWRlIGVmZmVjdCwgd2hpY2ggc2lsZW50bHkgZmFpbHMgd2hlbiBQREYvZW1haWwgc2V0dXAgaXNcbiAgLy8gYnJva2VuLiBVc2UgYXBwcm92ZUludm9pY2VBcHByb3ZhbCwgd2hpY2ggYWR2YW5jZXMgc3RhdHVzIHVuY29uZGl0aW9uYWxseS5cbiAgcHJpdmF0ZSBhZHZhbmNlSW52b2ljZUJ5U3RhdHVzKGludjogYW55KSB7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0NzbScpIHtcbiAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdTZXJ2aWNlLmFwcHJvdmVJbnZvaWNlQ3NtKGludi5faWQpO1xuICAgIH1cbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nRmluYW5jZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdTZXJ2aWNlLmFwcHJvdmVJbnZvaWNlRmluYW5jZShpbnYuX2lkKTtcbiAgICB9XG4gICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0geyAuLi5pbnYsIHNlbmRJbnZvaWNlOiB0cnVlLCBzdGF0dXM6ICdhcHByb3ZlZCcgfTtcbiAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VEb3dubG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhcHByb3ZlSW52b2ljZShkYXRhOiBhbnkpIHtcbiAgICAvLyBUaGUgcGVyLXJvdyBpY29uJ3MgKm5nSWYgYWxyZWFkeSBnYXRlcyBieSBzdGFnZSArIHBlcm1pc3Npb24uIElmIHRoZVxuICAgIC8vIGludm9pY2UncyBzdGF0dXMgaXNuJ3QgaW4gdGhlIHByZS1hcHByb3ZhbCBzZXQsIGFkdmFuY2VJbnZvaWNlQnlTdGF0dXNcbiAgICAvLyByZXR1cm5zIG51bGwgYmVsb3cg4oCUIHRoZSBiYWNrZW5kIHdvdWxkIGFsc28gcmVmdXNlIHdpdGggYSA0MDMvNDA5LlxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXF1ZXN0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICAvLyBTaG93IHRoZSBzaW5nbGUtcm93J3MgZnJvbSDihpIgdG8gdHJhbnNpdGlvbiBzbyB0aGUgcG9wdXAgaXMgY29uc2lzdGVudFxuICAgIC8vIHdpdGggdGhlIGJ1bGstYXBwcm92ZSBicmVha2Rvd24uXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHJhbnNpdGlvbnMgPSB0aGlzLmJ1aWxkVHJhbnNpdGlvbnMoW2RhdGFdKTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIGNvbnN0IGNhbGwgPSB0aGlzLmFkdmFuY2VJbnZvaWNlQnlTdGF0dXMoZGF0YSk7XG4gICAgICAgIGlmICghY2FsbCkgcmV0dXJuO1xuICAgICAgICBjYWxsLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdJbnZvaWNlIGFkdmFuY2VkIHRvIHRoZSBuZXh0IHN0YWdlJyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGFkdmFuY2UgaW52b2ljZSc7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHJlZ2VuZXJhdGVJbnZvaWNlKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZWdlcmF0ZUludm9pY2VDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcbiAgICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgICAgaW52b2ljZUlkOiBkYXRhLmludm9pY2UsXG4gICAgICAgICAgYWxsQ2xpZW50OiBmYWxzZSxcbiAgICAgICAgICByZWdlbnJhdGU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5pbnZvaWNlcmVnZXJhdGUocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdUaGUgaW52b2ljZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVnZW5lcmF0ZWQuJyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwYXltZW50c3RhdHVzQ2hhbmdlKGRhdGE6IGFueSkge1xuICAgIC8vIE1vZGFsIG5vdyBjb2xsZWN0cyBhIHJlYWwgcGF5bWVudCBlbnRyeSAoYW1vdW50LCBkYXRlLCBtZXRob2QsXG4gICAgLy8gcmVmZXJlbmNlLCBub3RlcykgaW5zdGVhZCBvZiBhIFllcy9ObyB0b2dnbGUuIE9uIHN1Ym1pdCB0aGUgc2VydmVyXG4gICAgLy8gYXBwZW5kcyB0byBwYXltZW50SGlzdG9yeSBhbmQgcmVjb21wdXRlcyBwYXltZW50U3RhdHVzLlxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihQYXltZW50U3RhdHVzY2hhbmdlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlID0gZGF0YTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ3JlY29yZCcgJiYgcmVzdWx0LnBheWxvYWQpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgaW52b2ljZUlkOiBkYXRhLmludm9pY2UsIC4uLnJlc3VsdC5wYXlsb2FkIH07XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UucmVjb3JkUGF5bWVudChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlcz8uZGF0YT8ucGF5bWVudFN0YXR1cyB8fCByZXM/LnBheW1lbnRTdGF0dXMgfHwgJ3VwZGF0ZWQnO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoYFBheW1lbnQgcmVjb3JkZWQg4oCUIHN0YXR1czogJHtzdGF0dXN9YCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/LmVycm9yPy5lcnJvciB8fCAnRmFpbGVkIHRvIHJlY29yZCBwYXltZW50JztcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZG93bmxvYWRJbnZvaWNlKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IHJlcSA9IHsgLi4uZGF0YSB9O1xuICAgIHJlcS5jbGllbnRJZCA9IFtkYXRhLmNsaWVudElkXTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VEb3dubG9hZChyZXEpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBkYXRhPy5iaWxsaW5nRGF0ZSA/IG5ldyBEYXRlKGRhdGEuYmlsbGluZ0RhdGUpLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbW9udGg6ICdsb25nJyB9KSA6ICcnO1xuICAgICAgICBjb25zdCBicmFuZE5hbWUgPSBkYXRhPy5yZWdpc3RlcmVkQ29tcGFueU5hbWUgfHwgZGF0YT8uY29tcGFueU5hbWUgfHwgJyc7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7ZGF0YT8uaW52b2ljZSB8fCAnaW52b2ljZSd9LSR7bW9udGh9LSR7YnJhbmROYW1lfS5wZGZgLnJlcGxhY2UoL1tcXFxcLzoqP1wiPD58XFxyXFxuXS9nLCAnJykudHJpbSgpO1xuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTXVsdGktc2VsZWN0IGFwcHJvdmFsIC8gZG93bmxvYWQuIENoZWNrYm94ZXMgYXJlIHVuY29uZGl0aW9uYWw7XG4gIC8vIEFwcHJvdmUgYWR2YW5jZXMgZWFjaCBzZWxlY3RlZCByb3cgYnkgb25lIHBpcGVsaW5lIHN0YWdlIGF0IGFjdGlvbiB0aW1lLlxuICAvLyBBIHJvdyB0aGUgdXNlciBjYW4ndCBhcHByb3ZlIGF0IGl0cyBjdXJyZW50IHN0YWdlIGlzIHNraXBwZWQuXG4gIGdldFBlbmRpbmdJbnZvaWNlcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUxpc3QuZmlsdGVyKChpbnY6IGFueSkgPT4gdGhpcy5jYW5BcHByb3ZlKGludiwgdGhpcy51c2VyQWNjZXNzKSk7XG4gIH1cblxuICBnZXRTZWxlY3RhYmxlSW52b2ljZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmludm9pY2VMaXN0O1xuICB9XG5cbiAgcGVuZGluZ0luU2VsZWN0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUxpc3QuZmlsdGVyKChpbnY6IGFueSkgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaW52Ll9pZCkgJiYgdGhpcy5jYW5BcHByb3ZlKGludiwgdGhpcy51c2VyQWNjZXNzKVxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdEFsbCkge1xuICAgICAgdGhpcy5nZXRTZWxlY3RhYmxlSW52b2ljZXMoKS5mb3JFYWNoKChpbnY6IGFueSkgPT4gdGhpcy5zZWxlY3RlZEludm9pY2VzLmFkZChpbnYuX2lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUludm9pY2VTZWxlY3QoaW52OiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpbnYuX2lkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmRlbGV0ZShpbnYuX2lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmFkZChpbnYuX2lkKTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0YWJsZSA9IHRoaXMuZ2V0U2VsZWN0YWJsZUludm9pY2VzKCk7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBzZWxlY3RhYmxlLmxlbmd0aCA+IDAgJiZcbiAgICAgIHNlbGVjdGFibGUuZXZlcnkoKGk6IGFueSkgPT4gdGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpLl9pZCkpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChpbnY6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW52b2ljZXMuaGFzKGludi5faWQpO1xuICB9XG5cbiAgYXBwcm92ZVNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW52b2ljZXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIC8vIENvbXB1dGUgdGhlIGFwcHJvdmFibGUgc3Vic2V0IHVwLWZyb250IHNvIHRoZSBjb25maXJtYXRpb24gcG9wdXAgY2FuXG4gICAgLy8gc2hvdyB0aGUgZnJvbSDihpIgdG8gYnJlYWtkb3duIGJlZm9yZSB0aGUgdXNlciBjbGlja3MgWWVzLlxuICAgIGNvbnN0IHNlbGVjdGVkTGlzdCA9IHRoaXMuaW52b2ljZUxpc3QuZmlsdGVyKChpbnY6IGFueSkgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaW52Ll9pZCkgJiYgdGhpcy5jYW5BcHByb3ZlKGludiwgdGhpcy51c2VyQWNjZXNzKVxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gcGVuZGluZyBpbnZvaWNlcyBpbiBzZWxlY3Rpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRyYW5zaXRpb25zID0gdGhpcy5idWlsZFRyYW5zaXRpb25zKHNlbGVjdGVkTGlzdCk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICB0aGlzLmJ1bGtBcHByb3ZpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgY29tcGxldGVkID0gMDtcbiAgICAgICAgbGV0IHN1Y2NlZWRlZCA9IDA7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBzZWxlY3RlZExpc3QuZm9yRWFjaCgoaW52OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBjYWxsID0gdGhpcy5hZHZhbmNlSW52b2ljZUJ5U3RhdHVzKGludik7XG4gICAgICAgICAgaWYgKCFjYWxsKSB7XG4gICAgICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgICAgICAgc3VjY2VlZGVkKys7XG4gICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPT09IHNlbGVjdGVkTGlzdC5sZW5ndGgpIHRoaXMuZmluaXNoQnVsa0FwcHJvdmUoc3VjY2VlZGVkLCBmYWlsZWQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA9PT0gc2VsZWN0ZWRMaXN0Lmxlbmd0aCkgdGhpcy5maW5pc2hCdWxrQXBwcm92ZShzdWNjZWVkZWQsIGZhaWxlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQnVsa0FwcHJvdmUoc3VjY2VlZGVkOiBudW1iZXIsIGZhaWxlZDogbnVtYmVyKSB7XG4gICAgdGhpcy5idWxrQXBwcm92aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZTtcbiAgICBpZiAoZmFpbGVkID09PSAwKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgJHtzdWNjZWVkZWR9IGludm9pY2UocykgYWR2YW5jZWQgdG8gbmV4dCBzdGFnZWApO1xuICAgIH0gZWxzZSBpZiAoc3VjY2VlZGVkID09PSAwKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYEFsbCAke2ZhaWxlZH0gaW52b2ljZShzKSBmYWlsZWQgdG8gYWR2YW5jZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYCR7c3VjY2VlZGVkfSBhZHZhbmNlZCwgJHtmYWlsZWR9IGZhaWxlZGApO1xuICAgIH1cbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgZG93bmxvYWRTZWxlY3RlZCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEludm9pY2VzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgaW52b2ljZUlkczogWy4uLnRoaXMuc2VsZWN0ZWRJbnZvaWNlc10gfTtcbiAgICBjb25zdCBjb3VudCA9IHBheWxvYWQuaW52b2ljZUlkcy5sZW5ndGg7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrSW52b2ljZURvd25sb2FkKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcmVzXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vemlwJyB9KTtcbiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IHJhd0JyYW5kID0gdGhpcy5jbGllbnRJbmZvPy5jbGllbnROYW1lIHx8IHRoaXMuYnJhbmROYW1lIHx8ICdpbnZvaWNlcyc7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcmF3QnJhbmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpIHx8ICdpbnZvaWNlcyc7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYGludm9pY2VzLSR7YnJhbmR9LSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKX0uemlwYDtcbiAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBEb3dubG9hZGVkICR7Y291bnR9IGludm9pY2UocylgKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gZG93bmxvYWQgaW52b2ljZXMnKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvcGVuSW52b2ljZVByZXZpZXcoaW52OiBhbnkpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEludm9pY2VCeUlkKGludi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9pY2VEYXRhID0gcmVzPy5kYXRhIHx8IGludjtcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VQcmV2aWV3Q29tcG9uZW50LCB7XG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGludm9pY2UnKVxuICAgIH0pO1xuICB9XG5cbiAgZWRpdEludm9pY2UoaW52OiBhbnkpIHtcbiAgICAvLyBMb2NrZWQgb25jZSB0aGUgaW52b2ljZSBpcyBmaW5hbC1hcHByb3ZlZDsgdGhlIGljb24gaXMgZGlzYWJsZWQgaW4gdGhlXG4gICAgLy8gdGVtcGxhdGUgYnV0IGd1YXJkIGhlcmUgdG9vIGluIGNhc2UgaXQncyBjYWxsZWQgZnJvbSBhbm90aGVyIHBhdGguXG4gICAgaWYgKHRoaXMuaXNJbnZvaWNlTG9ja2VkKGludikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmV0Y2ggZnVsbCBpbnZvaWNlIGRhdGEgYnkgX2lkXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRJbnZvaWNlQnlJZChpbnYuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsSW52b2ljZSA9IHJlcz8uZGF0YSB8fCBpbnY7XG4gICAgICAgIHRoaXMub3BlbkVkaXRNb2RhbChmdWxsSW52b2ljZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG9wZW4gd2l0aCB3aGF0ZXZlciBkYXRhIHdlIGhhdmUgZnJvbSB0aGUgbGlzdFxuICAgICAgICB0aGlzLm9wZW5FZGl0TW9kYWwoaW52KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkVkaXRNb2RhbChpbnZvaWNlRGF0YTogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLm1vZGUgPSAnZWRpdCc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmJyYW5kSWQ7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAndXBkYXRlZCcgfHwgcmVzdWx0ID09PSAnY3JlZGl0QXBwbGllZCcgfHwgcmVzdWx0ID09PSAnZmVlQXBwbGllZCcpIHtcbiAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBjcmVhdGVJbnZvaWNlKCkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZSA9ICdjcmVhdGUnO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudElkID0gdGhpcy5icmFuZElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZGVsZXRlSW52b2ljZShpbnY6IGFueSkge1xuICAgIC8vIExvY2tlZCBvbmNlIGZpbmFsLWFwcHJvdmVkIOKAlCBtaXJyb3IgdGhlIHNhbWUgY2hlY2sgdXNlZCBvbiB0aGUgRWRpdFxuICAgIC8vIGFjdGlvbiBhbmQgZW5mb3JjZWQgYnkgdGhlIGJhY2tlbmQuXG4gICAgaWYgKHRoaXMuaXNJbnZvaWNlTG9ja2VkKGludikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUludm9pY2UoaW52Ll9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnSW52b2ljZSBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBkZWxldGUgaW52b2ljZSc7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHNlbGVjdFRhYih0YWI6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSB0YWI7XG4gICAgaWYgKHRhYiA9PT0gJ2ludm9pY2VzJykge1xuICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICB9XG4gIH1cblxuICBnb0JhY2soKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL2JpbGxpbmcnXSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgIDwhLS0gQmFjayBCdXR0b24g4oCUIGhpZGRlbiBmb3IgY2xpZW50IHVzZXJzIChubyBCcmFuZHMgbGlzdCB0byBnbyBiYWNrIHRvKS4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm10LTMgbXgtM1wiICpuZ0lmPVwiIWlzQ2xpZW50XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saW5rIHRleHQtbXV0ZWQgcC0wXCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDhIMU0xIDhMOCAxNU0xIDhMOCAxXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgQmFjayB0byBCaWxsaW5nXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCcmFuZCBIZWFkZXIg4oCUIGhpZGRlbiBmb3IgY2xpZW50IHVzZXJzLiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtaGVhZGVyIG14LTMgbXQtMyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNTBweCBzeW1ib2wtY2lyY2xlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN5bWJvbC1sYWJlbCBiZy1wcmltYXJ5IHRleHQtd2hpdGUgYnJhbmQtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAge3sgY2xpZW50SW5mbz8uY2xpZW50TmFtZT8uY2hhckF0KDApIHx8IGJyYW5kTmFtZT8uY2hhckF0KDApIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYW5kLW5hbWVcIj57eyBjbGllbnRJbmZvPy5jbGllbnROYW1lIHx8IGJyYW5kTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYW5kLW1ldGEgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIHt7IGNsaWVudEluZm8/LnRvdGFsU3RvcmVzIHx8IDAgfX0gU3RvcmVzXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0xXCI+Jm1pZGRvdDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgQmlsbGluZyB7eyBjbGllbnRJbmZvPy5zdGF0dXMgPT09ICdhY3RpdmUnID8gJ0FjdGl2ZScgOiAnSW5hY3RpdmUnIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN1YiBUYWJzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtdC00IG14LTMgcGF5bWVudGhpc3RvcnlcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdpbnZvaWNlcycpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zIG1lLTJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlcycgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignaW52b2ljZXMnKVwiPlxuICAgICAgICAgICAgSW52b2ljZXNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygnZXN0aW1hdGUnKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnZXN0aW1hdGUnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2VzdGltYXRlJylcIj5cbiAgICAgICAgICAgIEVzdGltYXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ2RhaWx5LXByaWNpbmcnKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnZGFpbHktcHJpY2luZycgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignZGFpbHktcHJpY2luZycpXCI+XG4gICAgICAgICAgICBCaWxsaW5nIEJyZWFrZG93blxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdwbGFucy1zdWJzY3JpcHRpb24nKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAncGxhbnMtc3Vic2NyaXB0aW9uJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdwbGFucy1zdWJzY3JpcHRpb24nKVwiPlxuICAgICAgICAgICAgUGxhbnMgJmFtcDsgU3Vic2NyaXB0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ2JpbGxpbmctZ3JvdXBzJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTMgbWUtMlwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2JpbGxpbmctZ3JvdXBzJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdiaWxsaW5nLWdyb3VwcycpXCI+XG4gICAgICAgICAgICBCaWxsaW5nIFNldHRpbmdzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ3B1cmNoYXNlLW9yZGVyJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdwdXJjaGFzZS1vcmRlcicgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYigncHVyY2hhc2Utb3JkZXInKVwiPlxuICAgICAgICAgICAgUHVyY2hhc2UgT3JkZXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFBsYW5zICYgU3Vic2NyaXB0aW9uIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3BsYW5zLXN1YnNjcmlwdGlvbidcIj5cbiAgICAgICAgPGxpYi1wbGFucy1zdWJzY3JpcHRpb24+PC9saWItcGxhbnMtc3Vic2NyaXB0aW9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFc3RpbWF0ZSBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdlc3RpbWF0ZSdcIj5cbiAgICAgICAgPGxpYi1lc3RpbWF0ZXMgW2NsaWVudElkXT1cImJyYW5kSWRcIj48L2xpYi1lc3RpbWF0ZXM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEludm9pY2VzIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImludm9pY2VzLXNlY3Rpb24gbXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnaW52b2ljZXMnXCI+XG4gICAgICAgIDwhLS0gU3ViLXRvZ2dsZTogcmVndWxhciBpbnZvaWNlcyB2cyBhZHZhbmNlIChUSU5WLSopIGludm9pY2VzLiBTaG93biBmb3JcbiAgICAgICAgICAgICBib3RoIHRhbmdvIGFuZCBjbGllbnQgdmlld3MuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS10eXBlLXRvZ2dsZSBtYi0zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImludm9pY2VUeXBlID09PSAnYWxsJyA/ICdpbnZvaWNlLXR5cGUtYnRuIGFjdGl2ZScgOiAnaW52b2ljZS10eXBlLWJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbnZvaWNlVHlwZSgnYWxsJylcIj5BbGwgSW52b2ljZXM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52b2ljZVR5cGUgPT09ICdhZHZhbmNlJyA/ICdpbnZvaWNlLXR5cGUtYnRuIGFjdGl2ZScgOiAnaW52b2ljZS10eXBlLWJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbnZvaWNlVHlwZSgnYWR2YW5jZScpXCI+QWR2YW5jZSBJbnZvaWNlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSGVhZGVyIHN1bW1hcnkgY2FyZHMg4oCUIE91dHN0YW5kaW5nIC8gT3ZlcmR1ZSAvIFBlbmRpbmcgUGF5bWVudCxcbiAgICAgICAgICAgICBlYWNoIHNwbGl0IGludG8gRXhjbC4gR1NUIC8gSW5jbC4gR1NUICjigrkpLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbWItM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPk91dHN0YW5kaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+RXhjbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlXCI+4oK5e3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nRXhjbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+SW5jbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlXCI+4oK5e3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nSW5jbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+e3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nQ291bnQgfX0ge3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nQ291bnQgPT09IDEgPyAnaW52b2ljZScgOiAnaW52b2ljZXMnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5PdmVyZHVlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+RXhjbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlIHRleHQtZGFuZ2VyXCI+4oK5e3sgaW52b2ljZUNhcmRzLm92ZXJkdWVFeGNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5JbmNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC1kYW5nZXJcIj7igrl7eyBpbnZvaWNlQ2FyZHMub3ZlcmR1ZUluY2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPnt7IGludm9pY2VDYXJkcy5vdmVyZHVlQ291bnQgfX0ge3sgaW52b2ljZUNhcmRzLm92ZXJkdWVDb3VudCA9PT0gMSA/ICdpbnZvaWNlJyA6ICdpbnZvaWNlcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPlBlbmRpbmcgUGF5bWVudDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkV4Y2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LXdhcm5pbmdcIj7igrl7eyBpbnZvaWNlQ2FyZHMucGVuZGluZ1BheW1lbnRFeGNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5JbmNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC13YXJuaW5nXCI+4oK5e3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50SW5jbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+e3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50Q291bnQgfX0ge3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50Q291bnQgPT09IDEgPyAnaW52b2ljZScgOiAnaW52b2ljZXMnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBIZWFkZXIgUm93IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjY2NjY3IDEwSDEzLjMzMzNNNi42NjY2NyA2LjY2NjY3SDEzLjMzMzNNNi42NjY2NyAxMy4zMzMzSDEwTTUgMTcuNUgxNUMxNS45MjA1IDE3LjUgMTYuNjY2NyAxNi43NTM4IDE2LjY2NjcgMTUuODMzM1Y0LjE2NjY3QzE2LjY2NjcgMy4yNDYxOSAxNS45MjA1IDIuNSAxNSAyLjVINUM0LjA3OTUzIDIuNSAzLjMzMzMzIDMuMjQ2MTkgMy4zMzMzMyA0LjE2NjY3VjE1LjgzMzNDMy4zMzMzMyAxNi43NTM4IDQuMDc5NTMgMTcuNSA1IDE3LjVaXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5JbnZvaWNlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1saWdodCB0ZXh0LWRhcmsgbXMtMVwiPnt7IHRvdGFsSW52b2ljZXMgfX0gdG90YWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiPlRvdGFsIGludm9pY2VkOiA8c3Ryb25nPuKCuXt7IHRvdGFsSW52b2ljZWQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBQZW5kaW5nIEFwcHJvdmFsIGlzIGludGVybmFsIHBpcGVsaW5lIOKAlCBoaWRkZW4gZm9yIGNsaWVudCBsb2dpbi5cbiAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmcgUGF5bWVudCArIFBhaWQgYXJlIHNob3duIHRvIGNsaWVudHMuIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCIgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC13YXJuaW5nXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+e3sgcGVuZGluZ0FwcHJvdmFsIH19IFBlbmRpbmcgQXBwcm92YWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1wcmltYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+e3sgcGVuZGluZ1BheW1lbnQgfX0gUGVuZGluZyBQYXltZW50PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3Qtc3VjY2Vzc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGV4dFwiPnt7IHBhaWQgfX0gUGFpZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG93bmxvYWRTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgc2VsZWN0ZWRJbnZvaWNlcy5zaXplID4gMFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidWxrRG93bmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNNS44MzMzMyA4LjMzMzMzTDEwIDEyLjVNMTAgMTIuNUwxNC4xNjY3IDguMzMzMzNNMTAgMTIuNVYyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cIiFidWxrRG93bmxvYWRpbmdcIj5Eb3dubG9hZCBTZWxlY3RlZCAoe3sgc2VsZWN0ZWRJbnZvaWNlcy5zaXplIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrRG93bmxvYWRpbmdcIj5QcmVwYXJpbmcgWklQLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhcHByb3ZlU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIGJ0bi1zbSBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiBzZWxlY3RlZEludm9pY2VzLnNpemUgPiAwICYmIChncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVsa0FwcHJvdmluZyB8fCBwZW5kaW5nSW5TZWxlY3Rpb24oKSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYuNjY2NyA1TDcuNTAwMDEgMTQuMTY2N0wzLjMzMzM0IDEwXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCIhYnVsa0FwcHJvdmluZ1wiPkFwcHJvdmUgU2VsZWN0ZWQgKHt7IHBlbmRpbmdJblNlbGVjdGlvbigpIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrQXBwcm92aW5nXCI+QXBwcm92aW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjcmVhdGVJbnZvaWNlKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNC4xNjY2N1YxNS44MzMzTTQuMTY2NjcgMTBIMTUuODMzM1wiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiPkNyZWF0ZSBJbnZvaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkV4cG9ydCgpXCIgKm5nSWY9XCIhaXNDbGllbnRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpbnZvaWNlTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIj5FeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaWx0ZXIgVGFicyArIFNlYXJjaCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnRoaXN0b3J5IGJvcmRlci0wIHB4LTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPCEtLSAnUGVuZGluZyBBcHByb3ZhbCcgaXMgaW50ZXJuYWwgcGlwZWxpbmUg4oCUIGhpZGRlbiBmb3IgY2xpZW50IGxvZ2luLlxuICAgICAgICAgICAgICAgICAgICAgQ2xpZW50cyBzdGlsbCBzZWUgQWxsIC8gUGVuZGluZyBQYXltZW50IC8gUGFpZC4gLS0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIGZpbHRlclRhYnNcIiBjbGFzcz1cImJ0biBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImlzQ2xpZW50ICYmIHRhYiA9PT0gJ1BlbmRpbmcgQXBwcm92YWwnXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlRmlsdGVyID09PSB0YWIgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0RmlsdGVyKHRhYilcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFiIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFiID09PSAnUGVuZGluZyBBcHByb3ZhbCcgJiYgcGVuZGluZ0FwcHJvdmFsXCIgY2xhc3M9XCJtcy0xIHNtYWxsXCI+e3sgcGVuZGluZ0FwcHJvdmFsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhYiA9PT0gJ1BlbmRpbmcgUGF5bWVudCcgJiYgcGVuZGluZ1BheW1lbnRcIiBjbGFzcz1cIm1zLTEgc21hbGxcIj57eyBwZW5kaW5nUGF5bWVudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBpbnZvaWNlc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXQtNiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJsZW5cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IGludm9pY2VzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSW52b2ljZSAjIG9yIGJpbGxpbmcgZ3JvdXAuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWFyY2hEaXNhYmxlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiaW52b2ljZUZpbHRlck9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUludm9pY2VGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIExvYWRpbmcgU2hpbW1lciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2VMb2FkaW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBObyBEYXRhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW52b2ljZU5vRGF0YVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBJbnZvaWNlcyBUYWJsZSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpbnZvaWNlTG9hZGluZyAmJiAhaW52b2ljZU5vRGF0YVwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYWNjb3JkaW9uIHRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIiBzdHlsZT1cIndpZHRoOiA0MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInNlbGVjdEFsbFwiIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBbZGlzYWJsZWRdPVwiaW52b2ljZUxpc3QubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2ludm9pY2UnKVwiPklOVk9JQ0UgI1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ2ludm9pY2UnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdpbnZvaWNlJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFpc0NsaWVudFwiPkJJTExJTkcgR1JPVVA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlBFUklPRDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnYmlsbGluZ0RhdGUnKVwiPkdFTkVSQVRFRFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ2JpbGxpbmdEYXRlJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnYmlsbGluZ0RhdGUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlFUWTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnYW1vdW50JylcIj5BTU9VTlQgKGV4Y2wuIEdTVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdhbW91bnQnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdhbW91bnQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3RvdGFsQW1vdW50JylcIj5BTU9VTlQgKGluY2wuIEdTVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICd0b3RhbEFtb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RvdGFsQW1vdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TVEFUVVM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFDVElPTjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaW52IG9mIGludm9pY2VMaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNDBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG10LTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUludm9pY2VTZWxlY3QoaW52KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGFibGUtdGl0bGUtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ2luZGljYXRvci13YXJuaW5nJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnY/LnBheW1lbnRTdGF0dXMgPT09ICdwYWlkJyA/ICdpbmRpY2F0b3Itc3VjY2VzcycgOiAnaW5kaWNhdG9yLXByaW1hcnknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaW52b2ljZS1saW5rXCIgKGNsaWNrKT1cIm9wZW5JbnZvaWNlUHJldmlldyhpbnYpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj57eyBpbnY/Lmludm9pY2UgfX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFpc0NsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy41IDEuMTY2NzVWMi45MTY3NU0xMC41IDEuMTY2NzVWMi45MTY3NU0xLjE2NjY3IDUuNTQxNzVIMTIuODMzM00yLjMzMzMzIDIuMDQxNzVIMTEuNjY2N0MxMi4zMTExIDIuMDQxNzUgMTIuODMzMyAyLjU2NDAyIDEyLjgzMzMgMy4yMDg0MVYxMS42NjY3QzEyLjgzMzMgMTIuMzExMSAxMi4zMTExIDEyLjgzMzQgMTEuNjY2NyAxMi44MzM0SDIuMzMzMzNDMS42ODg5OSAxMi44MzM0IDEuMTY2NjcgMTIuMzExMSAxLjE2NjY3IDExLjY2NjdWMy4yMDg0MUMxLjE2NjY3IDIuNTY0MDIgMS42ODg5OSAyLjA0MTc1IDIuMzMzMzMgMi4wNDE3NVpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaW52Py5ncm91cE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjUgMS4xNjY3NVYyLjkxNjc1TTEwLjUgMS4xNjY3NVYyLjkxNjc1TTEuMTY2NjcgNS41NDE3NUgxMi44MzMzTTIuMzMzMzMgMi4wNDE3NUgxMS42NjY3QzEyLjMxMTEgMi4wNDE3NSAxMi44MzMzIDIuNTY0MDIgMTIuODMzMyAzLjIwODQxVjExLjY2NjdDMTIuODMzMyAxMi4zMTExIDEyLjMxMTEgMTIuODMzNCAxMS42NjY3IDEyLjgzMzRIMi4zMzMzM0MxLjY4ODk5IDEyLjgzMzQgMS4xNjY2NyAxMi4zMTExIDEuMTY2NjcgMTEuNjY2N1YzLjIwODQxQzEuMTY2NjcgMi41NjQwMiAxLjY4ODk5IDIuMDQxNzUgMi4zMzMzMyAyLjA0MTc1WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpbnY/LmJpbGxpbmdEYXRlIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBpbnY/LmJpbGxpbmdEYXRlIHwgZGF0ZTogJ2RkIE1NTSB5eXl5JyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGV4dC1jZW50ZXJcIj48c3Ryb25nPnt7IGludj8uc3RvcmVzIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IGludm9pY2VDdXJyZW5jeVN5bWJvbChpbnYpIH19e3sgaW52Py5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPjxzdHJvbmc+e3sgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGludikgfX17eyBpbnY/LnRvdGFsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudHMgb25seSBzZWUgdGhlIHN0YXR1cyBvbmNlIHRoZSBpbnZvaWNlIGlzIEFQUFJPVkVEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlbiBpdCdzIHRoZSBwYXltZW50IHN0YXR1czogUGVuZGluZyBQYXltZW50IC8gUGFydGlhbCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlkKS4gQXBwcm92YWwtcGlwZWxpbmUgc3RhdHVzZXMgYXJlIGhpZGRlbiBmcm9tIGNsaWVudHMuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDbGllbnQgfHwgaW52Py5zdGF0dXMgPT09ICdhcHByb3ZlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhpbnYpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRJbnZvaWNlU3RhdHVzKGludikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNQZW5kaW5nKGludilcIiBjbGFzcz1cInBlbmRpbmctbm90ZSBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52KSB9fXt7IHBlbmRpbmdBbW91bnQoaW52KSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX0gcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYXJvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50XCIgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFpc0ludm9pY2VMb2NrZWQoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubG9ja2VkLWFjdGlvbl09XCJpc0ludm9pY2VMb2NrZWQoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWlzSW52b2ljZUxvY2tlZChpbnYpICYmIGVkaXRJbnZvaWNlKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiaXNJbnZvaWNlTG9ja2VkKGludikgPyAnQXBwcm92ZWQgaW52b2ljZSDigJQgZWRpdGluZyBpcyBkaXNhYmxlZCcgOiAnRWRpdCBJbnZvaWNlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfZWRpdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yNi41IDE0LjVMMjkuNSAxNy41TTE0LjUgMjkuNUgxNy41TDI4IDE5QzI4LjM5NzggMTguNjAyMiAyOC42MjEzIDE4LjA2NjMgMjguNjIxMyAxNy41QzI4LjYyMTMgMTYuOTMzNyAyOC4zOTc4IDE2LjM5NzggMjggMTZMMjggMTZDMjcuNjAyMiAxNS42MDIyIDI3LjA2NjMgMTUuMzc4NyAyNi41IDE1LjM3ODdDMjUuOTMzNyAxNS4zNzg3IDI1LjM5NzggMTUuNjAyMiAyNSAxNkwxNC41IDI2LjVWMjkuNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9lZGl0XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfZWRpdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2VkaXRcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYXBwcm92ZUludm9pY2UoaW52KVwiIFtuZ2JUb29sdGlwXT1cImdldEFwcHJvdmVUb29sdGlwKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgY2FuQXBwcm92ZShpbnYsIChncy51c2VyQWNjZXNzIHwgYXN5bmMpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNjQ3OF80MzA0MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNjQ3OF80MzA0MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMC4zMzQ2IDIwLjIzMzVWMjEuMDAwMkMzMC4zMzM2IDIyLjc5NzIgMjkuNzUxNyAyNC41NDU4IDI4LjY3NTcgMjUuOTg1MUMyNy41OTk4IDI3LjQyNDQgMjYuMDg3NCAyOC40NzczIDI0LjM2NDEgMjguOTg2OEMyMi42NDA4IDI5LjQ5NjMgMjAuNzk5IDI5LjQzNTEgMTkuMTEzNCAyOC44MTI0QzE3LjQyNzcgMjguMTg5NiAxNS45ODg1IDI3LjAzODYgMTUuMDEwNCAyNS41MzExQzE0LjAzMjQgMjQuMDIzNiAxMy41Njc4IDIyLjI0MDMgMTMuNjg2IDIwLjQ0NzFDMTMuODA0MyAxOC42NTQgMTQuNDk5IDE2Ljk0NzIgMTUuNjY2NSAxNS41ODExQzE2LjgzNDEgMTQuMjE1MSAxOC40MTIgMTMuMjYzIDIwLjE2NDggMTIuODY3QzIxLjkxNzYgMTIuNDcxIDIzLjc1MTUgMTIuNjUyMiAyNS4zOTMgMTMuMzgzNU0zMC4zMzQ2IDE0LjMzMzVMMjIuMDAxMyAyMi42NzUyTDE5LjUwMTMgMjAuMTc1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTY0NzhfNDMwNDBcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18xNjQ3OF80MzA0MFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTY0NzhfNDMwNDBcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNjQ3OF80MzA0MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTIgMTEpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NsaWVudCAmJiBpbnYuc3RhdHVzPT09J2FwcHJvdmVkJyAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgbmdiVG9vbHRpcD1cIkFscmVhZHkgQXBwcm92ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzE2NjMwXzgwNjIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0VBRUNGMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTY2MzBfODA2MilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMC4zMzQ2IDIwLjIzMzVWMjEuMDAwMkMzMC4zMzM2IDIyLjc5NzIgMjkuNzUxNyAyNC41NDU4IDI4LjY3NTcgMjUuOTg1MUMyNy41OTk4IDI3LjQyNDQgMjYuMDg3NCAyOC40NzczIDI0LjM2NDEgMjguOTg2OEMyMi42NDA4IDI5LjQ5NjMgMjAuNzk5IDI5LjQzNTEgMTkuMTEzNCAyOC44MTI0QzE3LjQyNzcgMjguMTg5NiAxNS45ODg1IDI3LjAzODYgMTUuMDEwNCAyNS41MzExQzE0LjAzMjQgMjQuMDIzNiAxMy41Njc4IDIyLjI0MDMgMTMuNjg2IDIwLjQ0NzFDMTMuODA0MyAxOC42NTQgMTQuNDk5IDE2Ljk0NzIgMTUuNjY2NSAxNS41ODExQzE2LjgzNDEgMTQuMjE1MSAxOC40MTIgMTMuMjYzIDIwLjE2NDggMTIuODY3QzIxLjkxNzYgMTIuNDcxIDIzLjc1MTUgMTIuNjUyMiAyNS4zOTMgMTMuMzgzNU0zMC4zMzQ2IDE0LjMzMzVMMjIuMDAxMyAyMi42NzUyTDE5LjUwMTMgMjAuMTc1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTY2MzBfODA2MlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NjMwXzgwNjJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NjMwXzgwNjJcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNjYzMF84MDYyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMiAxMSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZWdlbmVyYXRlSW52b2ljZShpbnYpXCIgbmdiVG9vbHRpcD1cIlJlZ2VuZXJhdGUgSW52b2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfMTU1MzBfNjAzOTUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMxLjE2NTQgMTQuMzMzM1YxOS4zMzMzTTMxLjE2NTQgMTkuMzMzM0gyNi4xNjU0TTMxLjE2NTQgMTkuMzMzM0wyNy4yOTg3IDE1LjdDMjYuNDAzMSAxNC44MDM5IDI1LjI5NTEgMTQuMTQ5MyAyNC4wNzggMTMuNzk3M0MyMi44NjEgMTMuNDQ1MyAyMS41NzQ2IDEzLjQwNzMgMjAuMzM4OSAxMy42ODY5QzE5LjEwMzMgMTMuOTY2NSAxNy45NTg1IDE0LjU1NDUgMTcuMDExNiAxNS4zOTYyQzE2LjA2NDYgMTYuMjM3OCAxNS4zNDYzIDE3LjMwNTYgMTQuOTIzNyAxOC41TTEyLjgzMiAyNy42NjY2VjIyLjY2NjZNMTIuODMyIDIyLjY2NjZIMTcuODMyTTEyLjgzMiAyMi42NjY2TDE2LjY5ODcgMjYuM0MxNy41OTQzIDI3LjE5NjEgMTguNzAyMyAyNy44NTA2IDE5LjkxOTQgMjguMjAyN0MyMS4xMzY0IDI4LjU1NDcgMjIuNDIyOCAyOC41OTI3IDIzLjY1ODUgMjguMzEzMUMyNC44OTQxIDI4LjAzMzUgMjYuMDM4OSAyNy40NDU1IDI2Ljk4NTggMjYuNjAzOEMyNy45MzI4IDI1Ljc2MjEgMjguNjUxMSAyNC42OTQzIDI5LjA3MzcgMjMuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNTUzMF82MDM5NVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk1XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTUzMF82MDM5NVwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnQgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicGF5bWVudHN0YXR1c0NoYW5nZShpbnYpXCIgbmdiVG9vbHRpcD1cIlBheW1lbnQgU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzLCAxMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjk5ODcgOC4wMDA2NVY2LjMzMzk4QzIuOTk4NyA1LjAwNzkgMy41MjU0OCAzLjczNjEzIDQuNDYzMTYgMi43OTg0NUM1LjQwMDg1IDEuODYwNzcgNi42NzI2MiAxLjMzMzk4IDcuOTk4NyAxLjMzMzk4QzkuMzI0NzggMS4zMzM5OCAxMC41OTY2IDEuODYwNzcgMTEuNTM0MiAyLjc5ODQ1QzEyLjQ3MTkgMy43MzYxMyAxMi45OTg3IDUuMDA3OSAxMi45OTg3IDYuMzMzOThWOC4wMDA2NU0xLjMzMjAzIDEzLjAwMDdDMS4zMzIwMyAxMy40NDI3IDEuNTA3NjMgMTMuODY2NiAxLjgyMDE5IDE0LjE3OTJDMi4xMzI3NSAxNC40OTE3IDIuNTU2NjcgMTQuNjY3MyAyLjk5ODcgMTQuNjY3M0MzLjQ0MDczIDE0LjY2NzMgMy44NjQ2NSAxNC40OTE3IDQuMTc3MjEgMTQuMTc5MkM0LjQ4OTc3IDEzLjg2NjYgNC42NjUzNiAxMy40NDI3IDQuNjY1MzYgMTMuMDAwN0M0LjY2NTM2IDEyLjU1ODYgNC40ODk3NyAxMi4xMzQ3IDQuMTc3MjEgMTEuODIyMUMzLjg2NDY1IDExLjUwOTYgMy40NDA3MyAxMS4zMzQgMi45OTg3IDExLjMzNEMyLjU1NjY3IDExLjMzNCAyLjEzMjc1IDExLjUwOTYgMS44MjAxOSAxMS44MjIxQzEuNTA3NjMgMTIuMTM0NyAxLjMzMjAzIDEyLjU1ODYgMS4zMzIwMyAxMy4wMDA3Wk0xMS4zMzIgMTMuMDAwN0MxMS4zMzIgMTMuNDQyNyAxMS41MDc2IDEzLjg2NjYgMTEuODIwMiAxNC4xNzkyQzEyLjEzMjcgMTQuNDkxNyAxMi41NTY3IDE0LjY2NzMgMTIuOTk4NyAxNC42NjczQzEzLjQ0MDcgMTQuNjY3MyAxMy44NjQ2IDE0LjQ5MTcgMTQuMTc3MiAxNC4xNzkyQzE0LjQ4OTggMTMuODY2NiAxNC42NjU0IDEzLjQ0MjcgMTQuNjY1NCAxMy4wMDA3QzE0LjY2NTQgMTIuNTU4NiAxNC40ODk4IDEyLjEzNDcgMTQuMTc3MiAxMS44MjIxQzEzLjg2NDYgMTEuNTA5NiAxMy40NDA3IDExLjMzNCAxMi45OTg3IDExLjMzNEMxMi41NTY3IDExLjMzNCAxMi4xMzI3IDExLjUwOTYgMTEuODIwMiAxMS44MjIxQzExLjUwNzYgMTIuMTM0NyAxMS4zMzIgMTIuNTU4NiAxMS4zMzIgMTMuMDAwN1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC41IDUuNUwxMyA4TDE1LjUgNS41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImRvd25sb2FkSW52b2ljZShpbnYpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIG5nYlRvb2x0aXA9XCJEb3dubG9hZCBJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNTUzMF82MDM5NilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjkuNSAyMy41VjI2LjgzMzNDMjkuNSAyNy4yNzU0IDI5LjMyNDQgMjcuNjk5MyAyOS4wMTE4IDI4LjAxMThDMjguNjk5MyAyOC4zMjQ0IDI4LjI3NTQgMjguNSAyNy44MzMzIDI4LjVIMTYuMTY2N0MxNS43MjQ2IDI4LjUgMTUuMzAwNyAyOC4zMjQ0IDE0Ljk4ODIgMjguMDExOEMxNC42NzU2IDI3LjY5OTMgMTQuNSAyNy4yNzU0IDE0LjUgMjYuODMzM1YyMy41TTE3LjgzMzMgMTkuMzMzM0wyMiAyMy41TTIyIDIzLjVMMjYuMTY2NyAxOS4zMzMzTTIyIDIzLjVWMTMuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNTUzMF82MDM5NlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk2XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTUzMF82MDM5NlwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnRcIiBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzSW52b2ljZUxvY2tlZChpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sb2NrZWQtYWN0aW9uXT1cImlzSW52b2ljZUxvY2tlZChpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXNJbnZvaWNlTG9ja2VkKGludikgJiYgZGVsZXRlSW52b2ljZShpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImlzSW52b2ljZUxvY2tlZChpbnYpID8gJ0FwcHJvdmVkIGludm9pY2Ug4oCUIGRlbGV0ZSBpcyBkaXNhYmxlZCcgOiAnRGVsZXRlIEludm9pY2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF9kZWxldGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcgMjFIMjdNMTUuNSAxN0gyOC41TTE5LjUgMjVIMjQuNU0xNi4xNjY3IDI4LjVIMjcuODMzM0MyOC43NTM4IDI4LjUgMjkuNSAyNy43NTM4IDI5LjUgMjYuODMzM1YxNS4xNjY3QzI5LjUgMTQuMjQ2MiAyOC43NTM4IDEzLjUgMjcuODMzMyAxMy41SDE2LjE2NjdDMTUuMjQ2MiAxMy41IDE0LjUgMTQuMjQ2MiAxNC41IDE1LjE2NjdWMjYuODMzM0MxNC41IDI3Ljc1MzggMTUuMjQ2MiAyOC41IDE2LjE2NjcgMjguNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9kZWxldGVcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd19kZWxldGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2RlbGV0ZVwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImludm9pY2UtdG90YWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNFwiPjxzdHJvbmc+VG90YWwgwrcge3sgdG90YWxJbnZvaWNlcyB9fSBpbnZvaWNlczwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz57eyB0b3RhbFN0b3JlcyB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxBbW91bnRFeGNsR3N0IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbEFtb3VudEluY2xHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWlzQ2xpZW50XCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rmb290PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaW52b2ljZUxvYWRpbmcgJiYgIWludm9pY2VOb0RhdGFcIj5cbiAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEYWlseSBQcmljaW5nIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2RhaWx5LXByaWNpbmcnXCI+XG4gICAgICAgIDxsaWItZGFpbHktcHJpY2luZyBbY2xpZW50SWRdPVwiYnJhbmRJZFwiPjwvbGliLWRhaWx5LXByaWNpbmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJpbGxpbmcgR3JvdXBzIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2JpbGxpbmctZ3JvdXBzJ1wiPlxuICAgICAgICA8bGliLWJpbGxpbmctZ3JvdXBzIFtjbGllbnRJZF09XCJicmFuZElkXCI+PC9saWItYmlsbGluZy1ncm91cHM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1cmNoYXNlIE9yZGVyIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3B1cmNoYXNlLW9yZGVyJ1wiPlxuICAgICAgICA8bGliLXB1cmNoYXNlLW9yZGVyIFtjbGllbnRJZF09XCJicmFuZElkXCI+PC9saWItcHVyY2hhc2Utb3JkZXI+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
857
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtaW52b2ljZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5kLWludm9pY2VzL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9icmFuZC1pbnZvaWNlcy9icmFuZC1pbnZvaWNlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDL0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7QUFDeEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBT3ZGLE1BQU0sT0FBTyxzQkFBc0I7SUF1RnZCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRDtJQUNDO0lBQ0E7SUE3Rk8sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFMUMsT0FBTyxHQUFXLEVBQUUsQ0FBQztJQUNyQixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFD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QUUsRUFBRTt3QkFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsOEJBQThCLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN0QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNsQixNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQzt3QkFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBcDFCVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwwRENuQm5DLGtvaERBaW1CTTs7NEZEOWtCTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi90YW5nby1tYW5hZ2UtYmlsbGluZy9yZXF1ZXN0LWNvbmZpcm1hdGlvbi9yZXF1ZXN0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnZXJhdGVJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcmVnZXJhdGUtaW52b2ljZS9yZWdlcmF0ZS1pbnZvaWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50U3RhdHVzY2hhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcGF5bWVudC1zdGF0dXNjaGFuZ2UvcGF5bWVudC1zdGF0dXNjaGFuZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZWRpdC1pbnZvaWNlL2VkaXQtaW52b2ljZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbnZvaWNlUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uL2ludm9pY2UtcHJldmlldy9pbnZvaWNlLXByZXZpZXcuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyYW5kLWludm9pY2VzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCcmFuZEludm9pY2VzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBicmFuZElkOiBzdHJpbmcgPSAnJztcbiAgYnJhbmROYW1lOiBzdHJpbmcgPSAnJztcbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEludm9pY2VzIGlzIHRoZSBicmFuZC1kZXRhaWwgbGFuZGluZyB0YWIgKG1hdGNoZXMgdGhlIHByb3RvdHlwZSB0YWIgb3JkZXI6XG4gIC8vIEludm9pY2VzIOKGkiBFc3RpbWF0ZSDihpIgQmlsbGluZyBCcmVha2Rvd24g4oaSIFBsYW5zICYgU3Vic2NyaXB0aW9uIOKGkiBCaWxsaW5nXG4gIC8vIFNldHRpbmdzKS5cbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyA9ICdpbnZvaWNlcyc7XG5cbiAgLy8gQ2xpZW50IGluZm9cbiAgY2xpZW50SW5mbzogYW55ID0ge307XG5cbiAgLy8gU3VtbWFyeVxuICB0b3RhbEludm9pY2VzOiBudW1iZXIgPSAwO1xuICB0b3RhbEludm9pY2VkOiBudW1iZXIgPSAwO1xuICBwZW5kaW5nQXBwcm92YWw6IG51bWJlciA9IDA7XG4gIHBlbmRpbmdQYXltZW50OiBudW1iZXIgPSAwO1xuICBwYWlkOiBudW1iZXIgPSAwO1xuICAvLyBGb290ZXIgdG90YWxzIG92ZXIgdGhlIGZ1bGwgZmlsdGVyZWQgc2V0IChmcm9tIGJhY2tlbmQgc3VtbWFyeSkuXG4gIHRvdGFsU3RvcmVzOiBudW1iZXIgPSAwO1xuICB0b3RhbEFtb3VudEV4Y2xHc3Q6IG51bWJlciA9IDA7XG4gIHRvdGFsQW1vdW50SW5jbEdzdDogbnVtYmVyID0gMDtcblxuICAvLyBUYWJsZVxuICBpbnZvaWNlTGlzdDogYW55ID0gW107XG4gIGludm9pY2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgaW52b2ljZU5vRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuICBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xuICBpdGVtc1BlclBhZ2U6IG51bWJlciA9IDEwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMCwgNTAsIDEwMCwgNTAwXTtcbiAgc29ydENvbHVtTmFtZTogc3RyaW5nID0gJ2JpbGxpbmdEYXRlJztcbiAgc29ydEJ5OiBudW1iZXIgPSAtMTtcbiAgYWN0aXZlRmlsdGVyOiBzdHJpbmcgPSAnQWxsJztcbiAgZmlsdGVyVGFicyA9IFsnQWxsJywgJ1BlbmRpbmcgQXBwcm92YWwnLCAnUGVuZGluZyBQYXltZW50JywgJ1BhaWQnXTtcbiAgLy8gSW52b2ljZSB0eXBlIHN1Yi10b2dnbGU6ICdhbGwnID0gcmVndWxhciBJTlYtKiwgJ2FkdmFuY2UnID0gVElOVi0qLlxuICBpbnZvaWNlVHlwZTogJ2FsbCcgfCAnYWR2YW5jZScgPSAnYWxsJztcbiAgLy8gSGVhZGVyIGNhcmRzIChPdXRzdGFuZGluZyAvIE92ZXJkdWUgLyBQZW5kaW5nIFBheW1lbnQpIHNwbGl0IGJ5IEdTVCwgaW4g4oK5LlxuICBpbnZvaWNlQ2FyZHMgPSB7XG4gICAgb3V0c3RhbmRpbmdFeGNsQW1vdW50OiAwLCBvdXRzdGFuZGluZ0luY2xBbW91bnQ6IDAsIG91dHN0YW5kaW5nQ291bnQ6IDAsXG4gICAgb3ZlcmR1ZUV4Y2xBbW91bnQ6IDAsIG92ZXJkdWVJbmNsQW1vdW50OiAwLCBvdmVyZHVlQ291bnQ6IDAsXG4gICAgcGVuZGluZ1BheW1lbnRFeGNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IDAsIHBlbmRpbmdQYXltZW50Q291bnQ6IDAsXG4gIH07XG5cbiAgZHVyYXRpb25GaWx0ZXI6IHN0cmluZyA9ICdwcmV2JztcblxuICAvLyBNdWx0aS1zZWxlY3QgYXBwcm92YWwgLyBkb3dubG9hZFxuICBzZWxlY3RlZEludm9pY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtBcHByb3Zpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVsa0Rvd25sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRmxhdCB1c2VyLWFjY2VzcyBvYmplY3QsIGNhY2hlZCBmcm9tIGdzLnVzZXJBY2Nlc3MuIFJlYWRzIGxpa2VcbiAgLy8gdXNlckFjY2Vzcy5UYW5nb0FkbWluX2NzbUFwcHJvdmFsX2lzRWRpdCBldGMuXG4gIHVzZXJBY2Nlc3M6IGFueSA9IHt9O1xuXG4gIC8vIENsaWVudCB1c2VycyBzZWUgYSByZWFkLW9ubHksIHJlc3RyaWN0ZWQgdmlldzogb25seSBJbnZvaWNlcyArIFBsYW5zICZcbiAgLy8gU3Vic2NyaXB0aW9uIHRhYnMsIG5vIGVkaXQvYWN0aW9uIGNvbnRyb2xzLCBzY29wZWQgdG8gdGhlaXIgb3duIGNsaWVudElkLlxuICBpc0NsaWVudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG1vbnRoRmlsdGVyOiBzdHJpbmcgPSAnJztcbiAgeWVhckZpbHRlcjogc3RyaW5nID0gJyc7XG5cbiAgaW52b2ljZUZpbHRlck9iamVjdCA9IFtcbiAgICB7IERlc2NyaXB0aW9uOiAnU3RhdHVzJywgdHlwZTogJ3NpbmdsZScsIElzc3VlczogW3sgaWQ6ICdwZW5kaW5nQXBwcm92YWwnLCB0ZXh0OiAnUGVuZGluZyBBcHByb3ZhbCcgfSwgeyBpZDogJ3BlbmRpbmdQYXltZW50JywgdGV4dDogJ1BlbmRpbmcgUGF5bWVudCcgfSwgeyBpZDogJ3BhaWQnLCB0ZXh0OiAnUGFpZCcgfV0gfSxcbiAgICB7IERlc2NyaXB0aW9uOiAnRHVyYXRpb24nLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbeyBpZDogJ2N1cnJlbnQnLCB0ZXh0OiAnQ3VycmVudCBNb250aCcgfSwgeyBpZDogJ3ByZXYnLCB0ZXh0OiAnUHJldmlvdXMgTW9udGgnIH0sIHsgaWQ6ICdsYXN0MycsIHRleHQ6ICdMYXN0IDMgTW9udGhzJyB9LCB7IGlkOiAnbGFzdDYnLCB0ZXh0OiAnTGFzdCA2IE1vbnRocycgfSwgeyBpZDogJ2xhc3QxMicsIHRleHQ6ICdMYXN0IDEgWWVhcicgfV0gfSxcbiAgICB7IERlc2NyaXB0aW9uOiAnTW9udGgnLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbXG4gICAgICB7IGlkOiAnMScsIHRleHQ6ICdKYW51YXJ5JyB9LCB7IGlkOiAnMicsIHRleHQ6ICdGZWJydWFyeScgfSwgeyBpZDogJzMnLCB0ZXh0OiAnTWFyY2gnIH0sXG4gICAgICB7IGlkOiAnNCcsIHRleHQ6ICdBcHJpbCcgfSwgeyBpZDogJzUnLCB0ZXh0OiAnTWF5JyB9LCB7IGlkOiAnNicsIHRleHQ6ICdKdW5lJyB9LFxuICAgICAgeyBpZDogJzcnLCB0ZXh0OiAnSnVseScgfSwgeyBpZDogJzgnLCB0ZXh0OiAnQXVndXN0JyB9LCB7IGlkOiAnOScsIHRleHQ6ICdTZXB0ZW1iZXInIH0sXG4gICAgICB7IGlkOiAnMTAnLCB0ZXh0OiAnT2N0b2JlcicgfSwgeyBpZDogJzExJywgdGV4dDogJ05vdmVtYmVyJyB9LCB7IGlkOiAnMTInLCB0ZXh0OiAnRGVjZW1iZXInIH1cbiAgICBdIH0sXG4gICAgeyBEZXNjcmlwdGlvbjogJ1llYXInLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiAoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCB5ZWFyczogeyBpZDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW107XG4gICAgICBmb3IgKGxldCB5ID0gY3VycmVudFllYXIgKyAxOyB5ID49IGN1cnJlbnRZZWFyIC0gNTsgeS0tKSB7XG4gICAgICAgIHllYXJzLnB1c2goeyBpZDogU3RyaW5nKHkpLCB0ZXh0OiBTdHJpbmcoeSkgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geWVhcnM7XG4gICAgfSkoKSB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcbiAgKSB7XG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcbiAgICAgICAgdGhpcy5icmFuZElkID0gZGF0YS5jbGllbnQ7XG4gICAgICAgIHRoaXMubG9hZENsaWVudEluZm8oKTtcbiAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBDYWNoZSB0aGUgdXNlcidzIGZsYXQtYWNjZXNzIG9iamVjdCBzbyBzeW5jaHJvbm91cyBtZXRob2RzIChidWxrIGZpbHRlcnMsXG4gICAgLy8gcGVuZGluZ0luU2VsZWN0aW9uKSBjYW4gZ2F0ZSBieSBzdGFnZS1zcGVjaWZpYyBwZXJtaXNzaW9uIHdpdGhvdXQgYXN5bmMuXG4gICAgdGhpcy5ncy51c2VyQWNjZXNzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFjY2VzczogYW55KSA9PiB7XG4gICAgICB0aGlzLnVzZXJBY2Nlc3MgPSBhY2Nlc3MgfHwge307XG4gICAgICB0aGlzLmlzQ2xpZW50ID0gKGFjY2Vzcz8udXNlclR5cGUgfHwgJycpID09PSAnY2xpZW50JztcbiAgICAgIC8vIEEgY2xpZW50IHVzZXIgbGFuZHMgZGlyZWN0bHkgb24gdGhlaXIgb3duIGJyYW5kIHZpZXcgKG5vIEJyYW5kcyBsaXN0IHRvXG4gICAgICAvLyBuYXZpZ2F0ZSBmcm9tKSwgc28gcmVzb2x2ZSB0aGVpciBjbGllbnRJZCBmcm9tIHRoZWlyIHByb2ZpbGUgYW5kIHNjb3BlXG4gICAgICAvLyB0aGUgdGFicyB0byBJbnZvaWNlcyArIFBsYW5zICYgU3Vic2NyaXB0aW9uLCBkZWZhdWx0aW5nIHRvIEludm9pY2VzLlxuICAgICAgaWYgKHRoaXMuaXNDbGllbnQgJiYgIXRoaXMuYnJhbmRJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHVzZXJJbmZvID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XG4gICAgICAgICAgaWYgKHVzZXJJbmZvPy5jbGllbnRJZCkge1xuICAgICAgICAgICAgdGhpcy5icmFuZElkID0gU3RyaW5nKHVzZXJJbmZvLmNsaWVudElkKTtcbiAgICAgICAgICAgIGlmICghWydpbnZvaWNlcycsICdwbGFucy1zdWJzY3JpcHRpb24nXS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkVGFiKSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2ludm9pY2VzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZENsaWVudEluZm8oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogaWdub3JlIG1hbGZvcm1lZCB1c2VyLWluZm8gKi8gfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGFicyBhIGNsaWVudCB1c2VyIGlzIGFsbG93ZWQgdG8gc2VlIChldmVyeXRoaW5nIGZvciB0YW5nbyB1c2VycykuXG4gIGdldCB2aXNpYmxlVGFicygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGllbnRcbiAgICAgID8gWydpbnZvaWNlcycsICdwbGFucy1zdWJzY3JpcHRpb24nXVxuICAgICAgOiBbJ2ludm9pY2VzJywgJ2VzdGltYXRlJywgJ2RhaWx5LXByaWNpbmcnLCAncGxhbnMtc3Vic2NyaXB0aW9uJywgJ2JpbGxpbmctZ3JvdXBzJywgJ3B1cmNoYXNlLW9yZGVyJ107XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBzZXRQYWdlRGF0YSgpIHtcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKHRoaXMuYnJhbmROYW1lIHx8ICdCcmFuZCBJbnZvaWNlcycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0RGVzY3JpcHRpb24oJ1ZpZXcgYW5kIG1hbmFnZSBicmFuZCBpbnZvaWNlcycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xuICAgICAgeyB0aXRsZTogJ01hbmFnZScsIHBhdGg6ICcvbWFuYWdlJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcbiAgICAgIHsgdGl0bGU6ICdNYW5hZ2UnLCBwYXRoOiAnL21hbmFnZScsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgIHsgdGl0bGU6ICdCaWxsaW5nJywgcGF0aDogJy9tYW5hZ2UvYmlsbGluZycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXG4gICAgICB7IHRpdGxlOiAnQmlsbGluZycsIHBhdGg6ICcvbWFuYWdlL2JpbGxpbmcnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgXSk7XG4gIH1cblxuICBsb2FkQ2xpZW50SW5mbygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldENsaWVudEJpbGxpbmdJbmZvKHsgY2xpZW50SWQ6IHRoaXMuYnJhbmRJZCB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5jbGllbnRJbmZvID0gcmVzLmRhdGE7XG4gICAgICAgICAgdGhpcy5icmFuZE5hbWUgPSB0aGlzLmNsaWVudEluZm8uY2xpZW50TmFtZSB8fCAnJztcbiAgICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRJbnZvaWNlcygpIHtcbiAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5pbnZvaWNlTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5pbnZvaWNlTm9EYXRhID0gZmFsc2U7XG5cbiAgICBsZXQgc3RhdHVzRmlsdGVyOiBhbnkgPSBbXTtcbiAgICBsZXQgcGF5bWVudFN0YXR1c0ZpbHRlcjogYW55ID0gW107XG5cbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIEFwcHJvdmFsJykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydwZW5kaW5nQ3NtJywgJ3BlbmRpbmdGaW5hbmNlJywgJ3BlbmRpbmdBcHByb3ZhbCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIFBheW1lbnQnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ2FwcHJvdmVkJ107XG4gICAgICBwYXltZW50U3RhdHVzRmlsdGVyID0gWyd1bnBhaWQnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGFpZCcpIHtcbiAgICAgIHBheW1lbnRTdGF0dXNGaWx0ZXIgPSBbJ3BhaWQnXTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmJyYW5kSWQsXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBzdGF0dXM6IHN0YXR1c0ZpbHRlcixcbiAgICAgIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIsXG4gICAgICBkdXJhdGlvbkZpbHRlcjogdGhpcy5kdXJhdGlvbkZpbHRlcixcbiAgICAgIG1vbnRoRmlsdGVyOiB0aGlzLm1vbnRoRmlsdGVyLFxuICAgICAgeWVhckZpbHRlcjogdGhpcy55ZWFyRmlsdGVyLFxuICAgICAgaW52b2ljZVR5cGU6IHRoaXMuaW52b2ljZVR5cGUsXG4gICAgICBleHBvcnQ6IGZhbHNlXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnJhbmRJbnZvaWNlTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIGlmIChlPy5kYXRhPy5jb3VudCkge1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VMaXN0ID0gZS5kYXRhPy5kYXRhO1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IGUuZGF0YT8uY291bnQ7XG5cbiAgICAgICAgICBpZiAoZS5kYXRhPy5jbGllbnRJbmZvKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWVudEluZm8gPSBlLmRhdGEuY2xpZW50SW5mbztcbiAgICAgICAgICAgIHRoaXMuYnJhbmROYW1lID0gdGhpcy5jbGllbnRJbmZvLmNsaWVudE5hbWUgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGUuZGF0YT8uc3VtbWFyeTtcbiAgICAgICAgICBpZiAoc3VtbWFyeSkge1xuICAgICAgICAgICAgdGhpcy50b3RhbEludm9pY2VzID0gc3VtbWFyeS50b3RhbEludm9pY2VzIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsSW52b2ljZWQgPSBzdW1tYXJ5LnRvdGFsSW52b2ljZWQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0FwcHJvdmFsID0gc3VtbWFyeS5wZW5kaW5nQXBwcm92YWwgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1BheW1lbnQgPSBzdW1tYXJ5LnBlbmRpbmdQYXltZW50IHx8IDA7XG4gICAgICAgICAgICB0aGlzLnBhaWQgPSBzdW1tYXJ5LnBhaWQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxTdG9yZXMgPSBzdW1tYXJ5LnRvdGFsU3RvcmVzIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsQW1vdW50RXhjbEdzdCA9IHN1bW1hcnkudG90YWxBbW91bnRFeGNsR3N0IHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsQW1vdW50SW5jbEdzdCA9IHN1bW1hcnkudG90YWxBbW91bnRJbmNsR3N0IHx8IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2FyZHMgPSBlLmRhdGE/LmNhcmRzO1xuICAgICAgICAgIGlmIChjYXJkcykge1xuICAgICAgICAgICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nRXhjbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nSW5jbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdJbmNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nQ291bnQ6IGNhcmRzLm91dHN0YW5kaW5nQ291bnQgfHwgMCxcbiAgICAgICAgICAgICAgb3ZlcmR1ZUV4Y2xBbW91bnQ6IGNhcmRzLm92ZXJkdWVFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG92ZXJkdWVJbmNsQW1vdW50OiBjYXJkcy5vdmVyZHVlSW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBvdmVyZHVlQ291bnQ6IGNhcmRzLm92ZXJkdWVDb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEV4Y2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50RXhjbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50SW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudENvdW50OiBjYXJkcy5wZW5kaW5nUGF5bWVudENvdW50IHx8IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW52b2ljZUxpc3QgPSBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgIC8vIE5vIGludm9pY2VzIGZvciB0aGUgY3VycmVudCBmaWx0ZXIvdG9nZ2xlIOKAlCB6ZXJvIG91dCB0aGUgY2FyZHMgYW5kXG4gICAgICAgICAgLy8gc3VtbWFyeSBjb3VudGVycyBzbyB0aGV5IGRvbid0IHNob3cgc3RhbGUgdmFsdWVzIGZyb20gYSBwcmlvciBsb2FkLlxuICAgICAgICAgIHRoaXMucmVzZXRJbnZvaWNlU3VtbWFyeSgpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAvLyBBIDIwNCAobm8gZGF0YSkgY2FuIHN1cmZhY2UgaGVyZSB0b28g4oCUIHJlc2V0IHRoZSBjYXJkcy9zdW1tYXJ5LlxuICAgICAgICB0aGlzLnJlc2V0SW52b2ljZVN1bW1hcnkoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBaZXJvIHRoZSBoZWFkZXIgY2FyZHMgKyBzdW1tYXJ5IGNvdW50ZXJzICh1c2VkIHdoZW4gdGhlIGxpc3QgaGFzIG5vIGRhdGEpLlxuICBwcml2YXRlIHJlc2V0SW52b2ljZVN1bW1hcnkoKSB7XG4gICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICBvdXRzdGFuZGluZ0V4Y2xBbW91bnQ6IDAsIG91dHN0YW5kaW5nSW5jbEFtb3VudDogMCwgb3V0c3RhbmRpbmdDb3VudDogMCxcbiAgICAgIG92ZXJkdWVFeGNsQW1vdW50OiAwLCBvdmVyZHVlSW5jbEFtb3VudDogMCwgb3ZlcmR1ZUNvdW50OiAwLFxuICAgICAgcGVuZGluZ1BheW1lbnRFeGNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IDAsIHBlbmRpbmdQYXltZW50Q291bnQ6IDAsXG4gICAgfTtcbiAgICB0aGlzLnRvdGFsSW52b2ljZXMgPSAwO1xuICAgIHRoaXMudG90YWxJbnZvaWNlZCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nQXBwcm92YWwgPSAwO1xuICAgIHRoaXMucGVuZGluZ1BheW1lbnQgPSAwO1xuICAgIHRoaXMucGFpZCA9IDA7XG4gICAgdGhpcy50b3RhbFN0b3JlcyA9IDA7XG4gICAgdGhpcy50b3RhbEFtb3VudEV4Y2xHc3QgPSAwO1xuICAgIHRoaXMudG90YWxBbW91bnRJbmNsR3N0ID0gMDtcbiAgfVxuXG4gIHNldEZpbHRlcihmaWx0ZXI6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gZmlsdGVyO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICAvLyBJbnZvaWNlIHR5cGUgc3ViLXRvZ2dsZTogYWxsIChyZWd1bGFyKSB2cyBhZHZhbmNlIChUSU5WLSopLiBSZWxvYWRzIHRoZSBsaXN0LFxuICAvLyBzdW1tYXJ5IGFuZCBjYXJkcy5cbiAgc2VsZWN0SW52b2ljZVR5cGUodHlwZTogJ2FsbCcgfCAnYWR2YW5jZScpIHtcbiAgICBpZiAodGhpcy5pbnZvaWNlVHlwZSA9PT0gdHlwZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLmludm9pY2VUeXBlID0gdHlwZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIHNvcnREYXRhKGNvbHVtbjogc3RyaW5nKSB7XG4gICAgdGhpcy5zb3J0Q29sdW1OYW1lID0gY29sdW1uO1xuICAgIHRoaXMuc29ydEJ5ICo9IC0xO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhcnNlSW50KHBhZ2VPZmZzZXQpO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnBhZ2VTaXplID0gcGFyc2VJbnQocGFnZVNpemUpO1xuICAgIC8vIEtlZXAgaXRlbXNQZXJQYWdlIGluIHN5bmMgd2l0aCB0aGUgY2hvc2VuIHNpemUg4oCUIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xcbiAgICAvLyBkZXJpdmVzIGl0cyBwYWdlIGNvdW50IGZyb20gaXRlbXNQZXJQYWdlLCBzbyBhIHN0YWxlIHZhbHVlIChhbHdheXMgMTApXG4gICAgLy8gbWFkZSB0aGUgcGFnZSBudW1iZXJzIHdyb25nIGZvciBhbnkgc2l6ZSBvdGhlciB0aGFuIDEwLlxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgbGV0IHN0YXR1c0ZpbHRlcjogYW55ID0gW107XG4gICAgbGV0IHBheW1lbnRTdGF0dXNGaWx0ZXI6IGFueSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGVuZGluZyBBcHByb3ZhbCcpIHtcbiAgICAgIHN0YXR1c0ZpbHRlciA9IFsncGVuZGluZ0NzbScsICdwZW5kaW5nRmluYW5jZScsICdwZW5kaW5nQXBwcm92YWwnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGVuZGluZyBQYXltZW50Jykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydhcHByb3ZlZCddO1xuICAgICAgcGF5bWVudFN0YXR1c0ZpbHRlciA9IFsndW5wYWlkJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZUZpbHRlciA9PT0gJ1BhaWQnKSB7XG4gICAgICBwYXltZW50U3RhdHVzRmlsdGVyID0gWydwYWlkJ107XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5icmFuZElkLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIHN0YXR1czogc3RhdHVzRmlsdGVyLFxuICAgICAgcGF5bWVudFN0YXR1czogcGF5bWVudFN0YXR1c0ZpbHRlcixcbiAgICAgIGR1cmF0aW9uRmlsdGVyOiB0aGlzLmR1cmF0aW9uRmlsdGVyLFxuICAgICAgbW9udGhGaWx0ZXI6IHRoaXMubW9udGhGaWx0ZXIsXG4gICAgICB5ZWFyRmlsdGVyOiB0aGlzLnllYXJGaWx0ZXIsXG4gICAgICBpbnZvaWNlVHlwZTogdGhpcy5pbnZvaWNlVHlwZSxcbiAgICAgIGV4cG9ydDogdHJ1ZVxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJyYW5kSW52b2ljZUxpc3RFeHBvcnQoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgJ2JyYW5kLWludm9pY2VzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU29tZXRoaW5nIHdlbnQgV3JvbmcuLicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlJbnZvaWNlRmlsdGVycyhldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXR1cycpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5Jc3N1ZXM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuSXNzdWVzLmlkO1xuICAgICAgICAgICAgaWYgKGlkID09PSAncGVuZGluZ0FwcHJvdmFsJykgdGhpcy5hY3RpdmVGaWx0ZXIgPSAnUGVuZGluZyBBcHByb3ZhbCc7XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ3BlbmRpbmdQYXltZW50JykgdGhpcy5hY3RpdmVGaWx0ZXIgPSAnUGVuZGluZyBQYXltZW50JztcbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID09PSAncGFpZCcpIHRoaXMuYWN0aXZlRmlsdGVyID0gJ1BhaWQnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUZpbHRlciA9ICdBbGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ0R1cmF0aW9uJykge1xuICAgICAgICAgIHRoaXMuZHVyYXRpb25GaWx0ZXIgPSBlbGVtZW50Lklzc3Vlcz8uaWQgfHwgJ2N1cnJlbnQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnTW9udGgnKSB7XG4gICAgICAgICAgdGhpcy5tb250aEZpbHRlciA9IGVsZW1lbnQuSXNzdWVzPy5pZCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1llYXInKSB7XG4gICAgICAgICAgdGhpcy55ZWFyRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIGdldEludm9pY2VTdGF0dXMoaW52b2ljZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdQZW5kaW5nIENTTSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSByZXR1cm4gJ1BlbmRpbmcgRmluYW5jZSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICAvLyBMZWdhY3kgcHJlLXBpcGVsaW5lIHZhbHVlLCBqdXN0IGluIGNhc2UgdW4tbWlncmF0ZWQgcm93cyBzdGlsbCBleGlzdC5cbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFydGlhbCcpIHJldHVybiAnUGFydGlhbCc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3VucGFpZCcpIHJldHVybiAnUGVuZGluZyBQYXltZW50JztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFpZCcpIHJldHVybiAnUGFpZCc7XG4gICAgcmV0dXJuIGludm9pY2Uuc3RhdHVzO1xuICB9XG5cbiAgZ2V0U3RhdHVzQ2xhc3MoaW52b2ljZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nJztcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nRmluYW5jZScpIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtaW5mbyc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC1kYXJrJztcbiAgICAvLyBMZWdhY3kgcHJlLXBpcGVsaW5lIHZhbHVlIGZhbGxzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHdhcm5pbmcgc3R5bGUuXG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZycpIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtd2FybmluZyc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3BhaWQnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3MnO1xuICAgIGlmIChpbnZvaWNlLnBheW1lbnRTdGF0dXMgPT09ICdwYXJ0aWFsJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAndW5wYWlkJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5JztcbiAgICByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LWRhbmdlcic7XG4gIH1cblxuICAvLyBPdXRzdGFuZGluZyBiYWxhbmNlIG9uIHRoaXMgaW52b2ljZS4gVXNlZCB0byByZW5kZXIgYW4gaW5saW5lXG4gIC8vIFwi4oK5IFggcGVuZGluZ1wiIG5vdGUgdW5kZXIgdGhlIHN0YXR1cyBiYWRnZSBzbyByZXZpZXdlcnMgc2VlIHRoZVxuICAvLyBzaG9ydGZhbGwgYXQgYSBnbGFuY2UuXG4gIHBlbmRpbmdBbW91bnQoaW52b2ljZTogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihpbnZvaWNlPy50b3RhbEFtb3VudCkgfHwgMDtcbiAgICBjb25zdCBwYWlkID0gTnVtYmVyKGludm9pY2U/LnBhaWRBbW91bnQpIHx8IDA7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgucm91bmQoKHRvdGFsIC0gcGFpZCkgKiAxMDApIC8gMTAwKTtcbiAgfVxuXG4gIGhhc1BlbmRpbmcoaW52b2ljZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFpZCA9IE51bWJlcihpbnZvaWNlPy5wYWlkQW1vdW50KSB8fCAwO1xuICAgIHJldHVybiBwYWlkID4gMCAmJiB0aGlzLnBlbmRpbmdBbW91bnQoaW52b2ljZSkgPiAwO1xuICB9XG5cbiAgLy8gTWlycm9yIHRoZSBiYWNrZW5kIHN5bWJvbCBtYXAgc28gZWFjaCBpbnZvaWNlIHJvdyByZW5kZXJzIGluIGl0cyBvd25cbiAgLy8gY3VycmVuY3kgKHdhcyBoYXJkY29kZWQgdG8g4oK5KS5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW5jeVN5bWJvbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaW5yOiAn4oK5JyxcbiAgICBkb2xsYXI6ICckJyxcbiAgICBzaW5nYXBvcmVkb2xsYXI6ICdTJCcsXG4gICAgZXVybzogJ+KCrCcsXG4gICAgYWVkOiAnQUVEJyxcbiAgfTtcblxuICBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbmN5U3ltYm9sc1tpbnY/LmN1cnJlbmN5IHx8ICcnXSB8fCAnJCc7XG4gIH1cblxuICAvLyBMb2NrZWQgYWZ0ZXIgZmluYWwgYXBwcm92YWwg4oCUIEVkaXQvRGVsZXRlIG11c3Qgbm90IG11dGF0ZSBhIGZpbmFsaXNlZCBpbnZvaWNlLlxuICAvLyBUaGUgYmFja2VuZCBlbmZvcmNlcyB0aGUgc2FtZSBjaGVjayAodXBkYXRlSW52b2ljZSAvIGRlbGV0ZUludm9pY2UpIHNvIHRoZVxuICAvLyBsb2NrIGNhbid0IGJlIGJ5cGFzc2VkIGJ5IGhpdHRpbmcgdGhlIEFQSSBkaXJlY3RseS5cbiAgaXNJbnZvaWNlTG9ja2VkKGludjogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGludj8uc3RhdHVzID09PSAnYXBwcm92ZWQnO1xuICB9XG5cbiAgLy8gVHJ1ZSB3aGVuIHRoZSBpbnZvaWNlIGlzIGluIGEgcHJlLWFwcHJvdmFsIHN0YWdlIEFORCB0aGUgY3VycmVudCB1c2VyXG4gIC8vIGhhcyB0aGUgbWF0Y2hpbmcgVGFuZ29BZG1pbiBwZXJtaXNzaW9uIGZvciB0aGF0IHN0YWdlLlxuICAvLyB1c2VyQWNjZXNzIGlzIHRoZSBmbGF0IG9iamVjdCBzZXJ2ZWQgYnkgR2xvYmFsU3RhdGVTZXJ2aWNlLnVzZXJBY2Nlc3MkLFxuICAvLyBlLmcuIHsgVGFuZ29BZG1pbl9jc21BcHByb3ZhbF9pc0VkaXQ6IHRydWUsIC4uLiB9XG4gIGNhbkFwcHJvdmUoaW52OiBhbnksIHVzZXJBY2Nlc3M6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdXNlckFjY2VzcykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFN1cGVyYWRtaW4gYnlwYXNzOiBjYW4gYXBwcm92ZSBhdCBhbnkgc3RhZ2UgcmVnYXJkbGVzcyBvZiBwZXItbW9kdWxlIHBlcm1pc3Npb25zLlxuICAgIGlmICh1c2VyQWNjZXNzLnJvbGUgPT09ICdzdXBlcmFkbWluJykge1xuICAgICAgcmV0dXJuIFsncGVuZGluZ0NzbScsICdwZW5kaW5nRmluYW5jZScsICdwZW5kaW5nQXBwcm92YWwnXS5pbmNsdWRlcyhpbnY/LnN0YXR1cyk7XG4gICAgfVxuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdDc20nKSByZXR1cm4gISF1c2VyQWNjZXNzLlRhbmdvQWRtaW5fY3NtQXBwcm92YWxfaXNFZGl0O1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykgcmV0dXJuICEhdXNlckFjY2Vzcy5UYW5nb0FkbWluX2ZpbmFuY2VBcHByb3ZhbF9pc0VkaXQ7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICEhdXNlckFjY2Vzcy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVG9vbHRpcCAvIGJ1dHRvbiBsYWJlbCBmb3IgdGhlIHBlci1yb3cgYXBwcm92ZSBpY29uLCBieSBjdXJyZW50IHN0YWdlLlxuICBnZXRBcHByb3ZlVG9vbHRpcChpbnY6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0NzbScpIHJldHVybiAnQXBwcm92ZSBhcyBDU00nO1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykgcmV0dXJuICdBcHByb3ZlIGFzIEZpbmFuY2UnO1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdBcHByb3ZhbCcpIHJldHVybiAnRmluYWwgQXBwcm92ZSc7XG4gICAgcmV0dXJuICdBcHByb3ZlIEludm9pY2UnO1xuICB9XG5cbiAgLy8gSHVtYW4gbGFiZWwgZm9yIGVhY2ggcGlwZWxpbmUgc3RhdHVzIOKAlCB1c2VkIGluIHRoZSBjb25maXJtYXRpb24gcG9wdXAnc1xuICAvLyBcImZyb20g4oaSIHRvXCIgYnJlYWtkb3duIHNvIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGF0IGVhY2ggYXBwcm92ZSBkb2VzLlxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlTGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIHBlbmRpbmdDc206ICdQZW5kaW5nIENTTScsXG4gICAgcGVuZGluZ0ZpbmFuY2U6ICdQZW5kaW5nIEZpbmFuY2UnLFxuICAgIHBlbmRpbmdBcHByb3ZhbDogJ1BlbmRpbmcgQXBwcm92YWwnLFxuICAgIGFwcHJvdmVkOiAnQXBwcm92ZWQnLFxuICB9O1xuXG4gIC8vIFRoZSBzaW5nbGUgbmV4dC1zdGFnZSBzdGVwIGZvciBlYWNoIHByZS1hcHByb3ZhbCBzdGF0dXMuIE1pcnJvcnMgdGhlXG4gIC8vIGJhY2tlbmQgdHJhbnNpdGlvbnMgaW4gYXBwcm92ZUludm9pY2VDc20vRmluYW5jZS9BcHByb3ZhbC5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZU5leHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgcGVuZGluZ0NzbTogJ3BlbmRpbmdGaW5hbmNlJyxcbiAgICBwZW5kaW5nRmluYW5jZTogJ3BlbmRpbmdBcHByb3ZhbCcsXG4gICAgcGVuZGluZ0FwcHJvdmFsOiAnYXBwcm92ZWQnLFxuICB9O1xuXG4gIC8vIENvbGxhcHNlIGEgbGlzdCBvZiBpbnZvaWNlcyBpbnRvIFt7ZnJvbSwgdG8sIGNvdW50fSwgLi4uXSBzb3J0ZWQgYnkgdGhlXG4gIC8vIHBpcGVsaW5lIG9yZGVyLCBzbyB0aGUgcG9wdXAgbGlzdHMgQ1NNIGZpcnN0IHRoZW4gRmluYW5jZSB0aGVuIEFwcHJvdmFsLlxuICBwcml2YXRlIGJ1aWxkVHJhbnNpdGlvbnMoaW52b2ljZXM6IGFueVtdKTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfVtdIHtcbiAgICBjb25zdCBvcmRlciA9IFsncGVuZGluZ0NzbScsICdwZW5kaW5nRmluYW5jZScsICdwZW5kaW5nQXBwcm92YWwnXTtcbiAgICBjb25zdCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBpbnZvaWNlcy5mb3JFYWNoKChpbnYpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGludj8uc3RhdHVzO1xuICAgICAgaWYgKHRoaXMuc3RhZ2VOZXh0W3N0YXR1c10pIHtcbiAgICAgICAgY291bnRzW3N0YXR1c10gPSAoY291bnRzW3N0YXR1c10gfHwgMCkgKyAxO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvcmRlclxuICAgICAgLmZpbHRlcigocykgPT4gY291bnRzW3NdKVxuICAgICAgLm1hcCgocykgPT4gKHtcbiAgICAgICAgZnJvbTogdGhpcy5zdGFnZUxhYmVsc1tzXSxcbiAgICAgICAgdG86IHRoaXMuc3RhZ2VMYWJlbHNbdGhpcy5zdGFnZU5leHRbc11dLFxuICAgICAgICBjb3VudDogY291bnRzW3NdLFxuICAgICAgfSkpO1xuICB9XG5cbiAgLy8gQ2FsbHMgdGhlIGRlZGljYXRlZCB0cmFuc2l0aW9uIGVuZHBvaW50IGZvciBlYWNoIHByZS1hcHByb3ZhbCBzdGFnZS5cbiAgLy8gRmluYWwtc3RhZ2UgYXBwcm92YWwgKHBlbmRpbmdBcHByb3ZhbCDihpIgYXBwcm92ZWQpIG11c3QgTk9UIGdvIHRocm91Z2hcbiAgLy8gaW52b2ljZURvd25sb2FkIOKAlCB0aGF0IGVuZHBvaW50IGlzIGZvciBQREYgZ2VuZXJhdGlvbiBhbmQgb25seSBhZHZhbmNlc1xuICAvLyBzdGF0dXMgYXMgYSBzaWRlIGVmZmVjdCwgd2hpY2ggc2lsZW50bHkgZmFpbHMgd2hlbiBQREYvZW1haWwgc2V0dXAgaXNcbiAgLy8gYnJva2VuLiBVc2UgYXBwcm92ZUludm9pY2VBcHByb3ZhbCwgd2hpY2ggYWR2YW5jZXMgc3RhdHVzIHVuY29uZGl0aW9uYWxseS5cbiAgcHJpdmF0ZSBhZHZhbmNlSW52b2ljZUJ5U3RhdHVzKGludjogYW55KSB7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0NzbScpIHtcbiAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdTZXJ2aWNlLmFwcHJvdmVJbnZvaWNlQ3NtKGludi5faWQpO1xuICAgIH1cbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nRmluYW5jZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdTZXJ2aWNlLmFwcHJvdmVJbnZvaWNlRmluYW5jZShpbnYuX2lkKTtcbiAgICB9XG4gICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0geyAuLi5pbnYsIHNlbmRJbnZvaWNlOiB0cnVlLCBzdGF0dXM6ICdhcHByb3ZlZCcgfTtcbiAgICAgIHJldHVybiB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VEb3dubG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhcHByb3ZlSW52b2ljZShkYXRhOiBhbnkpIHtcbiAgICAvLyBUaGUgcGVyLXJvdyBpY29uJ3MgKm5nSWYgYWxyZWFkeSBnYXRlcyBieSBzdGFnZSArIHBlcm1pc3Npb24uIElmIHRoZVxuICAgIC8vIGludm9pY2UncyBzdGF0dXMgaXNuJ3QgaW4gdGhlIHByZS1hcHByb3ZhbCBzZXQsIGFkdmFuY2VJbnZvaWNlQnlTdGF0dXNcbiAgICAvLyByZXR1cm5zIG51bGwgYmVsb3cg4oCUIHRoZSBiYWNrZW5kIHdvdWxkIGFsc28gcmVmdXNlIHdpdGggYSA0MDMvNDA5LlxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXF1ZXN0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICAvLyBTaG93IHRoZSBzaW5nbGUtcm93J3MgZnJvbSDihpIgdG8gdHJhbnNpdGlvbiBzbyB0aGUgcG9wdXAgaXMgY29uc2lzdGVudFxuICAgIC8vIHdpdGggdGhlIGJ1bGstYXBwcm92ZSBicmVha2Rvd24uXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHJhbnNpdGlvbnMgPSB0aGlzLmJ1aWxkVHJhbnNpdGlvbnMoW2RhdGFdKTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIGNvbnN0IGNhbGwgPSB0aGlzLmFkdmFuY2VJbnZvaWNlQnlTdGF0dXMoZGF0YSk7XG4gICAgICAgIGlmICghY2FsbCkgcmV0dXJuO1xuICAgICAgICBjYWxsLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdJbnZvaWNlIGFkdmFuY2VkIHRvIHRoZSBuZXh0IHN0YWdlJyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGFkdmFuY2UgaW52b2ljZSc7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHJlZ2VuZXJhdGVJbnZvaWNlKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZWdlcmF0ZUludm9pY2VDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcbiAgICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgICAgaW52b2ljZUlkOiBkYXRhLmludm9pY2UsXG4gICAgICAgICAgYWxsQ2xpZW50OiBmYWxzZSxcbiAgICAgICAgICByZWdlbnJhdGU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5pbnZvaWNlcmVnZXJhdGUocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdUaGUgaW52b2ljZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVnZW5lcmF0ZWQuJyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwYXltZW50c3RhdHVzQ2hhbmdlKGRhdGE6IGFueSkge1xuICAgIC8vIE1vZGFsIG5vdyBjb2xsZWN0cyBhIHJlYWwgcGF5bWVudCBlbnRyeSAoYW1vdW50LCBkYXRlLCBtZXRob2QsXG4gICAgLy8gcmVmZXJlbmNlLCBub3RlcykgaW5zdGVhZCBvZiBhIFllcy9ObyB0b2dnbGUuIE9uIHN1Ym1pdCB0aGUgc2VydmVyXG4gICAgLy8gYXBwZW5kcyB0byBwYXltZW50SGlzdG9yeSBhbmQgcmVjb21wdXRlcyBwYXltZW50U3RhdHVzLlxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihQYXltZW50U3RhdHVzY2hhbmdlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlID0gZGF0YTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ3JlY29yZCcgJiYgcmVzdWx0LnBheWxvYWQpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgaW52b2ljZUlkOiBkYXRhLmludm9pY2UsIC4uLnJlc3VsdC5wYXlsb2FkIH07XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UucmVjb3JkUGF5bWVudChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlcz8uZGF0YT8ucGF5bWVudFN0YXR1cyB8fCByZXM/LnBheW1lbnRTdGF0dXMgfHwgJ3VwZGF0ZWQnO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoYFBheW1lbnQgcmVjb3JkZWQg4oCUIHN0YXR1czogJHtzdGF0dXN9YCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/LmVycm9yPy5lcnJvciB8fCAnRmFpbGVkIHRvIHJlY29yZCBwYXltZW50JztcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZG93bmxvYWRJbnZvaWNlKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IHJlcSA9IHsgLi4uZGF0YSB9O1xuICAgIHJlcS5jbGllbnRJZCA9IFtkYXRhLmNsaWVudElkXTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VEb3dubG9hZChyZXEpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBkYXRhPy5iaWxsaW5nRGF0ZSA/IG5ldyBEYXRlKGRhdGEuYmlsbGluZ0RhdGUpLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbW9udGg6ICdsb25nJyB9KSA6ICcnO1xuICAgICAgICBjb25zdCBicmFuZE5hbWUgPSBkYXRhPy5yZWdpc3RlcmVkQ29tcGFueU5hbWUgfHwgZGF0YT8uY29tcGFueU5hbWUgfHwgJyc7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7ZGF0YT8uaW52b2ljZSB8fCAnaW52b2ljZSd9LSR7bW9udGh9LSR7YnJhbmROYW1lfS5wZGZgLnJlcGxhY2UoL1tcXFxcLzoqP1wiPD58XFxyXFxuXS9nLCAnJykudHJpbSgpO1xuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTXVsdGktc2VsZWN0IGFwcHJvdmFsIC8gZG93bmxvYWQuIENoZWNrYm94ZXMgYXJlIHVuY29uZGl0aW9uYWw7XG4gIC8vIEFwcHJvdmUgYWR2YW5jZXMgZWFjaCBzZWxlY3RlZCByb3cgYnkgb25lIHBpcGVsaW5lIHN0YWdlIGF0IGFjdGlvbiB0aW1lLlxuICAvLyBBIHJvdyB0aGUgdXNlciBjYW4ndCBhcHByb3ZlIGF0IGl0cyBjdXJyZW50IHN0YWdlIGlzIHNraXBwZWQuXG4gIGdldFBlbmRpbmdJbnZvaWNlcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUxpc3QuZmlsdGVyKChpbnY6IGFueSkgPT4gdGhpcy5jYW5BcHByb3ZlKGludiwgdGhpcy51c2VyQWNjZXNzKSk7XG4gIH1cblxuICBnZXRTZWxlY3RhYmxlSW52b2ljZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmludm9pY2VMaXN0O1xuICB9XG5cbiAgcGVuZGluZ0luU2VsZWN0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUxpc3QuZmlsdGVyKChpbnY6IGFueSkgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaW52Ll9pZCkgJiYgdGhpcy5jYW5BcHByb3ZlKGludiwgdGhpcy51c2VyQWNjZXNzKVxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdEFsbCkge1xuICAgICAgdGhpcy5nZXRTZWxlY3RhYmxlSW52b2ljZXMoKS5mb3JFYWNoKChpbnY6IGFueSkgPT4gdGhpcy5zZWxlY3RlZEludm9pY2VzLmFkZChpbnYuX2lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUludm9pY2VTZWxlY3QoaW52OiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpbnYuX2lkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmRlbGV0ZShpbnYuX2lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmFkZChpbnYuX2lkKTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0YWJsZSA9IHRoaXMuZ2V0U2VsZWN0YWJsZUludm9pY2VzKCk7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBzZWxlY3RhYmxlLmxlbmd0aCA+IDAgJiZcbiAgICAgIHNlbGVjdGFibGUuZXZlcnkoKGk6IGFueSkgPT4gdGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpLl9pZCkpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChpbnY6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW52b2ljZXMuaGFzKGludi5faWQpO1xuICB9XG5cbiAgYXBwcm92ZVNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW52b2ljZXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIC8vIENvbXB1dGUgdGhlIGFwcHJvdmFibGUgc3Vic2V0IHVwLWZyb250IHNvIHRoZSBjb25maXJtYXRpb24gcG9wdXAgY2FuXG4gICAgLy8gc2hvdyB0aGUgZnJvbSDihpIgdG8gYnJlYWtkb3duIGJlZm9yZSB0aGUgdXNlciBjbGlja3MgWWVzLlxuICAgIGNvbnN0IHNlbGVjdGVkTGlzdCA9IHRoaXMuaW52b2ljZUxpc3QuZmlsdGVyKChpbnY6IGFueSkgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaW52Ll9pZCkgJiYgdGhpcy5jYW5BcHByb3ZlKGludiwgdGhpcy51c2VyQWNjZXNzKVxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gcGVuZGluZyBpbnZvaWNlcyBpbiBzZWxlY3Rpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRyYW5zaXRpb25zID0gdGhpcy5idWlsZFRyYW5zaXRpb25zKHNlbGVjdGVkTGlzdCk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICB0aGlzLmJ1bGtBcHByb3ZpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgY29tcGxldGVkID0gMDtcbiAgICAgICAgbGV0IHN1Y2NlZWRlZCA9IDA7XG4gICAgICAgIGxldCBmYWlsZWQgPSAwO1xuICAgICAgICBzZWxlY3RlZExpc3QuZm9yRWFjaCgoaW52OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBjYWxsID0gdGhpcy5hZHZhbmNlSW52b2ljZUJ5U3RhdHVzKGludik7XG4gICAgICAgICAgaWYgKCFjYWxsKSB7XG4gICAgICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgICAgICAgc3VjY2VlZGVkKys7XG4gICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPT09IHNlbGVjdGVkTGlzdC5sZW5ndGgpIHRoaXMuZmluaXNoQnVsa0FwcHJvdmUoc3VjY2VlZGVkLCBmYWlsZWQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA9PT0gc2VsZWN0ZWRMaXN0Lmxlbmd0aCkgdGhpcy5maW5pc2hCdWxrQXBwcm92ZShzdWNjZWVkZWQsIGZhaWxlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQnVsa0FwcHJvdmUoc3VjY2VlZGVkOiBudW1iZXIsIGZhaWxlZDogbnVtYmVyKSB7XG4gICAgdGhpcy5idWxrQXBwcm92aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZTtcbiAgICBpZiAoZmFpbGVkID09PSAwKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgJHtzdWNjZWVkZWR9IGludm9pY2UocykgYWR2YW5jZWQgdG8gbmV4dCBzdGFnZWApO1xuICAgIH0gZWxzZSBpZiAoc3VjY2VlZGVkID09PSAwKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYEFsbCAke2ZhaWxlZH0gaW52b2ljZShzKSBmYWlsZWQgdG8gYWR2YW5jZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYCR7c3VjY2VlZGVkfSBhZHZhbmNlZCwgJHtmYWlsZWR9IGZhaWxlZGApO1xuICAgIH1cbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgZG93bmxvYWRTZWxlY3RlZCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEludm9pY2VzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgaW52b2ljZUlkczogWy4uLnRoaXMuc2VsZWN0ZWRJbnZvaWNlc10gfTtcbiAgICBjb25zdCBjb3VudCA9IHBheWxvYWQuaW52b2ljZUlkcy5sZW5ndGg7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrSW52b2ljZURvd25sb2FkKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcmVzXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vemlwJyB9KTtcbiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IHJhd0JyYW5kID0gdGhpcy5jbGllbnRJbmZvPy5jbGllbnROYW1lIHx8IHRoaXMuYnJhbmROYW1lIHx8ICdpbnZvaWNlcyc7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcmF3QnJhbmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpIHx8ICdpbnZvaWNlcyc7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYGludm9pY2VzLSR7YnJhbmR9LSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKX0uemlwYDtcbiAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0QWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBEb3dubG9hZGVkICR7Y291bnR9IGludm9pY2UocylgKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gZG93bmxvYWQgaW52b2ljZXMnKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvcGVuSW52b2ljZVByZXZpZXcoaW52OiBhbnkpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEludm9pY2VCeUlkKGludi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9pY2VEYXRhID0gcmVzPy5kYXRhIHx8IGludjtcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VQcmV2aWV3Q29tcG9uZW50LCB7XG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGludm9pY2UnKVxuICAgIH0pO1xuICB9XG5cbiAgZWRpdEludm9pY2UoaW52OiBhbnkpIHtcbiAgICAvLyBMb2NrZWQgb25jZSB0aGUgaW52b2ljZSBpcyBmaW5hbC1hcHByb3ZlZDsgdGhlIGljb24gaXMgZGlzYWJsZWQgaW4gdGhlXG4gICAgLy8gdGVtcGxhdGUgYnV0IGd1YXJkIGhlcmUgdG9vIGluIGNhc2UgaXQncyBjYWxsZWQgZnJvbSBhbm90aGVyIHBhdGguXG4gICAgaWYgKHRoaXMuaXNJbnZvaWNlTG9ja2VkKGludikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmV0Y2ggZnVsbCBpbnZvaWNlIGRhdGEgYnkgX2lkXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRJbnZvaWNlQnlJZChpbnYuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsSW52b2ljZSA9IHJlcz8uZGF0YSB8fCBpbnY7XG4gICAgICAgIHRoaXMub3BlbkVkaXRNb2RhbChmdWxsSW52b2ljZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG9wZW4gd2l0aCB3aGF0ZXZlciBkYXRhIHdlIGhhdmUgZnJvbSB0aGUgbGlzdFxuICAgICAgICB0aGlzLm9wZW5FZGl0TW9kYWwoaW52KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkVkaXRNb2RhbChpbnZvaWNlRGF0YTogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLm1vZGUgPSAnZWRpdCc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmJyYW5kSWQ7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAndXBkYXRlZCcgfHwgcmVzdWx0ID09PSAnY3JlZGl0QXBwbGllZCcgfHwgcmVzdWx0ID09PSAnZmVlQXBwbGllZCcpIHtcbiAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBjcmVhdGVJbnZvaWNlKCkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZSA9ICdjcmVhdGUnO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudElkID0gdGhpcy5icmFuZElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZGVsZXRlSW52b2ljZShpbnY6IGFueSkge1xuICAgIC8vIExvY2tlZCBvbmNlIGZpbmFsLWFwcHJvdmVkIOKAlCBtaXJyb3IgdGhlIHNhbWUgY2hlY2sgdXNlZCBvbiB0aGUgRWRpdFxuICAgIC8vIGFjdGlvbiBhbmQgZW5mb3JjZWQgYnkgdGhlIGJhY2tlbmQuXG4gICAgaWYgKHRoaXMuaXNJbnZvaWNlTG9ja2VkKGludikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUludm9pY2UoaW52Ll9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnSW52b2ljZSBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBkZWxldGUgaW52b2ljZSc7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIHNlbGVjdFRhYih0YWI6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSB0YWI7XG4gICAgaWYgKHRhYiA9PT0gJ2ludm9pY2VzJykge1xuICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICB9XG4gIH1cblxuICBnb0JhY2soKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL2JpbGxpbmcnXSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgIDwhLS0gQmFjayBCdXR0b24g4oCUIGhpZGRlbiBmb3IgY2xpZW50IHVzZXJzIChubyBCcmFuZHMgbGlzdCB0byBnbyBiYWNrIHRvKS4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm10LTMgbXgtM1wiICpuZ0lmPVwiIWlzQ2xpZW50XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saW5rIHRleHQtbXV0ZWQgcC0wXCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDhIMU0xIDhMOCAxNU0xIDhMOCAxXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgQmFjayB0byBCaWxsaW5nXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCcmFuZCBIZWFkZXIg4oCUIGhpZGRlbiBmb3IgY2xpZW50IHVzZXJzLiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtaGVhZGVyIG14LTMgbXQtMyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNTBweCBzeW1ib2wtY2lyY2xlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN5bWJvbC1sYWJlbCBiZy1wcmltYXJ5IHRleHQtd2hpdGUgYnJhbmQtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAge3sgY2xpZW50SW5mbz8uY2xpZW50TmFtZT8uY2hhckF0KDApIHx8IGJyYW5kTmFtZT8uY2hhckF0KDApIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYW5kLW5hbWVcIj57eyBjbGllbnRJbmZvPy5jbGllbnROYW1lIHx8IGJyYW5kTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYW5kLW1ldGEgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIHt7IGNsaWVudEluZm8/LnRvdGFsU3RvcmVzIHx8IDAgfX0gU3RvcmVzXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0xXCI+Jm1pZGRvdDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgQmlsbGluZyB7eyBjbGllbnRJbmZvPy5zdGF0dXMgPT09ICdhY3RpdmUnID8gJ0FjdGl2ZScgOiAnSW5hY3RpdmUnIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN1YiBUYWJzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtdC00IG14LTMgcGF5bWVudGhpc3RvcnlcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdpbnZvaWNlcycpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zIG1lLTJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlcycgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignaW52b2ljZXMnKVwiPlxuICAgICAgICAgICAgSW52b2ljZXNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygnZXN0aW1hdGUnKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnZXN0aW1hdGUnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2VzdGltYXRlJylcIj5cbiAgICAgICAgICAgIEVzdGltYXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ2RhaWx5LXByaWNpbmcnKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnZGFpbHktcHJpY2luZycgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignZGFpbHktcHJpY2luZycpXCI+XG4gICAgICAgICAgICBCaWxsaW5nIEJyZWFrZG93blxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdwbGFucy1zdWJzY3JpcHRpb24nKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAncGxhbnMtc3Vic2NyaXB0aW9uJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdwbGFucy1zdWJzY3JpcHRpb24nKVwiPlxuICAgICAgICAgICAgUGxhbnMgJmFtcDsgU3Vic2NyaXB0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ2JpbGxpbmctZ3JvdXBzJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTMgbWUtMlwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2JpbGxpbmctZ3JvdXBzJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdiaWxsaW5nLWdyb3VwcycpXCI+XG4gICAgICAgICAgICBCaWxsaW5nIFNldHRpbmdzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ3B1cmNoYXNlLW9yZGVyJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdwdXJjaGFzZS1vcmRlcicgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYigncHVyY2hhc2Utb3JkZXInKVwiPlxuICAgICAgICAgICAgUHVyY2hhc2UgT3JkZXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFBsYW5zICYgU3Vic2NyaXB0aW9uIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3BsYW5zLXN1YnNjcmlwdGlvbidcIj5cbiAgICAgICAgPGxpYi1wbGFucy1zdWJzY3JpcHRpb24+PC9saWItcGxhbnMtc3Vic2NyaXB0aW9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFc3RpbWF0ZSBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdlc3RpbWF0ZSdcIj5cbiAgICAgICAgPGxpYi1lc3RpbWF0ZXMgW2NsaWVudElkXT1cImJyYW5kSWRcIj48L2xpYi1lc3RpbWF0ZXM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEludm9pY2VzIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImludm9pY2VzLXNlY3Rpb24gbXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnaW52b2ljZXMnXCI+XG4gICAgICAgIDwhLS0gU3ViLXRvZ2dsZTogcmVndWxhciBpbnZvaWNlcyB2cyBhZHZhbmNlIChUSU5WLSopIGludm9pY2VzLiBTaG93biBmb3JcbiAgICAgICAgICAgICBib3RoIHRhbmdvIGFuZCBjbGllbnQgdmlld3MuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS10eXBlLXRvZ2dsZSBtYi0zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImludm9pY2VUeXBlID09PSAnYWxsJyA/ICdpbnZvaWNlLXR5cGUtYnRuIGFjdGl2ZScgOiAnaW52b2ljZS10eXBlLWJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbnZvaWNlVHlwZSgnYWxsJylcIj5BbGwgSW52b2ljZXM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52b2ljZVR5cGUgPT09ICdhZHZhbmNlJyA/ICdpbnZvaWNlLXR5cGUtYnRuIGFjdGl2ZScgOiAnaW52b2ljZS10eXBlLWJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbnZvaWNlVHlwZSgnYWR2YW5jZScpXCI+QWR2YW5jZSBJbnZvaWNlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSGVhZGVyIHN1bW1hcnkgY2FyZHMg4oCUIE91dHN0YW5kaW5nIC8gT3ZlcmR1ZSAvIFBlbmRpbmcgUGF5bWVudCxcbiAgICAgICAgICAgICBlYWNoIHNwbGl0IGludG8gRXhjbC4gR1NUIC8gSW5jbC4gR1NUICjigrkpLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbWItM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPk91dHN0YW5kaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+RXhjbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlXCI+4oK5e3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nRXhjbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+SW5jbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlXCI+4oK5e3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nSW5jbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+e3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nQ291bnQgfX0ge3sgaW52b2ljZUNhcmRzLm91dHN0YW5kaW5nQ291bnQgPT09IDEgPyAnaW52b2ljZScgOiAnaW52b2ljZXMnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5PdmVyZHVlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+RXhjbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlIHRleHQtZGFuZ2VyXCI+4oK5e3sgaW52b2ljZUNhcmRzLm92ZXJkdWVFeGNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5JbmNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC1kYW5nZXJcIj7igrl7eyBpbnZvaWNlQ2FyZHMub3ZlcmR1ZUluY2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPnt7IGludm9pY2VDYXJkcy5vdmVyZHVlQ291bnQgfX0ge3sgaW52b2ljZUNhcmRzLm92ZXJkdWVDb3VudCA9PT0gMSA/ICdpbnZvaWNlJyA6ICdpbnZvaWNlcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPlBlbmRpbmcgUGF5bWVudDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkV4Y2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LXdhcm5pbmdcIj7igrl7eyBpbnZvaWNlQ2FyZHMucGVuZGluZ1BheW1lbnRFeGNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5JbmNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC13YXJuaW5nXCI+4oK5e3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50SW5jbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+e3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50Q291bnQgfX0ge3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50Q291bnQgPT09IDEgPyAnaW52b2ljZScgOiAnaW52b2ljZXMnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBIZWFkZXIgUm93IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjY2NjY3IDEwSDEzLjMzMzNNNi42NjY2NyA2LjY2NjY3SDEzLjMzMzNNNi42NjY2NyAxMy4zMzMzSDEwTTUgMTcuNUgxNUMxNS45MjA1IDE3LjUgMTYuNjY2NyAxNi43NTM4IDE2LjY2NjcgMTUuODMzM1Y0LjE2NjY3QzE2LjY2NjcgMy4yNDYxOSAxNS45MjA1IDIuNSAxNSAyLjVINUM0LjA3OTUzIDIuNSAzLjMzMzMzIDMuMjQ2MTkgMy4zMzMzMyA0LjE2NjY3VjE1LjgzMzNDMy4zMzMzMyAxNi43NTM4IDQuMDc5NTMgMTcuNSA1IDE3LjVaXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5JbnZvaWNlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1saWdodCB0ZXh0LWRhcmsgbXMtMVwiPnt7IHRvdGFsSW52b2ljZXMgfX0gdG90YWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiPlRvdGFsIGludm9pY2VkOiA8c3Ryb25nPuKCuXt7IHRvdGFsSW52b2ljZWQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBQZW5kaW5nIEFwcHJvdmFsIGlzIGludGVybmFsIHBpcGVsaW5lIOKAlCBoaWRkZW4gZm9yIGNsaWVudCBsb2dpbi5cbiAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmcgUGF5bWVudCArIFBhaWQgYXJlIHNob3duIHRvIGNsaWVudHMuIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCIgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC13YXJuaW5nXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+e3sgcGVuZGluZ0FwcHJvdmFsIH19IFBlbmRpbmcgQXBwcm92YWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtZG90IGRvdC1wcmltYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+e3sgcGVuZGluZ1BheW1lbnQgfX0gUGVuZGluZyBQYXltZW50PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBkb3Qtc3VjY2Vzc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGV4dFwiPnt7IHBhaWQgfX0gUGFpZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG93bmxvYWRTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgc2VsZWN0ZWRJbnZvaWNlcy5zaXplID4gMFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidWxrRG93bmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNNS44MzMzMyA4LjMzMzMzTDEwIDEyLjVNMTAgMTIuNUwxNC4xNjY3IDguMzMzMzNNMTAgMTIuNVYyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cIiFidWxrRG93bmxvYWRpbmdcIj5Eb3dubG9hZCBTZWxlY3RlZCAoe3sgc2VsZWN0ZWRJbnZvaWNlcy5zaXplIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrRG93bmxvYWRpbmdcIj5QcmVwYXJpbmcgWklQLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhcHByb3ZlU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIGJ0bi1zbSBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiBzZWxlY3RlZEludm9pY2VzLnNpemUgPiAwICYmIChncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVsa0FwcHJvdmluZyB8fCBwZW5kaW5nSW5TZWxlY3Rpb24oKSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYuNjY2NyA1TDcuNTAwMDEgMTQuMTY2N0wzLjMzMzM0IDEwXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCIhYnVsa0FwcHJvdmluZ1wiPkFwcHJvdmUgU2VsZWN0ZWQgKHt7IHBlbmRpbmdJblNlbGVjdGlvbigpIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrQXBwcm92aW5nXCI+QXBwcm92aW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjcmVhdGVJbnZvaWNlKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNC4xNjY2N1YxNS44MzMzTTQuMTY2NjcgMTBIMTUuODMzM1wiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiPkNyZWF0ZSBJbnZvaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkV4cG9ydCgpXCIgKm5nSWY9XCIhaXNDbGllbnRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpbnZvaWNlTGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIj5FeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaWx0ZXIgVGFicyArIFNlYXJjaCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnRoaXN0b3J5IGJvcmRlci0wIHB4LTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPCEtLSAnUGVuZGluZyBBcHByb3ZhbCcgaXMgaW50ZXJuYWwgcGlwZWxpbmUg4oCUIGhpZGRlbiBmb3IgY2xpZW50IGxvZ2luLlxuICAgICAgICAgICAgICAgICAgICAgQ2xpZW50cyBzdGlsbCBzZWUgQWxsIC8gUGVuZGluZyBQYXltZW50IC8gUGFpZC4gLS0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIGZpbHRlclRhYnNcIiBjbGFzcz1cImJ0biBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImlzQ2xpZW50ICYmIHRhYiA9PT0gJ1BlbmRpbmcgQXBwcm92YWwnXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlRmlsdGVyID09PSB0YWIgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0RmlsdGVyKHRhYilcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFiIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFiID09PSAnUGVuZGluZyBBcHByb3ZhbCcgJiYgcGVuZGluZ0FwcHJvdmFsXCIgY2xhc3M9XCJtcy0xIHNtYWxsXCI+e3sgcGVuZGluZ0FwcHJvdmFsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhYiA9PT0gJ1BlbmRpbmcgUGF5bWVudCcgJiYgcGVuZGluZ1BheW1lbnRcIiBjbGFzcz1cIm1zLTEgc21hbGxcIj57eyBwZW5kaW5nUGF5bWVudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBpbnZvaWNlc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXQtNiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJsZW5cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IGludm9pY2VzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSW52b2ljZSAjIG9yIGJpbGxpbmcgZ3JvdXAuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWFyY2hEaXNhYmxlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiaW52b2ljZUZpbHRlck9iamVjdFwiIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUludm9pY2VGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIExvYWRpbmcgU2hpbW1lciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2VMb2FkaW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBObyBEYXRhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW52b2ljZU5vRGF0YVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBJbnZvaWNlcyBUYWJsZSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpbnZvaWNlTG9hZGluZyAmJiAhaW52b2ljZU5vRGF0YVwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYWNjb3JkaW9uIHRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIiBzdHlsZT1cIndpZHRoOiA0MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInNlbGVjdEFsbFwiIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBbZGlzYWJsZWRdPVwiaW52b2ljZUxpc3QubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2ludm9pY2UnKVwiPklOVk9JQ0UgI1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ2ludm9pY2UnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdpbnZvaWNlJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFpc0NsaWVudFwiPkJJTExJTkcgR1JPVVA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlBFUklPRDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnYmlsbGluZ0RhdGUnKVwiPkdFTkVSQVRFRFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ2JpbGxpbmdEYXRlJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnYmlsbGluZ0RhdGUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlFUWTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnYW1vdW50JylcIj5BTU9VTlQgKGV4Y2wuIEdTVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdhbW91bnQnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdhbW91bnQnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3RvdGFsQW1vdW50JylcIj5BTU9VTlQgKGluY2wuIEdTVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICd0b3RhbEFtb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RvdGFsQW1vdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TVEFUVVM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFDVElPTjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaW52IG9mIGludm9pY2VMaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNDBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG10LTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUludm9pY2VTZWxlY3QoaW52KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGFibGUtdGl0bGUtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ2luZGljYXRvci13YXJuaW5nJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnY/LnBheW1lbnRTdGF0dXMgPT09ICdwYWlkJyA/ICdpbmRpY2F0b3Itc3VjY2VzcycgOiAnaW5kaWNhdG9yLXByaW1hcnknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaW52b2ljZS1saW5rXCIgKGNsaWNrKT1cIm9wZW5JbnZvaWNlUHJldmlldyhpbnYpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj57eyBpbnY/Lmludm9pY2UgfX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFpc0NsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy41IDEuMTY2NzVWMi45MTY3NU0xMC41IDEuMTY2NzVWMi45MTY3NU0xLjE2NjY3IDUuNTQxNzVIMTIuODMzM00yLjMzMzMzIDIuMDQxNzVIMTEuNjY2N0MxMi4zMTExIDIuMDQxNzUgMTIuODMzMyAyLjU2NDAyIDEyLjgzMzMgMy4yMDg0MVYxMS42NjY3QzEyLjgzMzMgMTIuMzExMSAxMi4zMTExIDEyLjgzMzQgMTEuNjY2NyAxMi44MzM0SDIuMzMzMzNDMS42ODg5OSAxMi44MzM0IDEuMTY2NjcgMTIuMzExMSAxLjE2NjY3IDExLjY2NjdWMy4yMDg0MUMxLjE2NjY3IDIuNTY0MDIgMS42ODg5OSAyLjA0MTc1IDIuMzMzMzMgMi4wNDE3NVpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaW52Py5ncm91cE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjUgMS4xNjY3NVYyLjkxNjc1TTEwLjUgMS4xNjY3NVYyLjkxNjc1TTEuMTY2NjcgNS41NDE3NUgxMi44MzMzTTIuMzMzMzMgMi4wNDE3NUgxMS42NjY3QzEyLjMxMTEgMi4wNDE3NSAxMi44MzMzIDIuNTY0MDIgMTIuODMzMyAzLjIwODQxVjExLjY2NjdDMTIuODMzMyAxMi4zMTExIDEyLjMxMTEgMTIuODMzNCAxMS42NjY3IDEyLjgzMzRIMi4zMzMzM0MxLjY4ODk5IDEyLjgzMzQgMS4xNjY2NyAxMi4zMTExIDEuMTY2NjcgMTEuNjY2N1YzLjIwODQxQzEuMTY2NjcgMi41NjQwMiAxLjY4ODk5IDIuMDQxNzUgMi4zMzMzMyAyLjA0MTc1WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpbnY/LmJpbGxpbmdEYXRlIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBpbnY/LmJpbGxpbmdEYXRlIHwgZGF0ZTogJ2RkIE1NTSB5eXl5JyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGV4dC1jZW50ZXJcIj48c3Ryb25nPnt7IGludj8uc3RvcmVzIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IGludm9pY2VDdXJyZW5jeVN5bWJvbChpbnYpIH19e3sgaW52Py5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPjxzdHJvbmc+e3sgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGludikgfX17eyBpbnY/LnRvdGFsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudHMgb25seSBzZWUgdGhlIHN0YXR1cyBvbmNlIHRoZSBpbnZvaWNlIGlzIEFQUFJPVkVEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlbiBpdCdzIHRoZSBwYXltZW50IHN0YXR1czogUGVuZGluZyBQYXltZW50IC8gUGFydGlhbCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlkKS4gQXBwcm92YWwtcGlwZWxpbmUgc3RhdHVzZXMgYXJlIGhpZGRlbiBmcm9tIGNsaWVudHMuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDbGllbnQgfHwgaW52Py5zdGF0dXMgPT09ICdhcHByb3ZlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhpbnYpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRJbnZvaWNlU3RhdHVzKGludikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNQZW5kaW5nKGludilcIiBjbGFzcz1cInBlbmRpbmctbm90ZSBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52KSB9fXt7IHBlbmRpbmdBbW91bnQoaW52KSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX0gcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYXJvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50XCIgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFpc0ludm9pY2VMb2NrZWQoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubG9ja2VkLWFjdGlvbl09XCJpc0ludm9pY2VMb2NrZWQoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWlzSW52b2ljZUxvY2tlZChpbnYpICYmIGVkaXRJbnZvaWNlKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiaXNJbnZvaWNlTG9ja2VkKGludikgPyAnQXBwcm92ZWQgaW52b2ljZSDigJQgZWRpdGluZyBpcyBkaXNhYmxlZCcgOiAnRWRpdCBJbnZvaWNlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfZWRpdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yNi41IDE0LjVMMjkuNSAxNy41TTE0LjUgMjkuNUgxNy41TDI4IDE5QzI4LjM5NzggMTguNjAyMiAyOC42MjEzIDE4LjA2NjMgMjguNjIxMyAxNy41QzI4LjYyMTMgMTYuOTMzNyAyOC4zOTc4IDE2LjM5NzggMjggMTZMMjggMTZDMjcuNjAyMiAxNS42MDIyIDI3LjA2NjMgMTUuMzc4NyAyNi41IDE1LjM3ODdDMjUuOTMzNyAxNS4zNzg3IDI1LjM5NzggMTUuNjAyMiAyNSAxNkwxNC41IDI2LjVWMjkuNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9lZGl0XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfZWRpdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2VkaXRcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYXBwcm92ZUludm9pY2UoaW52KVwiIFtuZ2JUb29sdGlwXT1cImdldEFwcHJvdmVUb29sdGlwKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgY2FuQXBwcm92ZShpbnYsIChncy51c2VyQWNjZXNzIHwgYXN5bmMpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNjQ3OF80MzA0MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNjQ3OF80MzA0MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMC4zMzQ2IDIwLjIzMzVWMjEuMDAwMkMzMC4zMzM2IDIyLjc5NzIgMjkuNzUxNyAyNC41NDU4IDI4LjY3NTcgMjUuOTg1MUMyNy41OTk4IDI3LjQyNDQgMjYuMDg3NCAyOC40NzczIDI0LjM2NDEgMjguOTg2OEMyMi42NDA4IDI5LjQ5NjMgMjAuNzk5IDI5LjQzNTEgMTkuMTEzNCAyOC44MTI0QzE3LjQyNzcgMjguMTg5NiAxNS45ODg1IDI3LjAzODYgMTUuMDEwNCAyNS41MzExQzE0LjAzMjQgMjQuMDIzNiAxMy41Njc4IDIyLjI0MDMgMTMuNjg2IDIwLjQ0NzFDMTMuODA0MyAxOC42NTQgMTQuNDk5IDE2Ljk0NzIgMTUuNjY2NSAxNS41ODExQzE2LjgzNDEgMTQuMjE1MSAxOC40MTIgMTMuMjYzIDIwLjE2NDggMTIuODY3QzIxLjkxNzYgMTIuNDcxIDIzLjc1MTUgMTIuNjUyMiAyNS4zOTMgMTMuMzgzNU0zMC4zMzQ2IDE0LjMzMzVMMjIuMDAxMyAyMi42NzUyTDE5LjUwMTMgMjAuMTc1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTY0NzhfNDMwNDBcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18xNjQ3OF80MzA0MFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTY0NzhfNDMwNDBcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNjQ3OF80MzA0MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTIgMTEpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NsaWVudCAmJiBpbnYuc3RhdHVzPT09J2FwcHJvdmVkJyAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgbmdiVG9vbHRpcD1cIkFscmVhZHkgQXBwcm92ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzE2NjMwXzgwNjIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0VBRUNGMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTY2MzBfODA2MilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMC4zMzQ2IDIwLjIzMzVWMjEuMDAwMkMzMC4zMzM2IDIyLjc5NzIgMjkuNzUxNyAyNC41NDU4IDI4LjY3NTcgMjUuOTg1MUMyNy41OTk4IDI3LjQyNDQgMjYuMDg3NCAyOC40NzczIDI0LjM2NDEgMjguOTg2OEMyMi42NDA4IDI5LjQ5NjMgMjAuNzk5IDI5LjQzNTEgMTkuMTEzNCAyOC44MTI0QzE3LjQyNzcgMjguMTg5NiAxNS45ODg1IDI3LjAzODYgMTUuMDEwNCAyNS41MzExQzE0LjAzMjQgMjQuMDIzNiAxMy41Njc4IDIyLjI0MDMgMTMuNjg2IDIwLjQ0NzFDMTMuODA0MyAxOC42NTQgMTQuNDk5IDE2Ljk0NzIgMTUuNjY2NSAxNS41ODExQzE2LjgzNDEgMTQuMjE1MSAxOC40MTIgMTMuMjYzIDIwLjE2NDggMTIuODY3QzIxLjkxNzYgMTIuNDcxIDIzLjc1MTUgMTIuNjUyMiAyNS4zOTMgMTMuMzgzNU0zMC4zMzQ2IDE0LjMzMzVMMjIuMDAxMyAyMi42NzUyTDE5LjUwMTMgMjAuMTc1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTY2MzBfODA2MlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NjMwXzgwNjJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NjMwXzgwNjJcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNjYzMF84MDYyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMiAxMSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZWdlbmVyYXRlSW52b2ljZShpbnYpXCIgbmdiVG9vbHRpcD1cIlJlZ2VuZXJhdGUgSW52b2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfMTU1MzBfNjAzOTUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMxLjE2NTQgMTQuMzMzM1YxOS4zMzMzTTMxLjE2NTQgMTkuMzMzM0gyNi4xNjU0TTMxLjE2NTQgMTkuMzMzM0wyNy4yOTg3IDE1LjdDMjYuNDAzMSAxNC44MDM5IDI1LjI5NTEgMTQuMTQ5MyAyNC4wNzggMTMuNzk3M0MyMi44NjEgMTMuNDQ1MyAyMS41NzQ2IDEzLjQwNzMgMjAuMzM4OSAxMy42ODY5QzE5LjEwMzMgMTMuOTY2NSAxNy45NTg1IDE0LjU1NDUgMTcuMDExNiAxNS4zOTYyQzE2LjA2NDYgMTYuMjM3OCAxNS4zNDYzIDE3LjMwNTYgMTQuOTIzNyAxOC41TTEyLjgzMiAyNy42NjY2VjIyLjY2NjZNMTIuODMyIDIyLjY2NjZIMTcuODMyTTEyLjgzMiAyMi42NjY2TDE2LjY5ODcgMjYuM0MxNy41OTQzIDI3LjE5NjEgMTguNzAyMyAyNy44NTA2IDE5LjkxOTQgMjguMjAyN0MyMS4xMzY0IDI4LjU1NDcgMjIuNDIyOCAyOC41OTI3IDIzLjY1ODUgMjguMzEzMUMyNC44OTQxIDI4LjAzMzUgMjYuMDM4OSAyNy40NDU1IDI2Ljk4NTggMjYuNjAzOEMyNy45MzI4IDI1Ljc2MjEgMjguNjUxMSAyNC42OTQzIDI5LjA3MzcgMjMuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNTUzMF82MDM5NVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk1XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTUzMF82MDM5NVwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnQgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicGF5bWVudHN0YXR1c0NoYW5nZShpbnYpXCIgbmdiVG9vbHRpcD1cIlBheW1lbnQgU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzLCAxMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjk5ODcgOC4wMDA2NVY2LjMzMzk4QzIuOTk4NyA1LjAwNzkgMy41MjU0OCAzLjczNjEzIDQuNDYzMTYgMi43OTg0NUM1LjQwMDg1IDEuODYwNzcgNi42NzI2MiAxLjMzMzk4IDcuOTk4NyAxLjMzMzk4QzkuMzI0NzggMS4zMzM5OCAxMC41OTY2IDEuODYwNzcgMTEuNTM0MiAyLjc5ODQ1QzEyLjQ3MTkgMy43MzYxMyAxMi45OTg3IDUuMDA3OSAxMi45OTg3IDYuMzMzOThWOC4wMDA2NU0xLjMzMjAzIDEzLjAwMDdDMS4zMzIwMyAxMy40NDI3IDEuNTA3NjMgMTMuODY2NiAxLjgyMDE5IDE0LjE3OTJDMi4xMzI3NSAxNC40OTE3IDIuNTU2NjcgMTQuNjY3MyAyLjk5ODcgMTQuNjY3M0MzLjQ0MDczIDE0LjY2NzMgMy44NjQ2NSAxNC40OTE3IDQuMTc3MjEgMTQuMTc5MkM0LjQ4OTc3IDEzLjg2NjYgNC42NjUzNiAxMy40NDI3IDQuNjY1MzYgMTMuMDAwN0M0LjY2NTM2IDEyLjU1ODYgNC40ODk3NyAxMi4xMzQ3IDQuMTc3MjEgMTEuODIyMUMzLjg2NDY1IDExLjUwOTYgMy40NDA3MyAxMS4zMzQgMi45OTg3IDExLjMzNEMyLjU1NjY3IDExLjMzNCAyLjEzMjc1IDExLjUwOTYgMS44MjAxOSAxMS44MjIxQzEuNTA3NjMgMTIuMTM0NyAxLjMzMjAzIDEyLjU1ODYgMS4zMzIwMyAxMy4wMDA3Wk0xMS4zMzIgMTMuMDAwN0MxMS4zMzIgMTMuNDQyNyAxMS41MDc2IDEzLjg2NjYgMTEuODIwMiAxNC4xNzkyQzEyLjEzMjcgMTQuNDkxNyAxMi41NTY3IDE0LjY2NzMgMTIuOTk4NyAxNC42NjczQzEzLjQ0MDcgMTQuNjY3MyAxMy44NjQ2IDE0LjQ5MTcgMTQuMTc3MiAxNC4xNzkyQzE0LjQ4OTggMTMuODY2NiAxNC42NjU0IDEzLjQ0MjcgMTQuNjY1NCAxMy4wMDA3QzE0LjY2NTQgMTIuNTU4NiAxNC40ODk4IDEyLjEzNDcgMTQuMTc3MiAxMS44MjIxQzEzLjg2NDYgMTEuNTA5NiAxMy40NDA3IDExLjMzNCAxMi45OTg3IDExLjMzNEMxMi41NTY3IDExLjMzNCAxMi4xMzI3IDExLjUwOTYgMTEuODIwMiAxMS44MjIxQzExLjUwNzYgMTIuMTM0NyAxMS4zMzIgMTIuNTU4NiAxMS4zMzIgMTMuMDAwN1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC41IDUuNUwxMyA4TDE1LjUgNS41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImRvd25sb2FkSW52b2ljZShpbnYpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIG5nYlRvb2x0aXA9XCJEb3dubG9hZCBJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNTUzMF82MDM5NilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjkuNSAyMy41VjI2LjgzMzNDMjkuNSAyNy4yNzU0IDI5LjMyNDQgMjcuNjk5MyAyOS4wMTE4IDI4LjAxMThDMjguNjk5MyAyOC4zMjQ0IDI4LjI3NTQgMjguNSAyNy44MzMzIDI4LjVIMTYuMTY2N0MxNS43MjQ2IDI4LjUgMTUuMzAwNyAyOC4zMjQ0IDE0Ljk4ODIgMjguMDExOEMxNC42NzU2IDI3LjY5OTMgMTQuNSAyNy4yNzU0IDE0LjUgMjYuODMzM1YyMy41TTE3LjgzMzMgMTkuMzMzM0wyMiAyMy41TTIyIDIzLjVMMjYuMTY2NyAxOS4zMzMzTTIyIDIzLjVWMTMuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNTUzMF82MDM5NlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk2XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTUzMF82MDM5NlwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnRcIiBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzSW52b2ljZUxvY2tlZChpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sb2NrZWQtYWN0aW9uXT1cImlzSW52b2ljZUxvY2tlZChpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXNJbnZvaWNlTG9ja2VkKGludikgJiYgZGVsZXRlSW52b2ljZShpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImlzSW52b2ljZUxvY2tlZChpbnYpID8gJ0FwcHJvdmVkIGludm9pY2Ug4oCUIGRlbGV0ZSBpcyBkaXNhYmxlZCcgOiAnRGVsZXRlIEludm9pY2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF9kZWxldGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcgMjFIMjdNMTUuNSAxN0gyOC41TTE5LjUgMjVIMjQuNU0xNi4xNjY3IDI4LjVIMjcuODMzM0MyOC43NTM4IDI4LjUgMjkuNSAyNy43NTM4IDI5LjUgMjYuODMzM1YxNS4xNjY3QzI5LjUgMTQuMjQ2MiAyOC43NTM4IDEzLjUgMjcuODMzMyAxMy41SDE2LjE2NjdDMTUuMjQ2MiAxMy41IDE0LjUgMTQuMjQ2MiAxNC41IDE1LjE2NjdWMjYuODMzM0MxNC41IDI3Ljc1MzggMTUuMjQ2MiAyOC41IDE2LjE2NjcgMjguNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9kZWxldGVcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd19kZWxldGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2RlbGV0ZVwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImludm9pY2UtdG90YWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGVhZGluZyBzcGFuIGNvdmVycyBJTlZPSUNFIyArIFBFUklPRCArIEdFTkVSQVRFRCwgcGx1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUxMSU5HIEdST1VQIGZvciBub24tY2xpZW50IHZpZXdzICh0aGF0IGNvbHVtbiBpcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNsaWVudHMpLiBXaXRob3V0IHRoZSBpc0NsaWVudCBhZGp1c3RtZW50IHRoZSB0b3RhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRlZCBvbmUgY29sdW1uIHJpZ2h0IG9uIGNsaWVudCBsb2dpbi4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJpc0NsaWVudCA/IDMgOiA0XCI+PHN0cm9uZz5Ub3RhbCDCtyB7eyB0b3RhbEludm9pY2VzIH19IGludm9pY2VzPC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPnt7IHRvdGFsU3RvcmVzIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbEFtb3VudEV4Y2xHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFsQW1vdW50SW5jbEdzdCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rmb290PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaW52b2ljZUxvYWRpbmcgJiYgIWludm9pY2VOb0RhdGFcIj5cbiAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEYWlseSBQcmljaW5nIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2RhaWx5LXByaWNpbmcnXCI+XG4gICAgICAgIDxsaWItZGFpbHktcHJpY2luZyBbY2xpZW50SWRdPVwiYnJhbmRJZFwiPjwvbGliLWRhaWx5LXByaWNpbmc+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJpbGxpbmcgR3JvdXBzIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2JpbGxpbmctZ3JvdXBzJ1wiPlxuICAgICAgICA8bGliLWJpbGxpbmctZ3JvdXBzIFtjbGllbnRJZF09XCJicmFuZElkXCI+PC9saWItYmlsbGluZy1ncm91cHM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFB1cmNoYXNlIE9yZGVyIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3B1cmNoYXNlLW9yZGVyJ1wiPlxuICAgICAgICA8bGliLXB1cmNoYXNlLW9yZGVyIFtjbGllbnRJZF09XCJicmFuZElkXCI+PC9saWItcHVyY2hhc2Utb3JkZXI+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=