UNPKG

@indice/ng-components

Version:

Indice common components for Angular v12

174 lines 28.7 kB
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=