UNPKG

@vendasta/store

Version:

Components and data for Store

231 lines 30.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { trigger, transition, animate, style, state } from '@angular/animations'; import { BehaviorSubject, ReplaySubject, combineLatest, zip } from 'rxjs'; import { filter, map, startWith } from 'rxjs/operators'; import { buildSalesPackages, buildSalesProductFromProduct, addStatusesToSalesPackages, addStatusesToSalesProduct, } from './sales-package'; import { ListIndent } from './package-dropdown-item/package-dropdown-item.component'; export class VaPackageDropdownComponent { constructor() { this.singularDropdown = false; this.packageProductIndent = ListIndent.INDENT_ONE; this.packageAddonWithoutProductIndent = ListIndent.INDENT_ONE; this.packageAddonWithProductIndent = ListIndent.INDENT_TWO; this.productAddonIndent = ListIndent.INDENT_ONE; this.packages$$ = new ReplaySubject(1); this.products$$ = new ReplaySubject(1); this.standAloneProducts$$ = new ReplaySubject(1); this.statuses$$ = new BehaviorSubject([]); this.addons$$ = new ReplaySubject(1); this.packageToggles = []; this.productToggles = []; } // packages in dropdown /** * @param {?} packages * @return {?} */ set packages(packages) { this.packages$$.next(packages); } // products within given packages /** * @param {?} products * @return {?} */ set products(products) { this.products$$.next(products); } // products not associated with a package /** * @param {?} standAloneProducts * @return {?} */ set standAloneProducts(standAloneProducts) { this.standAloneProducts$$.next(standAloneProducts); } // statuses for all products and addons /** * @param {?} statuses * @return {?} */ set statuses(statuses) { this.statuses$$.next(statuses); } // addons within given packages /** * @param {?} addons * @return {?} */ set addons(addons) { this.addons$$.next(addons); } /** * @return {?} */ ngOnInit() { /** @type {?} */ const packages$ = this.packages$$.pipe(filter(packages => packages !== null)); /** @type {?} */ const products$ = this.products$$.pipe(filter(products => products !== null)); /** @type {?} */ const addons$ = this.addons$$.pipe(filter(addons => addons !== null)); /** @type {?} */ const salesPackage$ = zip(packages$, products$, addons$).pipe(map(([packages, products, addons]) => buildSalesPackages(packages, products, addons))); this.salesPackages$ = combineLatest(salesPackage$, this.statuses$$).pipe(map(([salesPackages, statuses]) => addStatusesToSalesPackages(salesPackages, statuses)), startWith([])); this.salesProducts$ = combineLatest(this.standAloneProducts$$, this.statuses$$).pipe(filter(([products, _]) => products !== null), map(([products, statuses]) => { return products.map(p => { /** @type {?} */ const addons = p.addons || null; /** @type {?} */ const salesProducts = buildSalesProductFromProduct(p, addons); return addStatusesToSalesProduct(salesProducts, statuses); }); }), startWith([])); this.templateData$ = combineLatest(this.salesPackages$, this.salesProducts$).pipe(map(([packages, products]) => ({ packages: packages, products: products }))); } /** * @param {?} indexToToggle * @return {?} */ togglePackage(indexToToggle) { if (this.singularDropdown) { /** @type {?} */ const openedIndex = this.packageToggles.findIndex(value => value === true); if (openedIndex !== indexToToggle) { this.packageToggles[openedIndex] = false; } /** @type {?} */ const productOpenedIndex = this.productToggles.findIndex(value => value === true); if (productOpenedIndex > -1) { this.productToggles[productOpenedIndex] = false; } } this.packageToggles[indexToToggle] = !this.packageToggles[indexToToggle]; } /** * @param {?} indexToToggle * @return {?} */ toggleProduct(indexToToggle) { if (this.singularDropdown) { /** @type {?} */ const openedIndex = this.productToggles.findIndex(value => value === true); if (openedIndex !== indexToToggle) { this.productToggles[openedIndex] = false; } /** @type {?} */ const packageOpenedIndex = this.packageToggles.findIndex(value => value === true); if (packageOpenedIndex > -1) { this.packageToggles[packageOpenedIndex] = false; } } this.productToggles[indexToToggle] = !this.productToggles[indexToToggle]; } /** * @param {?} product * @return {?} */ formatProductEditionName(product) { return product.editionName ? `${product.name} ${product.editionName}` : product.name; } /** * @param {?} product * @return {?} */ standAloneProductDescription(product) { if (product.addons && product.addons.length > 0) { /** @type {?} */ let description = `Contains ${product.addons.length}`; description = product.addons.length === 1 ? `${description} Addon` : `${description} Addons`; return description; } return ''; } /** * @param {?} pkg * @return {?} */ packageDescription(pkg) { /** @type {?} */ const hasProducts = pkg.products && pkg.products.length > 0; if (!hasProducts && pkg.totalAddons === 0) { return 'No Items in Package'; } /** @type {?} */ let description = ''; /** @type {?} */ const hasOneProduct = pkg.products && pkg.products.length === 1; if (hasProducts || pkg.totalAddons > 0) { description = 'Contains '; } if (hasProducts) { description = `${description} ${pkg.products.length}`; description = hasOneProduct ? `${description} Product` : `${description} Products`; } if (hasProducts && pkg.totalAddons > 0) { description = `${description} & ${pkg.totalAddons}`; description = pkg.totalAddons === 1 ? `${description} Addon` : `${description} Addons`; } return description; } } VaPackageDropdownComponent.decorators = [ { type: Component, args: [{ selector: 'va-package-dropdown', animations: [ trigger('listAnimationStart', [ state('void', style({ height: '0px' })), state('*', style({ height: '*' })), transition('void => *', [animate('0.25s ease')]), transition('* => void', [animate('0.25s ease')]) ]) ], template: "<ng-container *ngIf=\"templateData$ | async as data\">\n <mat-card class=\"package-list-container\" *ngIf=\"data.products?.length > 0 || data.packages?.length > 0 else loading\">\n <mat-list>\n <div class=\"package-list\" *ngFor=\"let package of data.packages; let packageIndex = index\">\n\n <va-package-dropdown-item\n [title]=\"package.name\"\n [iconUrl]=\"package.icon\"\n [subtitle]=\"package.formattedPrices\"\n [statusItem]=\"package.activationStatus\"\n [description]=\"packageDescription(package)\"\n [enableDropdown]=\"package.products?.length > 0 || package.addonsWithNoParent?.length > 0\"\n [toggleValue]=\"packageToggles[packageIndex]\"\n (itemToggled)=\"togglePackage(packageIndex)\"\n ></va-package-dropdown-item>\n\n <mat-list class=\"product-or-addon-list package-dropdown-font\" *ngIf=\"packageToggles[packageIndex]\"\n [@listAnimationStart]>\n <div *ngFor=\"let product of package.products\">\n <va-package-dropdown-item\n [title]=\"product.name\"\n [subtitle]=\"product.tagline\"\n [iconUrl]=\"product.icon\"\n [statusItem]=\"product.activationStatus\"\n [indent]=\"packageProductIndent\"\n ></va-package-dropdown-item>\n\n <va-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithProductIndent\"\n ></va-package-dropdown-item>\n </div>\n\n <va-package-dropdown-item\n *ngFor=\"let addon of package.addonsWithNoParent\"\n [title]=\"addon.name\"\n titleDescriptor=\"(Requires {{ addon.parentName || ''}})\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [secondaryIconUrl]=\"addon.parentIcon\"\n [secondaryIconName]=\"addon.parentName\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithoutProductIndent\"\n ></va-package-dropdown-item>\n </mat-list>\n </div>\n\n <div class=\"product-list\" *ngFor=\"let product of data.products; let productIndex = index\">\n <va-package-dropdown-item\n [title]=\"formatProductEditionName(product)\"\n [iconUrl]=\"product.icon\"\n [subtitle]=\"product.formattedPrices\"\n [statusItem]=\"product.activationStatus\"\n [description]=\"standAloneProductDescription(product)\"\n [enableDropdown]=\"product.addons?.length > 0\"\n [toggleValue]=\"productToggles[productIndex]\"\n (itemToggled)=\"toggleProduct(productIndex)\"\n ></va-package-dropdown-item>\n\n <mat-list class=\"product-or-addon-list product-dropdown-font\" *ngIf=\"productToggles[productIndex]\"\n [@listAnimationStart]>\n <va-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"productAddonIndent\"\n ></va-package-dropdown-item>\n </mat-list>\n </div>\n\n </mat-list>\n </mat-card>\n</ng-container>\n\n<ng-template #loading>\n <mat-card>\n <div class=\"package-dropdown-stencil-display\">\n <va-icon [iconUrl]=\"\"></va-icon>\n <div class=\"stencil-text\">\n <h1 class=\"stencil-title stencil-shimmer\"></h1>\n <span class=\"stencil-tagline stencil-shimmer\"></span>\n </div>\n </div>\n </mat-card>\n</ng-template>\n", styles: [".package-dropdown-font,.product-dropdown-font{color:rgba(0,0,0,.54);font-size:14px;font-weight:400}.package-list-container{border-top:1px solid rgba(0,0,0,.12);padding:0}.package-list-container mat-list{padding:0}.package-dropdown-stencil-display{display:flex;width:100%;flex-grow:1}.package-dropdown-stencil-display va-icon{margin-right:20px}.package-dropdown-stencil-display .stencil-text{width:inherit;display:flex;flex-direction:column;justify-content:center}.package-dropdown-stencil-display .stencil-text .stencil-title{height:32px;width:40%;margin-bottom:5px!important;margin-top:0!important}.package-dropdown-stencil-display .stencil-text .stencil-tagline{height:32px;width:inherit}.product-or-addon-list{background-color:rgba(0,0,0,.04);overflow:hidden}"] }] } ]; VaPackageDropdownComponent.propDecorators = { packages: [{ type: Input }], products: [{ type: Input }], standAloneProducts: [{ type: Input }], statuses: [{ type: Input }], addons: [{ type: Input }], singularDropdown: [{ type: Input }] }; if (false) { /** @type {?} */ VaPackageDropdownComponent.prototype.singularDropdown; /** @type {?} */ VaPackageDropdownComponent.prototype.packageProductIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.packageAddonWithoutProductIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.packageAddonWithProductIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.productAddonIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.packages$$; /** @type {?} */ VaPackageDropdownComponent.prototype.products$$; /** @type {?} */ VaPackageDropdownComponent.prototype.standAloneProducts$$; /** @type {?} */ VaPackageDropdownComponent.prototype.statuses$$; /** @type {?} */ VaPackageDropdownComponent.prototype.addons$$; /** @type {?} */ VaPackageDropdownComponent.prototype.templateData$; /** @type {?} */ VaPackageDropdownComponent.prototype.salesPackages$; /** @type {?} */ VaPackageDropdownComponent.prototype.salesProducts$; /** @type {?} */ VaPackageDropdownComponent.prototype.packageToggles; /** @type {?} */ VaPackageDropdownComponent.prototype.productToggles; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdmVuZGFzdGEvc3RvcmUvIiwic291cmNlcyI6WyJsaWIvcGFja2FnZS1kcm9wZG93bi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRixPQUFPLEVBQWMsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hELE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsNEJBQTRCLEVBQzVCLDBCQUEwQixFQUMxQix5QkFBeUIsR0FFMUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seURBQXlELENBQUM7QUFlckYsTUFBTSxPQUFPLDBCQUEwQjtJQWJ2QztRQXVDVyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFbEMseUJBQW9CLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUM3QyxxQ0FBZ0MsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3pELGtDQUE2QixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUUzQyxlQUFVLEdBQTZCLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELGVBQVUsR0FBNkIsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQseUJBQW9CLEdBQTZCLElB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LE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzt3QkFDdkMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzt3QkFDbEMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7cUJBQ2pELENBQUM7aUJBQ0g7Z0JBQ0QsMHpIQUE4Qzs7YUFFL0M7Ozt1QkFHRSxLQUFLO3VCQUtMLEtBQUs7aUNBS0wsS0FBSzt1QkFLTCxLQUFLO3FCQUtMLEtBQUs7K0JBSUwsS0FBSzs7OztJQUFOLHNEQUFrQzs7SUFFbEMsMERBQTZDOztJQUM3QyxzRUFBeUQ7O0lBQ3pELG1FQUFzRDs7SUFDdEQsd0RBQTJDOztJQUUzQyxnREFBNEQ7O0lBQzVELGdEQUE0RDs7SUFDNUQsMERBQXNFOztJQUN0RSxnREFBcUY7O0lBQ3JGLDhDQUF3RDs7SUFFeEQsbURBQWdGOztJQUNoRixvREFBMkM7O0lBQzNDLG9EQUEyQzs7SUFDM0Msb0RBQStCOztJQUMvQixvREFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIGFuaW1hdGUsIHN0eWxlLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCB6aXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFkZG9uIH0gZnJvbSAnQHZlbmRhc3RhL2NvcmUvbWFya2V0cGxhY2UtcGFja2FnZXMnO1xuaW1wb3J0IHtcbiAgU2FsZXNQYWNrYWdlLFxuICBTYWxlc1Byb2R1Y3QsXG4gIGJ1aWxkU2FsZXNQYWNrYWdlcyxcbiAgYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdCxcbiAgYWRkU3RhdHVzZXNUb1NhbGVzUGFja2FnZXMsXG4gIGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QsXG4gIFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1cyxcbn0gZnJvbSAnLi9zYWxlcy1wYWNrYWdlJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi9zaGFyZWQvcHJvZHVjdCc7XG5pbXBvcnQgeyBQYWNrYWdlIH0gZnJvbSAnLi4vcGFja2FnZS1kZXRhaWxzL3BhY2thZ2UnO1xuaW1wb3J0IHsgTGlzdEluZGVudCB9IGZyb20gJy4vcGFja2FnZS1kcm9wZG93bi1pdGVtL3BhY2thZ2UtZHJvcGRvd24taXRlbS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YS1wYWNrYWdlLWRyb3Bkb3duJyxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2xpc3RBbmltYXRpb25TdGFydCcsIFtcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnIH0pKSxcbiAgICAgIHN0YXRlKCcqJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSlcbiAgICBdKVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJ3BhY2thZ2UtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVmFQYWNrYWdlRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBwYWNrYWdlcyBpbiBkcm9wZG93blxuICBASW5wdXQoKVxuICBzZXQgcGFja2FnZXMocGFja2FnZXM6IFBhY2thZ2VbXSkge1xuICAgIHRoaXMucGFja2FnZXMkJC5uZXh0KHBhY2thZ2VzKTtcbiAgfVxuICAvLyBwcm9kdWN0cyB3aXRoaW4gZ2l2ZW4gcGFja2FnZXNcbiAgQElucHV0KClcbiAgc2V0IHByb2R1Y3RzKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICB0aGlzLnByb2R1Y3RzJCQubmV4dChwcm9kdWN0cyk7XG4gIH1cbiAgLy8gcHJvZHVjdHMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHBhY2thZ2VcbiAgQElucHV0KClcbiAgc2V0IHN0YW5kQWxvbmVQcm9kdWN0cyhzdGFuZEFsb25lUHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIHRoaXMuc3RhbmRBbG9uZVByb2R1Y3RzJCQubmV4dChzdGFuZEFsb25lUHJvZHVjdHMpO1xuICB9XG4gIC8vIHN0YXR1c2VzIGZvciBhbGwgcHJvZHVjdHMgYW5kIGFkZG9uc1xuICBASW5wdXQoKVxuICBzZXQgc3RhdHVzZXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKSB7XG4gICAgdGhpcy5zdGF0dXNlcyQkLm5leHQoc3RhdHVzZXMpO1xuICB9XG4gIC8vIGFkZG9ucyB3aXRoaW4gZ2l2ZW4gcGFja2FnZXNcbiAgQElucHV0KClcbiAgc2V0IGFkZG9ucyhhZGRvbnM6IEFkZG9uW10pIHtcbiAgICB0aGlzLmFkZG9ucyQkLm5leHQoYWRkb25zKTtcbiAgfVxuICBASW5wdXQoKSBzaW5ndWxhckRyb3Bkb3duID0gZmFsc2U7XG5cbiAgcGFja2FnZVByb2R1Y3RJbmRlbnQgPSBMaXN0SW5kZW50LklOREVOVF9PTkU7XG4gIHBhY2thZ2VBZGRvbldpdGhvdXRQcm9kdWN0SW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuICBwYWNrYWdlQWRkb25XaXRoUHJvZHVjdEluZGVudCA9IExpc3RJbmRlbnQuSU5ERU5UX1RXTztcbiAgcHJvZHVjdEFkZG9uSW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuXG4gIHBhY2thZ2VzJCQ6IFJlcGxheVN1YmplY3Q8UGFja2FnZVtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBwcm9kdWN0cyQkOiBSZXBsYXlTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgc3RhbmRBbG9uZVByb2R1Y3RzJCQ6IFJlcGxheVN1YmplY3Q8UHJvZHVjdFtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBzdGF0dXNlcyQkOiBCZWhhdmlvclN1YmplY3Q8UGFja2FnZUl0ZW1BY3RpdmF0aW9uU3RhdHVzW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIGFkZG9ucyQkOiBSZXBsYXlTdWJqZWN0PEFkZG9uW10+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgdGVtcGxhdGVEYXRhJDogT2JzZXJ2YWJsZTx7cGFja2FnZXM6IFNhbGVzUGFja2FnZVtdOyBwcm9kdWN0czogU2FsZXNQcm9kdWN0W119PjtcbiAgc2FsZXNQYWNrYWdlcyQ6IE9ic2VydmFibGU8U2FsZXNQYWNrYWdlW10+O1xuICBzYWxlc1Byb2R1Y3RzJDogT2JzZXJ2YWJsZTxTYWxlc1Byb2R1Y3RbXT47XG4gIHBhY2thZ2VUb2dnbGVzOiBib29sZWFuW10gPSBbXTtcbiAgcHJvZHVjdFRvZ2dsZXM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VzJDogT2JzZXJ2YWJsZTxQYWNrYWdlW10+ID0gdGhpcy5wYWNrYWdlcyQkLnBpcGUoZmlsdGVyKHBhY2thZ2VzID0+IHBhY2thZ2VzICE9PSBudWxsKSk7XG4gICAgY29uc3QgcHJvZHVjdHMkOiBPYnNlcnZhYmxlPFByb2R1Y3RbXT4gPSB0aGlzLnByb2R1Y3RzJCQucGlwZShmaWx0ZXIocHJvZHVjdHMgPT4gcHJvZHVjdHMgIT09IG51bGwpKTtcbiAgICBjb25zdCBhZGRvbnMkOiBPYnNlcnZhYmxlPEFkZG9uW10+ID0gdGhpcy5hZGRvbnMkJC5waXBlKGZpbHRlcihhZGRvbnMgPT4gYWRkb25zICE9PSBudWxsKSk7XG5cbiAgICBjb25zdCBzYWxlc1BhY2thZ2UkID0gemlwKHBhY2thZ2VzJCwgcHJvZHVjdHMkLCBhZGRvbnMkKS5waXBlKFxuICAgICAgbWFwKChbcGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnNdKSA9PiBidWlsZFNhbGVzUGFja2FnZXMocGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnMpKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1BhY2thZ2VzJCA9IGNvbWJpbmVMYXRlc3Qoc2FsZXNQYWNrYWdlJCwgdGhpcy5zdGF0dXNlcyQkKS5waXBlKFxuICAgICAgbWFwKChbc2FsZXNQYWNrYWdlcywgc3RhdHVzZXNdKSA9PiBhZGRTdGF0dXNlc1RvU2FsZXNQYWNrYWdlcyhzYWxlc1BhY2thZ2VzLCBzdGF0dXNlcykpLFxuICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1Byb2R1Y3RzJCA9IGNvbWJpbmVMYXRlc3QodGhpcy5zdGFuZEFsb25lUHJvZHVjdHMkJCwgdGhpcy5zdGF0dXNlcyQkKS5waXBlKFxuICAgICAgZmlsdGVyKChbcHJvZHVjdHMsIF9dKSA9PiBwcm9kdWN0cyAhPT0gbnVsbCksXG4gICAgICBtYXAoKFtwcm9kdWN0cywgc3RhdHVzZXNdOiBbUHJvZHVjdFtdLCBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXV0pOiBTYWxlc1Byb2R1Y3RbXSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0cy5tYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgYWRkb25zID0gcC5hZGRvbnMgfHwgbnVsbDtcbiAgICAgICAgICBjb25zdCBzYWxlc1Byb2R1Y3RzID0gYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdChwLCBhZGRvbnMpO1xuICAgICAgICAgIHJldHVybiBhZGRTdGF0dXNlc1RvU2FsZXNQcm9kdWN0KHNhbGVzUHJvZHVjdHMsIHN0YXR1c2VzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgKTtcbiAgICB0aGlzLnRlbXBsYXRlRGF0YSQgPSBjb21iaW5lTGF0ZXN0KHRoaXMuc2FsZXNQYWNrYWdlcyQsIHRoaXMuc2FsZXNQcm9kdWN0cyQpLnBpcGUoXG4gICAgICBtYXAoKFtwYWNrYWdlcywgcHJvZHVjdHNdKSA9PiAoe3BhY2thZ2VzOiBwYWNrYWdlcywgcHJvZHVjdHM6IHByb2R1Y3RzfSkpXG4gICAgKVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZVBhY2thZ2UoaW5kZXhUb1RvZ2dsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2luZ3VsYXJEcm9wZG93bikge1xuICAgICAgY29uc3Qgb3BlbmVkSW5kZXggPSB0aGlzLnBhY2thZ2VUb2dnbGVzLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb2R1Y3RPcGVuZWRJbmRleCA9IHRoaXMucHJvZHVjdFRvZ2dsZXMuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwcm9kdWN0T3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnByb2R1Y3RUb2dnbGVzW3Byb2R1Y3RPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnBhY2thZ2VUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVByb2R1Y3QoaW5kZXhUb1RvZ2dsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2luZ3VsYXJEcm9wZG93bikge1xuICAgICAgY29uc3Qgb3BlbmVkSW5kZXggPSB0aGlzLnByb2R1Y3RUb2dnbGVzLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VPcGVuZWRJbmRleCA9IHRoaXMucGFja2FnZVRvZ2dsZXMuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwYWNrYWdlT3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnBhY2thZ2VUb2dnbGVzW3BhY2thZ2VPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnByb2R1Y3RUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdFByb2R1Y3RFZGl0aW9uTmFtZShwcm9kdWN0OiBTYWxlc1Byb2R1Y3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9kdWN0LmVkaXRpb25OYW1lID8gYCR7cHJvZHVjdC5uYW1lfSAke3Byb2R1Y3QuZWRpdGlvbk5hbWV9YCA6IHByb2R1Y3QubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFuZEFsb25lUHJvZHVjdERlc2NyaXB0aW9uKHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCk6IHN0cmluZyB7XG4gICAgaWYgKHByb2R1Y3QuYWRkb25zICYmIHByb2R1Y3QuYWRkb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGBDb250YWlucyAke3Byb2R1Y3QuYWRkb25zLmxlbmd0aH1gO1xuICAgICAgZGVzY3JpcHRpb24gPSBwcm9kdWN0LmFkZG9ucy5sZW5ndGggPT09IDEgPyBgJHtkZXNjcmlwdGlvbn0gQWRkb25gIDogYCR7ZGVzY3JpcHRpb259IEFkZG9uc2A7XG4gICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBwYWNrYWdlRGVzY3JpcHRpb24ocGtnOiBTYWxlc1BhY2thZ2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc1Byb2R1Y3RzID0gcGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5sZW5ndGggPiAwO1xuICAgIGlmICghaGFzUHJvZHVjdHMgJiYgcGtnLnRvdGFsQWRkb25zID09PSAwKSB7XG4gICAgICByZXR1cm4gJ05vIEl0ZW1zIGluIFBhY2thZ2UnO1xuICAgIH1cblxuICAgIGxldCBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGNvbnN0IGhhc09uZVByb2R1Y3QgPSBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCA9PT0gMTtcbiAgICBpZiAoaGFzUHJvZHVjdHMgfHwgcGtnLnRvdGFsQWRkb25zID4gMCkge1xuICAgICAgZGVzY3JpcHRpb24gPSAnQ29udGFpbnMgJztcbiAgICB9XG4gICAgaWYgKGhhc1Byb2R1Y3RzKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGAke2Rlc2NyaXB0aW9ufSAke3BrZy5wcm9kdWN0cy5sZW5ndGh9YDtcbiAgICAgIGRlc2NyaXB0aW9uID0gaGFzT25lUHJvZHVjdCA/IGAke2Rlc2NyaXB0aW9ufSBQcm9kdWN0YCA6IGAke2Rlc2NyaXB0aW9ufSBQcm9kdWN0c2A7XG4gICAgfVxuICAgIGlmIChoYXNQcm9kdWN0cyAmJiBwa2cudG90YWxBZGRvbnMgPiAwKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGAke2Rlc2NyaXB0aW9ufSAmICR7cGtnLnRvdGFsQWRkb25zfWA7XG4gICAgICBkZXNjcmlwdGlvbiA9IHBrZy50b3RhbEFkZG9ucyA9PT0gMSA/IGAke2Rlc2NyaXB0aW9ufSBBZGRvbmAgOiBgJHtkZXNjcmlwdGlvbn0gQWRkb25zYDtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICB9XG59XG4iXX0=