UNPKG

@vendasta/store

Version:

Components and data for Store

85 lines 17.7 kB
import { Component, Input } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { OrderSummaryService } from '../order-summary.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@ngx-translate/core"; import * as i3 from "@vendasta/galaxy/pipes"; export class OrderSummarizedTotalsComponent { constructor() { this.orderTotals$$ = new BehaviorSubject(null); this.orderTotals$ = this.orderTotals$$.asObservable(); } set orderItems(orderItems) { const orderSummary = OrderSummaryService.getPriceSummary(orderItems); this._orderItems = orderSummary.items; this.orderTotals$$.next(this.calculateOrderTotals(this._orderItems, this._taxOptions)); } set taxOptions(taxOptions) { this._taxOptions = taxOptions; this.orderTotals$$.next(this.calculateOrderTotals(this._orderItems, this._taxOptions)); } calculateOrderTotals(orderItems, taxOptions) { let orderTotal = 0; let orderSubtotal = 0; let orderTaxes = []; orderItems.forEach((orderItem) => { const prices = orderItem.revenueComponents; orderTotal += this.calculateTotal(prices, taxOptions); orderSubtotal += this.calculateSubtotal(prices); const itemTaxes = this.calculateTaxes(prices, taxOptions); if (orderTaxes.length > 0) { orderTaxes = orderTaxes.map((tax, i) => ({ tax: tax.tax + itemTaxes[i].tax, percentage: tax.percentage, })); } else { orderTaxes = itemTaxes; } }); const orderTotals = { total: orderTotal, subtotal: orderSubtotal, taxes: orderTaxes, currency: orderItems.length > 0 ? orderItems[0].currencyCode : null, }; this.convertTotalsToDollars(orderTotals); return orderTotals; } calculateTotal(prices, taxOptions) { const subtotal = this.calculateSubtotal(prices); const taxes = this.calculateTaxes(prices, taxOptions); return subtotal + taxes.reduce((total, tax) => total + tax.tax, 0); } calculateSubtotal(prices) { return (prices || []).reduce((subtotal, price) => subtotal + price.value, 0); } calculateTaxes(prices, taxOptions) { return (taxOptions || []).map((taxOption) => { const tax = (prices || []).reduce((totalTax, price) => totalTax + price.value * taxOption.percentageMultiplier, 0); return { tax: tax, percentage: (taxOption.percentageMultiplier * 100).toFixed(2), }; }); } convertTotalsToDollars(orderTotals) { orderTotals.total /= 100; orderTotals.subtotal /= 100; orderTotals.taxes.forEach((tax) => { tax.tax /= 100; }); } } OrderSummarizedTotalsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OrderSummarizedTotalsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); OrderSummarizedTotalsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: OrderSummarizedTotalsComponent, selector: "app-order-summarized-totals", inputs: { orderItems: "orderItems", taxOptions: "taxOptions" }, ngImport: i0, template: "<ng-container *ngIf=\"orderTotals$ | async as orderTotals\">\n <ng-container *ngIf=\"orderTotals.total > 0; else freeLabel\">\n <div class=\"pricing-row\">\n <span>{{ 'FRONTEND.STORE.SUBTOTAL' | translate }}</span>\n <span class=\"pricing\">\n {{ orderTotals.subtotal | glxyCurrency: orderTotals.currency }}\n </span>\n </div>\n <ng-container *ngFor=\"let tax of orderTotals.taxes\">\n <div class=\"pricing-row\">\n <span>\n {{ 'FRONTEND.STORE.TAX' | translate: { percentage: tax.percentage } }}\n </span>\n <span class=\"pricing\">\n {{ tax.tax | glxyCurrency: orderTotals.currency }}\n </span>\n </div>\n </ng-container>\n <div class=\"pricing-row\">\n <span>\n <strong>{{ 'FRONTEND.STORE.TOTAL' | translate }}</strong>\n </span>\n <span class=\"pricing\">\n <strong>\n {{ orderTotals.total | glxyCurrency: orderTotals.currency }}\n </strong>\n </span>\n </div>\n </ng-container>\n <ng-template #freeLabel>\n <div class=\"pricing-row\">\n <span class=\"pricing\">\n {{ 'FRONTEND.STORE.FREE' | translate }}\n </span>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".pricing-row{width:100%;display:flex;flex-direction:row;margin-bottom:12px}.pricing-row:last-child{margin-bottom:0}.pricing-row .pricing{margin-left:auto}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i1.AsyncPipe, "translate": i2.TranslatePipe, "glxyCurrency": i3.GalaxyCurrencyPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OrderSummarizedTotalsComponent, decorators: [{ type: Component, args: [{ selector: 'app-order-summarized-totals', template: "<ng-container *ngIf=\"orderTotals$ | async as orderTotals\">\n <ng-container *ngIf=\"orderTotals.total > 0; else freeLabel\">\n <div class=\"pricing-row\">\n <span>{{ 'FRONTEND.STORE.SUBTOTAL' | translate }}</span>\n <span class=\"pricing\">\n {{ orderTotals.subtotal | glxyCurrency: orderTotals.currency }}\n </span>\n </div>\n <ng-container *ngFor=\"let tax of orderTotals.taxes\">\n <div class=\"pricing-row\">\n <span>\n {{ 'FRONTEND.STORE.TAX' | translate: { percentage: tax.percentage } }}\n </span>\n <span class=\"pricing\">\n {{ tax.tax | glxyCurrency: orderTotals.currency }}\n </span>\n </div>\n </ng-container>\n <div class=\"pricing-row\">\n <span>\n <strong>{{ 'FRONTEND.STORE.TOTAL' | translate }}</strong>\n </span>\n <span class=\"pricing\">\n <strong>\n {{ orderTotals.total | glxyCurrency: orderTotals.currency }}\n </strong>\n </span>\n </div>\n </ng-container>\n <ng-template #freeLabel>\n <div class=\"pricing-row\">\n <span class=\"pricing\">\n {{ 'FRONTEND.STORE.FREE' | translate }}\n </span>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".pricing-row{width:100%;display:flex;flex-direction:row;margin-bottom:12px}.pricing-row:last-child{margin-bottom:0}.pricing-row .pricing{margin-left:auto}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { orderItems: [{ type: Input }], taxOptions: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItc3VtbWFyaXplZC10b3RhbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zdG9yZS9zcmMvbGliL29yZGVyLXN1bW1hcnkvb3JkZXItc3VtbWFyaXplZC10b3RhbHMvb3JkZXItc3VtbWFyaXplZC10b3RhbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zdG9yZS9zcmMvbGliL29yZGVyLXN1bW1hcnkvb3JkZXItc3VtbWFyaXplZC10b3RhbHMvb3JkZXItc3VtbWFyaXplZC10b3RhbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFtQi9ELE1BQU0sT0FBTyw4QkFBOEI7SUFvQnpDO1FBSFEsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUN4RCxpQkFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFekMsQ0FBQztJQW5CaEIsSUFDSSxVQUFVLENBQUMsVUFBd0I7UUFDckMsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsSUFDSSxVQUFVLENBQUMsVUFB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QUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsRUFDNUUsQ0FBQyxDQUNGLENBQUM7WUFDRixPQUFPO2dCQUNMLEdBQUcsRUFBRSxHQUFHO2dCQUNSLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQzlELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxXQUF3QjtRQUNyRCxXQUFXLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQztRQUN6QixXQUFXLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQztRQUM1QixXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2hDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7MkhBL0VVLDhCQUE4QjsrR0FBOUIsOEJBQThCLG1JQ3ZCM0MscXRDQXFDQTsyRkRkYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsNkJBQTZCOzBFQU1uQyxVQUFVO3NCQURiLEtBQUs7Z0JBUUYsVUFBVTtzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmV2ZW51ZUNvbXBvbmVudCB9IGZyb20gJ0B2ZW5kYXN0YS9zYWxlcy1vcmRlcnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdW1tYXJ5SXRlbSwgVGF4T3B0aW9uLCBVSUxpbmVJdGVtIH0gZnJvbSAnLi4vLi4vb3JkZXItZm9ybS9vcmRlci1pdGVtLWxpc3QvaW50ZXJmYWNlJztcbmltcG9ydCB7IE9yZGVyU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuLi9vcmRlci1zdW1tYXJ5LnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgT3JkZXJUb3RhbHMge1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWJ0b3RhbDogbnVtYmVyO1xuICB0YXhlczogT3JkZXJUYXhbXTtcbiAgY3VycmVuY3k6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE9yZGVyVGF4IHtcbiAgdGF4OiBudW1iZXI7XG4gIHBlcmNlbnRhZ2U6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW9yZGVyLXN1bW1hcml6ZWQtdG90YWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29yZGVyLXN1bW1hcml6ZWQtdG90YWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JkZXItc3VtbWFyaXplZC10b3RhbHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgT3JkZXJTdW1tYXJpemVkVG90YWxzQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgc2V0IG9yZGVySXRlbXMob3JkZXJJdGVtczogVUlMaW5lSXRlbVtdKSB7XG4gICAgY29uc3Qgb3JkZXJTdW1tYXJ5ID0gT3JkZXJTdW1tYXJ5U2VydmljZS5nZXRQcmljZVN1bW1hcnkob3JkZXJJdGVtcyk7XG4gICAgdGhpcy5fb3JkZXJJdGVtcyA9IG9yZGVyU3VtbWFyeS5pdGVtcztcbiAgICB0aGlzLm9yZGVyVG90YWxzJCQubmV4dCh0aGlzLmNhbGN1bGF0ZU9yZGVyVG90YWxzKHRoaXMuX29yZGVySXRlbXMsIHRoaXMuX3RheE9wdGlvbnMpKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB0YXhPcHRpb25zKHRheE9wdGlvbnM6IFRheE9wdGlvbltdKSB7XG4gICAgdGhpcy5fdGF4T3B0aW9ucyA9IHRheE9wdGlvbnM7XG4gICAgdGhpcy5vcmRlclRvdGFscyQkLm5leHQodGhpcy5jYWxjdWxhdGVPcmRlclRvdGFscyh0aGlzLl9vcmRlckl0ZW1zLCB0aGlzLl90YXhPcHRpb25zKSk7XG4gIH1cblxuICBwcml2YXRlIF9vcmRlckl0ZW1zOiBTdW1tYXJ5SXRlbVtdO1xuICBwcml2YXRlIF90YXhPcHRpb25zOiBUYXhPcHRpb25bXTtcblxuICBwcml2YXRlIG9yZGVyVG90YWxzJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9yZGVyVG90YWxzPihudWxsKTtcbiAgcHVibGljIG9yZGVyVG90YWxzJCA9IHRoaXMub3JkZXJUb3RhbHMkJC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVPcmRlclRvdGFscyhvcmRlckl0ZW1zOiBTdW1tYXJ5SXRlbVtdLCB0YXhPcHRpb25zOiBUYXhPcHRpb25bXSk6IE9yZGVyVG90YWxzIHtcbiAgICBsZXQgb3JkZXJUb3RhbCA9IDA7XG4gICAgbGV0IG9yZGVyU3VidG90YWwgPSAwO1xuICAgIGxldCBvcmRlclRheGVzOiBPcmRlclRheFtdID0gW107XG4gICAgb3JkZXJJdGVtcy5mb3JFYWNoKChvcmRlckl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHByaWNlcyA9IG9yZGVySXRlbS5yZXZlbnVlQ29tcG9uZW50cztcbiAgICAgIG9yZGVyVG90YWwgKz0gdGhpcy5jYWxjdWxhdGVUb3RhbChwcmljZXMsIHRheE9wdGlvbnMpO1xuICAgICAgb3JkZXJTdWJ0b3RhbCArPSB0aGlzLmNhbGN1bGF0ZVN1YnRvdGFsKHByaWNlcyk7XG4gICAgICBjb25zdCBpdGVtVGF4ZXMgPSB0aGlzLmNhbGN1bGF0ZVRheGVzKHByaWNlcywgdGF4T3B0aW9ucyk7XG4gICAgICBpZiAob3JkZXJUYXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9yZGVyVGF4ZXMgPSBvcmRlclRheGVzLm1hcCgodGF4LCBpKSA9PiAoe1xuICAgICAgICAgIHRheDogdGF4LnRheCArIGl0ZW1UYXhlc1tpXS50YXgsXG4gICAgICAgICAgcGVyY2VudGFnZTogdGF4LnBlcmNlbnRhZ2UsXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yZGVyVGF4ZXMgPSBpdGVtVGF4ZXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgb3JkZXJUb3RhbHMgPSB7XG4gICAgICB0b3RhbDogb3JkZXJUb3RhbCxcbiAgICAgIHN1YnRvdGFsOiBvcmRlclN1YnRvdGFsLFxuICAgICAgdGF4ZXM6IG9yZGVyVGF4ZXMsXG4gICAgICBjdXJyZW5jeTogb3JkZXJJdGVtcy5sZW5ndGggPiAwID8gb3JkZXJJdGVtc1swXS5jdXJyZW5jeUNvZGUgOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5jb252ZXJ0VG90YWxzVG9Eb2xsYXJzKG9yZGVyVG90YWxzKTtcbiAgICByZXR1cm4gb3JkZXJUb3RhbHM7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVRvdGFsKHByaWNlczogUmV2ZW51ZUNvbXBvbmVudFtdLCB0YXhPcHRpb25zOiBUYXhPcHRpb25bXSk6IG51bWJlciB7XG4gICAgY29uc3Qgc3VidG90YWwgPSB0aGlzLmNhbGN1bGF0ZVN1YnRvdGFsKHByaWNlcyk7XG4gICAgY29uc3QgdGF4ZXMgPSB0aGlzLmNhbGN1bGF0ZVRheGVzKHByaWNlcywgdGF4T3B0aW9ucyk7XG4gICAgcmV0dXJuIHN1YnRvdGFsICsgdGF4ZXMucmVkdWNlKCh0b3RhbCwgdGF4KSA9PiB0b3RhbCArIHRheC50YXgsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTdWJ0b3RhbChwcmljZXM6IFJldmVudWVDb21wb25lbnRbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChwcmljZXMgfHwgW10pLnJlZHVjZSgoc3VidG90YWwsIHByaWNlKSA9PiBzdWJ0b3RhbCArIHByaWNlLnZhbHVlLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlVGF4ZXMocHJpY2VzOiBSZXZlbnVlQ29tcG9uZW50W10sIHRheE9wdGlvbnM6IFRheE9wdGlvbltdKTogT3JkZXJUYXhbXSB7XG4gICAgcmV0dXJuICh0YXhPcHRpb25zIHx8IFtdKS5tYXAoKHRheE9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgdGF4ID0gKHByaWNlcyB8fCBbXSkucmVkdWNlKFxuICAgICAgICAodG90YWxUYXgsIHByaWNlKSA9PiB0b3RhbFRheCArIHByaWNlLnZhbHVlICogdGF4T3B0aW9uLnBlcmNlbnRhZ2VNdWx0aXBsaWVyLFxuICAgICAgICAwLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRheDogdGF4LFxuICAgICAgICBwZXJjZW50YWdlOiAodGF4T3B0aW9uLnBlcmNlbnRhZ2VNdWx0aXBsaWVyICogMTAwKS50b0ZpeGVkKDIpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvdGFsc1RvRG9sbGFycyhvcmRlclRvdGFsczogT3JkZXJUb3RhbHMpOiB2b2lkIHtcbiAgICBvcmRlclRvdGFscy50b3RhbCAvPSAxMDA7XG4gICAgb3JkZXJUb3RhbHMuc3VidG90YWwgLz0gMTAwO1xuICAgIG9yZGVyVG90YWxzLnRheGVzLmZvckVhY2goKHRheCkgPT4ge1xuICAgICAgdGF4LnRheCAvPSAxMDA7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJvcmRlclRvdGFscyQgfCBhc3luYyBhcyBvcmRlclRvdGFsc1wiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwib3JkZXJUb3RhbHMudG90YWwgPiAwOyBlbHNlIGZyZWVMYWJlbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwcmljaW5nLXJvd1wiPlxuICAgICAgPHNwYW4+e3sgJ0ZST05URU5ELlNUT1JFLlNVQlRPVEFMJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHJpY2luZ1wiPlxuICAgICAgICB7eyBvcmRlclRvdGFscy5zdWJ0b3RhbCB8IGdseHlDdXJyZW5jeTogb3JkZXJUb3RhbHMuY3VycmVuY3kgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YXggb2Ygb3JkZXJUb3RhbHMudGF4ZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmljaW5nLXJvd1wiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7eyAnRlJPTlRFTkQuU1RPUkUuVEFYJyB8IHRyYW5zbGF0ZTogeyBwZXJjZW50YWdlOiB0YXgucGVyY2VudGFnZSB9IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljaW5nXCI+XG4gICAgICAgICAge3sgdGF4LnRheCB8IGdseHlDdXJyZW5jeTogb3JkZXJUb3RhbHMuY3VycmVuY3kgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiBjbGFzcz1cInByaWNpbmctcm93XCI+XG4gICAgICA8c3Bhbj5cbiAgICAgICAgPHN0cm9uZz57eyAnRlJPTlRFTkQuU1RPUkUuVE9UQUwnIHwgdHJhbnNsYXRlIH19PC9zdHJvbmc+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInByaWNpbmdcIj5cbiAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICB7eyBvcmRlclRvdGFscy50b3RhbCB8IGdseHlDdXJyZW5jeTogb3JkZXJUb3RhbHMuY3VycmVuY3kgfX1cbiAgICAgICAgPC9zdHJvbmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI2ZyZWVMYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicHJpY2luZy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHJpY2luZ1wiPlxuICAgICAgICB7eyAnRlJPTlRFTkQuU1RPUkUuRlJFRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuIl19