UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

167 lines 42.8 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, inject, Inject, Input, Output, ViewEncapsulation } from '@angular/core'; import { RouterModule } from '@angular/router'; import { DsfrI18nPipe, DsfrI18nService, DsfrLinkTargetConst } from '../../shared'; import { DSFR_CONFIG_TOKEN } from '../../shared/config/config-token'; import { DISPLAY_MODAL_ID, DsfrDisplayComponent } from '../display'; import { DsfrLinkComponent } from '../link'; import { ItemLinkComponent } from '../link/item-link.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class DsfrFooterComponent { /** Liens institutionnels */ /** @internal */ static { this.DEF_INSTITUTIONAL_LINKS = [ { label: 'info.gouv.fr', link: 'https://info.gouv.fr', tooltipMessage: 'info.gouv.fr', linkTarget: '_blank', }, { label: 'service-public.fr', link: 'https://service-public.fr', tooltipMessage: 'service-public.fr', linkTarget: '_blank', }, { label: 'legifrance.gouv.fr', link: 'https://legifrance.gouv.fr', tooltipMessage: 'legifrance.gouv.fr', linkTarget: '_blank', }, { label: 'data.gouv.fr', link: 'https://data.gouv.fr', tooltipMessage: 'data.gouv.fr', linkTarget: '_blank' }, ]; } /** Liens réglementaires obligatoires */ /** @internal */ static { this.DEF_MANDATORY_LINKS = [ { label: 'Accessibilité : ', link: 'https://www.info.gouv.fr/accessibilite', linkTarget: '_blank', }, { label: 'Mentions légales', link: '#' }, { label: 'Données personnelles', link: 'https://www.info.gouv.fr/donnees-personnelles-et-cookies', linkTarget: '_blank', }, { label: 'Gestion des cookies', link: 'https://www.info.gouv.fr/donnees-personnelles-et-cookies', linkTarget: '_blank', }, ]; } /** @internal */ constructor(config) { this.config = config; /** Bloc marque de la marianne */ this.logo = { label: 'République<br/>Française', link: '', tooltipMessage: "Accueil - [À MODIFIER - texte alternatif de l’image : nom de l'opérateur ou du site serviciel] - République Française", imagePath: '', imageAlt: '', }; /** Tableau des liens institutionnels - obligatoires. Initialisé par défaut. */ this.institutionalLinks = DsfrFooterComponent.DEF_INSTITUTIONAL_LINKS; /** * Liens d'obligations légales. Cette liste doit être définie en fonction du site, toutefois les liens & contenus suivants * sont obligatoires : “accessibilité : non/partiellement/totalement conforme”, mentions légales, données personnelles et gestion des cookies. - obligatoire. */ this.mandatoryLinks = DsfrFooterComponent.DEF_MANDATORY_LINKS; /** Mention de licence. */ this.license = 'Emplacement de la mention de licence - OBLIGATOIRE.'; /** Indique le lien mandatory sélectionné. */ this.mandatoryLinkSelect = new EventEmitter(); this._useDeprecatedPictoPath = false; this.i18n = inject(DsfrI18nService); } get pictoPath() { return this.artworkDirPath; } get displayModalId() { return DISPLAY_MODAL_ID; } /** * Chemin des pictogrammes (du composant display) renseigné par le développeur. * * Note: ce chemin doit permettre de récupérer directement les fichiers SVG suivants : moon.svg, sun.svg, system.svg * * @deprecated Use `artworkDirPath` instead. */ set pictoPath(path) { this.artworkDirPath = path; this._useDeprecatedPictoPath = true; } /** Mention légale de la conformité d'accessibilité (none / partially / fully-compliant) */ set accessibility(accessibility) { let labelAccessibility = 'Accessibilité : non conforme'; switch (accessibility) { case 'fully-compliant': labelAccessibility = 'Accessibilité : totalement conforme'; break; case 'partially': labelAccessibility = 'Accessibilité : partiellement conforme'; break; } DsfrFooterComponent.DEF_MANDATORY_LINKS[0].label = labelAccessibility; } ngOnInit() { if (this.artworkDirPath === undefined) { this.artworkDirPath = this.config.artworkDirPath; } } /** @internal */ getLinkTarget(item) { return item.target ?? item.linkTarget; } /** @internal */ onMandatoryLinkSelect(link) { this.mandatoryLinkSelect.emit(link); } tooltipMessagePartner(partner) { if (partner.linkTarget === DsfrLinkTargetConst.BLANK) { return partner.tooltipMessage ? `${partner.tooltipMessage} - ${this.i18n.t('link.newWindow')}` : `${this.i18n.t('link.newWindow')}`; } return partner.tooltipMessage; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFooterComponent, deps: [{ token: DSFR_CONFIG_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrFooterComponent, isStandalone: true, selector: "dsfr-footer", inputs: { display: "display", artworkDirPath: "artworkDirPath", logo: "logo", presentation: "presentation", institutionalLinks: "institutionalLinks", mandatoryLinks: "mandatoryLinks", partnerMain: "partnerMain", partnersSub: "partnersSub", reboundLinks: "reboundLinks", license: "license", pictoPath: "pictoPath", accessibility: "accessibility" }, outputs: { mandatoryLinkSelect: "mandatoryLinkSelect" }, ngImport: i0, template: "<footer class=\"fr-footer\" role=\"contentinfo\" id=\"footer\">\n <!-- ReboundLinks -->\n @if (reboundLinks && reboundLinks.length >= 1) {\n <div class=\"fr-footer__top\">\n <div class=\"fr-container\">\n <!-- BUG: Classe 'fr-grid-row--start' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-grid-row fr-grid-row--start fr-grid-row--gutters\">\n @for (item of reboundLinks; track item) {\n <div class=\"fr-col-12 fr-col-sm-3 fr-col-md-2\">\n <h3 class=\"fr-footer__top-cat\">{{ item.title }}</h3>\n <ul class=\"fr-footer__top-list\">\n @for (link of item.links; track link) {\n <li>\n <edu-item-link [item]=\"link\" customClass=\"fr-footer__top-link\"></edu-item-link>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <div class=\"fr-container\">\n <div class=\"fr-footer__body\">\n <div class=\"fr-footer__brand fr-enlarge-link\">\n <!--Bloc avec logo op\u00E9rateur-->\n @if (logo.imagePath) {\n <p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n <dsfr-link\n [customClass]=\"'fr-footer__brand-link'\"\n [link]=\"logo.link ?? logo.navigation?.link ?? ''\"\n [linkTarget]=\"logo.navigation?.linkTarget\"\n [ariaCurrentWhenActive]=\"false\"\n [route]=\"logo.navigation?.route ?? ''\"\n [tooltipMessage]=\"logo.tooltipMessage ? logo.tooltipMessage : ''\"\n [routePath]=\"logo.navigation?.routerLink ?? ''\">\n <img class=\"fr-footer__logo\" style=\"width: 3.5rem\" [src]=\"logo.imagePath\" [attr.alt]=\"logo.imageAlt\" />\n </dsfr-link>\n } @else {\n <!--Bloc sans logo op\u00E9rateur-->\n <dsfr-link\n customClass=\"edu-link\"\n [link]=\"logo.link ?? logo.navigation?.link ?? ''\"\n [linkTarget]=\"logo.navigation?.linkTarget\"\n [ariaCurrentWhenActive]=\"false\"\n [route]=\"logo.navigation?.route ?? ''\"\n [tooltipMessage]=\"logo.tooltipMessage ? logo.tooltipMessage : ''\"\n [routePath]=\"logo.navigation?.routerLink ?? ''\">\n <p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n </dsfr-link>\n }\n </div>\n <div class=\"fr-footer__content\">\n @if (presentation) {\n <p class=\"fr-footer__content-desc\" [innerHtml]=\"presentation\"></p>\n }\n <ul class=\"fr-footer__content-list\">\n @for (item of institutionalLinks; track item) {\n <li class=\"fr-footer__content-item\">\n <!-- BUG: Classe 'fr-footer__content-item' inconnue en DSFR 1.9.3 -->\n <edu-item-link [item]=\"item\" customClass=\"fr-footer__content-link\"></edu-item-link>\n </li>\n }\n </ul>\n </div>\n </div>\n <!--Bloc avec partenaires-->\n @if (partnerMain) {\n <div class=\"fr-footer__partners\">\n <h2 class=\"fr-footer__partners-title\">{{ 'footer.partners.title' | dsfrI18n }}</h2>\n <div class=\"fr-footer__partners-logos\">\n <div class=\"fr-footer__partners-main\">\n <a\n class=\"fr-footer__partners-link\"\n [href]=\"partnerMain.link\"\n [attr.title]=\"tooltipMessagePartner(partnerMain) ?? null\"\n [attr.target]=\"partnerMain.linkTarget || null\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{\n height: partnerMain.customHeight ? partnerMain.customHeight : '5.625rem',\n }\"\n [src]=\"partnerMain.imagePath\"\n [attr.alt]=\"partnerMain.imageAlt\" />\n </a>\n </div>\n @if (partnersSub) {\n <div class=\"fr-footer__partners-sub\">\n <ul>\n @for (item of partnersSub; track item) {\n <li>\n <a\n class=\"fr-footer__partners-link\"\n [attr.title]=\"tooltipMessagePartner(item) ?? null\"\n [href]=\"item.link\"\n [attr.target]=\"item.linkTarget || null\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{ height: item.customHeight ? item.customHeight : '5.625rem' }\"\n [src]=\"item.imagePath\"\n [attr.alt]=\"item.imageAlt\" />\n </a>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n <!-- Bottom ------------------------------------------------------------------------------------------------------->\n <div class=\"fr-footer__bottom\">\n <ul class=\"fr-footer__bottom-list\">\n @for (item of mandatoryLinks; track item) {\n <li class=\"fr-footer__bottom-item\">\n <edu-item-link\n [item]=\"item\"\n customClass=\"fr-footer__bottom-link\"\n (linkSelect)=\"onMandatoryLinkSelect($event)\"></edu-item-link>\n </li>\n }\n @if (display) {\n <li class=\"fr-footer__bottom-item\">\n <button\n type=\"button\"\n class=\"fr-footer__bottom-link fr-fi-theme-fill fr-link--icon-left\"\n [attr.aria-controls]=\"displayModalId\"\n data-fr-opened=\"false\">\n {{ 'footer.display' | dsfrI18n }}\n </button>\n </li>\n }\n </ul>\n <div class=\"fr-footer__bottom-copy\">\n <p [innerHTML]=\"license\"></p>\n </div>\n </div>\n </div>\n</footer>\n\n@if (display && _useDeprecatedPictoPath) {\n <dsfr-display [pictoPath]=\"artworkDirPath\"></dsfr-display>\n} @else if (display && !_useDeprecatedPictoPath) {\n <dsfr-display [artworkDirPath]=\"artworkDirPath\"></dsfr-display>\n}\n", styles: [".fr-footer__brand .fr-footer__brand-link{margin-left:1.5rem}@media (min-width: 48em){.fr-footer__brand .fr-footer__brand-link{margin-left:2rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "linkSize", "tooltipMessage", "mode", "ariaCurrentWhenActive", "size", "targetLink", "routerLink"], outputs: ["linkSelect"] }, { kind: "component", type: DsfrDisplayComponent, selector: "dsfr-display", inputs: ["displayId", "artworkDirPath", "pictoPath"], outputs: ["displayChange"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "component", type: ItemLinkComponent, selector: "edu-item-link", inputs: ["defaultIconPosition", "item"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFooterComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-footer', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, RouterModule, DsfrLinkComponent, DsfrDisplayComponent, DsfrI18nPipe, ItemLinkComponent], template: "<footer class=\"fr-footer\" role=\"contentinfo\" id=\"footer\">\n <!-- ReboundLinks -->\n @if (reboundLinks && reboundLinks.length >= 1) {\n <div class=\"fr-footer__top\">\n <div class=\"fr-container\">\n <!-- BUG: Classe 'fr-grid-row--start' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-grid-row fr-grid-row--start fr-grid-row--gutters\">\n @for (item of reboundLinks; track item) {\n <div class=\"fr-col-12 fr-col-sm-3 fr-col-md-2\">\n <h3 class=\"fr-footer__top-cat\">{{ item.title }}</h3>\n <ul class=\"fr-footer__top-list\">\n @for (link of item.links; track link) {\n <li>\n <edu-item-link [item]=\"link\" customClass=\"fr-footer__top-link\"></edu-item-link>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <div class=\"fr-container\">\n <div class=\"fr-footer__body\">\n <div class=\"fr-footer__brand fr-enlarge-link\">\n <!--Bloc avec logo op\u00E9rateur-->\n @if (logo.imagePath) {\n <p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n <dsfr-link\n [customClass]=\"'fr-footer__brand-link'\"\n [link]=\"logo.link ?? logo.navigation?.link ?? ''\"\n [linkTarget]=\"logo.navigation?.linkTarget\"\n [ariaCurrentWhenActive]=\"false\"\n [route]=\"logo.navigation?.route ?? ''\"\n [tooltipMessage]=\"logo.tooltipMessage ? logo.tooltipMessage : ''\"\n [routePath]=\"logo.navigation?.routerLink ?? ''\">\n <img class=\"fr-footer__logo\" style=\"width: 3.5rem\" [src]=\"logo.imagePath\" [attr.alt]=\"logo.imageAlt\" />\n </dsfr-link>\n } @else {\n <!--Bloc sans logo op\u00E9rateur-->\n <dsfr-link\n customClass=\"edu-link\"\n [link]=\"logo.link ?? logo.navigation?.link ?? ''\"\n [linkTarget]=\"logo.navigation?.linkTarget\"\n [ariaCurrentWhenActive]=\"false\"\n [route]=\"logo.navigation?.route ?? ''\"\n [tooltipMessage]=\"logo.tooltipMessage ? logo.tooltipMessage : ''\"\n [routePath]=\"logo.navigation?.routerLink ?? ''\">\n <p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n </dsfr-link>\n }\n </div>\n <div class=\"fr-footer__content\">\n @if (presentation) {\n <p class=\"fr-footer__content-desc\" [innerHtml]=\"presentation\"></p>\n }\n <ul class=\"fr-footer__content-list\">\n @for (item of institutionalLinks; track item) {\n <li class=\"fr-footer__content-item\">\n <!-- BUG: Classe 'fr-footer__content-item' inconnue en DSFR 1.9.3 -->\n <edu-item-link [item]=\"item\" customClass=\"fr-footer__content-link\"></edu-item-link>\n </li>\n }\n </ul>\n </div>\n </div>\n <!--Bloc avec partenaires-->\n @if (partnerMain) {\n <div class=\"fr-footer__partners\">\n <h2 class=\"fr-footer__partners-title\">{{ 'footer.partners.title' | dsfrI18n }}</h2>\n <div class=\"fr-footer__partners-logos\">\n <div class=\"fr-footer__partners-main\">\n <a\n class=\"fr-footer__partners-link\"\n [href]=\"partnerMain.link\"\n [attr.title]=\"tooltipMessagePartner(partnerMain) ?? null\"\n [attr.target]=\"partnerMain.linkTarget || null\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{\n height: partnerMain.customHeight ? partnerMain.customHeight : '5.625rem',\n }\"\n [src]=\"partnerMain.imagePath\"\n [attr.alt]=\"partnerMain.imageAlt\" />\n </a>\n </div>\n @if (partnersSub) {\n <div class=\"fr-footer__partners-sub\">\n <ul>\n @for (item of partnersSub; track item) {\n <li>\n <a\n class=\"fr-footer__partners-link\"\n [attr.title]=\"tooltipMessagePartner(item) ?? null\"\n [href]=\"item.link\"\n [attr.target]=\"item.linkTarget || null\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{ height: item.customHeight ? item.customHeight : '5.625rem' }\"\n [src]=\"item.imagePath\"\n [attr.alt]=\"item.imageAlt\" />\n </a>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n }\n <!-- Bottom ------------------------------------------------------------------------------------------------------->\n <div class=\"fr-footer__bottom\">\n <ul class=\"fr-footer__bottom-list\">\n @for (item of mandatoryLinks; track item) {\n <li class=\"fr-footer__bottom-item\">\n <edu-item-link\n [item]=\"item\"\n customClass=\"fr-footer__bottom-link\"\n (linkSelect)=\"onMandatoryLinkSelect($event)\"></edu-item-link>\n </li>\n }\n @if (display) {\n <li class=\"fr-footer__bottom-item\">\n <button\n type=\"button\"\n class=\"fr-footer__bottom-link fr-fi-theme-fill fr-link--icon-left\"\n [attr.aria-controls]=\"displayModalId\"\n data-fr-opened=\"false\">\n {{ 'footer.display' | dsfrI18n }}\n </button>\n </li>\n }\n </ul>\n <div class=\"fr-footer__bottom-copy\">\n <p [innerHTML]=\"license\"></p>\n </div>\n </div>\n </div>\n</footer>\n\n@if (display && _useDeprecatedPictoPath) {\n <dsfr-display [pictoPath]=\"artworkDirPath\"></dsfr-display>\n} @else if (display && !_useDeprecatedPictoPath) {\n <dsfr-display [artworkDirPath]=\"artworkDirPath\"></dsfr-display>\n}\n", styles: [".fr-footer__brand .fr-footer__brand-link{margin-left:1.5rem}@media (min-width: 48em){.fr-footer__brand .fr-footer__brand-link{margin-left:2rem}}\n"] }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [DSFR_CONFIG_TOKEN] }] }], propDecorators: { display: [{ type: Input }], artworkDirPath: [{ type: Input }], logo: [{ type: Input }], presentation: [{ type: Input }], institutionalLinks: [{ type: Input }], mandatoryLinks: [{ type: Input }], partnerMain: [{ type: Input }], partnersSub: [{ type: Input }], reboundLinks: [{ type: Input }], license: [{ type: Input }], mandatoryLinkSelect: [{ type: Output }], pictoPath: [{ type: Input }], accessibility: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2Zvb3Rlci9mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZm9vdGVyL2Zvb3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBNEIsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7O0FBY2hFLE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsNEJBQTRCO0lBQzVCLGdCQUFnQjthQUNBLDRCQUF1QixHQUFlO1FBQ3BEO1lBQ0UsS0FBSyxFQUFFLGNBQWM7WUFDckIsSUFBSSxFQUFFLHNCQUFzQjtZQUM1QixjQUFjLEVBQUUsY0FBYztZQUM5QixVQUFVLEVBQUUsUUFBUTtTQUNyQjtRQUNEO1lBQ0Us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WTtzQkFBcEIsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBTUcsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksbUJBQW1CO3NCQUE1QixNQUFNO2dCQXVCTSxTQUFTO3NCQUFyQixLQUFLO2dCQU1PLGFBQWE7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRHNmckkxOG5QaXBlLCBEc2ZySTE4blNlcnZpY2UsIERzZnJMaW5rLCBEc2ZyTGlua1RhcmdldCwgRHNmckxpbmtUYXJnZXRDb25zdCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEU0ZSX0NPTkZJR19UT0tFTiB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25maWcvY29uZmlnLXRva2VuJztcbmltcG9ydCB7IERzZnJDb25maWcgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uZmlnL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBESVNQTEFZX01PREFMX0lELCBEc2ZyRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uL2Rpc3BsYXknO1xuaW1wb3J0IHsgRHNmckxpbmtDb21wb25lbnQgfSBmcm9tICcuLi9saW5rJztcbmltcG9ydCB7IEl0ZW1MaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vbGluay9pdGVtLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IERzZnJBY2Nlc3NpYmlsaXR5IH0gZnJvbSAnLi9hY2Nlc3NpYmlsaXR5LnR5cGUnO1xuaW1wb3J0IHsgRHNmckZvb3RlclJlYm91bmRMaW5rcyB9IGZyb20gJy4vZm9vdGVyLXJlYm91bmQtbGlua3MubW9kZWwnO1xuaW1wb3J0IHsgRHNmckxvZ28gfSBmcm9tICcuL2xvZ28ubW9kZWwnO1xuaW1wb3J0IHsgRHNmclBhcnRuZXIgfSBmcm9tICcuL3BhcnRuZXIubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWZvb3RlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb290ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdHlsZVVybHM6IFsnLi9mb290ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUm91dGVyTW9kdWxlLCBEc2ZyTGlua0NvbXBvbmVudCwgRHNmckRpc3BsYXlDb21wb25lbnQsIERzZnJJMThuUGlwZSwgSXRlbUxpbmtDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRm9vdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqIExpZW5zIGluc3RpdHV0aW9ubmVscyAqL1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyByZWFkb25seSBERUZfSU5TVElUVVRJT05BTF9MSU5LUzogRHNmckxpbmtbXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ2luZm8uZ291di5mcicsXG4gICAgICBsaW5rOiAnaHR0cHM6Ly9pbmZvLmdvdXYuZnInLFxuICAgICAgdG9vbHRpcE1lc3NhZ2U6ICdpbmZvLmdvdXYuZnInLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ3NlcnZpY2UtcHVibGljLmZyJyxcbiAgICAgIGxpbms6ICdodHRwczovL3NlcnZpY2UtcHVibGljLmZyJyxcbiAgICAgIHRvb2x0aXBNZXNzYWdlOiAnc2VydmljZS1wdWJsaWMuZnInLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ2xlZ2lmcmFuY2UuZ291di5mcicsXG4gICAgICBsaW5rOiAnaHR0cHM6Ly9sZWdpZnJhbmNlLmdvdXYuZnInLFxuICAgICAgdG9vbHRpcE1lc3NhZ2U6ICdsZWdpZnJhbmNlLmdvdXYuZnInLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7IGxhYmVsOiAnZGF0YS5nb3V2LmZyJywgbGluazogJ2h0dHBzOi8vZGF0YS5nb3V2LmZyJywgdG9vbHRpcE1lc3NhZ2U6ICdkYXRhLmdvdXYuZnInLCBsaW5rVGFyZ2V0OiAnX2JsYW5rJyB9LFxuICBdO1xuXG4gIC8qKiBMaWVucyByw6lnbGVtZW50YWlyZXMgb2JsaWdhdG9pcmVzICovXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIHJlYWRvbmx5IERFRl9NQU5EQVRPUllfTElOS1M6IERzZnJMaW5rW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdBY2Nlc3NpYmlsaXTDqSA6ICcsXG4gICAgICBsaW5rOiAnaHR0cHM6Ly93d3cuaW5mby5nb3V2LmZyL2FjY2Vzc2liaWxpdGUnLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7IGxhYmVsOiAnTWVudGlvbnMgbMOpZ2FsZXMnLCBsaW5rOiAnIycgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0Rvbm7DqWVzIHBlcnNvbm5lbGxlcycsXG4gICAgICBsaW5rOiAnaHR0cHM6Ly93d3cuaW5mby5nb3V2LmZyL2Rvbm5lZXMtcGVyc29ubmVsbGVzLWV0LWNvb2tpZXMnLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0dlc3Rpb24gZGVzIGNvb2tpZXMnLFxuICAgICAgbGluazogJ2h0dHBzOi8vd3d3LmluZm8uZ291di5mci9kb25uZWVzLXBlcnNvbm5lbGxlcy1ldC1jb29raWVzJyxcbiAgICAgIGxpbmtUYXJnZXQ6ICdfYmxhbmsnLFxuICAgIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIEFmZmljaGFnZSBkdSBsaWVuICdQYXJhbcOodHJlIGQnYWZmaWNoYWdlJyBwb3VyIGfDqXJlciBsZXMgbW9kZXMgY2xhaXIvc29tYnJlLlxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2hlbWluIHZlcnMgbGUgcsOpcGVydG9pcmUgZXhwb3NhbnQgbGVzIHBpY3RvZ3JhbW1lcyBpbGx1c3RyYXRpZnMgRFNGUi5cbiAgICovXG4gIEBJbnB1dCgpIGFydHdvcmtEaXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIEJsb2MgbWFycXVlIGRlIGxhIG1hcmlhbm5lICovXG4gIEBJbnB1dCgpIGxvZ286IERzZnJMb2dvID0ge1xuICAgIGxhYmVsOiAnUsOpcHVibGlxdWU8YnIvPkZyYW7Dp2Fpc2UnLFxuICAgIGxpbms6ICcnLFxuICAgIHRvb2x0aXBNZXNzYWdlOlxuICAgICAgXCJBY2N1ZWlsIC0gW8OAIE1PRElGSUVSIC0gdGV4dGUgYWx0ZXJuYXRpZiBkZSBs4oCZaW1hZ2UgOiBub20gZGUgbCdvcMOpcmF0ZXVyIG91IGR1IHNpdGUgc2VydmljaWVsXSAtIFLDqXB1YmxpcXVlIEZyYW7Dp2Fpc2VcIixcbiAgICBpbWFnZVBhdGg6ICcnLFxuICAgIGltYWdlQWx0OiAnJyxcbiAgfTtcblxuICAvKiogVGV4dGUgZGUgcHLDqXNlbnRhdGlvbiAoaHRtbCBwb3NzaWJsZSkuICovXG4gIEBJbnB1dCgpIHByZXNlbnRhdGlvbjogc3RyaW5nO1xuXG4gIC8qKiBUYWJsZWF1IGRlcyBsaWVucyBpbnN0aXR1dGlvbm5lbHMgLSBvYmxpZ2F0b2lyZXMuIEluaXRpYWxpc8OpIHBhciBkw6lmYXV0LiAqL1xuICBASW5wdXQoKSBpbnN0aXR1dGlvbmFsTGlua3M6IERzZnJMaW5rW10gPSBEc2ZyRm9vdGVyQ29tcG9uZW50LkRFRl9JTlNUSVRVVElPTkFMX0xJTktTO1xuXG4gIC8qKlxuICAgKiBMaWVucyBkJ29ibGlnYXRpb25zIGzDqWdhbGVzLiBDZXR0ZSBsaXN0ZSBkb2l0IMOqdHJlIGTDqWZpbmllIGVuIGZvbmN0aW9uIGR1IHNpdGUsIHRvdXRlZm9pcyBsZXMgbGllbnMgJiBjb250ZW51cyBzdWl2YW50c1xuICAgKiBzb250IG9ibGlnYXRvaXJlcyA6IOKAnGFjY2Vzc2liaWxpdMOpIDogbm9uL3BhcnRpZWxsZW1lbnQvdG90YWxlbWVudCBjb25mb3JtZeKAnSwgbWVudGlvbnMgbMOpZ2FsZXMsIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBldCBnZXN0aW9uIGRlcyBjb29raWVzLiAtIG9ibGlnYXRvaXJlLlxuICAgKi9cbiAgQElucHV0KCkgbWFuZGF0b3J5TGlua3M6IERzZnJMaW5rW10gPSBEc2ZyRm9vdGVyQ29tcG9uZW50LkRFRl9NQU5EQVRPUllfTElOS1M7XG5cbiAgLyoqIExvZ28gcGFydGVuYWlyZSBwcmluY2lwYWwuICovXG4gIEBJbnB1dCgpIHBhcnRuZXJNYWluOiBEc2ZyUGFydG5lcjtcblxuICAvKiogTGlzdGVzIGRlcyBsb2dvcyBwYXJ0ZW5haXJlcy4gKi9cbiAgQElucHV0KCkgcGFydG5lcnNTdWI6IERzZnJQYXJ0bmVyW107XG5cbiAgLyoqIExpc3RlIGRlIGxpZW5zIGRlIHJlYm9uZCBjYXTDqWdvcmlzw6kuICovXG4gIEBJbnB1dCgpIHJlYm91bmRMaW5rczogRHNmckZvb3RlclJlYm91bmRMaW5rc1tdO1xuXG4gIC8qKiBNZW50aW9uIGRlIGxpY2VuY2UuICovXG4gIEBJbnB1dCgpIGxpY2Vuc2U6IHN0cmluZyA9ICdFbXBsYWNlbWVudCBkZSBsYSBtZW50aW9uIGRlIGxpY2VuY2UgLSBPQkxJR0FUT0lSRS4nO1xuXG4gIC8qKiBJbmRpcXVlIGxlIGxpZW4gbWFuZGF0b3J5IHPDqWxlY3Rpb25uw6kuICovXG4gIEBPdXRwdXQoKSBtYW5kYXRvcnlMaW5rU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgcHJvdGVjdGVkIF91c2VEZXByZWNhdGVkUGljdG9QYXRoID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChEc2ZySTE4blNlcnZpY2UpO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoQEluamVjdChEU0ZSX0NPTkZJR19UT0tFTikgcHJpdmF0ZSBjb25maWc6IERzZnJDb25maWcpIHt9XG5cbiAgZ2V0IHBpY3RvUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFydHdvcmtEaXJQYXRoO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlNb2RhbElkKCkge1xuICAgIHJldHVybiBESVNQTEFZX01PREFMX0lEO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZW1pbiBkZXMgcGljdG9ncmFtbWVzIChkdSBjb21wb3NhbnQgZGlzcGxheSkgcmVuc2VpZ27DqSBwYXIgbGUgZMOpdmVsb3BwZXVyLlxuICAgKlxuICAgKiBOb3RlOiBjZSBjaGVtaW4gZG9pdCBwZXJtZXR0cmUgZGUgcsOpY3Vww6lyZXIgZGlyZWN0ZW1lbnQgbGVzIGZpY2hpZXJzIFNWRyBzdWl2YW50cyA6IG1vb24uc3ZnLCBzdW4uc3ZnLCBzeXN0ZW0uc3ZnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgYXJ0d29ya0RpclBhdGhgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcGljdG9QYXRoKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuYXJ0d29ya0RpclBhdGggPSBwYXRoO1xuICAgIHRoaXMuX3VzZURlcHJlY2F0ZWRQaWN0b1BhdGggPSB0cnVlO1xuICB9XG5cbiAgLyoqIE1lbnRpb24gbMOpZ2FsZSBkZSBsYSBjb25mb3JtaXTDqSBkJ2FjY2Vzc2liaWxpdMOpIChub25lIC8gcGFydGlhbGx5IC8gZnVsbHktY29tcGxpYW50KSAqL1xuICBASW5wdXQoKSBzZXQgYWNjZXNzaWJpbGl0eShhY2Nlc3NpYmlsaXR5OiBEc2ZyQWNjZXNzaWJpbGl0eSkge1xuICAgIGxldCBsYWJlbEFjY2Vzc2liaWxpdHk6IHN0cmluZyA9ICdBY2Nlc3NpYmlsaXTDqSA6IG5vbiBjb25mb3JtZSc7XG4gICAgc3dpdGNoIChhY2Nlc3NpYmlsaXR5KSB7XG4gICAgICBjYXNlICdmdWxseS1jb21wbGlhbnQnOlxuICAgICAgICBsYWJlbEFjY2Vzc2liaWxpdHkgPSAnQWNjZXNzaWJpbGl0w6kgOiB0b3RhbGVtZW50IGNvbmZvcm1lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYXJ0aWFsbHknOlxuICAgICAgICBsYWJlbEFjY2Vzc2liaWxpdHkgPSAnQWNjZXNzaWJpbGl0w6kgOiBwYXJ0aWVsbGVtZW50IGNvbmZvcm1lJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgRHNmckZvb3RlckNvbXBvbmVudC5ERUZfTUFOREFUT1JZX0xJTktTWzBdLmxhYmVsID0gbGFiZWxBY2Nlc3NpYmlsaXR5O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJ0d29ya0RpclBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hcnR3b3JrRGlyUGF0aCA9IHRoaXMuY29uZmlnLmFydHdvcmtEaXJQYXRoO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0TGlua1RhcmdldChpdGVtOiBEc2ZyTGluayk6IERzZnJMaW5rVGFyZ2V0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gaXRlbS50YXJnZXQgPz8gaXRlbS5saW5rVGFyZ2V0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbk1hbmRhdG9yeUxpbmtTZWxlY3QobGluazogc3RyaW5nKSB7XG4gICAgdGhpcy5tYW5kYXRvcnlMaW5rU2VsZWN0LmVtaXQobGluayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9vbHRpcE1lc3NhZ2VQYXJ0bmVyKHBhcnRuZXI6IERzZnJQYXJ0bmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGFydG5lci5saW5rVGFyZ2V0ID09PSBEc2ZyTGlua1RhcmdldENvbnN0LkJMQU5LKSB7XG4gICAgICByZXR1cm4gcGFydG5lci50b29sdGlwTWVzc2FnZVxuICAgICAgICA/IGAke3BhcnRuZXIudG9vbHRpcE1lc3NhZ2V9IC0gJHt0aGlzLmkxOG4udCgnbGluay5uZXdXaW5kb3cnKX1gXG4gICAgICAgIDogYCR7dGhpcy5pMThuLnQoJ2xpbmsubmV3V2luZG93Jyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRuZXIudG9vbHRpcE1lc3NhZ2U7XG4gIH1cbn1cbiIsIjxmb290ZXIgY2xhc3M9XCJmci1mb290ZXJcIiByb2xlPVwiY29udGVudGluZm9cIiBpZD1cImZvb3RlclwiPlxuICA8IS0tIFJlYm91bmRMaW5rcyAtLT5cbiAgQGlmIChyZWJvdW5kTGlua3MgJiYgcmVib3VuZExpbmtzLmxlbmd0aCA+PSAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fdG9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyXCI+XG4gICAgICAgIDwhLS0gQlVHOiBDbGFzc2UgJ2ZyLWdyaWQtcm93LS1zdGFydCcgaW5jb25udWUgZW4gRFNGUiAxLjkuMyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZyLWdyaWQtcm93IGZyLWdyaWQtcm93LS1zdGFydCBmci1ncmlkLXJvdy0tZ3V0dGVyc1wiPlxuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgcmVib3VuZExpbmtzOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItY29sLTEyIGZyLWNvbC1zbS0zIGZyLWNvbC1tZC0yXCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImZyLWZvb3Rlcl9fdG9wLWNhdFwiPnt7IGl0ZW0udGl0bGUgfX08L2gzPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJmci1mb290ZXJfX3RvcC1saXN0XCI+XG4gICAgICAgICAgICAgICAgQGZvciAobGluayBvZiBpdGVtLmxpbmtzOyB0cmFjayBsaW5rKSB7XG4gICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgIDxlZHUtaXRlbS1saW5rIFtpdGVtXT1cImxpbmtcIiBjdXN0b21DbGFzcz1cImZyLWZvb3Rlcl9fdG9wLWxpbmtcIj48L2VkdS1pdGVtLWxpbms+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxkaXYgY2xhc3M9XCJmci1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19icmFuZCBmci1lbmxhcmdlLWxpbmtcIj5cbiAgICAgICAgPCEtLUJsb2MgYXZlYyBsb2dvIG9ww6lyYXRldXItLT5cbiAgICAgICAgQGlmIChsb2dvLmltYWdlUGF0aCkge1xuICAgICAgICAgIDxwIGNsYXNzPVwiZnItbG9nb1wiIFtpbm5lckhUTUxdPVwibG9nby5sYWJlbFwiPjwvcD5cbiAgICAgICAgICA8ZHNmci1saW5rXG4gICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2ZyLWZvb3Rlcl9fYnJhbmQtbGluaydcIlxuICAgICAgICAgICAgW2xpbmtdPVwibG9nby5saW5rID8/IGxvZ28ubmF2aWdhdGlvbj8ubGluayA/PyAnJ1wiXG4gICAgICAgICAgICBbbGlua1RhcmdldF09XCJsb2dvLm5hdmlnYXRpb24/LmxpbmtUYXJnZXRcIlxuICAgICAgICAgICAgW2FyaWFDdXJyZW50V2hlbkFjdGl2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbcm91dGVdPVwibG9nby5uYXZpZ2F0aW9uPy5yb3V0ZSA/PyAnJ1wiXG4gICAgICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwibG9nby50b29sdGlwTWVzc2FnZSA/IGxvZ28udG9vbHRpcE1lc3NhZ2UgOiAnJ1wiXG4gICAgICAgICAgICBbcm91dGVQYXRoXT1cImxvZ28ubmF2aWdhdGlvbj8ucm91dGVyTGluayA/PyAnJ1wiPlxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImZyLWZvb3Rlcl9fbG9nb1wiIHN0eWxlPVwid2lkdGg6IDMuNXJlbVwiIFtzcmNdPVwibG9nby5pbWFnZVBhdGhcIiBbYXR0ci5hbHRdPVwibG9nby5pbWFnZUFsdFwiIC8+XG4gICAgICAgICAgPC9kc2ZyLWxpbms+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDwhLS1CbG9jIHNhbnMgbG9nbyBvcMOpcmF0ZXVyLS0+XG4gICAgICAgICAgPGRzZnItbGlua1xuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCJlZHUtbGlua1wiXG4gICAgICAgICAgICBbbGlua109XCJsb2dvLmxpbmsgPz8gbG9nby5uYXZpZ2F0aW9uPy5saW5rID8/ICcnXCJcbiAgICAgICAgICAgIFtsaW5rVGFyZ2V0XT1cImxvZ28ubmF2aWdhdGlvbj8ubGlua1RhcmdldFwiXG4gICAgICAgICAgICBbYXJpYUN1cnJlbnRXaGVuQWN0aXZlXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtyb3V0ZV09XCJsb2dvLm5hdmlnYXRpb24/LnJvdXRlID8/ICcnXCJcbiAgICAgICAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJsb2dvLnRvb2x0aXBNZXNzYWdlID8gbG9nby50b29sdGlwTWVzc2FnZSA6ICcnXCJcbiAgICAgICAgICAgIFtyb3V0ZVBhdGhdPVwibG9nby5uYXZpZ2F0aW9uPy5yb3V0ZXJMaW5rID8/ICcnXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImZyLWxvZ29cIiBbaW5uZXJIVE1MXT1cImxvZ28ubGFiZWxcIj48L3A+XG4gICAgICAgICAgPC9kc2ZyLWxpbms+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fY29udGVudFwiPlxuICAgICAgICBAaWYgKHByZXNlbnRhdGlvbikge1xuICAgICAgICAgIDxwIGNsYXNzPVwiZnItZm9vdGVyX19jb250ZW50LWRlc2NcIiBbaW5uZXJIdG1sXT1cInByZXNlbnRhdGlvblwiPjwvcD5cbiAgICAgICAgfVxuICAgICAgICA8dWwgY2xhc3M9XCJmci1mb290ZXJfX2NvbnRlbnQtbGlzdFwiPlxuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaW5zdGl0dXRpb25hbExpbmtzOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJmci1mb290ZXJfX2NvbnRlbnQtaXRlbVwiPlxuICAgICAgICAgICAgICA8IS0tIEJVRzogQ2xhc3NlICdmci1mb290ZXJfX2NvbnRlbnQtaXRlbScgaW5jb25udWUgZW4gRFNGUiAxLjkuMyAtLT5cbiAgICAgICAgICAgICAgPGVkdS1pdGVtLWxpbmsgW2l0ZW1dPVwiaXRlbVwiIGN1c3RvbUNsYXNzPVwiZnItZm9vdGVyX19jb250ZW50LWxpbmtcIj48L2VkdS1pdGVtLWxpbms+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS1CbG9jIGF2ZWMgcGFydGVuYWlyZXMtLT5cbiAgICBAaWYgKHBhcnRuZXJNYWluKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19wYXJ0bmVyc1wiPlxuICAgICAgICA8aDIgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzLXRpdGxlXCI+e3sgJ2Zvb3Rlci5wYXJ0bmVycy50aXRsZScgfCBkc2ZySTE4biB9fTwvaDI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzLWxvZ29zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fcGFydG5lcnMtbWFpblwiPlxuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzLWxpbmtcIlxuICAgICAgICAgICAgICBbaHJlZl09XCJwYXJ0bmVyTWFpbi5saW5rXCJcbiAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwidG9vbHRpcE1lc3NhZ2VQYXJ0bmVyKHBhcnRuZXJNYWluKSA/PyBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIudGFyZ2V0XT1cInBhcnRuZXJNYWluLmxpbmtUYXJnZXQgfHwgbnVsbFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmci1mb290ZXJfX2xvZ29cIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogcGFydG5lck1haW4uY3VzdG9tSGVpZ2h0ID8gcGFydG5lck1haW4uY3VzdG9tSGVpZ2h0IDogJzUuNjI1cmVtJyxcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cInBhcnRuZXJNYWluLmltYWdlUGF0aFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYWx0XT1cInBhcnRuZXJNYWluLmltYWdlQWx0XCIgLz5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHBhcnRuZXJzU3ViKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19wYXJ0bmVycy1zdWJcIj5cbiAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgcGFydG5lcnNTdWI7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZyLWZvb3Rlcl9fcGFydG5lcnMtbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwidG9vbHRpcE1lc3NhZ2VQYXJ0bmVyKGl0ZW0pID8/IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cIml0ZW0ubGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0ubGlua1RhcmdldCB8fCBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmci1mb290ZXJfX2xvZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGl0ZW0uY3VzdG9tSGVpZ2h0ID8gaXRlbS5jdXN0b21IZWlnaHQgOiAnNS42MjVyZW0nIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJpdGVtLmltYWdlUGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hbHRdPVwiaXRlbS5pbWFnZUFsdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8IS0tIEJvdHRvbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgY2xhc3M9XCJmci1mb290ZXJfX2JvdHRvbVwiPlxuICAgICAgPHVsIGNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20tbGlzdFwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIG1hbmRhdG9yeUxpbmtzOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgPGxpIGNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20taXRlbVwiPlxuICAgICAgICAgICAgPGVkdS1pdGVtLWxpbmtcbiAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20tbGlua1wiXG4gICAgICAgICAgICAgIChsaW5rU2VsZWN0KT1cIm9uTWFuZGF0b3J5TGlua1NlbGVjdCgkZXZlbnQpXCI+PC9lZHUtaXRlbS1saW5rPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChkaXNwbGF5KSB7XG4gICAgICAgICAgPGxpIGNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20taXRlbVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmci1mb290ZXJfX2JvdHRvbS1saW5rIGZyLWZpLXRoZW1lLWZpbGwgZnItbGluay0taWNvbi1sZWZ0XCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJkaXNwbGF5TW9kYWxJZFwiXG4gICAgICAgICAgICAgIGRhdGEtZnItb3BlbmVkPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAge3sgJ2Zvb3Rlci5kaXNwbGF5JyB8IGRzZnJJMThuIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICA8L3VsPlxuICAgICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fYm90dG9tLWNvcHlcIj5cbiAgICAgICAgPHAgW2lubmVySFRNTF09XCJsaWNlbnNlXCI+PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb290ZXI+XG5cbkBpZiAoZGlzcGxheSAmJiBfdXNlRGVwcmVjYXRlZFBpY3RvUGF0aCkge1xuICA8ZHNmci1kaXNwbGF5IFtwaWN0b1BhdGhdPVwiYXJ0d29ya0RpclBhdGhcIj48L2RzZnItZGlzcGxheT5cbn0gQGVsc2UgaWYgKGRpc3BsYXkgJiYgIV91c2VEZXByZWNhdGVkUGljdG9QYXRoKSB7XG4gIDxkc2ZyLWRpc3BsYXkgW2FydHdvcmtEaXJQYXRoXT1cImFydHdvcmtEaXJQYXRoXCI+PC9kc2ZyLWRpc3BsYXk+XG59XG4iXX0=