@posiwise/smart-crm 0.0.26 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.mjs +3 -29
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-view-details/smart-crm-marketing-view-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.mjs +2 -2
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.mjs +23 -16
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.mjs +3 -4
- package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.mjs +18 -8
- package/fesm2022/posiwise-smart-crm.mjs +63 -76
- package/fesm2022/posiwise-smart-crm.mjs.map +1 -1
- package/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.d.ts +0 -6
- package/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.d.ts +24 -0
- package/package.json +1 -1
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { Component, Injector } from '@angular/core';
|
|
2
2
|
import { CrmService } from '@posiwise/smart-crm-shared';
|
|
3
3
|
import { AppBaseComponent } from '@posiwise/app-base-component';
|
|
4
|
+
import { ROUTERS } from 'libs/smart-crm/src/lib/shared/routers/routers';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
import * as i1 from "@posiwise/smart-crm-shared";
|
|
6
7
|
import * as i2 from "@angular/common";
|
|
7
8
|
import * as i3 from "@posiwise/directives";
|
|
8
|
-
import * as i4 from "
|
|
9
|
-
import * as i5 from "
|
|
10
|
-
import * as i6 from "primeng/
|
|
11
|
-
import * as i7 from "
|
|
12
|
-
import * as i8 from "
|
|
9
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
+
import * as i5 from "@angular/router";
|
|
11
|
+
import * as i6 from "primeng/api";
|
|
12
|
+
import * as i7 from "primeng/progressspinner";
|
|
13
|
+
import * as i8 from "primeng/table";
|
|
14
|
+
import * as i9 from "@posiwise/shared-components";
|
|
15
|
+
import * as i10 from "@posiwise/pipes";
|
|
16
|
+
import * as i11 from "@jsverse/transloco";
|
|
13
17
|
export class SmartCrmSummaryOthersComponent extends AppBaseComponent {
|
|
14
18
|
constructor(crmService, injector) {
|
|
15
19
|
super(injector);
|
|
16
20
|
this.crmService = crmService;
|
|
21
|
+
this.routers = ROUTERS;
|
|
17
22
|
this.signUpLastThirtyDaysLoaded = false;
|
|
18
23
|
this.activeOpportunitiesLoaded = false;
|
|
19
24
|
this.accountAtRiskDetailsLoaded = false;
|
|
@@ -25,6 +30,7 @@ export class SmartCrmSummaryOthersComponent extends AppBaseComponent {
|
|
|
25
30
|
this.getUserSubscription().subscribe(response => {
|
|
26
31
|
this.subscription = response;
|
|
27
32
|
if (this.subscription?.id) {
|
|
33
|
+
this.hasAccess = this.hasAdminAccess(this.subscription.id);
|
|
28
34
|
this.getUserInfo();
|
|
29
35
|
}
|
|
30
36
|
});
|
|
@@ -33,6 +39,7 @@ export class SmartCrmSummaryOthersComponent extends AppBaseComponent {
|
|
|
33
39
|
this.userStore().subscribe(user => {
|
|
34
40
|
if (user) {
|
|
35
41
|
this.user = user;
|
|
42
|
+
this.userId = user.id;
|
|
36
43
|
if (this.permissionService.isGranted('Pages.Beta') ||
|
|
37
44
|
this.permissionService.isSuperAdmin()) {
|
|
38
45
|
this.getSignedUpLastThirtyDays();
|
|
@@ -135,14 +142,17 @@ export class SmartCrmSummaryOthersComponent extends AppBaseComponent {
|
|
|
135
142
|
this.magicMomentLoaded = true;
|
|
136
143
|
});
|
|
137
144
|
}
|
|
145
|
+
checkPermission(permission) {
|
|
146
|
+
return this.permissionService.evaluatePermissions(permission);
|
|
147
|
+
}
|
|
138
148
|
ngOnDestroy() {
|
|
139
149
|
super.ngOnDestroy();
|
|
140
150
|
}
|
|
141
151
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmSummaryOthersComponent, deps: [{ token: i1.CrmService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
142
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmSummaryOthersComponent, selector: "pw-smart-crm-summary-others", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Owner\">\n {{ signUp.owner?.first_name }} {{ signUp.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ signUp.contact_name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ signUp.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"signedUpLastThirtyDays.length!== 0\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Title\">\n {{ opportunities.title }}\n </td>\n <td data-head=\"Contact Name\">\n {{ opportunities.crm_contact?.first_name }}\n {{ opportunities.crm_contact?.last_name }}\n </td>\n <td data-head=\"Account\">\n {{ opportunities.crm_account?.name }}\n </td>\n <td data-head=\"One Time Amount\">\n {{ opportunities.one_time_amount / 100 | currency }}\n </td>\n <td data-head=\"Monthly Amount\">\n {{ opportunities.monthly_amount / 100 | currency }}\n </td>\n <td data-head=\"Win Chance\">\n {{ opportunities.win_chances | percent }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"activeOpportunities.length !== 0\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"accountAtRisk.length !== 0\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"ContractRenewal.length !== 0\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"creditCardExpiring.length !== 0\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"magicMoment.length !==0 \">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: i7.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i2.PercentPipe, name: "percent" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i8.TranslocoPipe, name: "transloco" }] }); }
|
|
152
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmSummaryOthersComponent, selector: "pw-smart-crm-summary-others", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, signUp.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"signUp.crm_account_name\">{{ signUp?.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ signUp.expected_mrr / 100 | currency: signUp.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ signUp.signed_up_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"signedUpLastThirtyDays.length!== 0\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, opportunities.crm_account?.id]\" class=\"name-link\">\n <span [ngbTooltip]=\"opportunities.crm_account?.name\">{{ opportunities.crm_account?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Title\">\n <a [ngbTooltip]=\"opportunities?.title\" *ngIf=\"\n hasAccess ||\n opportunities?.owner_id === userId ||\n checkPermission('Pages.Product.CRM.Role.Admin')\n \" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunityInfo,\n opportunities.id\n ]\">\n <span>{{ opportunities?.title | textTruncate: 20 }} </span>\n </a>\n </td>\n <td data-head=\"One Time Amount\"> {{ opportunities.one_time_amount / 100 | currency }} </td>\n <td data-head=\"Monthly Amount\"> {{ opportunities.monthly_amount / 100 | currency }} </td>\n <td data-head=\"Win Chance\"> {{ opportunities.win_chances / 100 | percent }} <span class=\"text-danger\"\n *ngIf=\"opportunities.cancelled\">!Cancelled!</span>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"activeOpportunities.length !== 0\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account?.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"accountAtRisk.length !== 0\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.AccountMessage.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n\n <th scope=\"true\">{{ 'Crm.AccountMessage.Quarter' | transloco }}</th>\n <th scope=\"true\"> {{ 'Crm.AccountMessage.Month' | transloco }}</th>\n\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.ExpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"Quarter\">{{ account.sessions_last_quarter }}</td>\n <td data-head=\"Month\">{{ account.sessions_last_month }}</td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n <td data-head=\"ExpAt\">\n {{ account.cc_expiring_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"ContractRenewal.length !== 0\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.AccountMessage.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.ExpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n <td data-head=\"ExpAt\">\n {{ account.cc_expiring_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"creditCardExpiring.length !== 0\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account?.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"magicMoment.length !==0 \">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: i9.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i2.PercentPipe, name: "percent" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i10.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i10.TextTruncatePipe, name: "textTruncate" }, { kind: "pipe", type: i11.TranslocoPipe, name: "transloco" }] }); }
|
|
143
153
|
}
|
|
144
154
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmSummaryOthersComponent, decorators: [{
|
|
145
155
|
type: Component,
|
|
146
|
-
args: [{ selector: 'pw-smart-crm-summary-others', template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Owner\">\n {{ signUp.owner?.first_name }} {{ signUp.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ signUp.contact_name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ signUp.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"signedUpLastThirtyDays.length!== 0\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Title\">\n {{ opportunities.title }}\n </td>\n <td data-head=\"Contact Name\">\n {{ opportunities.crm_contact?.first_name }}\n {{ opportunities.crm_contact?.last_name }}\n </td>\n <td data-head=\"Account\">\n {{ opportunities.crm_account?.name }}\n </td>\n <td data-head=\"One Time Amount\">\n {{ opportunities.one_time_amount / 100 | currency }}\n </td>\n <td data-head=\"Monthly Amount\">\n {{ opportunities.monthly_amount / 100 | currency }}\n </td>\n <td data-head=\"Win Chance\">\n {{ opportunities.win_chances | percent }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"activeOpportunities.length !== 0\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"accountAtRisk.length !== 0\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"ContractRenewal.length !== 0\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"creditCardExpiring.length !== 0\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"magicMoment.length !==0 \">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n" }]
|
|
156
|
+
args: [{ selector: 'pw-smart-crm-summary-others', template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, signUp.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"signUp.crm_account_name\">{{ signUp?.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ signUp.expected_mrr / 100 | currency: signUp.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ signUp.signed_up_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"signedUpLastThirtyDays.length!== 0\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, opportunities.crm_account?.id]\" class=\"name-link\">\n <span [ngbTooltip]=\"opportunities.crm_account?.name\">{{ opportunities.crm_account?.name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"Title\">\n <a [ngbTooltip]=\"opportunities?.title\" *ngIf=\"\n hasAccess ||\n opportunities?.owner_id === userId ||\n checkPermission('Pages.Product.CRM.Role.Admin')\n \" [routerLink]=\"[\n '/' + subscription?.slug + routers.opportunityInfo,\n opportunities.id\n ]\">\n <span>{{ opportunities?.title | textTruncate: 20 }} </span>\n </a>\n </td>\n <td data-head=\"One Time Amount\"> {{ opportunities.one_time_amount / 100 | currency }} </td>\n <td data-head=\"Monthly Amount\"> {{ opportunities.monthly_amount / 100 | currency }} </td>\n <td data-head=\"Win Chance\"> {{ opportunities.win_chances / 100 | percent }} <span class=\"text-danger\"\n *ngIf=\"opportunities.cancelled\">!Cancelled!</span>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"activeOpportunities.length !== 0\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account?.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"accountAtRisk.length !== 0\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.AccountMessage.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n\n <th scope=\"true\">{{ 'Crm.AccountMessage.Quarter' | transloco }}</th>\n <th scope=\"true\"> {{ 'Crm.AccountMessage.Month' | transloco }}</th>\n\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.ExpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"Quarter\">{{ account.sessions_last_quarter }}</td>\n <td data-head=\"Month\">{{ account.sessions_last_month }}</td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n <td data-head=\"ExpAt\">\n {{ account.cc_expiring_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"ContractRenewal.length !== 0\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.AccountMessage.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.ExpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n <td data-head=\"ExpAt\">\n {{ account.cc_expiring_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"creditCardExpiring.length !== 0\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.MRR' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.AccountMessage.SignUpAt' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Account\">\n <a [routerLink]=\"['/' + subscription?.slug + routers.accountInfo, account.crm_account_id]\" class=\"name-link\">\n <span [ngbTooltip]=\"account.crm_account_name\">{{ account?.crm_account_name | textTruncate:20 }}</span>\n </a>\n </td>\n <td data-head=\"MRR\">\n {{ account.expected_mrr / 100 | currency: account.currency }}\n </td>\n <td data-head=\"SignUpAt\">\n {{ account.signed_up_at | dateFormat }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"magicMoment.length !==0 \">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n" }]
|
|
147
157
|
}], ctorParameters: () => [{ type: i1.CrmService }, { type: i0.Injector }] });
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1zdW1tYXJ5L3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy9zbWFydC1jcm0tc3VtbWFyeS1vdGhlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLXN1bW1hcnkvc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzL3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7O0FBTWhFLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUE2QmhFLFlBQ1ksVUFBc0IsRUFDOUIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSFIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWZsQywrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFFbkMsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBRWxDLCtCQUEwQixHQUFHLEtBQUssQ0FBQztRQUVuQyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFN0Isb0NBQStCLEdBQUcsS0FBSyxDQUFDO1FBRXhDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQVMxQixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxtQkFBbUIsRUFB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Q0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0Qsb0NBQW9DO0lBQzVCLGNBQWM7UUFDbEIsSUFBSSxDQUFDLFVBQVU7YUFDVixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDO2FBQ3RELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDMUIsQ0FBQzs7Z0JBQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkMsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0F0SlEsOEJBQThCO21HQUE5Qiw4QkFBOEIsMEZDVDNDLCs3WkFxVEE7OzRGRDVTYSw4QkFBOEI7a0JBSjFDLFNBQVM7K0JBQ0ksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgVXNlcixhY3RpdmVPcHBvcnR1bml0aWVzLHNpZ25lZFVwTGFzdFRoaXJ0eURheXN9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybVN1bW1hcnlPdGhlcnNDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHNpZ25lZFVwTGFzdFRoaXJ0eURheXM6c2lnbmVkVXBMYXN0VGhpcnR5RGF5c1tdO1xuXG4gICAgYWN0aXZlT3Bwb3J0dW5pdGllczphY3RpdmVPcHBvcnR1bml0aWVzW107XG5cbiAgICBhY2NvdW50QXRSaXNrOltdO1xuXG4gICAgQ29udHJhY3RSZW5ld2FsOltdO1xuXG4gICAgY3JlZGl0Q2FyZEV4cGlyaW5nOltdO1xuXG4gICAgbWFnaWNNb21lbnQ6W107XG5cbiAgICB1c2VyOiBVc2VyO1xuXG4gICAgc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGFjY291bnRBdFJpc2tEZXRhaWxzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBjb250YWN0UmVuZXdhbExvYWRlZCA9IGZhbHNlO1xuXG4gICAgY3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlsc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgbWFnaWNNb21lbnRMb2FkZWQgPSBmYWxzZTtcblxuICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY3JtU2VydmljZTogQ3JtU2VydmljZSxcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVzZXJJbmZvKCkge1xuICAgICAgICB0aGlzLnVzZXJTdG9yZSgpLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuaXNHcmFudGVkKCdQYWdlcy5CZXRhJykgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNpZ25lZFVwTGFzdFRoaXJ0eURheXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVPcHBvcnR1bml0aWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEF0Umlza0RldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250YWN0UmVuZXdhbCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENyZWRpdENhcmRFeHBpcmluZ0RldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYWdpY01vbWVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgc2lnbmVkIHVwIGxhc3QgMzAgZGF5cyBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRTaWduZWRVcExhc3RUaGlydHlEYXlzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnYWNjb3VudHNfc2lnbmVkX3VwX2xhc3RfMzBfZGF5cycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVXBMYXN0VGhpcnR5RGF5cyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLnNpZ25lZFVwTGFzdFRoaXJ0eURheXMgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25VcExhc3RUaGlydHlEYXlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIEFjdGl2ZSBPcHBvcnR1bml0aWVzIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldEFjdGl2ZU9wcG9ydHVuaXRpZXMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdhY2NvdW50c19hY3RpdmVfb3Bwb3J0dW5pdGllcycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlT3Bwb3J0dW5pdGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLmFjdGl2ZU9wcG9ydHVuaXRpZXMgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQWNjb3VudCBBdCBSaXNrIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnRBdFJpc2tEZXRhaWxzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnYWNjb3VudHNfYWNjb3VudHNfYXRfcmlzaycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0UmlzayA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLmFjY291bnRBdFJpc2sgPSByZXNwb25zZTtcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0Umlza0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ29udHJhY3QgcmVuZXdhbCBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRDb250YWN0UmVuZXdhbCgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2FjY291bnRzX2NvbnRyYWN0X3JlbmV3YWwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdFJlbmV3YWxMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ3JlZGl0IENhcmQgRXhwaXJpbmcgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0Q3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlscygpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2NyZWRpdF9jYXJkX2V4cGlyaW5nJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRpdENhcmRFeHBpcmluZ0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIG1hZ2ljIG1vbWVudCAqL1xuICAgIHByaXZhdGUgZ2V0TWFnaWNNb21lbnQoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdtYWdpY19tb21lbnQnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50ID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMubWFnaWNNb21lbnQgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPG5nLWNvbnRhaW5lciBjbGFzcz1cIm10LTVcIlxuICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQmV0YSdcIj5cbiAgICA8IS0tIFNpZ25lZCB1cCBsYXN0IDMwIGRheXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5TaWduZWQgdXAgTGFzdCAzMCBEYXlzPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwic2lnbmVkVXBMYXN0VGhpcnR5RGF5cz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJzaWduZWRVcExhc3RUaGlydHlEYXlzXCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LXNpZ25VcD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk93bmVyXCI+XG4gICAgICAgICAgICAgICAge3sgc2lnblVwLm93bmVyPy5maXJzdF9uYW1lIH19IHt7IHNpZ25VcC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBzaWduVXAuY29udGFjdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgc2lnblVwLmNvbnRhY3RfZW1haWwgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cInNpZ25lZFVwTGFzdFRoaXJ0eURheXMubGVuZ3RoIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNpZ25lZFVwTGFzdFRoaXJ0eURheXM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBY3RpdmUgT3Bwb3J0dW5pdGllcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPkFjdGl2ZSBPcHBvcnR1bml0aWVzPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhYWN0aXZlT3Bwb3J0dW5pdGllc0xvYWRlZFwiPlxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByaW1lbmctZGF0YXRhYmxlLWNvbnRhaW5lciB0YWJsZS1yZXNwb25zaXZlXCJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVPcHBvcnR1bml0aWVzPy5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZU9wcG9ydHVuaXRpZXNcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiYWN0aXZlT3Bwb3J0dW5pdGllcy5sZW5ndGhcIlxuICAgICAgICAgIFtsYXp5XT1cInRydWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Db250YWN0TmFtZScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkFjY291bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5PbmVUaW1lQW1vdW50JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuV2luQ2hhbmNlJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuTW9udGhseUFtb3VudCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgIGxldC1vcHBvcnR1bml0aWVzPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLmNybV9jb250YWN0Py5maXJzdF9uYW1lIH19XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5jcm1fY29udGFjdD8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5jcm1fYWNjb3VudD8ubmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT25lIFRpbWUgQW1vdW50XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5vbmVfdGltZV9hbW91bnQgLyAxMDAgfCBjdXJyZW5jeSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTW9udGhseSBBbW91bnRcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLm1vbnRobHlfYW1vdW50IC8gMTAwIHwgY3VycmVuY3kgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIldpbiBDaGFuY2VcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLndpbl9jaGFuY2VzIHwgcGVyY2VudCB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiICpuZ0lmPVwiYWN0aXZlT3Bwb3J0dW5pdGllcy5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY3RpdmVPcHBvcnR1bml0aWVzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZU9wcG9ydHVuaXRpZXM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBY2NvdW50cyBhdCByaXNrIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+QWNjb3VudHMgYXQgUmlzazwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWFjY291bnRBdFJpc2tEZXRhaWxzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aFwiPlxuICAgICAgICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgICAjZHRcbiAgICAgICAgICBbdmFsdWVdPVwiYWNjb3VudEF0Umlza1wiXG4gICAgICAgICAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJhY2NvdW50QXRSaXNrLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgICpuZ0lmPVwiYWNjb3VudEF0Umlzay5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY2NvdW50QXRSaXNrLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDb250cmFjdCByZW5ld2FsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q29udHJhY3QgUmVuZXdhbDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbnRhY3RSZW5ld2FsTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJDb250cmFjdFJlbmV3YWxcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiQ29udHJhY3RSZW5ld2FsLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJDb250cmFjdFJlbmV3YWwubGVuZ3RoICE9PSAwXCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgQ29udHJhY3RSZW5ld2FsLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENyZWRpdCBDYXJkIEV4cGlyaW5nIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q3JlZGl0IENhcmQgRXhwaXJpbmc8L2g1PlxuICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFjcmVkaXRDYXJkRXhwaXJpbmdEZXRhaWxzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJjcmVkaXRDYXJkRXhwaXJpbmdcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiY3JlZGl0Q2FyZEV4cGlyaW5nLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJjcmVkaXRDYXJkRXhwaXJpbmcubGVuZ3RoICE9PSAwXCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgY3JlZGl0Q2FyZEV4cGlyaW5nLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZz8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIE1hZ2ljIE1vbWVudCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPk1hZ2ljIE1vbWVudDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIW1hZ2ljTW9tZW50TG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIm1hZ2ljTW9tZW50Py5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cIm1hZ2ljTW9tZW50XCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG5cbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cIm1hZ2ljTW9tZW50Lmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJtYWdpY01vbWVudC5sZW5ndGggIT09MCBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBtYWdpY01vbWVudC5sZW5ndGggfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJtYWdpY01vbWVudD8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1zdW1tYXJ5L3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy9zbWFydC1jcm0tc3VtbWFyeS1vdGhlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLXN1bW1hcnkvc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzL3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBT2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUt4RSxNQUFNLE9BQU8sOEJBQStCLFNBQVEsZ0JBQWdCO0lBaUNoRSxZQUNZLFVBQXNCLEVBQzlCLFFBQWtCO1FBRWxCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUhSLGVBQVUsR0FBVixVQUFVLENBQVk7UUF6QmxDLFlBQU8sR0FBRyxPQUFPLENBQUM7UUFRbEIsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLDhCQUF5QixHQUFHLEtBQUssQ0FBQztRQUVsQywrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFFbkMseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBRTdCLG9DQUErQixHQUFHLEtBQUssQ0FBQztRQUV4QyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFXMUIsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxXQUFXO1FBQ2YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM5QixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLElBQ0ksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7b0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsRUFDdkMsQ0FBQztvQkFDQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxzREFBc0Q7SUFDOUMseUJBQXlCO1FBQzdCLElBQUksQ0FBQyxVQUFVO2FBQ1YsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLGlDQUFpQyxDQUFDO2FBQ3pFLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztZQUNyQyxDQUFDOztnQkFBTSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDO1FBQ2xELENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELG9EQUFvRDtJQUM1QyxzQkFBc0I7UUFDMUIsSUFBSSxDQUFDLFVBQVU7YUFDVixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsK0JBQStCLENBQUM7YUFDdkUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLENBQUM7O2dCQUFNLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7UUFDL0MsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsK0NBQStDO0lBQ3ZDLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsVUFBVTthQUNWLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQzthQUNuRSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQzVCLENBQUM7O2dCQUFNLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGdEQUFnRDtJQUN4QyxpQkFBaUI7UUFDckIsSUFBSSxDQUFDLFVBQVU7YUFDVixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsMkJBQTJCLENBQUM7YUFDbkUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUM5QixDQUFDOztnQkFBTSxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztRQUMzQyxDQUFDLENBQUM7YUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxvREFBb0Q7SUFDNUMsNEJBQTRCO1FBQ2hDLElBQUksQ0FBQyxVQUFVO2FBQ1YsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLHNCQUFzQixDQUFDO2FBQzlELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUNqQyxDQUFDOztnQkFBTSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1FBQzlDLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELG9DQUFvQztJQUM1QixjQUFjO1FBQ2xCLElBQUksQ0FBQyxVQUFVO2FBQ1YsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLGNBQWMsQ0FBQzthQUN0RCxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQzFCLENBQUM7O2dCQUFNLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFrQjtRQUM5QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0EvSlEsOEJBQThCO21HQUE5Qiw4QkFBOEIsMEZDZjNDLDRvZEErVEE7OzRGRGhUYSw4QkFBOEI7a0JBSjFDLFNBQVM7K0JBQ0ksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgU3Vic2NyaXB0aW9uLFxuICAgIFVzZXIsXG4gICAgYWN0aXZlT3Bwb3J0dW5pdGllcyxcbiAgICBzaWduZWRVcExhc3RUaGlydHlEYXlzXG59IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICdsaWJzL3NtYXJ0LWNybS9zcmMvbGliL3NoYXJlZC9yb3V0ZXJzL3JvdXRlcnMnO1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1zbWFydC1jcm0tc3VtbWFyeS1vdGhlcnMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zbWFydC1jcm0tc3VtbWFyeS1vdGhlcnMuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNtYXJ0Q3JtU3VtbWFyeU90aGVyc0NvbXBvbmVudCBleHRlbmRzIEFwcEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgc2lnbmVkVXBMYXN0VGhpcnR5RGF5czogc2lnbmVkVXBMYXN0VGhpcnR5RGF5c1tdO1xuXG4gICAgYWN0aXZlT3Bwb3J0dW5pdGllczogYWN0aXZlT3Bwb3J0dW5pdGllc1tdO1xuXG4gICAgYWNjb3VudEF0UmlzazogW107XG5cbiAgICBDb250cmFjdFJlbmV3YWw6IFtdO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBjcmVkaXRDYXJkRXhwaXJpbmc6IFtdO1xuXG4gICAgbWFnaWNNb21lbnQ6IFtdO1xuXG4gICAgdXNlcjogVXNlcjtcblxuICAgIHNpZ25VcExhc3RUaGlydHlEYXlzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBhY3RpdmVPcHBvcnR1bml0aWVzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBhY2NvdW50QXRSaXNrRGV0YWlsc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgY29udGFjdFJlbmV3YWxMb2FkZWQgPSBmYWxzZTtcblxuICAgIGNyZWRpdENhcmRFeHBpcmluZ0RldGFpbHNMb2FkZWQgPSBmYWxzZTtcblxuICAgIG1hZ2ljTW9tZW50TG9hZGVkID0gZmFsc2U7XG5cbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBoYXNBY2Nlc3M6IGJvb2xlYW47XG4gICAgdXNlcklkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3JcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldFVzZXJTdWJzY3JpcHRpb24oKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSByZXNwb25zZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0FjY2VzcyA9IHRoaXMuaGFzQWRtaW5BY2Nlc3ModGhpcy5zdWJzY3JpcHRpb24uaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVc2VySW5mbygpIHtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUodXNlciA9PiB7XG4gICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VySWQgPSB1c2VyLmlkO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc0dyYW50ZWQoJ1BhZ2VzLkJldGEnKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmlzU3VwZXJBZG1pbigpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2lnbmVkVXBMYXN0VGhpcnR5RGF5cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFjdGl2ZU9wcG9ydHVuaXRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY2NvdW50QXRSaXNrRGV0YWlscygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRhY3RSZW5ld2FsKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlscygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hZ2ljTW9tZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gY2FsbCBzaWduZWQgdXAgbGFzdCAzMCBkYXlzIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldFNpZ25lZFVwTGFzdFRoaXJ0eURheXMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdhY2NvdW50c19zaWduZWRfdXBfbGFzdF8zMF9kYXlzJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaWduZWRVcExhc3RUaGlydHlEYXlzID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuc2lnbmVkVXBMYXN0VGhpcnR5RGF5cyA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQWN0aXZlIE9wcG9ydHVuaXRpZXMgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0QWN0aXZlT3Bwb3J0dW5pdGllcygpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2FjY291bnRzX2FjdGl2ZV9vcHBvcnR1bml0aWVzJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVPcHBvcnR1bml0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuYWN0aXZlT3Bwb3J0dW5pdGllcyA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlT3Bwb3J0dW5pdGllc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gY2FsbCBBY2NvdW50IEF0IFJpc2sgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0QWNjb3VudEF0Umlza0RldGFpbHMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdhY2NvdW50c19hY2NvdW50c19hdF9yaXNrJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50QXRSaXNrID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuYWNjb3VudEF0UmlzayA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0Umlza0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ29udHJhY3QgcmVuZXdhbCBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRDb250YWN0UmVuZXdhbCgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2FjY291bnRzX2NvbnRyYWN0X3JlbmV3YWwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdFJlbmV3YWxMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ3JlZGl0IENhcmQgRXhwaXJpbmcgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0Q3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlscygpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2NyZWRpdF9jYXJkX2V4cGlyaW5nJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRpdENhcmRFeHBpcmluZ0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIG1hZ2ljIG1vbWVudCAqL1xuICAgIHByaXZhdGUgZ2V0TWFnaWNNb21lbnQoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdtYWdpY19tb21lbnQnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50ID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMubWFnaWNNb21lbnQgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvblNlcnZpY2UuZXZhbHVhdGVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxuZy1jb250YWluZXIgY2xhc3M9XCJtdC01XCJcbiAgICAqcmJhY0FsbG93PVwiJ1BhZ2VzLkJldGEnXCI+XG4gICAgPCEtLSBTaWduZWQgdXAgbGFzdCAzMCBkYXlzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+U2lnbmVkIHVwIExhc3QgMzAgRGF5czwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIXNpZ25VcExhc3RUaGlydHlEYXlzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cInNpZ25lZFVwTGFzdFRoaXJ0eURheXM/Lmxlbmd0aFwiPlxuICAgICAgICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgICAjZHRcbiAgICAgICAgICBbdmFsdWVdPVwic2lnbmVkVXBMYXN0VGhpcnR5RGF5c1wiXG4gICAgICAgICAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwic2lnbmVkVXBMYXN0VGhpcnR5RGF5cy5sZW5ndGhcIlxuICAgICAgICAgIFtsYXp5XT1cInRydWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQWNjb3VudCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5NUlInIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uQWNjb3VudE1lc3NhZ2UuU2lnblVwQXQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgICAgICBsZXQtc2lnblVwPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQWNjb3VudFwiPlxuICAgICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLCBzaWduVXAuY3JtX2FjY291bnRfaWRdXCIgY2xhc3M9XCJuYW1lLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ2JUb29sdGlwXT1cInNpZ25VcC5jcm1fYWNjb3VudF9uYW1lXCI+e3sgc2lnblVwPy5jcm1fYWNjb3VudF9uYW1lIHwgdGV4dFRydW5jYXRlOjIwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk1SUlwiPlxuICAgICAgICAgICAgICAgIHt7IHNpZ25VcC5leHBlY3RlZF9tcnIgLyAxMDAgfCBjdXJyZW5jeTogc2lnblVwLmN1cnJlbmN5IH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJTaWduVXBBdFwiPlxuICAgICAgICAgICAgICAgIHt7IHNpZ25VcC5zaWduZWRfdXBfYXQgfCBkYXRlRm9ybWF0IH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aCE9PSAwXCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgc2lnbmVkVXBMYXN0VGhpcnR5RGF5cy5sZW5ndGggfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaWduZWRVcExhc3RUaGlydHlEYXlzPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5TdW1tYXJ5Lk5vSW5zaWdodE1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+IDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQWN0aXZlIE9wcG9ydHVuaXRpZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5BY3RpdmUgT3Bwb3J0dW5pdGllczwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlT3Bwb3J0dW5pdGllcz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJhY3RpdmVPcHBvcnR1bml0aWVzXCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG5cbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImFjdGl2ZU9wcG9ydHVuaXRpZXMubGVuZ3RoXCJcbiAgICAgICAgICBbbGF6eV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkFjY291bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5UaXRsZScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5Lk9uZVRpbWVBbW91bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Nb250aGx5QW1vdW50JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuV2luQ2hhbmNlJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LW9wcG9ydHVuaXRpZXM+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuYWNjb3VudEluZm8sIG9wcG9ydHVuaXRpZXMuY3JtX2FjY291bnQ/LmlkXVwiIGNsYXNzPVwibmFtZS1saW5rXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdiVG9vbHRpcF09XCJvcHBvcnR1bml0aWVzLmNybV9hY2NvdW50Py5uYW1lXCI+e3sgb3Bwb3J0dW5pdGllcy5jcm1fYWNjb3VudD8ubmFtZSB8IHRleHRUcnVuY2F0ZToyMCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgIDxhIFtuZ2JUb29sdGlwXT1cIm9wcG9ydHVuaXRpZXM/LnRpdGxlXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FjY2VzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bwb3J0dW5pdGllcz8ub3duZXJfaWQgPT09IHVzZXJJZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCdQYWdlcy5Qcm9kdWN0LkNSTS5Sb2xlLkFkbWluJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5vcHBvcnR1bml0eUluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHBvcnR1bml0aWVzLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBvcHBvcnR1bml0aWVzPy50aXRsZSB8IHRleHRUcnVuY2F0ZTogMjAgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPbmUgVGltZSBBbW91bnRcIj4ge3sgb3Bwb3J0dW5pdGllcy5vbmVfdGltZV9hbW91bnQgLyAxMDAgfCBjdXJyZW5jeSB9fSA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTW9udGhseSBBbW91bnRcIj4ge3sgb3Bwb3J0dW5pdGllcy5tb250aGx5X2Ftb3VudCAvIDEwMCB8IGN1cnJlbmN5IH19IDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJXaW4gQ2hhbmNlXCI+IHt7IG9wcG9ydHVuaXRpZXMud2luX2NoYW5jZXMgLyAxMDAgfCBwZXJjZW50IH19IDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHBvcnR1bml0aWVzLmNhbmNlbGxlZFwiPiFDYW5jZWxsZWQhPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiICpuZ0lmPVwiYWN0aXZlT3Bwb3J0dW5pdGllcy5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY3RpdmVPcHBvcnR1bml0aWVzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZU9wcG9ydHVuaXRpZXM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBY2NvdW50cyBhdCByaXNrIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+QWNjb3VudHMgYXQgUmlzazwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWFjY291bnRBdFJpc2tEZXRhaWxzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aFwiPlxuICAgICAgICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgICAjZHRcbiAgICAgICAgICBbdmFsdWVdPVwiYWNjb3VudEF0Umlza1wiXG4gICAgICAgICAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJhY2NvdW50QXRSaXNrLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5BY2NvdW50JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLkFjY291bnRNZXNzYWdlLk1SUicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5TaWduVXBBdCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgIGxldC1hY2NvdW50PlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQWNjb3VudFwiPlxuICAgICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLCBhY2NvdW50LmNybV9hY2NvdW50X2lkXVwiIGNsYXNzPVwibmFtZS1saW5rXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdiVG9vbHRpcF09XCJhY2NvdW50LmNybV9hY2NvdW50X25hbWVcIj57eyBhY2NvdW50Py5jcm1fYWNjb3VudF9uYW1lIHwgdGV4dFRydW5jYXRlOjIwIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk1SUlwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQuZXhwZWN0ZWRfbXJyIC8gMTAwIHwgY3VycmVuY3k6IGFjY291bnQuY3VycmVuY3kgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlNpZ25VcEF0XCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5zaWduZWRfdXBfYXQgfCBkYXRlRm9ybWF0IH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgICpuZ0lmPVwiYWNjb3VudEF0Umlzay5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY2NvdW50QXRSaXNrLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDb250cmFjdCByZW5ld2FsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q29udHJhY3QgUmVuZXdhbDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbnRhY3RSZW5ld2FsTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJDb250cmFjdFJlbmV3YWxcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiQ29udHJhY3RSZW5ld2FsLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uQWNjb3VudE1lc3NhZ2UuQWNjb3VudCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5NUlInIHwgdHJhbnNsb2NvIH19PC90aD5cblxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5RdWFydGVyJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj4ge3sgJ0NybS5BY2NvdW50TWVzc2FnZS5Nb250aCcgfCB0cmFuc2xvY28gfX08L3RoPlxuXG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLkFjY291bnRNZXNzYWdlLlNpZ25VcEF0JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLkFjY291bnRNZXNzYWdlLkV4cEF0JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuYWNjb3VudEluZm8sIGFjY291bnQuY3JtX2FjY291bnRfaWRdXCIgY2xhc3M9XCJuYW1lLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ2JUb29sdGlwXT1cImFjY291bnQuY3JtX2FjY291bnRfbmFtZVwiPnt7IGFjY291bnQuY3JtX2FjY291bnRfbmFtZSB8IHRleHRUcnVuY2F0ZToyMCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJNUlJcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmV4cGVjdGVkX21yciAvIDEwMCB8IGN1cnJlbmN5OiBhY2NvdW50LmN1cnJlbmN5IH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJRdWFydGVyXCI+e3sgYWNjb3VudC5zZXNzaW9uc19sYXN0X3F1YXJ0ZXIgfX08L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTW9udGhcIj57eyBhY2NvdW50LnNlc3Npb25zX2xhc3RfbW9udGggfX08L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiU2lnblVwQXRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LnNpZ25lZF91cF9hdCB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkV4cEF0XCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jY19leHBpcmluZ19hdCB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbC5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBDb250cmFjdFJlbmV3YWwubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiQ29udHJhY3RSZW5ld2FsPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5TdW1tYXJ5Lk5vSW5zaWdodE1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+IDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQ3JlZGl0IENhcmQgRXhwaXJpbmcgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5DcmVkaXQgQ2FyZCBFeHBpcmluZzwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNyZWRpdENhcmRFeHBpcmluZ0RldGFpbHNMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwiY3JlZGl0Q2FyZEV4cGlyaW5nPy5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cImNyZWRpdENhcmRFeHBpcmluZ1wiXG4gICAgICAgICAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJjcmVkaXRDYXJkRXhwaXJpbmcubGVuZ3RoXCJcbiAgICAgICAgICBbbGF6eV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5BY2NvdW50JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLkFjY291bnRNZXNzYWdlLk1SUicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5TaWduVXBBdCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5BY2NvdW50TWVzc2FnZS5FeHBBdCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgIGxldC1hY2NvdW50PlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQWNjb3VudFwiPlxuICAgICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlsnLycgKyBzdWJzY3JpcHRpb24/LnNsdWcgKyByb3V0ZXJzLmFjY291bnRJbmZvLCBhY2NvdW50LmNybV9hY2NvdW50X2lkXVwiIGNsYXNzPVwibmFtZS1saW5rXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdiVG9vbHRpcF09XCJhY2NvdW50LmNybV9hY2NvdW50X25hbWVcIj57eyBhY2NvdW50LmNybV9hY2NvdW50X25hbWUgfCB0ZXh0VHJ1bmNhdGU6MjAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTVJSXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5leHBlY3RlZF9tcnIgLyAxMDAgfCBjdXJyZW5jeTogYWNjb3VudC5jdXJyZW5jeSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiU2lnblVwQXRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LnNpZ25lZF91cF9hdCB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkV4cEF0XCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jY19leHBpcmluZ19hdCB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZy5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBjcmVkaXRDYXJkRXhwaXJpbmcubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY3JlZGl0Q2FyZEV4cGlyaW5nPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5TdW1tYXJ5Lk5vSW5zaWdodE1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+IDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gTWFnaWMgTW9tZW50IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+TWFnaWMgTW9tZW50PC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhbWFnaWNNb21lbnRMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwibWFnaWNNb21lbnQ/Lmxlbmd0aFwiPlxuICAgICAgICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgICAjZHRcbiAgICAgICAgICBbdmFsdWVdPVwibWFnaWNNb21lbnRcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwibWFnaWNNb21lbnQubGVuZ3RoXCJcbiAgICAgICAgICBbbGF6eV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkFjY291bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uQWNjb3VudE1lc3NhZ2UuTVJSJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLkFjY291bnRNZXNzYWdlLlNpZ25VcEF0JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuYWNjb3VudEluZm8sIGFjY291bnQuY3JtX2FjY291bnRfaWRdXCIgY2xhc3M9XCJuYW1lLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ2JUb29sdGlwXT1cImFjY291bnQuY3JtX2FjY291bnRfbmFtZVwiPnt7IGFjY291bnQ/LmNybV9hY2NvdW50X25hbWUgfCB0ZXh0VHJ1bmNhdGU6MjAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTVJSXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5leHBlY3RlZF9tcnIgLyAxMDAgfCBjdXJyZW5jeTogYWNjb3VudC5jdXJyZW5jeSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiU2lnblVwQXRcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LnNpZ25lZF91cF9hdCB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cIm1hZ2ljTW9tZW50Lmxlbmd0aCAhPT0wIFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IG1hZ2ljTW9tZW50Lmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIm1hZ2ljTW9tZW50Py5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5TdW1tYXJ5Lk5vSW5zaWdodE1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+IDwvcHctbm8tZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
|