UNPKG

@abp/ng.theme.basic

Version:

<h1> @abp/ng.theme.basic </h1>

37 lines 19.1 kB
import { RoutesService } from '@abp/ng.core'; import { Component, Input, QueryList, Renderer2, ViewChildren, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@abp/ng.core"; import * as i2 from "@angular/common"; import * as i3 from "@angular/router"; import * as i4 from "@ng-bootstrap/ng-bootstrap"; import * as i5 from "@abp/ng.theme.shared"; export class RoutesComponent { constructor(routesService, renderer) { this.routesService = routesService; this.renderer = renderer; this.rootDropdownExpand = {}; this.trackByFn = (_, item) => item.name; } isDropdown(node) { return !node?.isLeaf || this.routesService.hasChildren(node.name); } closeDropdown() { this.childrenContainers.forEach(({ nativeElement }) => { this.renderer.addClass(nativeElement, 'd-none'); setTimeout(() => this.renderer.removeClass(nativeElement, 'd-none'), 0); }); } } RoutesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: RoutesComponent, deps: [{ token: i1.RoutesService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); RoutesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: RoutesComponent, selector: "abp-routes", inputs: { smallScreen: "smallScreen" }, viewQueries: [{ propertyName: "childrenContainers", predicate: ["childrenContainer"], descendants: true }], ngImport: i0, template: "<ul class=\"navbar-nav\">\r\n <ng-container\r\n *ngFor=\"let route of routesService.visible$ | async; trackBy: trackByFn\"\r\n [ngTemplateOutlet]=\"isDropdown(route) ? dropdownLink : defaultLink\"\r\n [ngTemplateOutletContext]=\"{ $implicit: route }\"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultLink let-route>\r\n <li class=\"nav-item\" *abpPermission=\"route.requiredPolicy\">\r\n <a class=\"nav-link\" [routerLink]=\"[route.path]\"\r\n ><i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-template>\r\n\r\n <ng-template #dropdownLink let-route>\r\n <ng-container *ngIf=\"route.children?.length\">\r\n <li\r\n class=\"nav-item dropdown\"\r\n display=\"static\"\r\n *abpPermission=\"route.requiredPolicy\"\r\n (click)=\"\r\n rootDropdownExpand[route.name]\r\n ? (rootDropdownExpand[route.name] = false)\r\n : (rootDropdownExpand[route.name] = true)\r\n \"\r\n >\r\n <a\r\n class=\"nav-link dropdown-toggle\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n href=\"javascript:void(0)\"\r\n >\r\n <i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}\r\n </a>\r\n <div\r\n #routeContainer\r\n class=\"dropdown-menu border-0 shadow-sm\"\r\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n [class.d-block]=\"smallScreen && rootDropdownExpand[route.name]\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"forTemplate; context: { $implicit: route }\"\r\n ></ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #forTemplate let-route>\r\n <ng-container *ngFor=\"let child of route.children\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"child.children?.length ? dropdownChild : defaultChild\"\r\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\r\n ></ng-template>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #defaultChild let-child>\r\n <ng-container *ngIf=\"child.path\">\r\n <div class=\"dropdown-submenu\" *abpPermission=\"child.requiredPolicy\">\r\n <a class=\"dropdown-item\" [routerLink]=\"[child.path]\" (click)=\"closeDropdown()\">\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}</a\r\n >\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #dropdownChild let-child>\r\n <div\r\n class=\"dropdown-submenu\"\r\n ngbDropdown\r\n #dropdownSubmenu=\"ngbDropdown\"\r\n placement=\"right-top\"\r\n [autoClose]=\"true\"\r\n *abpPermission=\"child.requiredPolicy\"\r\n >\r\n <div ngbDropdownToggle [class.dropdown-toggle]=\"false\">\r\n <a\r\n abpEllipsis=\"210px\"\r\n [abpEllipsisEnabled]=\"!smallScreen\"\r\n role=\"button\"\r\n class=\"btn d-block text-start dropdown-toggle\"\r\n >\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}\r\n </a>\r\n </div>\r\n <div\r\n #childrenContainer\r\n class=\"dropdown-menu dropdown-menu-start border-0 shadow-sm\"\r\n [class.d-block]=\"smallScreen && dropdownSubmenu.isOpen()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"forTemplate; context: { $implicit: child }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ul>\r\n", directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission"] }, { type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i5.EllipsisDirective, selector: "[abpEllipsis]", inputs: ["abpEllipsis", "title", "abpEllipsisEnabled"] }], pipes: { "async": i2.AsyncPipe, "abpLocalization": i1.LocalizationPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: RoutesComponent, decorators: [{ type: Component, args: [{ selector: 'abp-routes', template: "<ul class=\"navbar-nav\">\r\n <ng-container\r\n *ngFor=\"let route of routesService.visible$ | async; trackBy: trackByFn\"\r\n [ngTemplateOutlet]=\"isDropdown(route) ? dropdownLink : defaultLink\"\r\n [ngTemplateOutletContext]=\"{ $implicit: route }\"\r\n >\r\n </ng-container>\r\n\r\n <ng-template #defaultLink let-route>\r\n <li class=\"nav-item\" *abpPermission=\"route.requiredPolicy\">\r\n <a class=\"nav-link\" [routerLink]=\"[route.path]\"\r\n ><i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}</a\r\n >\r\n </li>\r\n </ng-template>\r\n\r\n <ng-template #dropdownLink let-route>\r\n <ng-container *ngIf=\"route.children?.length\">\r\n <li\r\n class=\"nav-item dropdown\"\r\n display=\"static\"\r\n *abpPermission=\"route.requiredPolicy\"\r\n (click)=\"\r\n rootDropdownExpand[route.name]\r\n ? (rootDropdownExpand[route.name] = false)\r\n : (rootDropdownExpand[route.name] = true)\r\n \"\r\n >\r\n <a\r\n class=\"nav-link dropdown-toggle\"\r\n data-toggle=\"dropdown\"\r\n aria-haspopup=\"true\"\r\n aria-expanded=\"false\"\r\n href=\"javascript:void(0)\"\r\n >\r\n <i *ngIf=\"route.iconClass\" [ngClass]=\"route.iconClass\"></i>\r\n {{ route.name | abpLocalization }}\r\n </a>\r\n <div\r\n #routeContainer\r\n class=\"dropdown-menu border-0 shadow-sm\"\r\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\r\n [class.d-block]=\"smallScreen && rootDropdownExpand[route.name]\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"forTemplate; context: { $implicit: route }\"\r\n ></ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #forTemplate let-route>\r\n <ng-container *ngFor=\"let child of route.children\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"child.children?.length ? dropdownChild : defaultChild\"\r\n [ngTemplateOutletContext]=\"{ $implicit: child }\"\r\n ></ng-template>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #defaultChild let-child>\r\n <ng-container *ngIf=\"child.path\">\r\n <div class=\"dropdown-submenu\" *abpPermission=\"child.requiredPolicy\">\r\n <a class=\"dropdown-item\" [routerLink]=\"[child.path]\" (click)=\"closeDropdown()\">\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}</a\r\n >\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #dropdownChild let-child>\r\n <div\r\n class=\"dropdown-submenu\"\r\n ngbDropdown\r\n #dropdownSubmenu=\"ngbDropdown\"\r\n placement=\"right-top\"\r\n [autoClose]=\"true\"\r\n *abpPermission=\"child.requiredPolicy\"\r\n >\r\n <div ngbDropdownToggle [class.dropdown-toggle]=\"false\">\r\n <a\r\n abpEllipsis=\"210px\"\r\n [abpEllipsisEnabled]=\"!smallScreen\"\r\n role=\"button\"\r\n class=\"btn d-block text-start dropdown-toggle\"\r\n >\r\n <i *ngIf=\"child.iconClass\" [ngClass]=\"child.iconClass\"></i>\r\n {{ child.name | abpLocalization }}\r\n </a>\r\n </div>\r\n <div\r\n #childrenContainer\r\n class=\"dropdown-menu dropdown-menu-start border-0 shadow-sm\"\r\n [class.d-block]=\"smallScreen && dropdownSubmenu.isOpen()\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"forTemplate; context: { $implicit: child }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ul>\r\n" }] }], ctorParameters: function () { return [{ type: i1.RoutesService }, { type: i0.Renderer2 }]; }, propDecorators: { smallScreen: [{ type: Input }], childrenContainers: [{ type: ViewChildren, args: ['childrenContainer'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lLWJhc2ljL3NyYy9saWIvY29tcG9uZW50cy9yb3V0ZXMvcm91dGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lLWJhc2ljL3NyYy9saWIvY29tcG9uZW50cy9yb3V0ZXMvcm91dGVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxhQUFhLEVBQVksTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFFVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFNdkIsTUFBTSxPQUFPLGVBQWU7SUFTMUIsWUFBNEIsYUFBNEIsRUFBWSxRQUFtQjtRQUEzRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFZLGFBQVEsR0FBUixRQUFRLENBQVc7UUFKdkYsdUJBQWtCLEdBQUcsRUFBZ0MsQ0FBQztRQUV0RCxjQUFTLEdBQXlDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUVpQixDQUFDO0lBRTNGLFVBQVUsQ0FBQyxJQUF5QjtRQUNsQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NEdBcEJVLGVBQWU7Z0dBQWYsZUFBZSxzTUNmNUIsNnVIQXVHQTsyRkR4RmEsZUFBZTtrQkFKM0IsU0FBUzsrQkFDRSxZQUFZOzRIQUliLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRTZCLGtCQUFrQjtzQkFBcEQsWUFBWTt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBQlAsIFJvdXRlc1NlcnZpY2UsIFRyZWVOb2RlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFRyYWNrQnlGdW5jdGlvbixcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FicC1yb3V0ZXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAncm91dGVzLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJvdXRlc0NvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgc21hbGxTY3JlZW4/OiBib29sZWFuO1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdjaGlsZHJlbkNvbnRhaW5lcicpIGNoaWxkcmVuQ29udGFpbmVycyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj47XHJcblxyXG4gIHJvb3REcm9wZG93bkV4cGFuZCA9IHt9IGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9O1xyXG5cclxuICB0cmFja0J5Rm46IFRyYWNrQnlGdW5jdGlvbjxUcmVlTm9kZTxBQlAuUm91dGU+PiA9IChfLCBpdGVtKSA9PiBpdGVtLm5hbWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSByb3V0ZXNTZXJ2aWNlOiBSb3V0ZXNTZXJ2aWNlLCBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cclxuXHJcbiAgaXNEcm9wZG93bihub2RlOiBUcmVlTm9kZTxBQlAuUm91dGU+KSB7XHJcbiAgICByZXR1cm4gIW5vZGU/LmlzTGVhZiB8fCB0aGlzLnJvdXRlc1NlcnZpY2UuaGFzQ2hpbGRyZW4obm9kZS5uYW1lKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuQ29udGFpbmVycy5mb3JFYWNoKCh7IG5hdGl2ZUVsZW1lbnQgfSkgPT4ge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG5hdGl2ZUVsZW1lbnQsICdkLW5vbmUnKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKG5hdGl2ZUVsZW1lbnQsICdkLW5vbmUnKSwgMCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPHVsIGNsYXNzPVwibmF2YmFyLW5hdlwiPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0Zvcj1cImxldCByb3V0ZSBvZiByb3V0ZXNTZXJ2aWNlLnZpc2libGUkIHwgYXN5bmM7IHRyYWNrQnk6IHRyYWNrQnlGblwiXHJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpc0Ryb3Bkb3duKHJvdXRlKSA/IGRyb3Bkb3duTGluayA6IGRlZmF1bHRMaW5rXCJcclxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm91dGUgfVwiXHJcbiAgPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMaW5rIGxldC1yb3V0ZT5cclxuICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCIgKmFicFBlcm1pc3Npb249XCJyb3V0ZS5yZXF1aXJlZFBvbGljeVwiPlxyXG4gICAgICA8YSBjbGFzcz1cIm5hdi1saW5rXCIgW3JvdXRlckxpbmtdPVwiW3JvdXRlLnBhdGhdXCJcclxuICAgICAgICA+PGkgKm5nSWY9XCJyb3V0ZS5pY29uQ2xhc3NcIiBbbmdDbGFzc109XCJyb3V0ZS5pY29uQ2xhc3NcIj48L2k+XHJcbiAgICAgICAge3sgcm91dGUubmFtZSB8IGFicExvY2FsaXphdGlvbiB9fTwvYVxyXG4gICAgICA+XHJcbiAgICA8L2xpPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25MaW5rIGxldC1yb3V0ZT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3V0ZS5jaGlsZHJlbj8ubGVuZ3RoXCI+XHJcbiAgICAgIDxsaVxyXG4gICAgICAgIGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd25cIlxyXG4gICAgICAgIGRpc3BsYXk9XCJzdGF0aWNcIlxyXG4gICAgICAgICphYnBQZXJtaXNzaW9uPVwicm91dGUucmVxdWlyZWRQb2xpY3lcIlxyXG4gICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgIHJvb3REcm9wZG93bkV4cGFuZFtyb3V0ZS5uYW1lXVxyXG4gICAgICAgICAgICA/IChyb290RHJvcGRvd25FeHBhbmRbcm91dGUubmFtZV0gPSBmYWxzZSlcclxuICAgICAgICAgICAgOiAocm9vdERyb3Bkb3duRXhwYW5kW3JvdXRlLm5hbWVdID0gdHJ1ZSlcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGFcclxuICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgZHJvcGRvd24tdG9nZ2xlXCJcclxuICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIlxyXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxyXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcclxuICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpICpuZ0lmPVwicm91dGUuaWNvbkNsYXNzXCIgW25nQ2xhc3NdPVwicm91dGUuaWNvbkNsYXNzXCI+PC9pPlxyXG4gICAgICAgICAge3sgcm91dGUubmFtZSB8IGFicExvY2FsaXphdGlvbiB9fVxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAjcm91dGVDb250YWluZXJcclxuICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBib3JkZXItMCBzaGFkb3ctc21cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgW2NsYXNzLmQtYmxvY2tdPVwic21hbGxTY3JlZW4gJiYgcm9vdERyb3Bkb3duRXhwYW5kW3JvdXRlLm5hbWVdXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9yVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3V0ZSB9XCJcclxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9saT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjZm9yVGVtcGxhdGUgbGV0LXJvdXRlPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGQgb2Ygcm91dGUuY2hpbGRyZW5cIj5cclxuICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpbGQuY2hpbGRyZW4/Lmxlbmd0aCA/IGRyb3Bkb3duQ2hpbGQgOiBkZWZhdWx0Q2hpbGRcIlxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY2hpbGQgfVwiXHJcbiAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2hpbGQgbGV0LWNoaWxkPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoaWxkLnBhdGhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXN1Ym1lbnVcIiAqYWJwUGVybWlzc2lvbj1cImNoaWxkLnJlcXVpcmVkUG9saWN5XCI+XHJcbiAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgW3JvdXRlckxpbmtdPVwiW2NoaWxkLnBhdGhdXCIgKGNsaWNrKT1cImNsb3NlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgPGkgKm5nSWY9XCJjaGlsZC5pY29uQ2xhc3NcIiBbbmdDbGFzc109XCJjaGlsZC5pY29uQ2xhc3NcIj48L2k+XHJcbiAgICAgICAgICB7eyBjaGlsZC5uYW1lIHwgYWJwTG9jYWxpemF0aW9uIH19PC9hXHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25DaGlsZCBsZXQtY2hpbGQ+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZHJvcGRvd24tc3VibWVudVwiXHJcbiAgICAgIG5nYkRyb3Bkb3duXHJcbiAgICAgICNkcm9wZG93blN1Ym1lbnU9XCJuZ2JEcm9wZG93blwiXHJcbiAgICAgIHBsYWNlbWVudD1cInJpZ2h0LXRvcFwiXHJcbiAgICAgIFthdXRvQ2xvc2VdPVwidHJ1ZVwiXHJcbiAgICAgICphYnBQZXJtaXNzaW9uPVwiY2hpbGQucmVxdWlyZWRQb2xpY3lcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IG5nYkRyb3Bkb3duVG9nZ2xlIFtjbGFzcy5kcm9wZG93bi10b2dnbGVdPVwiZmFsc2VcIj5cclxuICAgICAgICA8YVxyXG4gICAgICAgICAgYWJwRWxsaXBzaXM9XCIyMTBweFwiXHJcbiAgICAgICAgICBbYWJwRWxsaXBzaXNFbmFibGVkXT1cIiFzbWFsbFNjcmVlblwiXHJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGQtYmxvY2sgdGV4dC1zdGFydCBkcm9wZG93bi10b2dnbGVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpICpuZ0lmPVwiY2hpbGQuaWNvbkNsYXNzXCIgW25nQ2xhc3NdPVwiY2hpbGQuaWNvbkNsYXNzXCI+PC9pPlxyXG4gICAgICAgICAge3sgY2hpbGQubmFtZSB8IGFicExvY2FsaXphdGlvbiB9fVxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAjY2hpbGRyZW5Db250YWluZXJcclxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1zdGFydCBib3JkZXItMCBzaGFkb3ctc21cIlxyXG4gICAgICAgIFtjbGFzcy5kLWJsb2NrXT1cInNtYWxsU2NyZWVuICYmIGRyb3Bkb3duU3VibWVudS5pc09wZW4oKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9yVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjaGlsZCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC91bD5cclxuIl19