@indice/ng-components
Version:
Indice common components for Angular v12
174 lines • 28.7 kB
JavaScript
import { Inject, Injectable, Optional } from '@angular/core';
import { NavigationEnd } from '@angular/router';
import { Subject } from 'rxjs';
import { distinctUntilChanged, filter } from 'rxjs/operators';
import { BreadcrumbItem } from '../controls/breadcrumb/breadcrumb-item';
import { SHELL_CONFIG } from '../tokens';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "./utilities.service";
export class BreadcrumbService {
constructor(_router, _utilities, _shellConfig) {
this._router = _router;
this._utilities = _utilities;
this._shellConfig = _shellConfig;
this._breadcrumb$ = new Subject();
this.breadcrumb = this._breadcrumb$.asObservable();
if (_shellConfig?.breadcrumb) {
this._defaultHome = this._getDefaultHomeItem();
this._router
.events
.pipe(filter(event => event instanceof NavigationEnd), distinctUntilChanged())
.subscribe(_ => {
const breadcrumb = [...this._buildBreadcrumb()];
this._breadcrumb$.next(breadcrumb);
});
}
}
_getDefaultHomeItem() {
const routerConfig = this._router.config;
const declaredHomeRoutes = routerConfig.filter((route) => route.data?.breadcrumb?.isHome === true);
if (declaredHomeRoutes.length > 1) {
throw new Error('You can declare only one route as home.');
}
let homeRoute;
if (declaredHomeRoutes.length === 1) {
homeRoute = declaredHomeRoutes[0];
}
else {
homeRoute = routerConfig.find((route) => route.path === '');
if (!homeRoute) {
return undefined;
}
const redirectionUrl = homeRoute.redirectTo;
if (!homeRoute?.data?.breadcrumb?.title && redirectionUrl) {
homeRoute = routerConfig.find((route) => route.path === redirectionUrl);
if (!homeRoute) {
return undefined;
}
}
}
return new BreadcrumbItem(this._getRouteTitle(homeRoute), homeRoute.path || '');
}
_getRouteTitle(route) {
return route?.data?.breadcrumb?.title || route.component?.name.replace('Component', '');
}
_buildBreadcrumb() {
const breadcrumb = [];
if (this._defaultHome) {
breadcrumb.push(this._defaultHome);
}
const url = this._router.url;
const path = this._utilities.getPathFromUrl(url) || '';
const activeRoute = this._findRouteFromUrl(path);
const parentRoutes = this._findParentRoutes(activeRoute);
breadcrumb.push(...parentRoutes);
if (activeRoute && activeRoute?.path !== this._defaultHome?.url) {
const routeData = this._getBreadcrumbRouteData(activeRoute);
breadcrumb.push(new BreadcrumbItem(this._getRouteTitle(activeRoute), (routeData._fullPath || activeRoute.path || '')));
}
return breadcrumb.map((route) => {
const routeSegments = route.url?.split('/') || [];
routeSegments.forEach((segment, index) => {
if (segment.startsWith(':')) {
route.url = route.url?.replace(segment, url.split('/')[index + 1]);
}
});
return route;
});
}
_findRouteFromUrl(url) {
const urlSegments = url.split('/').filter((segment) => segment !== '');
const routerConfig = this._router.config;
const flattenedRouterConfig = this._flattenRoutes(routerConfig);
const filteredRouterConfig = flattenedRouterConfig.filter((route) => {
const routeData = this._getBreadcrumbRouteData(route);
return (routeData._fullPath || route.path)?.split('/').length === urlSegments.length;
});
const route = filteredRouterConfig.find((route) => {
const routeData = this._getBreadcrumbRouteData(route);
const routeSegments = (routeData._fullPath || route.path)?.split('/') || [];
let segmentsMatched = false;
for (let i = 0; i < routeSegments.length; i++) {
const currentSegment = routeSegments[i];
const isDynamicSegment = currentSegment.startsWith(':');
if (!isDynamicSegment) {
segmentsMatched = currentSegment === urlSegments[i];
}
}
return segmentsMatched ? route : undefined;
});
return route;
}
_findParentRoutes(activeRoute, items = []) {
if (!activeRoute) {
return [];
}
const routeData = this._getBreadcrumbRouteData(activeRoute);
let urlSegments = (routeData._fullPath || activeRoute.path)?.split('/').filter((segment) => segment !== '') || [];
if (urlSegments?.length <= 1) {
return [...items];
}
const previousUrl = urlSegments.slice(0, -1).join('/');
const route = this._findRouteFromUrl(previousUrl);
if (route) {
const routeData = this._getBreadcrumbRouteData(route);
if (routeData._level > 0 || (!route.children || route.children.length === 0)) {
items.push(new BreadcrumbItem(this._getRouteTitle(route), routeData._fullPath || route.path));
this._findParentRoutes(route, [...items]);
}
}
return [...items];
}
_flattenRoutes(routes, level) {
let children = [];
level = level || 0;
return routes.map((route) => {
const routeData = this._getBreadcrumbRouteData(route);
routeData._level = level;
if (route.children && route.children.length) {
route.children.forEach((child) => {
const childRouteData = this._getBreadcrumbRouteData(child);
const routePath = routeData._fullPath || route.path || '';
const childPath = child.path?.endsWith('/') ? child.path.slice(0, -1) : child.path;
childRouteData._fullPath = childPath?.indexOf(routePath) === -1 ? `${routePath}/${childPath}` : childPath;
});
children = [...children, ...route.children];
}
return route;
}).concat(children.length ? this._flattenRoutes(children, level + 1) : children);
}
_getBreadcrumbRouteData(route) {
if (!route) {
throw new Error('No route was found');
}
if (!route.data?.breadcrumb) {
if (!route.data) {
route.data = {};
}
route.data.breadcrumb = new BreadcrumbRouteData(0, false, undefined);
}
return route.data.breadcrumb;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: BreadcrumbService, deps: [{ token: i1.Router }, { token: i2.UtilitiesService }, { token: SHELL_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: BreadcrumbService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: BreadcrumbService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.UtilitiesService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [SHELL_CONFIG]
}] }] });
export class BreadcrumbRouteData {
constructor(_level, isHome, _fullPath) {
this._level = _level;
this.isHome = isHome;
this._fullPath = _fullPath;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2JyZWFkY3J1bWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFRLGFBQWEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUVyRSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQzs7OztBQU16QyxNQUFNLE9BQU8saUJBQWlCO0lBSTFCLFlBQ1ksT0FBZSxFQUNmLFVBQTRCLEVBQ0ssWUFBa0I7UUFGbkQsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQ0ssaUJBQVksR0FBWixZQUFZLENBQU07UUFMdkQsaUJBQVksR0FBOEIsSUFBSSxPQUFPLEVBQW9CLENBQUM7UUFzQjNFLGVBQVUsR0FBaUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQWYvRSxJQUFJLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxPQUFPO2lCQUNQLE1BQU07aUJBQ04sSUFBSSxDQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDL0Msb0JBQW9CLEVBQUUsQ0FD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QyxZQUFZOztBQXVKeEMsTUFBTSxPQUFPLG1CQUFtQjtJQUM1QixZQUFtQixNQUFjLEVBQVMsTUFBZSxFQUFTLFNBQThCO1FBQTdFLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBcUI7SUFBSSxDQUFDO0NBQ3hHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhLCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQnJlYWRjcnVtYkl0ZW0gfSBmcm9tICcuLi9jb250cm9scy9icmVhZGNydW1iL2JyZWFkY3J1bWItaXRlbSc7XHJcbmltcG9ydCB7IFNIRUxMX0NPTkZJRyB9IGZyb20gJy4uL3Rva2Vucyc7XHJcbmltcG9ydCB7IFV0aWxpdGllc1NlcnZpY2UgfSBmcm9tICcuL3V0aWxpdGllcy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYlNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEhvbWU6IEJyZWFkY3J1bWJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBfYnJlYWRjcnVtYiQ6IFN1YmplY3Q8QnJlYWRjcnVtYkl0ZW1bXT4gPSBuZXcgU3ViamVjdDxCcmVhZGNydW1iSXRlbVtdPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgX3V0aWxpdGllczogVXRpbGl0aWVzU2VydmljZSxcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNIRUxMX0NPTkZJRykgcHVibGljIF9zaGVsbENvbmZpZz86IGFueVxyXG4gICAgKSB7XHJcbiAgICAgICAgaWYgKF9zaGVsbENvbmZpZz8uYnJlYWRjcnVtYikge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0SG9tZSA9IHRoaXMuX2dldERlZmF1bHRIb21lSXRlbSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXJcclxuICAgICAgICAgICAgICAgIC5ldmVudHNcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJlYWRjcnVtYiA9IFsuLi50aGlzLl9idWlsZEJyZWFkY3J1bWIoKV07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnJlYWRjcnVtYiQubmV4dChicmVhZGNydW1iKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYnJlYWRjcnVtYjogT2JzZXJ2YWJsZTxCcmVhZGNydW1iSXRlbVtdPiA9IHRoaXMuX2JyZWFkY3J1bWIkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByaXZhdGUgX2dldERlZmF1bHRIb21lSXRlbSgpOiBCcmVhZGNydW1iSXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3Qgcm91dGVyQ29uZmlnID0gdGhpcy5fcm91dGVyLmNvbmZpZztcclxuICAgICAgICBjb25zdCBkZWNsYXJlZEhvbWVSb3V0ZXMgPSByb3V0ZXJDb25maWcuZmlsdGVyKChyb3V0ZTogUm91dGUpID0+IHJvdXRlLmRhdGE/LmJyZWFkY3J1bWI/LmlzSG9tZSA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgaWYgKGRlY2xhcmVkSG9tZVJvdXRlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBkZWNsYXJlIG9ubHkgb25lIHJvdXRlIGFzIGhvbWUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBob21lUm91dGU6IFJvdXRlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChkZWNsYXJlZEhvbWVSb3V0ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGhvbWVSb3V0ZSA9IGRlY2xhcmVkSG9tZVJvdXRlc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBob21lUm91dGUgPSByb3V0ZXJDb25maWcuZmluZCgocm91dGU6IFJvdXRlKSA9PiByb3V0ZS5wYXRoID09PSAnJyk7XHJcbiAgICAgICAgICAgIGlmICghaG9tZVJvdXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0aW9uVXJsID0gaG9tZVJvdXRlLnJlZGlyZWN0VG87XHJcbiAgICAgICAgICAgIGlmICghaG9tZVJvdXRlPy5kYXRhPy5icmVhZGNydW1iPy50aXRsZSAmJiByZWRpcmVjdGlvblVybCkge1xyXG4gICAgICAgICAgICAgICAgaG9tZVJvdXRlID0gcm91dGVyQ29uZmlnLmZpbmQoKHJvdXRlOiBSb3V0ZSkgPT4gcm91dGUucGF0aCA9PT0gcmVkaXJlY3Rpb25VcmwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFob21lUm91dGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgQnJlYWRjcnVtYkl0ZW0odGhpcy5fZ2V0Um91dGVUaXRsZShob21lUm91dGUpLCBob21lUm91dGUucGF0aCB8fCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0Um91dGVUaXRsZShyb3V0ZTogUm91dGUpIHtcclxuICAgICAgICByZXR1cm4gcm91dGU/LmRhdGE/LmJyZWFkY3J1bWI/LnRpdGxlIHx8IHJvdXRlLmNvbXBvbmVudD8ubmFtZS5yZXBsYWNlKCdDb21wb25lbnQnLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYnVpbGRCcmVhZGNydW1iKCk6IEJyZWFkY3J1bWJJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IGJyZWFkY3J1bWI6IEJyZWFkY3J1bWJJdGVtW10gPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5fZGVmYXVsdEhvbWUpIHtcclxuICAgICAgICAgICAgYnJlYWRjcnVtYi5wdXNoKHRoaXMuX2RlZmF1bHRIb21lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fcm91dGVyLnVybDtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5fdXRpbGl0aWVzLmdldFBhdGhGcm9tVXJsKHVybCkgfHwgJyc7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlUm91dGUgPSB0aGlzLl9maW5kUm91dGVGcm9tVXJsKHBhdGgpO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFJvdXRlcyA9IHRoaXMuX2ZpbmRQYXJlbnRSb3V0ZXMoYWN0aXZlUm91dGUpO1xyXG4gICAgICAgIGJyZWFkY3J1bWIucHVzaCguLi5wYXJlbnRSb3V0ZXMpO1xyXG4gICAgICAgIGlmIChhY3RpdmVSb3V0ZSAmJiBhY3RpdmVSb3V0ZT8ucGF0aCAhPT0gdGhpcy5fZGVmYXVsdEhvbWU/LnVybCkge1xyXG4gICAgICAgICAgICBjb25zdCByb3V0ZURhdGEgPSB0aGlzLl9nZXRCcmVhZGNydW1iUm91dGVEYXRhKGFjdGl2ZVJvdXRlKTtcclxuICAgICAgICAgICAgYnJlYWRjcnVtYi5wdXNoKG5ldyBCcmVhZGNydW1iSXRlbSh0aGlzLl9nZXRSb3V0ZVRpdGxlKGFjdGl2ZVJvdXRlKSwgKHJvdXRlRGF0YS5fZnVsbFBhdGggfHwgYWN0aXZlUm91dGUucGF0aCB8fCAnJykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJyZWFkY3J1bWIubWFwKChyb3V0ZTogQnJlYWRjcnVtYkl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlLnVybD8uc3BsaXQoJy8nKSB8fCBbXTtcclxuICAgICAgICAgICAgcm91dGVTZWdtZW50cy5mb3JFYWNoKChzZWdtZW50OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlLnVybCA9IHJvdXRlLnVybD8ucmVwbGFjZShzZWdtZW50LCB1cmwuc3BsaXQoJy8nKVtpbmRleCArIDFdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByb3V0ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9maW5kUm91dGVGcm9tVXJsKHVybDogc3RyaW5nKTogUm91dGUgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHVybFNlZ21lbnRzID0gdXJsLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgIT09ICcnKTtcclxuICAgICAgICBjb25zdCByb3V0ZXJDb25maWcgPSB0aGlzLl9yb3V0ZXIuY29uZmlnO1xyXG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZFJvdXRlckNvbmZpZyA9IHRoaXMuX2ZsYXR0ZW5Sb3V0ZXMocm91dGVyQ29uZmlnKTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJlZFJvdXRlckNvbmZpZyA9IGZsYXR0ZW5lZFJvdXRlckNvbmZpZy5maWx0ZXIoKHJvdXRlOiBSb3V0ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByb3V0ZURhdGEgPSB0aGlzLl9nZXRCcmVhZGNydW1iUm91dGVEYXRhKHJvdXRlKTtcclxuICAgICAgICAgICAgcmV0dXJuIChyb3V0ZURhdGEuX2Z1bGxQYXRoIHx8IHJvdXRlLnBhdGgpPy5zcGxpdCgnLycpLmxlbmd0aCA9PT0gdXJsU2VnbWVudHMubGVuZ3RoO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHJvdXRlID0gZmlsdGVyZWRSb3V0ZXJDb25maWcuZmluZCgocm91dGU6IFJvdXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlRGF0YSA9IHRoaXMuX2dldEJyZWFkY3J1bWJSb3V0ZURhdGEocm91dGUpO1xyXG4gICAgICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gKHJvdXRlRGF0YS5fZnVsbFBhdGggfHwgcm91dGUucGF0aCk/LnNwbGl0KCcvJykgfHwgW107XHJcbiAgICAgICAgICAgIGxldCBzZWdtZW50c01hdGNoZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0R5bmFtaWNTZWdtZW50ID0gY3VycmVudFNlZ21lbnQuc3RhcnRzV2l0aCgnOicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc0R5bmFtaWNTZWdtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHNNYXRjaGVkID0gY3VycmVudFNlZ21lbnQgPT09IHVybFNlZ21lbnRzW2ldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50c01hdGNoZWQgPyByb3V0ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcm91dGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZmluZFBhcmVudFJvdXRlcyhhY3RpdmVSb3V0ZTogUm91dGUgfCB1bmRlZmluZWQsIGl0ZW1zOiBCcmVhZGNydW1iSXRlbVtdID0gW10pOiBCcmVhZGNydW1iSXRlbVtdIHtcclxuICAgICAgICBpZiAoIWFjdGl2ZVJvdXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgcm91dGVEYXRhID0gdGhpcy5fZ2V0QnJlYWRjcnVtYlJvdXRlRGF0YShhY3RpdmVSb3V0ZSk7XHJcbiAgICAgICAgbGV0IHVybFNlZ21lbnRzID0gKHJvdXRlRGF0YS5fZnVsbFBhdGggfHwgYWN0aXZlUm91dGUucGF0aCk/LnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgIT09ICcnKSB8fCBbXTtcclxuICAgICAgICBpZiAodXJsU2VnbWVudHM/Lmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwcmV2aW91c1VybCA9IHVybFNlZ21lbnRzLnNsaWNlKDAsIC0xKS5qb2luKCcvJyk7XHJcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLl9maW5kUm91dGVGcm9tVXJsKHByZXZpb3VzVXJsKTtcclxuICAgICAgICBpZiAocm91dGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgcm91dGVEYXRhID0gdGhpcy5fZ2V0QnJlYWRjcnVtYlJvdXRlRGF0YShyb3V0ZSk7XHJcbiAgICAgICAgICAgIGlmIChyb3V0ZURhdGEuX2xldmVsID4gMCB8fCAoIXJvdXRlLmNoaWxkcmVuIHx8IHJvdXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IEJyZWFkY3J1bWJJdGVtKHRoaXMuX2dldFJvdXRlVGl0bGUocm91dGUpLCByb3V0ZURhdGEuX2Z1bGxQYXRoIHx8IHJvdXRlLnBhdGgpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRQYXJlbnRSb3V0ZXMocm91dGUsIFsuLi5pdGVtc10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2ZsYXR0ZW5Sb3V0ZXMocm91dGVzOiBSb3V0ZVtdLCBsZXZlbD86IG51bWJlcik6IFJvdXRlW10ge1xyXG4gICAgICAgIGxldCBjaGlsZHJlbjogUm91dGVbXSA9IFtdO1xyXG4gICAgICAgIGxldmVsID0gbGV2ZWwgfHwgMDtcclxuICAgICAgICByZXR1cm4gcm91dGVzLm1hcCgocm91dGU6IFJvdXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlRGF0YSA9IHRoaXMuX2dldEJyZWFkY3J1bWJSb3V0ZURhdGEocm91dGUpO1xyXG4gICAgICAgICAgICByb3V0ZURhdGEuX2xldmVsID0gbGV2ZWwhO1xyXG4gICAgICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4gJiYgcm91dGUuY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogUm91dGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFJvdXRlRGF0YSA9IHRoaXMuX2dldEJyZWFkY3J1bWJSb3V0ZURhdGEoY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IHJvdXRlRGF0YS5fZnVsbFBhdGggfHwgcm91dGUucGF0aCB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBjaGlsZC5wYXRoPy5lbmRzV2l0aCgnLycpID8gY2hpbGQucGF0aC5zbGljZSgwLCAtMSkgOiBjaGlsZC5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkUm91dGVEYXRhLl9mdWxsUGF0aCA9IGNoaWxkUGF0aD8uaW5kZXhPZihyb3V0ZVBhdGgpID09PSAtMSA/IGAke3JvdXRlUGF0aH0vJHtjaGlsZFBhdGh9YCA6IGNoaWxkUGF0aDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLnJvdXRlLmNoaWxkcmVuXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcm91dGU7XHJcbiAgICAgICAgfSkuY29uY2F0KGNoaWxkcmVuLmxlbmd0aCA/IHRoaXMuX2ZsYXR0ZW5Sb3V0ZXMoY2hpbGRyZW4sIGxldmVsICsgMSkgOiBjaGlsZHJlbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0QnJlYWRjcnVtYlJvdXRlRGF0YShyb3V0ZTogUm91dGUgfCB1bmRlZmluZWQpOiBCcmVhZGNydW1iUm91dGVEYXRhIHtcclxuICAgICAgICBpZiAoIXJvdXRlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcm91dGUgd2FzIGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcm91dGUuZGF0YT8uYnJlYWRjcnVtYikge1xyXG4gICAgICAgICAgICBpZiAoIXJvdXRlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHJvdXRlLmRhdGEgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByb3V0ZS5kYXRhLmJyZWFkY3J1bWIgPSBuZXcgQnJlYWRjcnVtYlJvdXRlRGF0YSgwLCBmYWxzZSwgdW5kZWZpbmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJvdXRlLmRhdGEuYnJlYWRjcnVtYjtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJSb3V0ZURhdGEge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIF9sZXZlbDogbnVtYmVyLCBwdWJsaWMgaXNIb21lOiBib29sZWFuLCBwdWJsaWMgX2Z1bGxQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkKSB7IH1cclxufVxyXG4iXX0=