UNPKG

@indice/ng-components

Version:

Indice common components for Angular v12

75 lines 18 kB
import { Component, Inject, Input } from '@angular/core'; import { Router } from '@angular/router'; import { AuthService } from '@indice/ng-auth'; import { APP_LINKS } from '../../tokens'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../../directives/click-outside.directive"; import * as i3 from "../nav-links-list/nav-links-list.component"; import * as i4 from "@indice/ng-auth"; import * as i5 from "@angular/router"; export class UserProfileMenuComponent { constructor(authService, router, links) { this.authService = authService; this.router = router; this.links = links; // tslint:disable-next-line:no-input-rename this.showUserName = false; this.showPicture = false; this.userSub$ = null; this.statusSub$ = null; this.user = null; this.avatarName = null; this.userMenuExpanded = false; } ngOnInit() { this.authService.loadUser().subscribe((user) => { this.setCurrentUser(user); }, error => { console.error(error); }); // Detect user changes and display / or not user info accordingly... this.userSub$ = this.authService.user$.subscribe((user) => { // console.log('ShellHeaderComponent user subscription'); this.setCurrentUser(user); }); } signin(event) { if (event) { event.preventDefault(); } this.authService.signinRedirect(); } setCurrentUser(user) { this.user = user; if (user && user.profile && user.profile.given_name && user.profile.family_name) { this.avatarName = `${user.profile.given_name.charAt(0)}${user.profile.family_name.charAt(0)}`.toUpperCase(); } } // tslint:disable-next-line:typedef onClickOutside($event) { this.userMenuExpanded = false; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: UserProfileMenuComponent, deps: [{ token: AuthService }, { token: Router }, { token: APP_LINKS }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.6", type: UserProfileMenuComponent, selector: "lib-user-profile-menu", inputs: { showUserName: ["show-user-name", "showUserName"], showPicture: ["show-picture", "showPicture"] }, ngImport: i0, template: "<div class=\"relative\" (clickOutside)=\"onClickOutside($event)\">\r\n\r\n <div class=\"inline-flex\">\r\n <!-- Username -->\r\n <div [ngClass]=\"{'shell-header-profile': showUserName}\">\r\n <div *ngIf=\"user && showUserName\" class=\"shell-header-profile-userName\">\r\n {{ user.profile.name }}\r\n </div>\r\n </div>\r\n\r\n <div [class.ml-2]=\"showUserName\">\r\n <button type=\"button\" \r\n *ngIf=\"user\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu-authenticated\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\"\r\n (click)=\"userMenuExpanded = !userMenuExpanded\">\r\n <span class=\"sr-only\">Open user menu</span>\r\n <span class=\"avatar-container\">\r\n <span *ngIf=\"!showPicture\" class=\"avatar-text\">{{this.avatarName}}</span>\r\n <img title=\"profile-image\" *ngIf=\"showPicture\" [userPicture]=\"user.profile.sub\" [displayName]=\"user.profile\" [size]=\"32\" />\r\n </span>\r\n </button>\r\n\r\n <button type=\"button\"\r\n *ngIf=\"!user\"\r\n (click)=\"signin($event)\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\">\r\n <span class=\"sr-only\">sign in</span>\r\n <span class=\"avatar-container\">\r\n <span class=\"avatar-text\"><i class=\"ms-Icon ms-Icon--Signin\"></i></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"userMenuExpanded ?\r\n 'transition ease-out duration-200 origin-top-right z-30 absolute right-0 mt-2 w-56 rounded-lg shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none'\r\n :\r\n 'hidden transition ease-in duration-75 origin-top-right z-30 right-0 mt-2 w-56 rounded-lg shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none'\"\r\n role=\"menu\" aria-orientation=\"vertical\" aria-labelledby=\"menu-button\" tabindex=\"-1\">\r\n <lib-nav-links-list\r\n (click)=\"onClickOutside($event)\"\r\n [links]=\"links.profile\"\r\n [link-class]=\"'nav-link-profile'\"\r\n [link-active-class]=\"'nav-link-profile-active'\">\r\n </lib-nav-links-list>\r\n </div>\r\n\r\n</div>\r\n\r\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: i3.NavLinksListComponent, selector: "lib-nav-links-list", inputs: ["links", "active-fragment", "link-class", "link-active-class", "container-class", "show-icons", "show-text", "large-icons"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: UserProfileMenuComponent, decorators: [{ type: Component, args: [{ selector: 'lib-user-profile-menu', template: "<div class=\"relative\" (clickOutside)=\"onClickOutside($event)\">\r\n\r\n <div class=\"inline-flex\">\r\n <!-- Username -->\r\n <div [ngClass]=\"{'shell-header-profile': showUserName}\">\r\n <div *ngIf=\"user && showUserName\" class=\"shell-header-profile-userName\">\r\n {{ user.profile.name }}\r\n </div>\r\n </div>\r\n\r\n <div [class.ml-2]=\"showUserName\">\r\n <button type=\"button\" \r\n *ngIf=\"user\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu-authenticated\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\"\r\n (click)=\"userMenuExpanded = !userMenuExpanded\">\r\n <span class=\"sr-only\">Open user menu</span>\r\n <span class=\"avatar-container\">\r\n <span *ngIf=\"!showPicture\" class=\"avatar-text\">{{this.avatarName}}</span>\r\n <img title=\"profile-image\" *ngIf=\"showPicture\" [userPicture]=\"user.profile.sub\" [displayName]=\"user.profile\" [size]=\"32\" />\r\n </span>\r\n </button>\r\n\r\n <button type=\"button\"\r\n *ngIf=\"!user\"\r\n (click)=\"signin($event)\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\">\r\n <span class=\"sr-only\">sign in</span>\r\n <span class=\"avatar-container\">\r\n <span class=\"avatar-text\"><i class=\"ms-Icon ms-Icon--Signin\"></i></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"userMenuExpanded ?\r\n 'transition ease-out duration-200 origin-top-right z-30 absolute right-0 mt-2 w-56 rounded-lg shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none'\r\n :\r\n 'hidden transition ease-in duration-75 origin-top-right z-30 right-0 mt-2 w-56 rounded-lg shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none'\"\r\n role=\"menu\" aria-orientation=\"vertical\" aria-labelledby=\"menu-button\" tabindex=\"-1\">\r\n <lib-nav-links-list\r\n (click)=\"onClickOutside($event)\"\r\n [links]=\"links.profile\"\r\n [link-class]=\"'nav-link-profile'\"\r\n [link-active-class]=\"'nav-link-profile-active'\">\r\n </lib-nav-links-list>\r\n </div>\r\n\r\n</div>\r\n\r\n" }] }], ctorParameters: () => [{ type: i4.AuthService, decorators: [{ type: Inject, args: [AuthService] }] }, { type: i5.Router, decorators: [{ type: Inject, args: [Router] }] }, { type: undefined, decorators: [{ type: Inject, args: [APP_LINKS] }] }], propDecorators: { showUserName: [{ type: Input, args: ['show-user-name'] }], showPicture: [{ type: Input, args: ['show-picture'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wcm9maWxlLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL3VzZXItcHJvZmlsZS1tZW51L3VzZXItcHJvZmlsZS1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy91c2VyLXByb2ZpbGUtbWVudS91c2VyLXByb2ZpbGUtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7O0FBU3pDLE1BQU0sT0FBTyx3QkFBd0I7SUFXbkMsWUFBMkMsV0FBd0IsRUFDN0IsTUFBYyxFQUNkLEtBQVU7UUFGTCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBSztRQVhoRCwyQ0FBMkM7UUFDbEIsaUJBQVksR0FBd0IsS0FBSyxDQUFDO1FBQzVDLGdCQUFXLEdBQXdCLEtBQUssQ0FBQztRQUN0RCxhQUFRLEdBQXdCLElBQUksQ0FBQztRQUNyQyxlQUFVLEdBQXdCLElBQUksQ0FBQztRQUMxQyxTQUFJLEdBQWdCLElBQUksQ0FBQztRQUN6QixlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFJb0IsQ0FBQztJQUVyRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCx5REFBeUQ7WUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBNkI7UUFDekMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sY0FBYyxDQUFDLElBQVM7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUcsQ0FBQztJQUNILENBQUM7SUFFRCxtQ0FBbUM7SUFDNUIsY0FBYyxDQUFDLE1BQVc7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDOzhHQTdDVSx3QkFBd0Isa0JBV2YsV0FBVyxhQUNYLE1BQU0sYUFDTixTQUFTO2tHQWJsQix3QkFBd0IseUtDWnJDLDY0RUF1REE7OzJGRDNDYSx3QkFBd0I7a0JBSnBDLFNBQVM7K0JBQ0UsdUJBQXVCOzswQkFjcEIsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsTUFBTTsyQkFBQyxNQUFNOzswQkFDYixNQUFNOzJCQUFDLFNBQVM7eUNBVkosWUFBWTtzQkFBcEMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ0EsV0FBVztzQkFBakMsS0FBSzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICdAaW5kaWNlL25nLWF1dGgnO1xyXG5pbXBvcnQgeyBBUFBfTElOS1MgfSBmcm9tICcuLi8uLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnb2lkYy1jbGllbnQtdHMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSW1nVXNlclBpY3R1cmVEaXJlY3RpdmUgfSBmcm9tICduZy1hdXRoJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXVzZXItcHJvZmlsZS1tZW51JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1wcm9maWxlLW1lbnUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyUHJvZmlsZU1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCdzaG93LXVzZXItbmFtZScpIHNob3dVc2VyTmFtZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgnc2hvdy1waWN0dXJlJykgc2hvd1BpY3R1cmU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgdXNlclN1YiQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBzdGF0dXNTdWIkOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgdXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBhdmF0YXJOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgdXNlck1lbnVFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEF1dGhTZXJ2aWNlKSBwcm90ZWN0ZWQgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoUm91dGVyKSBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChBUFBfTElOS1MpIHB1YmxpYyBsaW5rczogYW55KSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvYWRVc2VyKCkuc3Vic2NyaWJlKCh1c2VyKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgICAvLyBEZXRlY3QgdXNlciBjaGFuZ2VzIGFuZCBkaXNwbGF5IC8gb3Igbm90IHVzZXIgaW5mbyBhY2NvcmRpbmdseS4uLlxyXG4gICAgdGhpcy51c2VyU3ViJCA9IHRoaXMuYXV0aFNlcnZpY2UudXNlciQuc3Vic2NyaWJlKCh1c2VyOiBhbnkpID0+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ1NoZWxsSGVhZGVyQ29tcG9uZW50IHVzZXIgc3Vic2NyaXB0aW9uJyk7XHJcbiAgICAgIHRoaXMuc2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaWduaW4oZXZlbnQ6IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hdXRoU2VydmljZS5zaWduaW5SZWRpcmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDdXJyZW50VXNlcih1c2VyOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICBpZiAodXNlciAmJiB1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLmdpdmVuX25hbWUgJiYgdXNlci5wcm9maWxlLmZhbWlseV9uYW1lKSB7XHJcbiAgICAgIHRoaXMuYXZhdGFyTmFtZSA9IGAke3VzZXIucHJvZmlsZS5naXZlbl9uYW1lLmNoYXJBdCgwKX0ke3VzZXIucHJvZmlsZS5mYW1pbHlfbmFtZS5jaGFyQXQoMCl9YC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnR5cGVkZWZcclxuICBwdWJsaWMgb25DbGlja091dHNpZGUoJGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMudXNlck1lbnVFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInJlbGF0aXZlXCIgKGNsaWNrT3V0c2lkZSk9XCJvbkNsaWNrT3V0c2lkZSgkZXZlbnQpXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJpbmxpbmUtZmxleFwiPlxyXG4gICAgPCEtLSBVc2VybmFtZSAtLT5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydzaGVsbC1oZWFkZXItcHJvZmlsZSc6IHNob3dVc2VyTmFtZX1cIj5cclxuICAgICAgPGRpdiAqbmdJZj1cInVzZXIgJiYgc2hvd1VzZXJOYW1lXCIgY2xhc3M9XCJzaGVsbC1oZWFkZXItcHJvZmlsZS11c2VyTmFtZVwiPlxyXG4gICAgICAgIHt7IHVzZXIucHJvZmlsZS5uYW1lIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBbY2xhc3MubWwtMl09XCJzaG93VXNlck5hbWVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ1c2VyXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNoZWxsLWhlYWRlci1wcm9maWxlLWRyb3Bkb3duLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgaWQ9XCJ1c2VyLW1lbnUtYXV0aGVudGljYXRlZFwiXHJcbiAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZXJNZW51RXhwYW5kZWQgPSAhdXNlck1lbnVFeHBhbmRlZFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPk9wZW4gdXNlciBtZW51PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2hvd1BpY3R1cmVcIiBjbGFzcz1cImF2YXRhci10ZXh0XCI+e3t0aGlzLmF2YXRhck5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgIDxpbWcgdGl0bGU9XCJwcm9maWxlLWltYWdlXCIgKm5nSWY9XCJzaG93UGljdHVyZVwiIFt1c2VyUGljdHVyZV09XCJ1c2VyLnByb2ZpbGUuc3ViXCIgW2Rpc3BsYXlOYW1lXT1cInVzZXIucHJvZmlsZVwiIFtzaXplXT1cIjMyXCIgLz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIiF1c2VyXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2lnbmluKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hlbGwtaGVhZGVyLXByb2ZpbGUtZHJvcGRvd24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICBpZD1cInVzZXItbWVudVwiXHJcbiAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnNpZ24gaW48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2YXRhci10ZXh0XCI+PGkgY2xhc3M9XCJtcy1JY29uIG1zLUljb24tLVNpZ25pblwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IFtjbGFzc109XCJ1c2VyTWVudUV4cGFuZGVkID9cclxuICAgICd0cmFuc2l0aW9uIGVhc2Utb3V0IGR1cmF0aW9uLTIwMCBvcmlnaW4tdG9wLXJpZ2h0IHotMzAgYWJzb2x1dGUgcmlnaHQtMCBtdC0yIHctNTYgcm91bmRlZC1sZyBzaGFkb3ctbGcgYmctd2hpdGUgcmluZy0xIHJpbmctYmxhY2sgcmluZy1vcGFjaXR5LTUgZm9jdXM6b3V0bGluZS1ub25lJ1xyXG4gICAgOlxyXG4gICAgJ2hpZGRlbiB0cmFuc2l0aW9uIGVhc2UtaW4gZHVyYXRpb24tNzUgb3JpZ2luLXRvcC1yaWdodCB6LTMwIHJpZ2h0LTAgbXQtMiB3LTU2IHJvdW5kZWQtbGcgc2hhZG93LWxnIGJnLXdoaXRlIHJpbmctMSByaW5nLWJsYWNrIHJpbmctb3BhY2l0eS01IGZvY3VzOm91dGxpbmUtbm9uZSdcIlxyXG4gICAgcm9sZT1cIm1lbnVcIiBhcmlhLW9yaWVudGF0aW9uPVwidmVydGljYWxcIiBhcmlhLWxhYmVsbGVkYnk9XCJtZW51LWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgPGxpYi1uYXYtbGlua3MtbGlzdFxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25DbGlja091dHNpZGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtsaW5rc109XCJsaW5rcy5wcm9maWxlXCJcclxuICAgICAgICAgICAgW2xpbmstY2xhc3NdPVwiJ25hdi1saW5rLXByb2ZpbGUnXCJcclxuICAgICAgICAgICAgW2xpbmstYWN0aXZlLWNsYXNzXT1cIiduYXYtbGluay1wcm9maWxlLWFjdGl2ZSdcIj5cclxuICAgICAgICAgPC9saWItbmF2LWxpbmtzLWxpc3Q+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbiJdfQ==