@vendasta/store
Version:
Components and data for Store
105 lines • 27.3 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { MarketingType } from '../product-details-v2.interface';
import { ProductCost } from '@vendasta/marketplace-apps/v1';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/card";
import * as i2 from "../billing-price/billing-pricing-display/billing-pricing-display.component";
import * as i3 from "../marketplace-cost/mp-cost-pricing-display/mp-cost-pricing-display.component";
import * as i4 from "@angular/material/button";
import * as i5 from "@angular/common";
import * as i6 from "@angular/flex-layout/extended";
import * as i7 from "@ngx-translate/core";
export class EditionsMarketingComponent {
constructor() {
this.isEditionActionUsed = false;
this.editionActionClick = new EventEmitter();
this.priceAreaHeight$$ = new BehaviorSubject(null);
}
ngAfterViewInit() {
setTimeout(() => this.matchPricingAreaHeight(), 0);
}
ngOnChanges() {
if (this.billingPrice) {
this.priceCardData = this.prepareTabData(this.billingPrice, this.editionsMarketing, 'billingPrice', this.editionOrder);
}
else if (this.marketplaceCost) {
this.priceCardData = this.prepareTabData(this.marketplaceCost, this.editionsMarketing, 'marketplaceCost', this.editionOrder);
}
else {
this.priceCardData = [];
}
}
prepareTabData(pricing, marketing, type, order) {
const tabData = [];
Object.keys(pricing).forEach((key) => {
const curObj = pricing[key];
const curObjEditions = curObj.editionCost;
if (curObjEditions) {
Object.keys(curObjEditions).forEach((edKey) => {
const curPricing = curObjEditions[edKey];
curPricing.commitment = curObj.commitment;
tabData.push({
pricingType: type,
pricing: curPricing,
...marketing?.find((m) => m.billingId === edKey),
});
});
}
else {
tabData.push({
pricingType: type,
pricing: pricing[key],
...marketing?.find((m) => m.billingId === key),
});
}
});
if (!order && !!marketing && marketing.length) {
order = marketing.map((m) => m.billingId);
}
return this.orderTabData(tabData, order);
}
orderTabData(data, order) {
data.sort((a, b) => {
const A = a.billingId, B = b.billingId;
if (order.indexOf(A) > order.indexOf(B)) {
return 1;
}
else {
return -1;
}
});
return data;
}
matchPricingAreaHeight() {
const priceContainers = Array.from(document.getElementsByClassName('marketing-price-container'));
priceContainers.map((t) => {
if (!this.priceAreaHeight$$.getValue() || this.priceAreaHeight$$.getValue() < t.clientHeight) {
this.priceAreaHeight$$.next(t.clientHeight);
}
});
}
}
EditionsMarketingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: EditionsMarketingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
EditionsMarketingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: EditionsMarketingComponent, selector: "app-editions-marketing", inputs: { contactSales: "contactSales", marketingType: "marketingType", billingPrice: "billingPrice", marketplaceCost: "marketplaceCost", editionsMarketing: "editionsMarketing", editionOrder: "editionOrder", isEditionActionUsed: "isEditionActionUsed" }, outputs: { editionActionClick: "editionActionClick" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"edition-marketing-container\">\n <section\n class=\"edition-card-container\"\n *ngFor=\"let priceCard of priceCardData\"\n >\n <mat-card class=\"edition-marketing-card\">\n <div class=\"edition-title\" *ngIf=\"priceCard.name\">\n {{ priceCard.name }}\n </div>\n\n <div\n class=\"marketing-price-container\"\n [ngStyle]=\"{ 'height.px': priceAreaHeight$$ | async }\"\n >\n <ng-container\n *ngIf=\"priceCard.pricingType === 'billingPrice'; else costTemplate\"\n >\n <app-billing-pricing-display\n [contactSales]=\"contactSales\"\n [priceData]=\"priceCard.pricing\"\n ></app-billing-pricing-display>\n </ng-container>\n <ng-template #costTemplate>\n <app-mp-cost-pricing-display\n [contactSales]=\"contactSales\"\n [costData]=\"priceCard.pricing\"\n ></app-mp-cost-pricing-display>\n </ng-template>\n </div>\n\n <div class=\"add-to-cart-button\">\n <button\n *ngIf=\"isEditionActionUsed\"\n mat-flat-button\n color=\"primary\"\n (click)=\"\n editionActionClick.emit({\n appId: priceCard.appId,\n editionId: priceCard.editionId\n })\n \"\n >\n <span>{{ 'FRONTEND.STORE.ADD_TO_CART' | translate }}</span>\n </button>\n </div>\n\n <ng-container *ngIf=\"marketingType === 1; else endUser\">\n <ng-container *ngIf=\"priceCard.resellerMarketing\">\n <div>\n <div\n *ngIf=\"priceCard.resellerMarketing.description\"\n class=\"marketing-description\"\n >\n {{ priceCard.resellerMarketing.description }}\n </div>\n <ul\n *ngIf=\"priceCard.resellerMarketing.keySellingPoints\"\n class=\"marketing-ks\"\n >\n <li\n *ngFor=\"let ks of priceCard.resellerMarketing.keySellingPoints\"\n >\n <p>{{ ks }}</p>\n </li>\n </ul>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #endUser>\n <ng-container *ngIf=\"priceCard.endUserMarketing\">\n <div>\n <div\n *ngIf=\"priceCard.endUserMarketing.description\"\n class=\"marketing-description\"\n >\n {{ priceCard.endUserMarketing.description }}\n </div>\n <ul\n *ngIf=\"priceCard.endUserMarketing.keySellingPoints\"\n class=\"marketing-ks\"\n >\n <li\n *ngFor=\"let ks of priceCard.endUserMarketing.keySellingPoints\"\n >\n <p>{{ ks }}</p>\n </li>\n </ul>\n </div>\n </ng-container>\n </ng-template>\n </mat-card>\n </section>\n</div>\n", styles: [".edition-marketing-container{width:100%;display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap}.edition-marketing-card{padding:16px;height:100%}.edition-title{font-size:24px}.marketing-price-container{width:100%;padding-top:16px;overflow:hidden}.add-to-cart-button{width:100%;padding:0 16px}.add-to-cart-button button{width:100%}.va-component-title{font-size:16px;font-weight:400;margin-bottom:24px}.footer{font-size:12px;font-weight:400;color:#616161;margin-top:16px;white-space:normal}.edition-card-container{width:25%;padding:0 8px 8px}@media screen and (max-width: 960px){.edition-card-container{width:33%}}@media screen and (max-width: 768px){.edition-card-container{width:50%}}@media screen and (max-width: 600px){.edition-card-container{padding-top:8px;width:100%}}.marketing-description{padding-top:16px;color:#9e9e9e}.marketing-ks{padding-left:24px}.marketing-ks li{font-size:24px}.marketing-ks li p{font-size:16px}\n"], components: [{ type: i1.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i2.BillingPricingDisplayComponent, selector: "app-billing-pricing-display", inputs: ["contactSales", "priceData"] }, { type: i3.MpCostPricingDisplayComponent, selector: "app-mp-cost-pricing-display", inputs: ["contactSales", "costData"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }], pipes: { "async": i5.AsyncPipe, "translate": i7.TranslatePipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: EditionsMarketingComponent, decorators: [{
type: Component,
args: [{ selector: 'app-editions-marketing', template: "<div class=\"edition-marketing-container\">\n <section\n class=\"edition-card-container\"\n *ngFor=\"let priceCard of priceCardData\"\n >\n <mat-card class=\"edition-marketing-card\">\n <div class=\"edition-title\" *ngIf=\"priceCard.name\">\n {{ priceCard.name }}\n </div>\n\n <div\n class=\"marketing-price-container\"\n [ngStyle]=\"{ 'height.px': priceAreaHeight$$ | async }\"\n >\n <ng-container\n *ngIf=\"priceCard.pricingType === 'billingPrice'; else costTemplate\"\n >\n <app-billing-pricing-display\n [contactSales]=\"contactSales\"\n [priceData]=\"priceCard.pricing\"\n ></app-billing-pricing-display>\n </ng-container>\n <ng-template #costTemplate>\n <app-mp-cost-pricing-display\n [contactSales]=\"contactSales\"\n [costData]=\"priceCard.pricing\"\n ></app-mp-cost-pricing-display>\n </ng-template>\n </div>\n\n <div class=\"add-to-cart-button\">\n <button\n *ngIf=\"isEditionActionUsed\"\n mat-flat-button\n color=\"primary\"\n (click)=\"\n editionActionClick.emit({\n appId: priceCard.appId,\n editionId: priceCard.editionId\n })\n \"\n >\n <span>{{ 'FRONTEND.STORE.ADD_TO_CART' | translate }}</span>\n </button>\n </div>\n\n <ng-container *ngIf=\"marketingType === 1; else endUser\">\n <ng-container *ngIf=\"priceCard.resellerMarketing\">\n <div>\n <div\n *ngIf=\"priceCard.resellerMarketing.description\"\n class=\"marketing-description\"\n >\n {{ priceCard.resellerMarketing.description }}\n </div>\n <ul\n *ngIf=\"priceCard.resellerMarketing.keySellingPoints\"\n class=\"marketing-ks\"\n >\n <li\n *ngFor=\"let ks of priceCard.resellerMarketing.keySellingPoints\"\n >\n <p>{{ ks }}</p>\n </li>\n </ul>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #endUser>\n <ng-container *ngIf=\"priceCard.endUserMarketing\">\n <div>\n <div\n *ngIf=\"priceCard.endUserMarketing.description\"\n class=\"marketing-description\"\n >\n {{ priceCard.endUserMarketing.description }}\n </div>\n <ul\n *ngIf=\"priceCard.endUserMarketing.keySellingPoints\"\n class=\"marketing-ks\"\n >\n <li\n *ngFor=\"let ks of priceCard.endUserMarketing.keySellingPoints\"\n >\n <p>{{ ks }}</p>\n </li>\n </ul>\n </div>\n </ng-container>\n </ng-template>\n </mat-card>\n </section>\n</div>\n", styles: [".edition-marketing-container{width:100%;display:flex;flex-direction:row;justify-content:flex-start;flex-wrap:wrap}.edition-marketing-card{padding:16px;height:100%}.edition-title{font-size:24px}.marketing-price-container{width:100%;padding-top:16px;overflow:hidden}.add-to-cart-button{width:100%;padding:0 16px}.add-to-cart-button button{width:100%}.va-component-title{font-size:16px;font-weight:400;margin-bottom:24px}.footer{font-size:12px;font-weight:400;color:#616161;margin-top:16px;white-space:normal}.edition-card-container{width:25%;padding:0 8px 8px}@media screen and (max-width: 960px){.edition-card-container{width:33%}}@media screen and (max-width: 768px){.edition-card-container{width:50%}}@media screen and (max-width: 600px){.edition-card-container{padding-top:8px;width:100%}}.marketing-description{padding-top:16px;color:#9e9e9e}.marketing-ks{padding-left:24px}.marketing-ks li{font-size:24px}.marketing-ks li p{font-size:16px}\n"] }]
}], propDecorators: { contactSales: [{
type: Input
}], marketingType: [{
type: Input
}], billingPrice: [{
type: Input
}], marketplaceCost: [{
type: Input
}], editionsMarketing: [{
type: Input
}], editionOrder: [{
type: Input
}], isEditionActionUsed: [{
type: Input
}], editionActionClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGlvbnMtbWFya2V0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wcm9kdWN0LWRldGFpbHMtdjIvZWRpdGlvbnMtbWFya2V0aW5nL2VkaXRpb25zLW1hcmtldGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvcHJvZHVjdC1kZXRhaWxzLXYyL2VkaXRpb25zLW1hcmtldGluZy9lZGl0aW9ucy1tYXJrZXRpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFaEUsT0FBTyxFQUFFLFdBQVcsRUFBd0IsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7O0FBWWxGLE1BQU0sT0FBTywwQkFBMEI7SUFMdkM7UUFZVyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFcEMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVsRCxzQkFBaUIsR0FBNEIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7S0FrRnhFO0lBL0VDLGVBQWU7UUFDYixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUN0QyxJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMs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Q2pHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFO2dCQUM1RixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM3QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7dUhBNUZVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLHdZQ2hCdkMsNDZGQTZGQTsyRkQ3RWEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHdCQUF3Qjs4QkFLekIsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1hcmtldGluZ1R5cGUgfSBmcm9tICcuLi9wcm9kdWN0LWRldGFpbHMtdjIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb2R1Y3RQcmljaW5nIH0gZnJvbSAnQHZlbmRhc3RhL2JpbGxpbmcnO1xuaW1wb3J0IHsgUHJvZHVjdENvc3QsIEFwcEVkaXRpb25zTWFya2V0aW5nIH0gZnJvbSAnQHZlbmRhc3RhL21hcmtldHBsYWNlLWFwcHMvdjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRpb25UYWJEYXRhIGV4dGVuZHMgQXBwRWRpdGlvbnNNYXJrZXRpbmcge1xuICBwcmljaW5nVHlwZTogc3RyaW5nO1xuICBwcmljaW5nOiBQcm9kdWN0Q29zdCB8IFByb2R1Y3RQcmljaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZWRpdGlvbnMtbWFya2V0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRpb25zLW1hcmtldGluZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VkaXRpb25zLW1hcmtldGluZy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0aW9uc01hcmtldGluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbnRhY3RTYWxlczogYm9vbGVhbjtcbiAgQElucHV0KCkgbWFya2V0aW5nVHlwZTogTWFya2V0aW5nVHlwZTtcbiAgQElucHV0KCkgYmlsbGluZ1ByaWNlOiBQcm9kdWN0UHJpY2luZztcbiAgQElucHV0KCkgbWFya2V0cGxhY2VDb3N0OiBQcm9kdWN0Q29zdDtcbiAgQElucHV0KCkgZWRpdGlvbnNNYXJrZXRpbmc6IEFwcEVkaXRpb25zTWFya2V0aW5nW107XG4gIEBJbnB1dCgpIGVkaXRpb25PcmRlcjogc3RyaW5nW107XG4gIEBJbnB1dCgpIGlzRWRpdGlvbkFjdGlvblVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgZWRpdGlvbkFjdGlvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaWNlQXJlYUhlaWdodCQkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHByaWNlQ2FyZERhdGE6IEVkaXRpb25UYWJEYXRhW107XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5tYXRjaFByaWNpbmdBcmVhSGVpZ2h0KCksIDApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmlsbGluZ1ByaWNlKSB7XG4gICAgICB0aGlzLnByaWNlQ2FyZERhdGEgPSB0aGlzLnByZXBhcmVUYWJEYXRhKFxuICAgICAgICB0aGlzLmJpbGxpbmdQcmljZSxcbiAgICAgICAgdGhpcy5lZGl0aW9uc01hcmtldGluZyxcbiAgICAgICAgJ2JpbGxpbmdQcmljZScsXG4gICAgICAgIHRoaXMuZWRpdGlvbk9yZGVyLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFya2V0cGxhY2VDb3N0KSB7XG4gICAgICB0aGlzLnByaWNlQ2FyZERhdGEgPSB0aGlzLnByZXBhcmVUYWJEYXRhKFxuICAgICAgICB0aGlzLm1hcmtldHBsYWNlQ29zdCxcbiAgICAgICAgdGhpcy5lZGl0aW9uc01hcmtldGluZyxcbiAgICAgICAgJ21hcmtldHBsYWNlQ29zdCcsXG4gICAgICAgIHRoaXMuZWRpdGlvbk9yZGVyLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmljZUNhcmREYXRhID0gW107XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVRhYkRhdGEoXG4gICAgcHJpY2luZzogUHJvZHVjdFByaWNpbmcgfCBQcm9kdWN0Q29zdCxcbiAgICBtYXJrZXRpbmc6IEFwcEVkaXRpb25zTWFya2V0aW5nW10sXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIG9yZGVyOiBzdHJpbmdbXSxcbiAgKTogRWRpdGlvblRhYkRhdGFbXSB7XG4gICAgY29uc3QgdGFiRGF0YTogRWRpdGlvblRhYkRhdGFbXSA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHByaWNpbmcpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgY3VyT2JqID0gcHJpY2luZ1trZXldO1xuICAgICAgY29uc3QgY3VyT2JqRWRpdGlvbnMgPSBjdXJPYmouZWRpdGlvbkNvc3Q7XG4gICAgICBpZiAoY3VyT2JqRWRpdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoY3VyT2JqRWRpdGlvbnMpLmZvckVhY2goKGVkS2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VyUHJpY2luZyA9IGN1ck9iakVkaXRpb25zW2VkS2V5XTtcbiAgICAgICAgICBjdXJQcmljaW5nLmNvbW1pdG1lbnQgPSBjdXJPYmouY29tbWl0bWVudDtcbiAgICAgICAgICB0YWJEYXRhLnB1c2goe1xuICAgICAgICAgICAgcHJpY2luZ1R5cGU6IHR5cGUsXG4gICAgICAgICAgICBwcmljaW5nOiBjdXJQcmljaW5nLFxuICAgICAgICAgICAgLi4uKG1hcmtldGluZz8uZmluZCgobSkgPT4gbS5iaWxsaW5nSWQgPT09IGVkS2V5KSBhcyBhbnkpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYkRhdGEucHVzaCh7XG4gICAgICAgICAgcHJpY2luZ1R5cGU6IHR5cGUsXG4gICAgICAgICAgcHJpY2luZzogcHJpY2luZ1trZXldLFxuICAgICAgICAgIC4uLihtYXJrZXRpbmc/LmZpbmQoKG0pID0+IG0uYmlsbGluZ0lkID09PSBrZXkpIGFzIGFueSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghb3JkZXIgJiYgISFtYXJrZXRpbmcgJiYgbWFya2V0aW5nLmxlbmd0aCkge1xuICAgICAgb3JkZXIgPSBtYXJrZXRpbmcubWFwKChtKSA9PiBtLmJpbGxpbmdJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9yZGVyVGFiRGF0YSh0YWJEYXRhLCBvcmRlcik7XG4gIH1cblxuICBvcmRlclRhYkRhdGEoZGF0YTogRWRpdGlvblRhYkRhdGFbXSwgb3JkZXI6IHN0cmluZ1tdKTogRWRpdGlvblRhYkRhdGFbXSB7XG4gICAgZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBBID0gYS5iaWxsaW5nSWQsXG4gICAgICAgIEIgPSBiLmJpbGxpbmdJZDtcbiAgICAgIGlmIChvcmRlci5pbmRleE9mKEEpID4gb3JkZXIuaW5kZXhPZihCKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIG1hdGNoUHJpY2luZ0FyZWFIZWlnaHQoKTogdm9pZCB7XG4gICAgY29uc3QgcHJpY2VDb250YWluZXJzID0gQXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYXJrZXRpbmctcHJpY2UtY29udGFpbmVyJykpO1xuICAgIHByaWNlQ29udGFpbmVycy5tYXAoKHQpID0+IHtcbiAgICAgIGlmICghdGhpcy5wcmljZUFyZWFIZWlnaHQkJC5nZXRWYWx1ZSgpIHx8IHRoaXMucHJpY2VBcmVhSGVpZ2h0JCQuZ2V0VmFsdWUoKSA8IHQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucHJpY2VBcmVhSGVpZ2h0JCQubmV4dCh0LmNsaWVudEhlaWdodCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJlZGl0aW9uLW1hcmtldGluZy1jb250YWluZXJcIj5cbiAgPHNlY3Rpb25cbiAgICBjbGFzcz1cImVkaXRpb24tY2FyZC1jb250YWluZXJcIlxuICAgICpuZ0Zvcj1cImxldCBwcmljZUNhcmQgb2YgcHJpY2VDYXJkRGF0YVwiXG4gID5cbiAgICA8bWF0LWNhcmQgY2xhc3M9XCJlZGl0aW9uLW1hcmtldGluZy1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdGlvbi10aXRsZVwiICpuZ0lmPVwicHJpY2VDYXJkLm5hbWVcIj5cbiAgICAgICAge3sgcHJpY2VDYXJkLm5hbWUgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibWFya2V0aW5nLXByaWNlLWNvbnRhaW5lclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgJ2hlaWdodC5weCc6IHByaWNlQXJlYUhlaWdodCQkIHwgYXN5bmMgfVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cInByaWNlQ2FyZC5wcmljaW5nVHlwZSA9PT0gJ2JpbGxpbmdQcmljZSc7IGVsc2UgY29zdFRlbXBsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhcHAtYmlsbGluZy1wcmljaW5nLWRpc3BsYXlcbiAgICAgICAgICAgIFtjb250YWN0U2FsZXNdPVwiY29udGFjdFNhbGVzXCJcbiAgICAgICAgICAgIFtwcmljZURhdGFdPVwicHJpY2VDYXJkLnByaWNpbmdcIlxuICAgICAgICAgID48L2FwcC1iaWxsaW5nLXByaWNpbmctZGlzcGxheT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY29zdFRlbXBsYXRlPlxuICAgICAgICAgIDxhcHAtbXAtY29zdC1wcmljaW5nLWRpc3BsYXlcbiAgICAgICAgICAgIFtjb250YWN0U2FsZXNdPVwiY29udGFjdFNhbGVzXCJcbiAgICAgICAgICAgIFtjb3N0RGF0YV09XCJwcmljZUNhcmQucHJpY2luZ1wiXG4gICAgICAgICAgPjwvYXBwLW1wLWNvc3QtcHJpY2luZy1kaXNwbGF5PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJhZGQtdG8tY2FydC1idXR0b25cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiaXNFZGl0aW9uQWN0aW9uVXNlZFwiXG4gICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICBlZGl0aW9uQWN0aW9uQ2xpY2suZW1pdCh7XG4gICAgICAgICAgICAgIGFwcElkOiBwcmljZUNhcmQuYXBwSWQsXG4gICAgICAgICAgICAgIGVkaXRpb25JZDogcHJpY2VDYXJkLmVkaXRpb25JZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3sgJ0ZST05URU5ELlNUT1JFLkFERF9UT19DQVJUJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hcmtldGluZ1R5cGUgPT09IDE7IGVsc2UgZW5kVXNlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJpY2VDYXJkLnJlc2VsbGVyTWFya2V0aW5nXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJwcmljZUNhcmQucmVzZWxsZXJNYXJrZXRpbmcuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1hcmtldGluZy1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHByaWNlQ2FyZC5yZXNlbGxlck1hcmtldGluZy5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJwcmljZUNhcmQucmVzZWxsZXJNYXJrZXRpbmcua2V5U2VsbGluZ1BvaW50c1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWFya2V0aW5nLWtzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtzIG9mIHByaWNlQ2FyZC5yZXNlbGxlck1hcmtldGluZy5rZXlTZWxsaW5nUG9pbnRzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwPnt7IGtzIH19PC9wPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZW5kVXNlcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByaWNlQ2FyZC5lbmRVc2VyTWFya2V0aW5nXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJwcmljZUNhcmQuZW5kVXNlck1hcmtldGluZy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWFya2V0aW5nLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgcHJpY2VDYXJkLmVuZFVzZXJNYXJrZXRpbmcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICpuZ0lmPVwicHJpY2VDYXJkLmVuZFVzZXJNYXJrZXRpbmcua2V5U2VsbGluZ1BvaW50c1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWFya2V0aW5nLWtzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtzIG9mIHByaWNlQ2FyZC5lbmRVc2VyTWFya2V0aW5nLmtleVNlbGxpbmdQb2ludHNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHA+e3sga3MgfX08L3A+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtY2FyZD5cbiAgPC9zZWN0aW9uPlxuPC9kaXY+XG4iXX0=