UNPKG

@vendasta/store

Version:

Components and data for Store

80 lines 23.5 kB
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=