@coreui/angular
Version:
CoreUI for Angular UI components library
137 lines • 28.2 kB
JavaScript
import { Component, HostBinding, Input, Optional } from '@angular/core';
import { NavigationEnd } from '@angular/router';
import { SidebarNavHelper } from './sidebar-nav.service';
import { filter } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../sidebar/sidebar.component";
import * as i2 from "./sidebar-nav.service";
import * as i3 from "@angular/router";
import * as i4 from "../sidebar.service";
import * as i5 from "./sidebar-nav-divider.component";
import * as i6 from "./sidebar-nav-title.component";
import * as i7 from "./sidebar-nav-label.component";
import * as i8 from "./sidebar-nav-link.component";
import * as i9 from "@angular/common";
import * as i10 from "../../shared/html-attr.directive";
import * as i11 from "./sidebar-nav-item-class.pipe";
import * as i12 from "@coreui/icons-angular";
import * as i13 from "./sidebar-nav-badge.pipe";
import * as i14 from "./sidebar-nav-icon.pipe";
export class SidebarNavComponent {
constructor(sidebar, helper, router, renderer, hostElement, sidebarService) {
this.sidebar = sidebar;
this.helper = helper;
this.router = router;
this.renderer = renderer;
this.hostElement = hostElement;
this.sidebarService = sidebarService;
this.navItems = [];
this.dropdownMode = 'closeInactive';
this.role = 'nav';
this.navItemsArray = [];
}
get hostClasses() {
return {
'sidebar-nav': !this.groupItems,
compact: !this.groupItems && !!this.compact
};
}
get sidebarNavGroupItemsClass() {
return !!this.groupItems;
}
ngOnChanges(changes) {
this.navItemsArray = Array.isArray(this.navItems) ? this.navItems.slice() : [];
}
hideMobile() {
// todo: proper scrollIntoView() after NavigationEnd
if (this.sidebar && this.sidebar.sidebarState.mobile) {
this.sidebarService.toggle({ toggle: 'visible', sidebar: this.sidebar });
}
}
}
SidebarNavComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: SidebarNavComponent, deps: [{ token: i1.SidebarComponent, optional: true }, { token: i2.SidebarNavHelper }, { token: i3.Router }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i4.SidebarService }], target: i0.ɵɵFactoryTarget.Component });
SidebarNavComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: SidebarNavComponent, selector: "c-sidebar-nav", inputs: { navItems: "navItems", dropdownMode: "dropdownMode", groupItems: "groupItems", compact: "compact" }, host: { properties: { "class": "this.hostClasses", "class.nav-group-items": "this.sidebarNavGroupItemsClass", "attr.role": "this.role" } }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngFor=\"let item of navItemsArray\">\r\n <ng-container [ngSwitch]=\"helper.itemType(item)\">\r\n <c-sidebar-nav-group\r\n *ngSwitchCase=\"'group'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n routerLinkActive=\"show\"\r\n #rla=\"routerLinkActive\"\r\n [routerLinkActiveOptions]=\"{exact: true}\"\r\n >\r\n </c-sidebar-nav-group>\r\n <c-sidebar-nav-divider\r\n *ngSwitchCase=\"'divider'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n [cHtmlAttr]=\"item.attributes ?? {}\">\r\n </c-sidebar-nav-divider>\r\n <c-sidebar-nav-title\r\n *ngSwitchCase=\"'title'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n [cHtmlAttr]=\"item.attributes ?? {}\">\r\n </c-sidebar-nav-title>\r\n <c-sidebar-nav-label\r\n *ngSwitchCase=\"'label'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\">\r\n </c-sidebar-nav-label>\r\n <ng-container\r\n *ngSwitchCase=\"'empty'\">\r\n </ng-container>\r\n <c-sidebar-nav-link\r\n *ngSwitchDefault\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n (linkClick)=\"hideMobile()\"\r\n >\r\n </c-sidebar-nav-link>\r\n </ng-container>\r\n</ng-container>\r\n<ng-content></ng-content>\r\n", styles: [""], components: [{ type: i0.forwardRef(function () { return SidebarNavGroupComponent; }), selector: "c-sidebar-nav-group", inputs: ["item", "dropdownMode", "show"] }, { type: i0.forwardRef(function () { return i5.SidebarNavDividerComponent; }), selector: "c-sidebar-nav-divider", inputs: ["item"] }, { type: i0.forwardRef(function () { return i6.SidebarNavTitleComponent; }), selector: "c-sidebar-nav-title", inputs: ["item"] }, { type: i0.forwardRef(function () { return i7.SidebarNavLabelComponent; }), selector: "c-sidebar-nav-label", inputs: ["item"] }, { type: i0.forwardRef(function () { return i8.SidebarNavLinkComponent; }), selector: "c-sidebar-nav-link", inputs: ["item"], outputs: ["linkClick"] }], directives: [{ type: i0.forwardRef(function () { return i9.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i0.forwardRef(function () { return i9.NgSwitch; }), selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i0.forwardRef(function () { return i9.NgSwitchCase; }), selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i0.forwardRef(function () { return i3.RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { type: i0.forwardRef(function () { return i9.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i0.forwardRef(function () { return i10.HtmlAttributesDirective; }), selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { type: i0.forwardRef(function () { return i9.NgSwitchDefault; }), selector: "[ngSwitchDefault]" }], pipes: { "cSidebarNavItemClass": i0.forwardRef(function () { return i11.SidebarNavItemClassPipe; }) } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: SidebarNavComponent, decorators: [{
type: Component,
args: [{ selector: 'c-sidebar-nav', template: "<ng-container *ngFor=\"let item of navItemsArray\">\r\n <ng-container [ngSwitch]=\"helper.itemType(item)\">\r\n <c-sidebar-nav-group\r\n *ngSwitchCase=\"'group'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n routerLinkActive=\"show\"\r\n #rla=\"routerLinkActive\"\r\n [routerLinkActiveOptions]=\"{exact: true}\"\r\n >\r\n </c-sidebar-nav-group>\r\n <c-sidebar-nav-divider\r\n *ngSwitchCase=\"'divider'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n [cHtmlAttr]=\"item.attributes ?? {}\">\r\n </c-sidebar-nav-divider>\r\n <c-sidebar-nav-title\r\n *ngSwitchCase=\"'title'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n [cHtmlAttr]=\"item.attributes ?? {}\">\r\n </c-sidebar-nav-title>\r\n <c-sidebar-nav-label\r\n *ngSwitchCase=\"'label'\"\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\">\r\n </c-sidebar-nav-label>\r\n <ng-container\r\n *ngSwitchCase=\"'empty'\">\r\n </ng-container>\r\n <c-sidebar-nav-link\r\n *ngSwitchDefault\r\n [item]=\"item\"\r\n [ngClass]=\"item | cSidebarNavItemClass\"\r\n (linkClick)=\"hideMobile()\"\r\n >\r\n </c-sidebar-nav-link>\r\n </ng-container>\r\n</ng-container>\r\n<ng-content></ng-content>\r\n", styles: [""] }]
}], ctorParameters: function () { return [{ type: i1.SidebarComponent, decorators: [{
type: Optional
}] }, { type: i2.SidebarNavHelper }, { type: i3.Router }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i4.SidebarService }]; }, propDecorators: { navItems: [{
type: Input
}], dropdownMode: [{
type: Input
}], groupItems: [{
type: Input
}], compact: [{
type: Input
}], hostClasses: [{
type: HostBinding,
args: ['class']
}], sidebarNavGroupItemsClass: [{
type: HostBinding,
args: ['class.nav-group-items']
}], role: [{
type: HostBinding,
args: ['attr.role']
}] } });
export class SidebarNavGroupComponent {
constructor(router, helper, hostElement) {
this.router = router;
this.helper = helper;
this.hostElement = hostElement;
this.dropdownMode = 'closeInactive';
this.navItems = [];
this.navigationEndObservable = router.events.pipe(filter((event) => event instanceof NavigationEnd));
}
get hostClasses() {
return {
'nav-group': true,
show: this.open,
};
}
ngOnInit() {
this.navItems = [...this.item.children];
this.navSubscription = this.navigationEndObservable.subscribe((event) => {
const samePath = this.samePath(event.url);
this.openGroup(samePath);
});
if (this.samePath(this.router.routerState.snapshot.url)) {
this.openGroup(true);
}
}
samePath(url) {
// console.log('item:', this.item.name, this.item.url, 'url:', url);
const itemArray = this.item.url?.split('/');
const urlArray = url.split('/');
return itemArray?.every((value, index) => {
// console.log(value === urlArray[index], 'value:', value, 'index:', index, urlArray[index], url);
return value === urlArray[index];
});
}
openGroup(open) {
this.open = open;
}
toggleGroup($event) {
$event.preventDefault();
this.open = !this.open;
}
ngOnDestroy() {
this.navSubscription.unsubscribe();
}
}
SidebarNavGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: SidebarNavGroupComponent, deps: [{ token: i3.Router }, { token: i2.SidebarNavHelper }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
SidebarNavGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: SidebarNavGroupComponent, selector: "c-sidebar-nav-group", inputs: { item: "item", dropdownMode: "dropdownMode", show: "show" }, host: { properties: { "class": "this.hostClasses" } }, providers: [SidebarNavHelper], ngImport: i0, template: "<a class=\"nav-link nav-group-toggle\"\r\n (click)=\"toggleGroup($event)\"\r\n [cHtmlAttr]=\"item.attributes\">\r\n <ng-container *ngTemplateOutlet=\"iconTemplate ; context: {$implicit: item}\"></ng-container>\r\n <ng-container>{{ item.name }}</ng-container>\r\n <span *ngIf=\"helper.hasBadge(item)\" [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge.text }}</span>\r\n</a>\r\n<c-sidebar-nav\r\n [groupItems]=\"true\"\r\n [navItems]=\"navItems\">\r\n</c-sidebar-nav>\r\n\r\n<ng-template #iconTemplate let-item>\r\n <i *ngIf=\"item?.icon\" [ngClass]=\"item | cSidebarNavIcon\"></i>\r\n <ng-template [ngIf]=\"item?.iconComponent\">\r\n <svg\r\n [cIcon]=\"item.iconComponent?.content\"\r\n [name]=\"item.iconComponent?.name\"\r\n [customClasses]=\"item | cSidebarNavIcon\"\r\n ></svg>\r\n </ng-template>\r\n <span *ngIf=\"!item?.icon && !item?.iconComponent\" [ngClass]=\"item | cSidebarNavIcon\"></span>\r\n</ng-template>\r\n", styles: [".nav-group-toggle{cursor:pointer}.nav-group-items{display:block}\n"], components: [{ type: SidebarNavComponent, selector: "c-sidebar-nav", inputs: ["navItems", "dropdownMode", "groupItems", "compact"] }], directives: [{ type: i10.HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.IconDirective, selector: "svg[cIcon]", inputs: ["cIcon", "size", "title", "customClasses", "width", "height", "name", "viewBox", "xmlns", "pointer-events", "role"], exportAs: ["cIcon"] }], pipes: { "cSidebarNavBadge": i13.SidebarNavBadgePipe, "cSidebarNavIcon": i14.SidebarNavIconPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: SidebarNavGroupComponent, decorators: [{
type: Component,
args: [{ selector: 'c-sidebar-nav-group', providers: [SidebarNavHelper], template: "<a class=\"nav-link nav-group-toggle\"\r\n (click)=\"toggleGroup($event)\"\r\n [cHtmlAttr]=\"item.attributes\">\r\n <ng-container *ngTemplateOutlet=\"iconTemplate ; context: {$implicit: item}\"></ng-container>\r\n <ng-container>{{ item.name }}</ng-container>\r\n <span *ngIf=\"helper.hasBadge(item)\" [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge.text }}</span>\r\n</a>\r\n<c-sidebar-nav\r\n [groupItems]=\"true\"\r\n [navItems]=\"navItems\">\r\n</c-sidebar-nav>\r\n\r\n<ng-template #iconTemplate let-item>\r\n <i *ngIf=\"item?.icon\" [ngClass]=\"item | cSidebarNavIcon\"></i>\r\n <ng-template [ngIf]=\"item?.iconComponent\">\r\n <svg\r\n [cIcon]=\"item.iconComponent?.content\"\r\n [name]=\"item.iconComponent?.name\"\r\n [customClasses]=\"item | cSidebarNavIcon\"\r\n ></svg>\r\n </ng-template>\r\n <span *ngIf=\"!item?.icon && !item?.iconComponent\" [ngClass]=\"item | cSidebarNavIcon\"></span>\r\n</ng-template>\r\n", styles: [".nav-group-toggle{cursor:pointer}.nav-group-items{display:block}\n"] }]
}], ctorParameters: function () { return [{ type: i3.Router }, { type: i2.SidebarNavHelper }, { type: i0.ElementRef }]; }, propDecorators: { item: [{
type: Input
}], dropdownMode: [{
type: Input
}], show: [{
type: Input
}], hostClasses: [{
type: HostBinding,
args: ['class']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1uYXYuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9zaWRlYmFyL3NpZGViYXItbmF2L3NpZGViYXItbmF2LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvc2lkZWJhci9zaWRlYmFyLW5hdi9zaWRlYmFyLW5hdi5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmV1aS1hbmd1bGFyL3NyYy9saWIvc2lkZWJhci9zaWRlYmFyLW5hdi9zaWRlYmFyLW5hdi1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFdBQVcsRUFDWCxLQUFLLEVBSUwsUUFBUSxFQUdULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUd4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPeEMsTUFBTSxPQUFPLG1CQUFtQjtJQXVCOUIsWUFDcUIsT0FBeUIsRUFDckMsTUFBd0IsRUFDeEIsTUFBYyxFQUNiLFFBQW1CLEVBQ25CLFdBQXVCLEVBQ3ZCLGNBQThCO1FBTG5CLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ3JDLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDYixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTVCL0IsYUFBUSxHQUFnQixFQUFFLENB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IENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBJTmF2RGF0YSB9IGZyb20gJy4vc2lkZWJhci1uYXYnO1xyXG5pbXBvcnQgeyBTaWRlYmFyTmF2SGVscGVyIH0gZnJvbSAnLi9zaWRlYmFyLW5hdi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lkZWJhclNlcnZpY2UgfSBmcm9tICcuLi9zaWRlYmFyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaWRlYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2lkZWJhci9zaWRlYmFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Mtc2lkZWJhci1uYXYnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlYmFyLW5hdi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2lkZWJhci1uYXYuY29tcG9uZW50LnNjc3MnXVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBTaWRlYmFyTmF2Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBuYXZJdGVtcz86IElOYXZEYXRhW10gPSBbXTtcclxuICBASW5wdXQoKSBkcm9wZG93bk1vZGU/OiAnY2xvc2VJbmFjdGl2ZScgfCAnbm9BY3Rpb24nIHwgJ29wZW5BY3RpdmUnID0gJ2Nsb3NlSW5hY3RpdmUnO1xyXG4gIEBJbnB1dCgpIGdyb3VwSXRlbXM/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGNvbXBhY3Q/OiBib29sZWFuO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcclxuICBnZXQgaG9zdENsYXNzZXMoKTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdzaWRlYmFyLW5hdic6ICF0aGlzLmdyb3VwSXRlbXMsXHJcbiAgICAgIGNvbXBhY3Q6ICF0aGlzLmdyb3VwSXRlbXMgJiYgISF0aGlzLmNvbXBhY3RcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5hdi1ncm91cC1pdGVtcycpXHJcbiAgZ2V0IHNpZGViYXJOYXZHcm91cEl0ZW1zQ2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmdyb3VwSXRlbXM7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpIHJvbGUgPSAnbmF2JztcclxuXHJcbiAgcHVibGljIG5hdkl0ZW1zQXJyYXk6IElOYXZEYXRhW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgc2lkZWJhcjogU2lkZWJhckNvbXBvbmVudCxcclxuICAgIHB1YmxpYyBoZWxwZXI6IFNpZGViYXJOYXZIZWxwZXIsXHJcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBzaWRlYmFyU2VydmljZTogU2lkZWJhclNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5uYXZJdGVtc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLm5hdkl0ZW1zKSA/IHRoaXMubmF2SXRlbXMuc2xpY2UoKSA6IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZGVNb2JpbGUoKTogdm9pZCB7XHJcbiAgICAvLyB0b2RvOiBwcm9wZXIgc2Nyb2xsSW50b1ZpZXcoKSBhZnRlciBOYXZpZ2F0aW9uRW5kXHJcbiAgICBpZiAodGhpcy5zaWRlYmFyICYmIHRoaXMuc2lkZWJhci5zaWRlYmFyU3RhdGUubW9iaWxlKSB7XHJcbiAgICAgIHRoaXMuc2lkZWJhclNlcnZpY2UudG9nZ2xlKHt0b2dnbGU6ICd2aXNpYmxlJywgc2lkZWJhcjogdGhpcy5zaWRlYmFyfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Mtc2lkZWJhci1uYXYtZ3JvdXAnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlYmFyLW5hdi1ncm91cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2lkZWJhci1uYXYtZ3JvdXAuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFsgU2lkZWJhck5hdkhlbHBlciBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWRlYmFyTmF2R3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgaXRlbTogYW55O1xyXG4gIEBJbnB1dCgpIGRyb3Bkb3duTW9kZTogJ2Nsb3NlSW5hY3RpdmUnIHwgJ25vQWN0aW9uJyB8ICdvcGVuQWN0aXZlJyA9ICdjbG9zZUluYWN0aXZlJztcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgQElucHV0KCkgc2hvdzogYm9vbGVhbjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnR5cGVkZWZcclxuICBnZXQgaG9zdENsYXNzZXMoKTogYW55IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICduYXYtZ3JvdXAnOiB0cnVlLFxyXG4gICAgICBzaG93OiB0aGlzLm9wZW4sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gdG9kbzogZHJvcGRvd25Nb2RlXHJcblxyXG4gIG5hdmlnYXRpb25FbmRPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25FbmQ+O1xyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBuYXZTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIHByaXZhdGUgb3BlbjogYm9vbGVhbjtcclxuICBwdWJsaWMgbmF2SXRlbXM6IElOYXZEYXRhW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHVibGljIGhlbHBlcjogU2lkZWJhck5hdkhlbHBlcixcclxuICAgIHByaXZhdGUgaG9zdEVsZW1lbnQ6IEVsZW1lbnRSZWZcclxuICApIHtcclxuICAgIHRoaXMubmF2aWdhdGlvbkVuZE9ic2VydmFibGUgPSByb3V0ZXIuZXZlbnRzLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoZXZlbnQ6IGFueSkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICAgKSBhcyBPYnNlcnZhYmxlPE5hdmlnYXRpb25FbmQ+O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5uYXZJdGVtcyA9IFsuLi50aGlzLml0ZW0uY2hpbGRyZW5dO1xyXG5cclxuICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uID0gdGhpcy5uYXZpZ2F0aW9uRW5kT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNhbWVQYXRoID0gdGhpcy5zYW1lUGF0aChldmVudC51cmwpO1xyXG4gICAgICB0aGlzLm9wZW5Hcm91cChzYW1lUGF0aCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5zYW1lUGF0aCh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpKSB7XHJcbiAgICAgIHRoaXMub3Blbkdyb3VwKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2FtZVBhdGgodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdpdGVtOicsIHRoaXMuaXRlbS5uYW1lLCB0aGlzLml0ZW0udXJsLCAndXJsOicsIHVybCk7XHJcbiAgICBjb25zdCBpdGVtQXJyYXkgPSB0aGlzLml0ZW0udXJsPy5zcGxpdCgnLycpO1xyXG4gICAgY29uc3QgdXJsQXJyYXkgPSB1cmwuc3BsaXQoJy8nKTtcclxuICAgIHJldHVybiBpdGVtQXJyYXk/LmV2ZXJ5KCh2YWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHZhbHVlID09PSB1cmxBcnJheVtpbmRleF0sICd2YWx1ZTonLCB2YWx1ZSwgJ2luZGV4OicsIGluZGV4LCB1cmxBcnJheVtpbmRleF0sIHVybCk7XHJcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdXJsQXJyYXlbaW5kZXhdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuR3JvdXAob3BlbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuID0gb3BlbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUdyb3VwKCRldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbmF2SXRlbXNBcnJheVwiPlxyXG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImhlbHBlci5pdGVtVHlwZShpdGVtKVwiPlxyXG4gICAgPGMtc2lkZWJhci1uYXYtZ3JvdXBcclxuICAgICAgKm5nU3dpdGNoQ2FzZT1cIidncm91cCdcIlxyXG4gICAgICBbaXRlbV09XCJpdGVtXCJcclxuICAgICAgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SXRlbUNsYXNzXCJcclxuICAgICAgcm91dGVyTGlua0FjdGl2ZT1cInNob3dcIlxyXG4gICAgICAjcmxhPVwicm91dGVyTGlua0FjdGl2ZVwiXHJcbiAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7ZXhhY3Q6IHRydWV9XCJcclxuICAgID5cclxuICAgIDwvYy1zaWRlYmFyLW5hdi1ncm91cD5cclxuICAgIDxjLXNpZGViYXItbmF2LWRpdmlkZXJcclxuICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkaXZpZGVyJ1wiXHJcbiAgICAgIFtpdGVtXT1cIml0ZW1cIlxyXG4gICAgICBbbmdDbGFzc109XCJpdGVtIHwgY1NpZGViYXJOYXZJdGVtQ2xhc3NcIlxyXG4gICAgICBbY0h0bWxBdHRyXT1cIml0ZW0uYXR0cmlidXRlcyA/PyB7fVwiPlxyXG4gICAgPC9jLXNpZGViYXItbmF2LWRpdmlkZXI+XHJcbiAgICA8Yy1zaWRlYmFyLW5hdi10aXRsZVxyXG4gICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3RpdGxlJ1wiXHJcbiAgICAgIFtpdGVtXT1cIml0ZW1cIlxyXG4gICAgICBbbmdDbGFzc109XCJpdGVtIHwgY1NpZGViYXJOYXZJdGVtQ2xhc3NcIlxyXG4gICAgICBbY0h0bWxBdHRyXT1cIml0ZW0uYXR0cmlidXRlcyA/PyB7fVwiPlxyXG4gICAgPC9jLXNpZGViYXItbmF2LXRpdGxlPlxyXG4gICAgPGMtc2lkZWJhci1uYXYtbGFiZWxcclxuICAgICAgKm5nU3dpdGNoQ2FzZT1cIidsYWJlbCdcIlxyXG4gICAgICBbaXRlbV09XCJpdGVtXCJcclxuICAgICAgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SXRlbUNsYXNzXCI+XHJcbiAgICA8L2Mtc2lkZWJhci1uYXYtbGFiZWw+XHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICpuZ1N3aXRjaENhc2U9XCInZW1wdHknXCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxjLXNpZGViYXItbmF2LWxpbmtcclxuICAgICAgKm5nU3dpdGNoRGVmYXVsdFxyXG4gICAgICBbaXRlbV09XCJpdGVtXCJcclxuICAgICAgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SXRlbUNsYXNzXCJcclxuICAgICAgKGxpbmtDbGljayk9XCJoaWRlTW9iaWxlKClcIlxyXG4gICAgPlxyXG4gICAgPC9jLXNpZGViYXItbmF2LWxpbms+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctY29udGFpbmVyPlxyXG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiIsIjxhIGNsYXNzPVwibmF2LWxpbmsgbmF2LWdyb3VwLXRvZ2dsZVwiXHJcbiAgIChjbGljayk9XCJ0b2dnbGVHcm91cCgkZXZlbnQpXCJcclxuICAgW2NIdG1sQXR0cl09XCJpdGVtLmF0dHJpYnV0ZXNcIj5cclxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvblRlbXBsYXRlIDsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICA8bmctY29udGFpbmVyPnt7IGl0ZW0ubmFtZSB9fTwvbmctY29udGFpbmVyPlxyXG4gIDxzcGFuICpuZ0lmPVwiaGVscGVyLmhhc0JhZGdlKGl0ZW0pXCIgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2QmFkZ2VcIj57eyBpdGVtLmJhZGdlLnRleHQgfX08L3NwYW4+XHJcbjwvYT5cclxuPGMtc2lkZWJhci1uYXZcclxuICBbZ3JvdXBJdGVtc109XCJ0cnVlXCJcclxuICBbbmF2SXRlbXNdPVwibmF2SXRlbXNcIj5cclxuPC9jLXNpZGViYXItbmF2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNpY29uVGVtcGxhdGUgbGV0LWl0ZW0+XHJcbiAgPGkgKm5nSWY9XCJpdGVtPy5pY29uXCIgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SWNvblwiPjwvaT5cclxuICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbT8uaWNvbkNvbXBvbmVudFwiPlxyXG4gICAgPHN2Z1xyXG4gICAgICBbY0ljb25dPVwiaXRlbS5pY29uQ29tcG9uZW50Py5jb250ZW50XCJcclxuICAgICAgW25hbWVdPVwiaXRlbS5pY29uQ29tcG9uZW50Py5uYW1lXCJcclxuICAgICAgW2N1c3RvbUNsYXNzZXNdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SWNvblwiXHJcbiAgICA+PC9zdmc+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8c3BhbiAqbmdJZj1cIiFpdGVtPy5pY29uICYmICFpdGVtPy5pY29uQ29tcG9uZW50XCIgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SWNvblwiPjwvc3Bhbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19