@vendasta/store
Version:
Components and data for Store
98 lines • 22.2 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Product } from '../shared/product';
import { CONTACT_SALES } from '../pricing/pricing';
import { Addon } from '@vendasta/core/shared';
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 "../addon-list/addon-list.component";
import * as i4 from "../faqs/faqs.component";
import * as i5 from "../restrictions/country/supported-countries.component";
import * as i6 from "@vendasta/uikit";
import * as i7 from "../files/files.component";
import * as i8 from "@angular/common";
export class VaProductDetailsComponent {
constructor() {
this.hasVerifiedContract = false;
this.canAccessContractPricing = false;
this.showActionButton = false;
this.showPricing = false;
this.pricingLabel = 'Wholesale Price';
this.showPricingAction = false;
this.loaded = true;
this.enableClicked = new EventEmitter();
this.addonSelected = new EventEmitter();
this.primaryPricingActionSelected = new EventEmitter();
this.pricingActionSelected = new EventEmitter();
}
getAddons() {
if (!this._addons) {
this._addons = this.product.addons.map((addon) => Addon.fromApi(addon));
}
return this._addons;
}
getActionLabel() {
if (this.product.isArchived) {
return 'Enable';
}
return 'Enabled';
}
get price() {
// NOTE: wholesalePrice = 0 means free, wholesalePrice = null || -1 means "contact sales"
let prices = [];
if (this.product.wholesalePrice !== CONTACT_SALES && this.product.wholesalePrice != null) {
prices = [
{
price: this.product.wholesalePrice,
frequency: this.product.billingFrequency,
},
];
}
return {
currency: this.product.currency,
prices: prices,
};
}
onAddonSelected(addonId) {
this.addonSelected.emit(addonId);
}
}
VaProductDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaProductDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
VaProductDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: VaProductDetailsComponent, selector: "app-product-details", inputs: { product: "product", billedProduct: "billedProduct", hasVerifiedContract: "hasVerifiedContract", canAccessContractPricing: "canAccessContractPricing", showActionButton: "showActionButton", showPricing: "showPricing", pricingLabel: "pricingLabel", primaryPricingActionLabel: "primaryPricingActionLabel", pricingActionLabel: "pricingActionLabel", showPricingAction: "showPricingAction", loaded: "loaded", partnerID: "partnerID" }, outputs: { enableClicked: "enableClicked", addonSelected: "addonSelected", primaryPricingActionSelected: "primaryPricingActionSelected", pricingActionSelected: "pricingActionSelected" }, ngImport: i0, template: "<div class=\"page\">\n <app-header-container\n [iconUrl]=\"product.iconUrl\"\n [title]=\"product.name\"\n [tagline]=\"product.tagline\"\n [chipLabels]=\"product.getLmiCategoryNames()\"\n [pricing]=\"price\"\n [pricingLabel]=\"pricingLabel\"\n [primaryPricingActionLabel]=\"primaryPricingActionLabel\"\n [pricingActionLabel]=\"pricingActionLabel\"\n [pricingActionEnabled]=\"showPricingAction\"\n [actionLabel]=\"getActionLabel()\"\n [actionEnabled]=\"product.isArchived\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [billedProduct]=\"billedProduct\"\n [hasVerifiedContract]=\"hasVerifiedContract\"\n [loaded]=\"loaded\"\n (primaryPricingActionSelected)=\"primaryPricingActionSelected.emit()\"\n (pricingActionSelected)=\"pricingActionSelected.emit()\"\n (actionSelected)=\"enableClicked.emit()\"\n ></app-header-container>\n <div class=\"product-details product-content\">\n <div class=\"left-column\">\n <ng-container *ngIf=\"product.description || product.keySellingPoints\">\n <app-selling-info\n [description]=\"product.description\"\n [keySellingPoints]=\"product.keySellingPoints\"\n ></app-selling-info>\n </ng-container>\n <section *ngIf=\"product.addons?.length > 0\">\n <h2 class=\"va-component-title\">Add-Ons</h2>\n <app-store-addon-list\n (addonSelected)=\"onAddonSelected($event)\"\n [addons]=\"getAddons()\"\n [showPricing]=\"showPricing\"\n [hasVerifiedContract]=\"hasVerifiedContract\"\n [canAccessContractPricing]=\"canAccessContractPricing\"\n [partnerID]=\"partnerID\"\n ></app-store-addon-list>\n </section>\n\n <section *ngIf=\"product.faqs?.length > 0\">\n <h2 class=\"va-component-title\">FAQs</h2>\n <app-faqs [faqs]=\"product.faqs\"></app-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section *ngIf=\"product.restrictions?.country?.whitelist?.length > 0\">\n <app-supported-countries\n [countryCodes]=\"product.restrictions.country.whitelist\"\n ></app-supported-countries>\n </section>\n\n <section *ngIf=\"product.screenshotUrls?.length > 0\">\n <h2 class=\"va-component-title\">Gallery</h2>\n <va-image-gallery\n [imageUrls]=\"product.screenshotUrls\"\n ></va-image-gallery>\n </section>\n\n <section *ngIf=\"product.files?.length > 0\">\n <h2 class=\"va-component-title\">Files</h2>\n <app-store-files [files]=\"product.files\"></app-store-files>\n </section>\n </div>\n </div>\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:400;margin-top:0}@media screen and (min-width: 600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.sales-person-details{max-height:430px;overflow:hidden}.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%}}.product-content{display:flex}@media screen and (max-width: 600px){.product-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.VaAddonListComponent, selector: "app-store-addon-list", inputs: ["addons", "showPricing", "partnerID", "hasVerifiedContract", "canAccessContractPricing"], outputs: ["addonSelected"] }, { type: i4.VaFaqsComponent, selector: "app-faqs", inputs: ["faqs"] }, { type: i5.SupportedCountriesComponent, selector: "app-supported-countries", inputs: ["countryCodes"] }, { type: i6.VaImageGalleryComponent, selector: "va-image-gallery", inputs: ["imageUrls", "clickable"] }, { type: i7.VaFilesComponent, selector: "app-store-files", inputs: ["files"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: VaProductDetailsComponent, decorators: [{
type: Component,
args: [{ selector: 'app-product-details', template: "<div class=\"page\">\n <app-header-container\n [iconUrl]=\"product.iconUrl\"\n [title]=\"product.name\"\n [tagline]=\"product.tagline\"\n [chipLabels]=\"product.getLmiCategoryNames()\"\n [pricing]=\"price\"\n [pricingLabel]=\"pricingLabel\"\n [primaryPricingActionLabel]=\"primaryPricingActionLabel\"\n [pricingActionLabel]=\"pricingActionLabel\"\n [pricingActionEnabled]=\"showPricingAction\"\n [actionLabel]=\"getActionLabel()\"\n [actionEnabled]=\"product.isArchived\"\n [showAction]=\"showActionButton\"\n [showPricing]=\"showPricing\"\n [billedProduct]=\"billedProduct\"\n [hasVerifiedContract]=\"hasVerifiedContract\"\n [loaded]=\"loaded\"\n (primaryPricingActionSelected)=\"primaryPricingActionSelected.emit()\"\n (pricingActionSelected)=\"pricingActionSelected.emit()\"\n (actionSelected)=\"enableClicked.emit()\"\n ></app-header-container>\n <div class=\"product-details product-content\">\n <div class=\"left-column\">\n <ng-container *ngIf=\"product.description || product.keySellingPoints\">\n <app-selling-info\n [description]=\"product.description\"\n [keySellingPoints]=\"product.keySellingPoints\"\n ></app-selling-info>\n </ng-container>\n <section *ngIf=\"product.addons?.length > 0\">\n <h2 class=\"va-component-title\">Add-Ons</h2>\n <app-store-addon-list\n (addonSelected)=\"onAddonSelected($event)\"\n [addons]=\"getAddons()\"\n [showPricing]=\"showPricing\"\n [hasVerifiedContract]=\"hasVerifiedContract\"\n [canAccessContractPricing]=\"canAccessContractPricing\"\n [partnerID]=\"partnerID\"\n ></app-store-addon-list>\n </section>\n\n <section *ngIf=\"product.faqs?.length > 0\">\n <h2 class=\"va-component-title\">FAQs</h2>\n <app-faqs [faqs]=\"product.faqs\"></app-faqs>\n </section>\n </div>\n\n <div class=\"right-column\">\n <section *ngIf=\"product.restrictions?.country?.whitelist?.length > 0\">\n <app-supported-countries\n [countryCodes]=\"product.restrictions.country.whitelist\"\n ></app-supported-countries>\n </section>\n\n <section *ngIf=\"product.screenshotUrls?.length > 0\">\n <h2 class=\"va-component-title\">Gallery</h2>\n <va-image-gallery\n [imageUrls]=\"product.screenshotUrls\"\n ></va-image-gallery>\n </section>\n\n <section *ngIf=\"product.files?.length > 0\">\n <h2 class=\"va-component-title\">Files</h2>\n <app-store-files [files]=\"product.files\"></app-store-files>\n </section>\n </div>\n </div>\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:400;margin-top:0}@media screen and (min-width: 600px){.va-component-title{font-size:32px}}img{max-width:100%}va-icon{display:inline-block}.sales-person-details{max-height:430px;overflow:hidden}.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%}}.product-content{display:flex}@media screen and (max-width: 600px){.product-content{flex-direction:column}}\n"] }]
}], propDecorators: { product: [{
type: Input
}], billedProduct: [{
type: Input
}], hasVerifiedContract: [{
type: Input
}], canAccessContractPricing: [{
type: Input
}], showActionButton: [{
type: Input
}], showPricing: [{
type: Input
}], pricingLabel: [{
type: Input
}], primaryPricingActionLabel: [{
type: Input
}], pricingActionLabel: [{
type: Input
}], showPricingAction: [{
type: Input
}], loaded: [{
type: Input
}], partnerID: [{
type: Input
}], enableClicked: [{
type: Output
}], addonSelected: [{
type: Output
}], primaryPricingActionSelected: [{
type: Output
}], pricingActionSelected: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wcm9kdWN0LWRldGFpbHMvcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wcm9kdWN0LWRldGFpbHMvcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBUyxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7QUFROUMsTUFBTSxPQUFPLHlCQUF5QjtJQUx0QztRQVFXLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1Qiw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDakMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsaUJBQWlCLENBQUM7UUFHakMsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFHYixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzNDLGlDQUE0QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztLQXFDdEQ7SUFsQ0MsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekU7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQzNCLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLHlGQUF5RjtRQUN6RixJQUFJLE1BQU0sR0FBWSxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSSxFQUFFO1lBQ3hGLE1BQU0sR0FBRztnQkFDUDtvQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjO29CQUNsQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7aUJBQ3pDO2FBQ0YsQ0FBQztTQUNIO1FBQ0QsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDL0IsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFlO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7O3NIQXJEVSx5QkFBeUI7MEdBQXpCLHlCQUF5Qiw0cUJDWHRDLDRuRkFxRUE7MkZEMURhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSxxQkFBcUI7OEJBS3RCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csNEJBQTRCO3NCQUFyQyxNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vc2hhcmVkL3Byb2R1Y3QnO1xuaW1wb3J0IHsgUHJpY2UsIENPTlRBQ1RfU0FMRVMgfSBmcm9tICcuLi9wcmljaW5nL3ByaWNpbmcnO1xuaW1wb3J0IHsgQWRkb24gfSBmcm9tICdAdmVuZGFzdGEvY29yZS9zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGVkUHJvZHVjdCB9IGZyb20gJ0B2ZW5kYXN0YS9iaWxsaW5nJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb2R1Y3QtZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAncHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFZhUHJvZHVjdERldGFpbHNDb21wb25lbnQge1xuICBASW5wdXQoKSBwcm9kdWN0OiBQcm9kdWN0O1xuICBASW5wdXQoKSBiaWxsZWRQcm9kdWN0OiBCaWxsZWRQcm9kdWN0O1xuICBASW5wdXQoKSBoYXNWZXJpZmllZENvbnRyYWN0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkFjY2Vzc0NvbnRyYWN0UHJpY2luZyA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93QWN0aW9uQnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dQcmljaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIHByaWNpbmdMYWJlbCA9ICdXaG9sZXNhbGUgUHJpY2UnO1xuICBASW5wdXQoKSBwcmltYXJ5UHJpY2luZ0FjdGlvbkxhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHByaWNpbmdBY3Rpb25MYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93UHJpY2luZ0FjdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2FkZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwYXJ0bmVySUQ6IHN0cmluZztcblxuICBAT3V0cHV0KCkgZW5hYmxlQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFkZG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHByaW1hcnlQcmljaW5nQWN0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwcmljaW5nQWN0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHByaXZhdGUgX2FkZG9uczogQWRkb25bXTtcblxuICBnZXRBZGRvbnMoKTogQWRkb25bXSB7XG4gICAgaWYgKCF0aGlzLl9hZGRvbnMpIHtcbiAgICAgIHRoaXMuX2FkZG9ucyA9IHRoaXMucHJvZHVjdC5hZGRvbnMubWFwKChhZGRvbikgPT4gQWRkb24uZnJvbUFwaShhZGRvbikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkb25zO1xuICB9XG5cbiAgZ2V0QWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wcm9kdWN0LmlzQXJjaGl2ZWQpIHtcbiAgICAgIHJldHVybiAnRW5hYmxlJztcbiAgICB9XG4gICAgcmV0dXJuICdFbmFibGVkJztcbiAgfVxuXG4gIGdldCBwcmljZSgpOiBhbnkge1xuICAgIC8vIE5PVEU6IHdob2xlc2FsZVByaWNlID0gMCBtZWFucyBmcmVlLCB3aG9sZXNhbGVQcmljZSA9IG51bGwgfHwgLTEgbWVhbnMgXCJjb250YWN0IHNhbGVzXCJcbiAgICBsZXQgcHJpY2VzOiBQcmljZVtdID0gW107XG4gICAgaWYgKHRoaXMucHJvZHVjdC53aG9sZXNhbGVQcmljZSAhPT0gQ09OVEFDVF9TQUxFUyAmJiB0aGlzLnByb2R1Y3Qud2hvbGVzYWxlUHJpY2UgIT0gbnVsbCkge1xuICAgICAgcHJpY2VzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgcHJpY2U6IHRoaXMucHJvZHVjdC53aG9sZXNhbGVQcmljZSxcbiAgICAgICAgICBmcmVxdWVuY3k6IHRoaXMucHJvZHVjdC5iaWxsaW5nRnJlcXVlbmN5LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbmN5OiB0aGlzLnByb2R1Y3QuY3VycmVuY3ksXG4gICAgICBwcmljZXM6IHByaWNlcyxcbiAgICB9O1xuICB9XG5cbiAgb25BZGRvblNlbGVjdGVkKGFkZG9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWRkb25TZWxlY3RlZC5lbWl0KGFkZG9uSWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicGFnZVwiPlxuICA8YXBwLWhlYWRlci1jb250YWluZXJcbiAgICBbaWNvblVybF09XCJwcm9kdWN0Lmljb25VcmxcIlxuICAgIFt0aXRsZV09XCJwcm9kdWN0Lm5hbWVcIlxuICAgIFt0YWdsaW5lXT1cInByb2R1Y3QudGFnbGluZVwiXG4gICAgW2NoaXBMYWJlbHNdPVwicHJvZHVjdC5nZXRMbWlDYXRlZ29yeU5hbWVzKClcIlxuICAgIFtwcmljaW5nXT1cInByaWNlXCJcbiAgICBbcHJpY2luZ0xhYmVsXT1cInByaWNpbmdMYWJlbFwiXG4gICAgW3ByaW1hcnlQcmljaW5nQWN0aW9uTGFiZWxdPVwicHJpbWFyeVByaWNpbmdBY3Rpb25MYWJlbFwiXG4gICAgW3ByaWNpbmdBY3Rpb25MYWJlbF09XCJwcmljaW5nQWN0aW9uTGFiZWxcIlxuICAgIFtwcmljaW5nQWN0aW9uRW5hYmxlZF09XCJzaG93UHJpY2luZ0FjdGlvblwiXG4gICAgW2FjdGlvbkxhYmVsXT1cImdldEFjdGlvbkxhYmVsKClcIlxuICAgIFthY3Rpb25FbmFibGVkXT1cInByb2R1Y3QuaXNBcmNoaXZlZFwiXG4gICAgW3Nob3dBY3Rpb25dPVwic2hvd0FjdGlvbkJ1dHRvblwiXG4gICAgW3Nob3dQcmljaW5nXT1cInNob3dQcmljaW5nXCJcbiAgICBbYmlsbGVkUHJvZHVjdF09XCJiaWxsZWRQcm9kdWN0XCJcbiAgICBbaGFzVmVyaWZpZWRDb250cmFjdF09XCJoYXNWZXJpZmllZENvbnRyYWN0XCJcbiAgICBbbG9hZGVkXT1cImxvYWRlZFwiXG4gICAgKHByaW1hcnlQcmljaW5nQWN0aW9uU2VsZWN0ZWQpPVwicHJpbWFyeVByaWNpbmdBY3Rpb25TZWxlY3RlZC5lbWl0KClcIlxuICAgIChwcmljaW5nQWN0aW9uU2VsZWN0ZWQpPVwicHJpY2luZ0FjdGlvblNlbGVjdGVkLmVtaXQoKVwiXG4gICAgKGFjdGlvblNlbGVjdGVkKT1cImVuYWJsZUNsaWNrZWQuZW1pdCgpXCJcbiAgPjwvYXBwLWhlYWRlci1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRldGFpbHMgcHJvZHVjdC1jb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImxlZnQtY29sdW1uXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvZHVjdC5kZXNjcmlwdGlvbiB8fCBwcm9kdWN0LmtleVNlbGxpbmdQb2ludHNcIj5cbiAgICAgICAgPGFwcC1zZWxsaW5nLWluZm9cbiAgICAgICAgICBbZGVzY3JpcHRpb25dPVwicHJvZHVjdC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgW2tleVNlbGxpbmdQb2ludHNdPVwicHJvZHVjdC5rZXlTZWxsaW5nUG9pbnRzXCJcbiAgICAgICAgPjwvYXBwLXNlbGxpbmctaW5mbz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHNlY3Rpb24gKm5nSWY9XCJwcm9kdWN0LmFkZG9ucz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJ2YS1jb21wb25lbnQtdGl0bGVcIj5BZGQtT25zPC9oMj5cbiAgICAgICAgPGFwcC1zdG9yZS1hZGRvbi1saXN0XG4gICAgICAgICAgKGFkZG9uU2VsZWN0ZWQpPVwib25BZGRvblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgIFthZGRvbnNdPVwiZ2V0QWRkb25zKClcIlxuICAgICAgICAgIFtzaG93UHJpY2luZ109XCJzaG93UHJpY2luZ1wiXG4gICAgICAgICAgW2hhc1ZlcmlmaWVkQ29udHJhY3RdPVwiaGFzVmVyaWZpZWRDb250cmFjdFwiXG4gICAgICAgICAgW2NhbkFjY2Vzc0NvbnRyYWN0UHJpY2luZ109XCJjYW5BY2Nlc3NDb250cmFjdFByaWNpbmdcIlxuICAgICAgICAgIFtwYXJ0bmVySURdPVwicGFydG5lcklEXCJcbiAgICAgICAgPjwvYXBwLXN0b3JlLWFkZG9uLWxpc3Q+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5mYXFzPy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cInZhLWNvbXBvbmVudC10aXRsZVwiPkZBUXM8L2gyPlxuICAgICAgICA8YXBwLWZhcXMgW2ZhcXNdPVwicHJvZHVjdC5mYXFzXCI+PC9hcHAtZmFxcz5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb2x1bW5cIj5cbiAgICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5yZXN0cmljdGlvbnM/LmNvdW50cnk/LndoaXRlbGlzdD8ubGVuZ3RoID4gMFwiPlxuICAgICAgICA8YXBwLXN1cHBvcnRlZC1jb3VudHJpZXNcbiAgICAgICAgICBbY291bnRyeUNvZGVzXT1cInByb2R1Y3QucmVzdHJpY3Rpb25zLmNvdW50cnkud2hpdGVsaXN0XCJcbiAgICAgICAgPjwvYXBwLXN1cHBvcnRlZC1jb3VudHJpZXM+XG4gICAgICA8L3NlY3Rpb24+XG5cbiAgICAgIDxzZWN0aW9uICpuZ0lmPVwicHJvZHVjdC5zY3JlZW5zaG90VXJscz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJ2YS1jb21wb25lbnQtdGl0bGVcIj5HYWxsZXJ5PC9oMj5cbiAgICAgICAgPHZhLWltYWdlLWdhbGxlcnlcbiAgICAgICAgICBbaW1hZ2VVcmxzXT1cInByb2R1Y3Quc2NyZWVuc2hvdFVybHNcIlxuICAgICAgICA+PC92YS1pbWFnZS1nYWxsZXJ5PlxuICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICA8c2VjdGlvbiAqbmdJZj1cInByb2R1Y3QuZmlsZXM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwidmEtY29tcG9uZW50LXRpdGxlXCI+RmlsZXM8L2gyPlxuICAgICAgICA8YXBwLXN0b3JlLWZpbGVzIFtmaWxlc109XCJwcm9kdWN0LmZpbGVzXCI+PC9hcHAtc3RvcmUtZmlsZXM+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=