@vendasta/store
Version:
Components and data for Store
80 lines • 23.5 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { combineLatest, BehaviorSubject, ReplaySubject } from 'rxjs';
import { PackageDetails } from './package';
import { map, take, tap, filter, shareReplay } from 'rxjs/operators';
import { LMI_CATEGORIES_BY_NAME } from '../lmi-categories';
import * as i0 from "@angular/core";
import * as i1 from "../header-container/header-container.component";
import * as i2 from "../selling-info/selling-info.component";
import * as i3 from "../products-nav/products-nav-v2/products-nav-v2.component";
import * as i4 from "../faqs/faqs.component";
import * as i5 from "@vendasta/uikit";
import * as i6 from "../files/files.component";
import * as i7 from "@angular/common";
import * as i8 from "@ngx-translate/core";
export class VaPackageDetailsV2Component {
constructor() {
this.showActionButton = true;
this.showPricing = true;
this.actionLabel = 'FRONTEND.STORE.GET_IT_NOW';
this.getItNow = new EventEmitter();
this.pkg$$ = new ReplaySubject(1);
this.itemSelectedEvent$$ = new BehaviorSubject('');
this.orderedLineItems$ = this.pkg$$.pipe(map((pkg) => pkg.line_items), filter((items) => !!items || items.length === 0), shareReplay(1));
this.productNameForSingleAddon$ = this.orderedLineItems$.pipe(map((items) => this.getParentsNameForItem(items)));
this.selectedItem$ = combineLatest([this.itemSelectedEvent$$, this.orderedLineItems$]).pipe(map(([id, lineItems]) => lineItems.find((lineItem) => lineItem.item.id === id)));
this.lmiCategories$ = this.orderedLineItems$.pipe(map((lis) => {
const lmiMap = (lis || []).reduce((prev, li) => {
if (li && li.item) {
(li.item.lmiCategories || []).forEach((lmi) => prev.set(lmi, lmi));
}
return prev;
}, new Map());
const lmiCats = [];
lmiMap.forEach((v, k) => {
if (LMI_CATEGORIES_BY_NAME.hasOwnProperty(k)) {
lmiCats.push(LMI_CATEGORIES_BY_NAME[k].i18nKey);
}
else {
lmiCats.push(k);
}
});
return lmiCats;
}));
// Set the initial selected Item
this.orderedLineItems$
.pipe(map((lineItems) => lineItems[0]), tap((lineItem) => this.selectItem(lineItem && lineItem.item ? lineItem.item.id : '')), take(1))
.subscribe();
}
set pkg(pkg) {
this.pkg$$.next(pkg);
}
selectItem(id) {
this.itemSelectedEvent$$.next(id);
}
emitGetItNow() {
this.getItNow.emit();
}
getParentsNameForItem(items) {
if (items && items.length === 1 && items[0]) {
return items[0].parent.name;
}
}
}
VaPackageDetailsV2Component.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaPackageDetailsV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component });
VaPackageDetailsV2Component.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaPackageDetailsV2Component, selector: "app-package-details-v2", inputs: { showActionButton: "showActionButton", showPricing: "showPricing", actionLabel: "actionLabel", pkg: "pkg" }, outputs: { getItNow: "getItNow" }, ngImport: i0, template: "<div *ngIf=\"pkg$$ | async as pkg\" class=\"page\">\n <app-header-container\n [iconUrl]=\"pkg.icon\"\n [title]=\"pkg.name\"\n [tagline]=\"pkg.tagline\"\n [prerequisite]=\"productNameForSingleAddon$ | async\"\n [chipLabels]=\"lmiCategories$ | async\"\n [pricing]=\"pkg.pricing\"\n [pricingLabel]=\"'FRONTEND.STORE.PRICING' | translate\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [actionLabel]=\"actionLabel | translate\"\n [actionEnabled]=\"true\"\n (actionSelected)=\"emitGetItNow()\"\n ></app-header-container>\n\n <ng-container *ngIf=\"pkg?.content\">\n <app-selling-info [description]=\"pkg.content\"></app-selling-info>\n </ng-container>\n\n <app-products-nav-v2\n [items]=\"orderedLineItems$ | async\"\n [hideItemsNav]=\"pkg?.hide_product_icons_and_names\"\n (itemSelected)=\"selectItem($event)\"\n ></app-products-nav-v2>\n\n <ng-container *ngIf=\"selectedItem$ | async as selectedItem\">\n <div *ngIf=\"!pkg?.hide_product_details\" class=\"package-content\">\n <div class=\"left-column\">\n <section\n *ngIf=\"\n selectedItem?.item?.description ||\n selectedItem?.item?.keySellingPoints\n \"\n >\n <app-selling-info\n [description]=\"selectedItem?.item?.description\"\n [keySellingPoints]=\"selectedItem?.item?.keySellingPoints\"\n ></app-selling-info>\n </section>\n\n <section\n *ngIf=\"\n selectedItem?.item?.faqs?.length > 0 &&\n selectedItem?.item?.faqs[0].question\n \"\n >\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.FAQS' | translate }}\n </h2>\n <app-faqs [faqs]=\"selectedItem.item.faqs\"></app-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section *ngIf=\"selectedItem?.item?.screenshotUrls?.length > 0\">\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.GALLERY' | translate }}\n </h2>\n <va-image-gallery\n [imageUrls]=\"selectedItem.item.screenshotUrls\"\n ></va-image-gallery>\n </section>\n\n <section *ngIf=\"selectedItem?.item?.files?.length > 0\">\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.FILES' | translate }}\n </h2>\n <app-store-files [files]=\"selectedItem.item.files\"></app-store-files>\n </section>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}.va-component-title{font-size:24px;font-weight:300;margin-top:0}@media screen and (min-width: 600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.page{position:relative;margin:0 auto 20px;background:#ffffff;color:#212121;box-shadow:0 3px 10px rgba(33,33,33,.3);overflow:hidden;font-size:16px}.page .item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}section{padding:24px}.left-column{width:66%}@media screen and (max-width: 600px){.left-column{width:100%}}.right-column{width:34%}@media screen and (max-width: 600px){.right-column{width:100%}}.package-content{display:flex}@media screen and (max-width: 600px){.package-content{flex-direction:column}}\n"], components: [{ type: i1.VaHeaderContainerComponent, selector: "app-header-container", inputs: ["iconUrl", "title", "tagline", "prerequisite", "chipLabels", "pricing", "billedProduct", "loaded", "hasVerifiedContract", "pricingLabel", "primaryPricingActionLabel", "pricingActionLabel", "pricingActionEnabled", "actionEnabled", "actionLabel", "showAction", "showPricing", "showEnableAddon", "prerequisiteLabel"], outputs: ["prerequisiteSelected", "actionSelected", "primaryPricingActionSelected", "pricingActionSelected"] }, { type: i2.VaSellingInfoComponent, selector: "app-selling-info", inputs: ["description", "keySellingPoints"] }, { type: i3.ProductsNavV2Component, selector: "app-products-nav-v2", inputs: ["items", "hideItemsNav"], outputs: ["itemSelected"] }, { type: i4.VaFaqsComponent, selector: "app-faqs", inputs: ["faqs"] }, { type: i5.VaImageGalleryComponent, selector: "va-image-gallery", inputs: ["imageUrls", "clickable"] }, { type: i6.VaFilesComponent, selector: "app-store-files", inputs: ["files"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i7.AsyncPipe, "translate": i8.TranslatePipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaPackageDetailsV2Component, decorators: [{
type: Component,
args: [{ selector: 'app-package-details-v2', template: "<div *ngIf=\"pkg$$ | async as pkg\" class=\"page\">\n <app-header-container\n [iconUrl]=\"pkg.icon\"\n [title]=\"pkg.name\"\n [tagline]=\"pkg.tagline\"\n [prerequisite]=\"productNameForSingleAddon$ | async\"\n [chipLabels]=\"lmiCategories$ | async\"\n [pricing]=\"pkg.pricing\"\n [pricingLabel]=\"'FRONTEND.STORE.PRICING' | translate\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [actionLabel]=\"actionLabel | translate\"\n [actionEnabled]=\"true\"\n (actionSelected)=\"emitGetItNow()\"\n ></app-header-container>\n\n <ng-container *ngIf=\"pkg?.content\">\n <app-selling-info [description]=\"pkg.content\"></app-selling-info>\n </ng-container>\n\n <app-products-nav-v2\n [items]=\"orderedLineItems$ | async\"\n [hideItemsNav]=\"pkg?.hide_product_icons_and_names\"\n (itemSelected)=\"selectItem($event)\"\n ></app-products-nav-v2>\n\n <ng-container *ngIf=\"selectedItem$ | async as selectedItem\">\n <div *ngIf=\"!pkg?.hide_product_details\" class=\"package-content\">\n <div class=\"left-column\">\n <section\n *ngIf=\"\n selectedItem?.item?.description ||\n selectedItem?.item?.keySellingPoints\n \"\n >\n <app-selling-info\n [description]=\"selectedItem?.item?.description\"\n [keySellingPoints]=\"selectedItem?.item?.keySellingPoints\"\n ></app-selling-info>\n </section>\n\n <section\n *ngIf=\"\n selectedItem?.item?.faqs?.length > 0 &&\n selectedItem?.item?.faqs[0].question\n \"\n >\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.FAQS' | translate }}\n </h2>\n <app-faqs [faqs]=\"selectedItem.item.faqs\"></app-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section *ngIf=\"selectedItem?.item?.screenshotUrls?.length > 0\">\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.GALLERY' | translate }}\n </h2>\n <va-image-gallery\n [imageUrls]=\"selectedItem.item.screenshotUrls\"\n ></va-image-gallery>\n </section>\n\n <section *ngIf=\"selectedItem?.item?.files?.length > 0\">\n <h2 class=\"va-component-title\">\n {{ 'FRONTEND.STORE.FILES' | translate }}\n </h2>\n <app-store-files [files]=\"selectedItem.item.files\"></app-store-files>\n </section>\n </div>\n </div>\n </ng-container>\n</div>\n", styles: [":host{display:block;font-size:14px;line-height:1.4}:host *{box-sizing:border-box}.va-component-title{font-size:24px;font-weight:300;margin-top:0}@media screen and (min-width: 600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.page{position:relative;margin:0 auto 20px;background:#ffffff;color:#212121;box-shadow:0 3px 10px rgba(33,33,33,.3);overflow:hidden;font-size:16px}.page .item-amount{color:#9e9e9e;font-size:14px;text-align:right;margin:0 24px 8px}section{padding:24px}.left-column{width:66%}@media screen and (max-width: 600px){.left-column{width:100%}}.right-column{width:34%}@media screen and (max-width: 600px){.right-column{width:100%}}.package-content{display:flex}@media screen and (max-width: 600px){.package-content{flex-direction:column}}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { showActionButton: [{
type: Input
}], showPricing: [{
type: Input
}], actionLabel: [{
type: Input
}], pkg: [{
type: Input
}], getItNow: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kZXRhaWxzLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRldGFpbHMtdjIvcGFja2FnZS1kZXRhaWxzLXYyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRldGFpbHMtdjIvcGFja2FnZS1kZXRhaWxzLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFjLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7OztBQU8zRCxNQUFNLE9BQU8sMkJBQTJCO0lBZ0J0QztRQWZTLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixnQkFBVyxHQUFHLDJCQUEyQixDQUFDO1FBSXpDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhDLFVBQUssR0FBRyxJQUFJLGFBQWEsQ0FBaUIsQ0FBQyxDQUFDLENBQUM7UUFDN0Msd0JBQW1CLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFPcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUN0QyxH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QyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFzQjtRQUMxQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDM0MsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7O3dIQXhFVSwyQkFBMkI7NEdBQTNCLDJCQUEyQix1TkNaeEMsd2dGQTBFQTsyRkQ5RGEsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLHdCQUF3QjswRUFLekIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDTyxHQUFHO3NCQUFmLEtBQUs7Z0JBR0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBCZWhhdmlvclN1YmplY3QsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBhY2thZ2VEZXRhaWxzIH0gZnJvbSAnLi9wYWNrYWdlJztcbmltcG9ydCB7IG1hcCwgdGFrZSwgdGFwLCBmaWx0ZXIsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3RvcmVMaW5lSXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IExNSV9DQVRFR09SSUVTX0JZX05BTUUgfSBmcm9tICcuLi9sbWktY2F0ZWdvcmllcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wYWNrYWdlLWRldGFpbHMtdjInLFxuICB0ZW1wbGF0ZVVybDogJ3BhY2thZ2UtZGV0YWlscy12Mi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BhY2thZ2UtZGV0YWlscy12Mi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBWYVBhY2thZ2VEZXRhaWxzVjJDb21wb25lbnQge1xuICBASW5wdXQoKSBzaG93QWN0aW9uQnV0dG9uID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd1ByaWNpbmcgPSB0cnVlO1xuICBASW5wdXQoKSBhY3Rpb25MYWJlbCA9ICdGUk9OVEVORC5TVE9SRS5HRVRfSVRfTk9XJztcbiAgQElucHV0KCkgc2V0IHBrZyhwa2c6IFBhY2thZ2VEZXRhaWxzKSB7XG4gICAgdGhpcy5wa2ckJC5uZXh0KHBrZyk7XG4gIH1cbiAgQE91dHB1dCgpIGdldEl0Tm93ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHBrZyQkID0gbmV3IFJlcGxheVN1YmplY3Q8UGFja2FnZURldGFpbHM+KDEpO1xuICBpdGVtU2VsZWN0ZWRFdmVudCQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgc2VsZWN0ZWRJdGVtJDogT2JzZXJ2YWJsZTxTdG9yZUxpbmVJdGVtPjtcbiAgb3JkZXJlZExpbmVJdGVtcyQ6IE9ic2VydmFibGU8U3RvcmVMaW5lSXRlbVtdPjtcbiAgcHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbiQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgbG1pQ2F0ZWdvcmllcyQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMub3JkZXJlZExpbmVJdGVtcyQgPSB0aGlzLnBrZyQkLnBpcGUoXG4gICAgICBtYXAoKHBrZykgPT4gcGtnLmxpbmVfaXRlbXMpLFxuICAgICAgZmlsdGVyKChpdGVtcykgPT4gISFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApLFxuICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgKTtcblxuICAgIHRoaXMucHJvZHVjdE5hbWVGb3JTaW5nbGVBZGRvbiQgPSB0aGlzLm9yZGVyZWRMaW5lSXRlbXMkLnBpcGUobWFwKChpdGVtcykgPT4gdGhpcy5nZXRQYXJlbnRzTmFtZUZvckl0ZW0oaXRlbXMpKSk7XG5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLml0ZW1TZWxlY3RlZEV2ZW50JCQsIHRoaXMub3JkZXJlZExpbmVJdGVtcyRdKS5waXBlKFxuICAgICAgbWFwKChbaWQsIGxpbmVJdGVtc10pID0+IGxpbmVJdGVtcy5maW5kKChsaW5lSXRlbSkgPT4gbGluZUl0ZW0uaXRlbS5pZCA9PT0gaWQpKSxcbiAgICApO1xuXG4gICAgdGhpcy5sbWlDYXRlZ29yaWVzJCA9IHRoaXMub3JkZXJlZExpbmVJdGVtcyQucGlwZShcbiAgICAgIG1hcCgobGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IGxtaU1hcCA9IChsaXMgfHwgW10pLnJlZHVjZSgocHJldiwgbGkpID0+IHtcbiAgICAgICAgICBpZiAobGkgJiYgbGkuaXRlbSkge1xuICAgICAgICAgICAgKGxpLml0ZW0ubG1pQ2F0ZWdvcmllcyB8fCBbXSkuZm9yRWFjaCgobG1pKSA9PiBwcmV2LnNldChsbWksIGxtaSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSk7XG5cbiAgICAgICAgY29uc3QgbG1pQ2F0cyA9IFtdO1xuICAgICAgICBsbWlNYXAuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgICAgIGlmIChMTUlfQ0FURUdPUklFU19CWV9OQU1FLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICBsbWlDYXRzLnB1c2goTE1JX0NBVEVHT1JJRVNfQllfTkFNRVtrXS5pMThuS2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG1pQ2F0cy5wdXNoKGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsbWlDYXRzO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgaW5pdGlhbCBzZWxlY3RlZCBJdGVtXG4gICAgdGhpcy5vcmRlcmVkTGluZUl0ZW1zJFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgobGluZUl0ZW1zKSA9PiBsaW5lSXRlbXNbMF0pLFxuICAgICAgICB0YXAoKGxpbmVJdGVtKSA9PiB0aGlzLnNlbGVjdEl0ZW0obGluZUl0ZW0gJiYgbGluZUl0ZW0uaXRlbSA/IGxpbmVJdGVtLml0ZW0uaWQgOiAnJykpLFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2VsZWN0SXRlbShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtU2VsZWN0ZWRFdmVudCQkLm5leHQoaWQpO1xuICB9XG5cbiAgZW1pdEdldEl0Tm93KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0SXROb3cuZW1pdCgpO1xuICB9XG5cbiAgZ2V0UGFyZW50c05hbWVGb3JJdGVtKGl0ZW1zOiBTdG9yZUxpbmVJdGVtW10pOiBzdHJpbmcge1xuICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPT09IDEgJiYgaXRlbXNbMF0pIHtcbiAgICAgIHJldHVybiBpdGVtc1swXS5wYXJlbnQubmFtZTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJwa2ckJCB8IGFzeW5jIGFzIHBrZ1wiIGNsYXNzPVwicGFnZVwiPlxuICA8YXBwLWhlYWRlci1jb250YWluZXJcbiAgICBbaWNvblVybF09XCJwa2cuaWNvblwiXG4gICAgW3RpdGxlXT1cInBrZy5uYW1lXCJcbiAgICBbdGFnbGluZV09XCJwa2cudGFnbGluZVwiXG4gICAgW3ByZXJlcXVpc2l0ZV09XCJwcm9kdWN0TmFtZUZvclNpbmdsZUFkZG9uJCB8IGFzeW5jXCJcbiAgICBbY2hpcExhYmVsc109XCJsbWlDYXRlZ29yaWVzJCB8IGFzeW5jXCJcbiAgICBbcHJpY2luZ109XCJwa2cucHJpY2luZ1wiXG4gICAgW3ByaWNpbmdMYWJlbF09XCInRlJPTlRFTkQuU1RPUkUuUFJJQ0lORycgfCB0cmFuc2xhdGVcIlxuICAgIFtzaG93QWN0aW9uXT1cInNob3dBY3Rpb25CdXR0b25cIlxuICAgIFtzaG93UHJpY2luZ109XCJzaG93UHJpY2luZ1wiXG4gICAgW2FjdGlvbkxhYmVsXT1cImFjdGlvbkxhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICBbYWN0aW9uRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAoYWN0aW9uU2VsZWN0ZWQpPVwiZW1pdEdldEl0Tm93KClcIlxuICA+PC9hcHAtaGVhZGVyLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGtnPy5jb250ZW50XCI+XG4gICAgPGFwcC1zZWxsaW5nLWluZm8gW2Rlc2NyaXB0aW9uXT1cInBrZy5jb250ZW50XCI+PC9hcHAtc2VsbGluZy1pbmZvPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8YXBwLXByb2R1Y3RzLW5hdi12MlxuICAgIFtpdGVtc109XCJvcmRlcmVkTGluZUl0ZW1zJCB8IGFzeW5jXCJcbiAgICBbaGlkZUl0ZW1zTmF2XT1cInBrZz8uaGlkZV9wcm9kdWN0X2ljb25zX2FuZF9uYW1lc1wiXG4gICAgKGl0ZW1TZWxlY3RlZCk9XCJzZWxlY3RJdGVtKCRldmVudClcIlxuICA+PC9hcHAtcHJvZHVjdHMtbmF2LXYyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEl0ZW0kIHwgYXN5bmMgYXMgc2VsZWN0ZWRJdGVtXCI+XG4gICAgPGRpdiAqbmdJZj1cIiFwa2c/LmhpZGVfcHJvZHVjdF9kZXRhaWxzXCIgY2xhc3M9XCJwYWNrYWdlLWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LWNvbHVtblwiPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW0/Lml0ZW0/LmRlc2NyaXB0aW9uIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW0/Lml0ZW0/LmtleVNlbGxpbmdQb2ludHNcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGFwcC1zZWxsaW5nLWluZm9cbiAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJzZWxlY3RlZEl0ZW0/Lml0ZW0/LmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtrZXlTZWxsaW5nUG9pbnRzXT1cInNlbGVjdGVkSXRlbT8uaXRlbT8ua2V5U2VsbGluZ1BvaW50c1wiXG4gICAgICAgICAgPjwvYXBwLXNlbGxpbmctaW5mbz5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbT8uaXRlbT8uZmFxcz8ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtPy5pdGVtPy5mYXFzWzBdLnF1ZXN0aW9uXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC10aXRsZVwiPlxuICAgICAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkZBUVMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8YXBwLWZhcXMgW2ZhcXNdPVwic2VsZWN0ZWRJdGVtLml0ZW0uZmFxc1wiPjwvYXBwLWZhcXM+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29sdW1uXCI+XG4gICAgICAgIDxzZWN0aW9uICpuZ0lmPVwic2VsZWN0ZWRJdGVtPy5pdGVtPy5zY3JlZW5zaG90VXJscz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC10aXRsZVwiPlxuICAgICAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkdBTExFUlknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dmEtaW1hZ2UtZ2FsbGVyeVxuICAgICAgICAgICAgW2ltYWdlVXJsc109XCJzZWxlY3RlZEl0ZW0uaXRlbS5zY3JlZW5zaG90VXJsc1wiXG4gICAgICAgICAgPjwvdmEtaW1hZ2UtZ2FsbGVyeT5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uICpuZ0lmPVwic2VsZWN0ZWRJdGVtPy5pdGVtPy5maWxlcz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC10aXRsZVwiPlxuICAgICAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkZJTEVTJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPGFwcC1zdG9yZS1maWxlcyBbZmlsZXNdPVwic2VsZWN0ZWRJdGVtLml0ZW0uZmlsZXNcIj48L2FwcC1zdG9yZS1maWxlcz5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=