cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
109 lines • 18 kB
JavaScript
import { Component } from '@angular/core';
import { NavigationEnd } from '@angular/router';
import { filter } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
export class BreadcrumbComponent {
router;
activatedRoute;
/** Lista de breadcrumbs gerados */
links = [];
/** Inscrição para monitorar mudanças na rota */
routeSubscription;
constructor(router, activatedRoute) {
this.router = router;
this.activatedRoute = activatedRoute;
}
/** Inicializa o componente e observa mudanças de rota */
ngOnInit() {
this.updateBreadcrumbs();
this.routeSubscription = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
this.updateBreadcrumbs();
});
}
/** Atualiza os breadcrumbs com base na rota ativa */
updateBreadcrumbs() {
const breadcrumbs = this.buildBreadcrumbs(this.router.routerState.root);
this.removeLastBreadcrumbUrl(breadcrumbs);
this.links = breadcrumbs;
}
/**
* Constrói os breadcrumbs recursivamente com base nas rotas ativadas.
* @param route Rota ativa.
* @param breadcrumbs Lista de breadcrumbs acumulada.
* @returns Lista de BreadcrumbLink atualizada.
*/
buildBreadcrumbs(route, breadcrumbs = []) {
route.children.forEach((child) => {
const routeSegment = this.getRouteURL(child);
const label = this.getBreadcrumbLabel(child.snapshot.data);
const fullPath = this.buildFullPath(routeSegment, breadcrumbs);
if (label && !this.isDuplicateBreadcrumb(breadcrumbs, label)) {
breadcrumbs.push({ label, url: fullPath, target: '_self' });
}
this.buildBreadcrumbs(child, breadcrumbs);
});
return breadcrumbs;
}
/**
* Obtém o segmento da URL da rota atual.
* @param route Rota atual.
* @returns Segmento da URL ou string vazia.
*/
getRouteURL(route) {
return route.snapshot.url.length > 0
? route.snapshot.url.map(segment => segment.path).join('/')
: '';
}
/**
* Constrói o caminho completo concatenando segmentos anteriores.
* @param routeSegment Segmento atual da rota.
* @param breadcrumbs Lista de breadcrumbs acumulada.
* @returns Caminho completo da URL.
*/
buildFullPath(routeSegment, breadcrumbs) {
if (!routeSegment)
return '';
const previousPath = breadcrumbs.length > 0 ? breadcrumbs[breadcrumbs.length - 1].url : '';
return previousPath ? `${previousPath}/${routeSegment}` : `/${routeSegment}`;
}
/**
* Obtém o rótulo do breadcrumb a partir dos dados da rota.
* @param data Dados da rota.
* @returns Rótulo do breadcrumb ou null.
*/
getBreadcrumbLabel(data) {
const label = data['breadcrumb'];
return label && typeof label === 'string' && label.trim() ? label.trim() : null;
}
/**
* Remove a URL do último breadcrumb para evitar que seja clicável.
* @param breadcrumbs Lista de breadcrumbs.
*/
removeLastBreadcrumbUrl(breadcrumbs) {
if (breadcrumbs.length > 0) {
breadcrumbs[breadcrumbs.length - 1].url = undefined;
}
}
/**
* Verifica se um breadcrumb já existe na lista para evitar duplicatas.
* @param breadcrumbs Lista de breadcrumbs acumulada.
* @param label Nome do breadcrumb a verificar.
* @returns Verdadeiro se o breadcrumb já existir, falso caso contrário.
*/
isDuplicateBreadcrumb(breadcrumbs, label) {
return breadcrumbs.some(bc => bc.label === label);
}
/** Cancela a inscrição ao destruir o componente */
ngOnDestroy() {
this.routeSubscription?.unsubscribe();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BreadcrumbComponent, selector: "cfc-breadcrumb", ngImport: i0, template: "<nav\r\n class=\"br-breadcrumb\"\r\n aria-label=\"Breadcrumbs\">\r\n <ul\r\n class=\"crumb-list\"\r\n style=\"padding-left: 0;\"\r\n role=\"list\">\r\n <li\r\n class=\"crumb\">\r\n <a\r\n class=\"br-button circle\"\r\n href=\"/\"\r\n target=\"_self\">\r\n <i class=\"fas fa-home\"></i>\r\n </a>\r\n </li>\r\n\r\n <li\r\n class=\"crumb\"\r\n *ngFor=\"let link of links; let last = last\">\r\n <i\r\n class=\"icon fas fa-chevron-right\">\r\n </i>\r\n\r\n <a\r\n *ngIf=\"!last\"\r\n [href]=\"link.url\"\r\n [target]=\"link.target\">\r\n <span>\r\n {{ link.label | titlecase }}\r\n </span>\r\n </a>\r\n\r\n\r\n <span\r\n *ngIf=\"last\"\r\n tabindex=\"0\"\r\n aria-current=\"page\">\r\n {{ link.label | titlecase }}\r\n </span>\r\n\r\n </li>\r\n </ul>\r\n</nav>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BreadcrumbComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-breadcrumb', template: "<nav\r\n class=\"br-breadcrumb\"\r\n aria-label=\"Breadcrumbs\">\r\n <ul\r\n class=\"crumb-list\"\r\n style=\"padding-left: 0;\"\r\n role=\"list\">\r\n <li\r\n class=\"crumb\">\r\n <a\r\n class=\"br-button circle\"\r\n href=\"/\"\r\n target=\"_self\">\r\n <i class=\"fas fa-home\"></i>\r\n </a>\r\n </li>\r\n\r\n <li\r\n class=\"crumb\"\r\n *ngFor=\"let link of links; let last = last\">\r\n <i\r\n class=\"icon fas fa-chevron-right\">\r\n </i>\r\n\r\n <a\r\n *ngIf=\"!last\"\r\n [href]=\"link.url\"\r\n [target]=\"link.target\">\r\n <span>\r\n {{ link.label | titlecase }}\r\n </span>\r\n </a>\r\n\r\n\r\n <span\r\n *ngIf=\"last\"\r\n tabindex=\"0\"\r\n aria-current=\"page\">\r\n {{ link.label | titlecase }}\r\n </span>\r\n\r\n </li>\r\n </ul>\r\n</nav>\r\n" }]
}], ctorParameters: () => [{ type: i1.Router }, { type: i1.ActivatedRoute }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQTBCLGFBQWEsRUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7O0FBUTVDLE1BQU0sT0FBTyxtQkFBbUI7SUFRcEI7SUFDQTtJQVJWLG1DQUFtQztJQUNuQyxLQUFLLEdBQXFCLEVBQUUsQ0FBQztJQUU3QixnREFBZ0Q7SUFDeEMsaUJBQWlCLENBQWdCO0lBRXpDLFlBQ1UsTUFBYyxFQUNkLGNBQThCO1FBRDlCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDckMsQ0FBQztJQUVKLHlEQUF5RDtJQUN6RCxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLGFBQWEsQ0FBQyxDQUNoRCxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxREFBcUQ7SUFDN0MsaUJBQWlCO1FB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LElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7d0dBNUdVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLHNEQ1ZoQyxxN0JBNENBOzs0RkRsQ2EsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgRGF0YSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGZpbHRlciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJMaW5rIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2JyZWFkY3J1bWIubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjZmMtYnJlYWRjcnVtYicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2JyZWFkY3J1bWIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogTGlzdGEgZGUgYnJlYWRjcnVtYnMgZ2VyYWRvcyAqL1xyXG4gIGxpbmtzOiBCcmVhZGNydW1iTGlua1tdID0gW107XHJcblxyXG4gIC8qKiBJbnNjcmnDp8OjbyBwYXJhIG1vbml0b3JhciBtdWRhbsOnYXMgbmEgcm90YSAqL1xyXG4gIHByaXZhdGUgcm91dGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7fVxyXG5cclxuICAvKiogSW5pY2lhbGl6YSBvIGNvbXBvbmVudGUgZSBvYnNlcnZhIG11ZGFuw6dhcyBkZSByb3RhICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzKCk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBBdHVhbGl6YSBvcyBicmVhZGNydW1icyBjb20gYmFzZSBuYSByb3RhIGF0aXZhICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVCcmVhZGNydW1icygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJyZWFkY3J1bWJzID0gdGhpcy5idWlsZEJyZWFkY3J1bWJzKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnJvb3QpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0QnJlYWRjcnVtYlVybChicmVhZGNydW1icyk7XHJcbiAgICB0aGlzLmxpbmtzID0gYnJlYWRjcnVtYnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHLDs2kgb3MgYnJlYWRjcnVtYnMgcmVjdXJzaXZhbWVudGUgY29tIGJhc2UgbmFzIHJvdGFzIGF0aXZhZGFzLlxyXG4gICAqIEBwYXJhbSByb3V0ZSBSb3RhIGF0aXZhLlxyXG4gICAqIEBwYXJhbSBicmVhZGNydW1icyBMaXN0YSBkZSBicmVhZGNydW1icyBhY3VtdWxhZGEuXHJcbiAgICogQHJldHVybnMgTGlzdGEgZGUgQnJlYWRjcnVtYkxpbmsgYXR1YWxpemFkYS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkQnJlYWRjcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlLCBicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSA9IFtdKTogQnJlYWRjcnVtYkxpbmtbXSB7XHJcbiAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSB0aGlzLmdldFJvdXRlVVJMKGNoaWxkKTtcclxuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEJyZWFkY3J1bWJMYWJlbChjaGlsZC5zbmFwc2hvdC5kYXRhKTtcclxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmJ1aWxkRnVsbFBhdGgocm91dGVTZWdtZW50LCBicmVhZGNydW1icyk7XHJcblxyXG4gICAgICBpZiAobGFiZWwgJiYgIXRoaXMuaXNEdXBsaWNhdGVCcmVhZGNydW1iKGJyZWFkY3J1bWJzLCBsYWJlbCkpIHtcclxuICAgICAgICBicmVhZGNydW1icy5wdXNoKHsgbGFiZWwsIHVybDogZnVsbFBhdGgsIHRhcmdldDogJ19zZWxmJyB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5idWlsZEJyZWFkY3J1bWJzKGNoaWxkLCBicmVhZGNydW1icyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYnJlYWRjcnVtYnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnTDqW0gbyBzZWdtZW50byBkYSBVUkwgZGEgcm90YSBhdHVhbC5cclxuICAgKiBAcGFyYW0gcm91dGUgUm90YSBhdHVhbC5cclxuICAgKiBAcmV0dXJucyBTZWdtZW50byBkYSBVUkwgb3Ugc3RyaW5nIHZhemlhLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0Um91dGVVUkwocm91dGU6IEFjdGl2YXRlZFJvdXRlKTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3V0ZS5zbmFwc2hvdC51cmwubGVuZ3RoID4gMFxyXG4gICAgICA/IHJvdXRlLnNuYXBzaG90LnVybC5tYXAoc2VnbWVudCA9PiBzZWdtZW50LnBhdGgpLmpvaW4oJy8nKVxyXG4gICAgICA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3Ryw7NpIG8gY2FtaW5obyBjb21wbGV0byBjb25jYXRlbmFuZG8gc2VnbWVudG9zIGFudGVyaW9yZXMuXHJcbiAgICogQHBhcmFtIHJvdXRlU2VnbWVudCBTZWdtZW50byBhdHVhbCBkYSByb3RhLlxyXG4gICAqIEBwYXJhbSBicmVhZGNydW1icyBMaXN0YSBkZSBicmVhZGNydW1icyBhY3VtdWxhZGEuXHJcbiAgICogQHJldHVybnMgQ2FtaW5obyBjb21wbGV0byBkYSBVUkwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZEZ1bGxQYXRoKHJvdXRlU2VnbWVudDogc3RyaW5nLCBicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXJvdXRlU2VnbWVudCkgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgcHJldmlvdXNQYXRoID0gYnJlYWRjcnVtYnMubGVuZ3RoID4gMCA/IGJyZWFkY3J1bWJzW2JyZWFkY3J1bWJzLmxlbmd0aCAtIDFdLnVybCA6ICcnO1xyXG4gICAgcmV0dXJuIHByZXZpb3VzUGF0aCA/IGAke3ByZXZpb3VzUGF0aH0vJHtyb3V0ZVNlZ21lbnR9YCA6IGAvJHtyb3V0ZVNlZ21lbnR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idMOpbSBvIHLDs3R1bG8gZG8gYnJlYWRjcnVtYiBhIHBhcnRpciBkb3MgZGFkb3MgZGEgcm90YS5cclxuICAgKiBAcGFyYW0gZGF0YSBEYWRvcyBkYSByb3RhLlxyXG4gICAqIEByZXR1cm5zIFLDs3R1bG8gZG8gYnJlYWRjcnVtYiBvdSBudWxsLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QnJlYWRjcnVtYkxhYmVsKGRhdGE6IERhdGEpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IGxhYmVsID0gZGF0YVsnYnJlYWRjcnVtYiddO1xyXG4gICAgcmV0dXJuIGxhYmVsICYmIHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycgJiYgbGFiZWwudHJpbSgpID8gbGFiZWwudHJpbSgpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhIFVSTCBkbyDDumx0aW1vIGJyZWFkY3J1bWIgcGFyYSBldml0YXIgcXVlIHNlamEgY2xpY8OhdmVsLlxyXG4gICAqIEBwYXJhbSBicmVhZGNydW1icyBMaXN0YSBkZSBicmVhZGNydW1icy5cclxuICAgKi9cclxuICBwcml2YXRlIHJlbW92ZUxhc3RCcmVhZGNydW1iVXJsKGJyZWFkY3J1bWJzOiBCcmVhZGNydW1iTGlua1tdKTogdm9pZCB7XHJcbiAgICBpZiAoYnJlYWRjcnVtYnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBicmVhZGNydW1ic1ticmVhZGNydW1icy5sZW5ndGggLSAxXS51cmwgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSB1bSBicmVhZGNydW1iIGrDoSBleGlzdGUgbmEgbGlzdGEgcGFyYSBldml0YXIgZHVwbGljYXRhcy5cclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMgTGlzdGEgZGUgYnJlYWRjcnVtYnMgYWN1bXVsYWRhLlxyXG4gICAqIEBwYXJhbSBsYWJlbCBOb21lIGRvIGJyZWFkY3J1bWIgYSB2ZXJpZmljYXIuXHJcbiAgICogQHJldHVybnMgVmVyZGFkZWlybyBzZSBvIGJyZWFkY3J1bWIgasOhIGV4aXN0aXIsIGZhbHNvIGNhc28gY29udHLDoXJpby5cclxuICAgKi9cclxuICBwcml2YXRlIGlzRHVwbGljYXRlQnJlYWRjcnVtYihicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSwgbGFiZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGJyZWFkY3J1bWJzLnNvbWUoYmMgPT4gYmMubGFiZWwgPT09IGxhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKiBDYW5jZWxhIGEgaW5zY3Jpw6fDo28gYW8gZGVzdHJ1aXIgbyBjb21wb25lbnRlICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8bmF2XHJcbiAgY2xhc3M9XCJici1icmVhZGNydW1iXCJcclxuICBhcmlhLWxhYmVsPVwiQnJlYWRjcnVtYnNcIj5cclxuICA8dWxcclxuICAgIGNsYXNzPVwiY3J1bWItbGlzdFwiXHJcbiAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMDtcIlxyXG4gICAgcm9sZT1cImxpc3RcIj5cclxuICAgIDxsaVxyXG4gICAgICBjbGFzcz1cImNydW1iXCI+XHJcbiAgICAgIDxhXHJcbiAgICAgICAgY2xhc3M9XCJici1idXR0b24gY2lyY2xlXCJcclxuICAgICAgICBocmVmPVwiL1wiXHJcbiAgICAgICAgdGFyZ2V0PVwiX3NlbGZcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1ob21lXCI+PC9pPlxyXG4gICAgICA8L2E+XHJcbiAgICA8L2xpPlxyXG5cclxuICAgIDxsaVxyXG4gICAgICBjbGFzcz1cImNydW1iXCJcclxuICAgICAgKm5nRm9yPVwibGV0IGxpbmsgb2YgbGlua3M7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICA8aVxyXG4gICAgICAgIGNsYXNzPVwiaWNvbiBmYXMgZmEtY2hldnJvbi1yaWdodFwiPlxyXG4gICAgICA8L2k+XHJcblxyXG4gICAgICA8YVxyXG4gICAgICAgICpuZ0lmPVwiIWxhc3RcIlxyXG4gICAgICAgIFtocmVmXT1cImxpbmsudXJsXCJcclxuICAgICAgICBbdGFyZ2V0XT1cImxpbmsudGFyZ2V0XCI+XHJcbiAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICB7eyBsaW5rLmxhYmVsIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2E+XHJcblxyXG5cclxuICAgICAgPHNwYW5cclxuICAgICAgICAqbmdJZj1cImxhc3RcIlxyXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiPlxyXG4gICAgICAgIHt7IGxpbmsubGFiZWwgfCB0aXRsZWNhc2UgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgIDwvbGk+XHJcbiAgPC91bD5cclxuPC9uYXY+XHJcbiJdfQ==