@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).
85 lines • 14.8 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Component, EventEmitter, Inject, Input, Output, ViewEncapsulation } from '@angular/core';
import { newUniqueId } from '../../shared';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
/** Composant de sélection de la langue. */
export class DsfrTranslateComponent {
/** @internal */
constructor(langService, i18n, elementRef, document) {
this.langService = langService;
this.i18n = i18n;
this.elementRef = elementRef;
this.document = document;
/** Liste des langues proposées à l'utilisateur. */
this.languages = [];
/** Sans bordure si 'false' */
this.outline = true;
/** Événement émit uniquement si la langue sélectionnée ne contient pas de href. Il contient le code de la langue. */
this.langChange = new EventEmitter();
}
get currentLangCode() {
return this.langService.lang;
}
get currentLabel() {
let label = '';
const language = this.getCurrentLang();
if (language && language.label) {
label = language.label;
}
return label;
}
/** Force la langue courante. */
set currentLangCode(value) {
this.langService.lang = value; // Informe le service
this.setDocLang(value); // Positionne la langue dans le document html
}
/** @internal */
ngOnInit() {
this.collapseId = newUniqueId();
}
/** @internal */
onClick(event, lang) {
this.currentLangCode = lang.value;
if (!lang.link) {
event.preventDefault();
// Si on ne déclenche pas le href, on est obligé de fermer manuellement le composant
this.collapse();
this.langChange.emit(lang.value);
}
}
getCurrentLang() {
return this.languages.find((l) => l.value === this.currentLangCode);
}
collapse() {
const nativeElt = this.elementRef.nativeElement;
const buttonElt = nativeElt.querySelector('button');
if (buttonElt) {
buttonElt.setAttribute('aria-expanded', 'false');
buttonElt.setAttribute('data-fr-js-collapse-button', true);
}
}
/** Positionne l'attribut lang dans la balise html, ex : lang="fr" */
setDocLang(codeLang) {
this.document?.documentElement.setAttribute('lang', codeLang);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrTranslateComponent, deps: [{ token: i1.LangService }, { token: i1.I18nService }, { token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrTranslateComponent, selector: "dsfr-translate", inputs: { languages: "languages", outline: "outline", currentLangCode: "currentLangCode" }, outputs: { langChange: "langChange" }, ngImport: i0, template: "<nav role=\"navigation\" class=\"fr-translate fr-nav\">\n <div class=\"fr-nav__item\">\n <button\n type=\"button\"\n [ngClass]=\"{\n 'fr-translate__btn': true,\n 'fr-btn fr-btn--tertiary': outline,\n 'fr-btn--tertiary-no-outline': !outline\n }\"\n [attr.aria-controls]=\"collapseId\"\n aria-expanded=\"false\"\n title=\"{{ i18n.t('translate.tooltip') }}\">\n {{ currentLangCode?.toUpperCase() }}<span class=\"fr-hidden-lg\"> - {{ currentLabel }}</span>\n </button>\n <div class=\"fr-collapse fr-translate__menu fr-menu\" [id]=\"collapseId\">\n <ul class=\"fr-menu__list\">\n <li *ngFor=\"let lang of languages\">\n <a\n class=\"fr-translate__language fr-nav__link\"\n hreflang=\"{{ lang.value }}\"\n lang=\"{{ lang.value }}\"\n [href]=\"lang.link ? lang.link : lang.value\"\n [attr.aria-current]=\"lang.value === currentLangCode ? true : null\"\n (click)=\"onClick($event, lang)\">\n {{ lang.value.toUpperCase() }} - {{ lang.label }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n</nav>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrTranslateComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-translate', encapsulation: ViewEncapsulation.None, template: "<nav role=\"navigation\" class=\"fr-translate fr-nav\">\n <div class=\"fr-nav__item\">\n <button\n type=\"button\"\n [ngClass]=\"{\n 'fr-translate__btn': true,\n 'fr-btn fr-btn--tertiary': outline,\n 'fr-btn--tertiary-no-outline': !outline\n }\"\n [attr.aria-controls]=\"collapseId\"\n aria-expanded=\"false\"\n title=\"{{ i18n.t('translate.tooltip') }}\">\n {{ currentLangCode?.toUpperCase() }}<span class=\"fr-hidden-lg\"> - {{ currentLabel }}</span>\n </button>\n <div class=\"fr-collapse fr-translate__menu fr-menu\" [id]=\"collapseId\">\n <ul class=\"fr-menu__list\">\n <li *ngFor=\"let lang of languages\">\n <a\n class=\"fr-translate__language fr-nav__link\"\n hreflang=\"{{ lang.value }}\"\n lang=\"{{ lang.value }}\"\n [href]=\"lang.link ? lang.link : lang.value\"\n [attr.aria-current]=\"lang.value === currentLangCode ? true : null\"\n (click)=\"onClick($event, lang)\">\n {{ lang.value.toUpperCase() }} - {{ lang.label }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n</nav>\n" }]
}], ctorParameters: function () { return [{ type: i1.LangService }, { type: i1.I18nService }, { type: i0.ElementRef }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; }, propDecorators: { languages: [{
type: Input
}], outline: [{
type: Input
}], langChange: [{
type: Output
}], currentLangCode: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RyYW5zbGF0ZS90cmFuc2xhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdHJhbnNsYXRlL3RyYW5zbGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUE0QixXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFRckUsMkNBQTJDO0FBQzNDLE1BQU0sT0FBTyxzQkFBc0I7SUFhakMsZ0JBQWdCO0lBQ2hCLFlBQ1UsV0FBd0IsRUFDekIsSUFBaUIsRUFDaEIsVUFBc0IsRUFDSyxRQUFrQjtRQUg3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN6QixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2hCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDSyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBakJ2RCxtREFBbUQ7UUFDMUMsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUVwQyw4QkFBOEI7UUFDckIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUV4QixxSEFBcUg7UUFDM0csZUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFXL0MsQ0FBQztJQUVKLElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUM5QixLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUN4QjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxJQUFhLGVBQWUsQ0FBQyxLQUFhO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQjtRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsNkNBQTZDO0lBQ3ZFLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixPQUFPLENBQUMsS0FBWSxFQUFFLElBQWM7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLG9GQUFvRjtZQUNwRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLFFBQVE7UUFDZCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksU0FBUyxFQUFFO1lBQ2IsU0FBUyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDakQsU0FBUyxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCxxRUFBcUU7SUFDN0QsVUFBVSxDQUFDLFFBQWdCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQzsrR0ExRVUsc0JBQXNCLGtHQWtCdkIsUUFBUTttR0FsQlAsc0JBQXNCLHlMQ1huQyw0cENBK0JBOzs0RkRwQmEsc0JBQXNCO2tCQU5sQyxTQUFTOytCQUNFLGdCQUFnQixpQkFFWCxpQkFBaUIsQ0FBQyxJQUFJOzswQkFxQmxDLE1BQU07MkJBQUMsUUFBUTs0Q0FoQlQsU0FBUztzQkFBakIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTTtnQkE0Qk0sZUFBZTtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBMYW5nU2VydmljZSwgbmV3VW5pcXVlSWQgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmckxhbmcgfSBmcm9tICcuL2xhbmcubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLXRyYW5zbGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90cmFuc2xhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbi8qKiBDb21wb3NhbnQgZGUgc8OpbGVjdGlvbiBkZSBsYSBsYW5ndWUuICovXG5leHBvcnQgY2xhc3MgRHNmclRyYW5zbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKiBMaXN0ZSBkZXMgbGFuZ3VlcyBwcm9wb3PDqWVzIMOgIGwndXRpbGlzYXRldXIuICovXG4gIEBJbnB1dCgpIGxhbmd1YWdlczogRHNmckxhbmdbXSA9IFtdO1xuXG4gIC8qKiBTYW5zIGJvcmR1cmUgc2kgJ2ZhbHNlJyAqL1xuICBASW5wdXQoKSBvdXRsaW5lID0gdHJ1ZTtcblxuICAvKiogw4l2w6luZW1lbnQgw6ltaXQgdW5pcXVlbWVudCBzaSBsYSBsYW5ndWUgc8OpbGVjdGlvbm7DqWUgbmUgY29udGllbnQgcGFzIGRlIGhyZWYuIElsIGNvbnRpZW50IGxlIGNvZGUgZGUgbGEgbGFuZ3VlLiAqL1xuICBAT3V0cHV0KCkgbGFuZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sbGFwc2VJZDogc3RyaW5nO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ1NlcnZpY2UsXG4gICAgcHVibGljIGkxOG46IEkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCxcbiAgKSB7fVxuXG4gIGdldCBjdXJyZW50TGFuZ0NvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sYW5nU2VydmljZS5sYW5nO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIGxldCBsYWJlbCA9ICcnO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRDdXJyZW50TGFuZygpO1xuICAgIGlmIChsYW5ndWFnZSAmJiBsYW5ndWFnZS5sYWJlbCkge1xuICAgICAgbGFiZWwgPSBsYW5ndWFnZS5sYWJlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICAvKiogRm9yY2UgbGEgbGFuZ3VlIGNvdXJhbnRlLiAqL1xuICBASW5wdXQoKSBzZXQgY3VycmVudExhbmdDb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxhbmdTZXJ2aWNlLmxhbmcgPSB2YWx1ZTsgLy8gSW5mb3JtZSBsZSBzZXJ2aWNlXG4gICAgdGhpcy5zZXREb2NMYW5nKHZhbHVlKTsgLy8gUG9zaXRpb25uZSBsYSBsYW5ndWUgZGFucyBsZSBkb2N1bWVudCBodG1sXG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29sbGFwc2VJZCA9IG5ld1VuaXF1ZUlkKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uQ2xpY2soZXZlbnQ6IEV2ZW50LCBsYW5nOiBEc2ZyTGFuZykge1xuICAgIHRoaXMuY3VycmVudExhbmdDb2RlID0gbGFuZy52YWx1ZTtcblxuICAgIGlmICghbGFuZy5saW5rKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gU2kgb24gbmUgZMOpY2xlbmNoZSBwYXMgbGUgaHJlZiwgb24gZXN0IG9ibGlnw6kgZGUgZmVybWVyIG1hbnVlbGxlbWVudCBsZSBjb21wb3NhbnRcbiAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICAgIHRoaXMubGFuZ0NoYW5nZS5lbWl0KGxhbmcudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudExhbmcoKTogRHNmckxhbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlcy5maW5kKChsKSA9PiBsLnZhbHVlID09PSB0aGlzLmN1cnJlbnRMYW5nQ29kZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxhcHNlKCkge1xuICAgIGNvbnN0IG5hdGl2ZUVsdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGJ1dHRvbkVsdCA9IG5hdGl2ZUVsdC5xdWVyeVNlbGVjdG9yKCdidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uRWx0KSB7XG4gICAgICBidXR0b25FbHQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICBidXR0b25FbHQuc2V0QXR0cmlidXRlKCdkYXRhLWZyLWpzLWNvbGxhcHNlLWJ1dHRvbicsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBQb3NpdGlvbm5lIGwnYXR0cmlidXQgbGFuZyBkYW5zIGxhIGJhbGlzZSBodG1sLCBleCA6IGxhbmc9XCJmclwiICovXG4gIHByaXZhdGUgc2V0RG9jTGFuZyhjb2RlTGFuZzogc3RyaW5nKSB7XG4gICAgdGhpcy5kb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnbGFuZycsIGNvZGVMYW5nKTtcbiAgfVxufVxuIiwiPG5hdiByb2xlPVwibmF2aWdhdGlvblwiIGNsYXNzPVwiZnItdHJhbnNsYXRlIGZyLW5hdlwiPlxuICA8ZGl2IGNsYXNzPVwiZnItbmF2X19pdGVtXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdmci10cmFuc2xhdGVfX2J0bic6IHRydWUsXG4gICAgICAgICdmci1idG4gZnItYnRuLS10ZXJ0aWFyeSc6IG91dGxpbmUsXG4gICAgICAgICdmci1idG4tLXRlcnRpYXJ5LW5vLW91dGxpbmUnOiAhb3V0bGluZVxuICAgICAgfVwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNvbGxhcHNlSWRcIlxuICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgIHRpdGxlPVwie3sgaTE4bi50KCd0cmFuc2xhdGUudG9vbHRpcCcpIH19XCI+XG4gICAgICB7eyBjdXJyZW50TGFuZ0NvZGU/LnRvVXBwZXJDYXNlKCkgfX08c3BhbiBjbGFzcz1cImZyLWhpZGRlbi1sZ1wiPiZuYnNwOy0ge3sgY3VycmVudExhYmVsIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJmci1jb2xsYXBzZSBmci10cmFuc2xhdGVfX21lbnUgZnItbWVudVwiIFtpZF09XCJjb2xsYXBzZUlkXCI+XG4gICAgICA8dWwgY2xhc3M9XCJmci1tZW51X19saXN0XCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZXNcIj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJmci10cmFuc2xhdGVfX2xhbmd1YWdlIGZyLW5hdl9fbGlua1wiXG4gICAgICAgICAgICBocmVmbGFuZz1cInt7IGxhbmcudmFsdWUgfX1cIlxuICAgICAgICAgICAgbGFuZz1cInt7IGxhbmcudmFsdWUgfX1cIlxuICAgICAgICAgICAgW2hyZWZdPVwibGFuZy5saW5rID8gbGFuZy5saW5rIDogbGFuZy52YWx1ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwibGFuZy52YWx1ZSA9PT0gY3VycmVudExhbmdDb2RlID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50LCBsYW5nKVwiPlxuICAgICAgICAgICAge3sgbGFuZy52YWx1ZS50b1VwcGVyQ2FzZSgpIH19IC0ge3sgbGFuZy5sYWJlbCB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uYXY+XG4iXX0=