ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
143 lines • 20.7 kB
JavaScript
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=