UNPKG

ontimize-web-ngx

Version:
143 lines 20.7 kB
import { Injectable, Injector } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { Subject } from 'rxjs'; import { AppConfig } from '../config/app-config'; import { Codes } from '../util/codes'; import { Util } from '../util/util'; import { PermissionsService } from './permissions/permissions.service'; import * as i0 from "@angular/core"; export class AppMenuService { constructor(injector) { this.injector = injector; this.onClick = new Subject; this.onPermissionMenuChanged = new Subject(); this._config = this.injector.get(AppConfig); this.router = this.injector.get(Router); this.router.events.subscribe((event) => { if (event instanceof NavigationEnd) { this.setActiveItem(); } }); this.setMenuItemsByMenuConfiguration(); this.permissionsService = this.injector.get(PermissionsService); this.permissionsService.onChangePermissions.subscribe(x => { this.mergeMenuItemsWithPermissions(); this.onPermissionMenuChanged.next({ menuRoots: this.MENU_ROOTS, allMenuItems: this.ALL_MENU_ITEMS }); }); } setMenuItemsByMenuConfiguration() { const defaultMenuConfiguration = Util.cloneArray(this._config.getMenuConfiguration()); this.MENU_ROOTS = defaultMenuConfiguration; this.ALL_MENU_ITEMS = []; for (let i = 0, len = this.MENU_ROOTS.length; i < len; i++) { const item = this.MENU_ROOTS[i]; this.ALL_MENU_ITEMS = this.ALL_MENU_ITEMS.concat(this.getMenuItems(item)); } } mergeMenuItemsWithPermissions() { this.setMenuItemsByMenuConfiguration(); const permissionsMenu = this.permissionsService.getAllMenuPermissions(); if (Util.isDefined(permissionsMenu)) { this.MENU_ROOTS = [...this.MENU_ROOTS.map(menu => { const indexPermission = permissionsMenu.findIndex(permission => permission.attr === menu.id); if (indexPermission > -1) { menu.visible = permissionsMenu[indexPermission].visible; } return menu; })]; this.ALL_MENU_ITEMS = [...this.ALL_MENU_ITEMS.map(menu => { const indexPermission = permissionsMenu.findIndex(permission => permission.attr === menu.id); if (indexPermission > -1) { menu.visible = permissionsMenu[indexPermission].visible; } return menu; })]; } } getMenuRoots() { return this.MENU_ROOTS; } getMenuRootById(id) { return this.MENU_ROOTS.find(c => c.id === id); } getAllMenuItems() { return this.ALL_MENU_ITEMS; } getMenuItemById(id) { return this.ALL_MENU_ITEMS.find(i => i.id === id); } getMenuItemType(item) { let type; switch (true) { case (item.route === Codes.LOGIN_ROUTE): type = 'logout'; break; case (item.action !== undefined): type = 'action'; break; case (item.locale !== undefined): type = 'locale'; break; case (item.user !== undefined): type = 'user-info'; break; case (item.items !== undefined): type = 'group'; break; default: type = 'default'; break; } return type; } isMenuGroup(item) { return this.getMenuItemType(item) === 'group'; } isMenuGroupRoute(item) { return this.getMenuItemType(item) === 'group' && item.hasOwnProperty('route'); } isItemActive(item) { return this.activeItem && this.activeItem.route === item.route; } isRouteItem(item) { return Util.isDefined(item.route); } isVisible(item) { return !Util.isDefined(item.visible) || (Util.isDefined(item.visible) && item.visible); } getMenuItems(item) { const menuGroup = item; const items = menuGroup.items; if (items !== undefined) { if (this.isMenuGroupRoute(menuGroup)) { return [item].concat(items); } return items; } return [item]; } setActiveItem() { let activeItem; const routeItems = this.ALL_MENU_ITEMS.filter(item => this.isRouteItem(item)); const pathMatchFullItems = routeItems.filter(item => item.pathMatch === 'full'); if (pathMatchFullItems.length > 0) { activeItem = pathMatchFullItems.find(item => item.route === this.router.url); } if (!activeItem) { activeItem = routeItems.find(item => this.router.url.startsWith(item.route)); } this.activeItem = activeItem; } } AppMenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppMenuService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); AppMenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppMenuService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppMenuService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9zZXJ2aWNlcy9hcHAtbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQWV2RSxNQUFNLE9BQU8sY0FBYztJQVl6QixZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBSGpDLFlBQU8sR0FBNEIsSUFBSSxPQUF1QixDQUFDO1FBQy9ELDRCQUF1QixHQUF3QyxJQUFJLE9BQU8sRUFBOEIsQ0FBQztRQUc5RyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckMsSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDdEI7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V0FBVyxDQUFDLElBQUksQ0FBQyxDQUFvQixDQUFDO1FBQ2xILE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDaEYsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDOzs0R0E1SlUsY0FBYztnSEFBZCxjQUFjLGNBRmIsTUFBTTs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tICcuLi9jb25maWcvYXBwLWNvbmZpZyc7XG5pbXBvcnQge1xuICBNZW51Q29tbW9uSXRlbSxcbiAgTWVudUdyb3VwLFxuICBNZW51SXRlbSxcbiAgTWVudUl0ZW1BY3Rpb24sXG4gIE1lbnVJdGVtTG9jYWxlLFxuICBNZW51SXRlbUxvZ291dCxcbiAgTWVudUl0ZW1Sb3V0ZSxcbiAgTWVudUl0ZW1Vc2VySW5mb1xufSBmcm9tICcuLi9pbnRlcmZhY2VzL2FwcC1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgeyBNZW51Um9vdEl0ZW0gfSBmcm9tICcuLi90eXBlcy9tZW51LXJvb3QtaXRlbS50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IFBlcm1pc3Npb25zU2VydmljZSB9IGZyb20gJy4vcGVybWlzc2lvbnMvcGVybWlzc2lvbnMuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUNsaWNrRXZlbnQge1xuICBpZE1lbnU6IHN0cmluZztcbiAgb3BlbmVkPzogYm9vbGVhbjsgLy8gT25seSBmb3IgbWVudSBncm91cHMsIGluZGljYXRlcyBpZiB0aGUgZ3JvdXAgaXMgb3BlbmVkIG9yIGNsb3NlZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZW51Q2hhbmdlZEV2ZW50IHtcbiAgbWVudVJvb3RzOiBNZW51Um9vdEl0ZW1bXTtcbiAgYWxsTWVudUl0ZW1zOiBNZW51Um9vdEl0ZW1bXTtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBwTWVudVNlcnZpY2Uge1xuXG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcbiAgcHJvdGVjdGVkIF9jb25maWc6IEFwcENvbmZpZztcbiAgcHJvdGVjdGVkIE1FTlVfUk9PVFM6IE1lbnVSb290SXRlbVtdO1xuICBwcm90ZWN0ZWQgQUxMX01FTlVfSVRFTVM6IE1lbnVSb290SXRlbVtdO1xuICBwcm90ZWN0ZWQgYWN0aXZlSXRlbTogTWVudUl0ZW1Sb3V0ZTtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zU2VydmljZTogUGVybWlzc2lvbnNTZXJ2aWNlO1xuXG4gIHB1YmxpYyBvbkNsaWNrOiBTdWJqZWN0PE1lbnVDbGlja0V2ZW50PiA9IG5ldyBTdWJqZWN0PE1lbnVDbGlja0V2ZW50PjtcbiAgcHVibGljIG9uUGVybWlzc2lvbk1lbnVDaGFuZ2VkOiBTdWJqZWN0PFBlcm1pc3Npb25NZW51Q2hhbmdlZEV2ZW50PiA9IG5ldyBTdWJqZWN0PFBlcm1pc3Npb25NZW51Q2hhbmdlZEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLmluamVjdG9yLmdldChBcHBDb25maWcpO1xuICAgIHRoaXMucm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0TWVudUl0ZW1zQnlNZW51Q29uZmlndXJhdGlvbigpO1xuXG4gICAgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChQZXJtaXNzaW9uc1NlcnZpY2UpO1xuICAgIHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLm9uQ2hhbmdlUGVybWlzc2lvbnMuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgdGhpcy5tZXJnZU1lbnVJdGVtc1dpdGhQZXJtaXNzaW9ucygpO1xuICAgICAgdGhpcy5vblBlcm1pc3Npb25NZW51Q2hhbmdlZC5uZXh0KHtcbiAgICAgICAgbWVudVJvb3RzOiB0aGlzLk1FTlVfUk9PVFMsXG4gICAgICAgIGFsbE1lbnVJdGVtczogdGhpcy5BTExfTUVOVV9JVEVNU1xuICAgICAgfSlcbiAgICB9KTtcblxuICB9XG5cbiAgc2V0TWVudUl0ZW1zQnlNZW51Q29uZmlndXJhdGlvbigpIHtcbiAgICAvKlxuICAgICAgc3ByZWFkIG9wZXJhdG9yICguLi4pIGluIGFycmF5IG11bHRpLWxldmVsIG5vdCB3b3Jrc1xuICAgICAgSlNPTi5wYXJzZSBhbmQgSlNPTi5zdHJpbmdpZnkgYXJlIHRoZSBzcGVjaWZpYyBtZXRob2RzIHVzZWQgZm9yIG11bHRpLWxldmVsIGRlZXAgY29weWluZ1xuICAgICovXG4gICAgY29uc3QgZGVmYXVsdE1lbnVDb25maWd1cmF0aW9uID0gVXRpbC5jbG9uZUFycmF5KHRoaXMuX2NvbmZpZy5nZXRNZW51Q29uZmlndXJhdGlvbigpKTtcbiAgICB0aGlzLk1FTlVfUk9PVFMgPSBkZWZhdWx0TWVudUNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5BTExfTUVOVV9JVEVNUyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLk1FTlVfUk9PVFMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW06IE1lbnVSb290SXRlbSA9IHRoaXMuTUVOVV9ST09UU1tpXTtcbiAgICAgIHRoaXMuQUxMX01FTlVfSVRFTVMgPSB0aGlzLkFMTF9NRU5VX0lURU1TLmNvbmNhdCh0aGlzLmdldE1lbnVJdGVtcyhpdGVtKSk7XG4gICAgfVxuICB9XG5cbiAgbWVyZ2VNZW51SXRlbXNXaXRoUGVybWlzc2lvbnMoKSB7XG5cbiAgICB0aGlzLnNldE1lbnVJdGVtc0J5TWVudUNvbmZpZ3VyYXRpb24oKTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc01lbnUgPSB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5nZXRBbGxNZW51UGVybWlzc2lvbnMoKTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwZXJtaXNzaW9uc01lbnUpKSB7XG4gICAgICB0aGlzLk1FTlVfUk9PVFMgPSBbLi4udGhpcy5NRU5VX1JPT1RTLm1hcChtZW51ID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhQZXJtaXNzaW9uID0gcGVybWlzc2lvbnNNZW51LmZpbmRJbmRleChwZXJtaXNzaW9uID0+IHBlcm1pc3Npb24uYXR0ciA9PT0gbWVudS5pZCk7XG4gICAgICAgIGlmIChpbmRleFBlcm1pc3Npb24gPiAtMSkge1xuICAgICAgICAgIG1lbnUudmlzaWJsZSA9IHBlcm1pc3Npb25zTWVudVtpbmRleFBlcm1pc3Npb25dLnZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbnU7XG4gICAgICB9KV07XG5cbiAgICAgIHRoaXMuQUxMX01FTlVfSVRFTVMgPSBbLi4udGhpcy5BTExfTUVOVV9JVEVNUy5tYXAobWVudSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4UGVybWlzc2lvbiA9IHBlcm1pc3Npb25zTWVudS5maW5kSW5kZXgocGVybWlzc2lvbiA9PiBwZXJtaXNzaW9uLmF0dHIgPT09IG1lbnUuaWQpO1xuICAgICAgICBpZiAoaW5kZXhQZXJtaXNzaW9uID4gLTEpIHtcbiAgICAgICAgICBtZW51LnZpc2libGUgPSBwZXJtaXNzaW9uc01lbnVbaW5kZXhQZXJtaXNzaW9uXS52aXNpYmxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW51O1xuICAgICAgfSldO1xuICAgIH1cbiAgfVxuXG4gIGdldE1lbnVSb290cygpOiBNZW51Um9vdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuTUVOVV9ST09UUztcbiAgfVxuXG4gIGdldE1lbnVSb290QnlJZChpZDogc3RyaW5nKTogTWVudVJvb3RJdGVtIHtcbiAgICByZXR1cm4gdGhpcy5NRU5VX1JPT1RTLmZpbmQoYyA9PiBjLmlkID09PSBpZCk7XG4gIH1cblxuICBnZXRBbGxNZW51SXRlbXMoKTogTWVudVJvb3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLkFMTF9NRU5VX0lURU1TO1xuICB9XG5cbiAgZ2V0TWVudUl0ZW1CeUlkKGlkOiBzdHJpbmcpOiBNZW51SXRlbSB8IE1lbnVHcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuQUxMX01FTlVfSVRFTVMuZmluZChpID0+IGkuaWQgPT09IGlkKTtcbiAgfVxuXG4gIGdldE1lbnVJdGVtVHlwZShpdGVtOiBNZW51Um9vdEl0ZW0pOiBzdHJpbmcge1xuICAgIGxldCB0eXBlOiBzdHJpbmc7XG4gICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICBjYXNlICgoaXRlbSBhcyBNZW51SXRlbUxvZ291dCkucm91dGUgPT09IENvZGVzLkxPR0lOX1JPVVRFKTpcbiAgICAgICAgdHlwZSA9ICdsb2dvdXQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKChpdGVtIGFzIE1lbnVJdGVtQWN0aW9uKS5hY3Rpb24gIT09IHVuZGVmaW5lZCk6XG4gICAgICAgIHR5cGUgPSAnYWN0aW9uJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICgoaXRlbSBhcyBNZW51SXRlbUxvY2FsZSkubG9jYWxlICE9PSB1bmRlZmluZWQpOlxuICAgICAgICB0eXBlID0gJ2xvY2FsZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoKGl0ZW0gYXMgTWVudUl0ZW1Vc2VySW5mbykudXNlciAhPT0gdW5kZWZpbmVkKTpcbiAgICAgICAgdHlwZSA9ICd1c2VyLWluZm8nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKChpdGVtIGFzIE1lbnVHcm91cCkuaXRlbXMgIT09IHVuZGVmaW5lZCk6XG4gICAgICAgIHR5cGUgPSAnZ3JvdXAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGlzTWVudUdyb3VwKGl0ZW06IE1lbnVSb290SXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldE1lbnVJdGVtVHlwZShpdGVtKSA9PT0gJ2dyb3VwJztcbiAgfVxuXG4gIGlzTWVudUdyb3VwUm91dGUoaXRlbTogTWVudVJvb3RJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWVudUl0ZW1UeXBlKGl0ZW0pID09PSAnZ3JvdXAnICYmIGl0ZW0uaGFzT3duUHJvcGVydHkoJ3JvdXRlJyk7XG4gIH1cblxuICBpc0l0ZW1BY3RpdmUoaXRlbTogTWVudUl0ZW1Sb3V0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUl0ZW0gJiYgdGhpcy5hY3RpdmVJdGVtLnJvdXRlID09PSBpdGVtLnJvdXRlO1xuICB9XG5cbiAgaXNSb3V0ZUl0ZW0oaXRlbTogTWVudUl0ZW1Sb3V0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChpdGVtLnJvdXRlKTtcbiAgfVxuXG4gIGlzVmlzaWJsZShpdGVtOiBNZW51Q29tbW9uSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhVXRpbC5pc0RlZmluZWQoaXRlbS52aXNpYmxlKSB8fCAoVXRpbC5pc0RlZmluZWQoaXRlbS52aXNpYmxlKSAmJiBpdGVtLnZpc2libGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZW51SXRlbXMoaXRlbTogTWVudVJvb3RJdGVtKTogTWVudVJvb3RJdGVtW10ge1xuICAgIGNvbnN0IG1lbnVHcm91cCA9IGl0ZW0gYXMgTWVudUdyb3VwO1xuICAgIGNvbnN0IGl0ZW1zID0gbWVudUdyb3VwLml0ZW1zO1xuICAgIGlmIChpdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5pc01lbnVHcm91cFJvdXRlKG1lbnVHcm91cCkpIHtcbiAgICAgICAgcmV0dXJuIFtpdGVtXS5jb25jYXQoaXRlbXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIHJldHVybiBbaXRlbV07XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZUl0ZW0oKTogdm9pZCB7XG4gICAgbGV0IGFjdGl2ZUl0ZW06IE1lbnVJdGVtUm91dGU7XG4gICAgY29uc3Qgcm91dGVJdGVtczogTWVudUl0ZW1Sb3V0ZVtdID0gdGhpcy5BTExfTUVOVV9JVEVNUy5maWx0ZXIoaXRlbSA9PiB0aGlzLmlzUm91dGVJdGVtKGl0ZW0pKSBhcyBNZW51SXRlbVJvdXRlW107XG4gICAgY29uc3QgcGF0aE1hdGNoRnVsbEl0ZW1zID0gcm91dGVJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnBhdGhNYXRjaCA9PT0gJ2Z1bGwnKTtcbiAgICBpZiAocGF0aE1hdGNoRnVsbEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjdGl2ZUl0ZW0gPSBwYXRoTWF0Y2hGdWxsSXRlbXMuZmluZChpdGVtID0+IGl0ZW0ucm91dGUgPT09IHRoaXMucm91dGVyLnVybCk7XG4gICAgfVxuICAgIGlmICghYWN0aXZlSXRlbSkge1xuICAgICAgYWN0aXZlSXRlbSA9IHJvdXRlSXRlbXMuZmluZChpdGVtID0+IHRoaXMucm91dGVyLnVybC5zdGFydHNXaXRoKGl0ZW0ucm91dGUpKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVJdGVtID0gYWN0aXZlSXRlbTtcbiAgfVxuXG59XG4iXX0=