@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).
95 lines • 17.3 kB
JavaScript
import { Component, Input, ViewEncapsulation } from '@angular/core';
import { downloadDetail } from '../../shared';
import { DsfrDownloadVariantConst } from './download-variant';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
export class DsfrDownloadComponent {
constructor(langService,
/** @internal */ i18n) {
this.langService = langService;
this.i18n = i18n;
/**
* Equivalent à l'attribut html natif 'download'.
* Si == 'true', télécharge directement le fichier sans l'ouvrir, 'false' par défaut.
* Peut prendre le nom du fichier à télécharger si on souhaite renommer ce fichier.
*/
this.directDownload = false;
/** Permet de basculer la présentation en card. */
this.variant = DsfrDownloadVariantConst.LINK;
/**
* Indique que les métadonnées du fichier seront positionnées automatiquement par le script DSFR. Les propriétés
* fileMimeType, fileSizeBytes, hreflang sont alors ignorées. Si la propriété est positionnée à false alors ce sont
* les valeurs des propriétés fileMimeType, fileSizeBytes, hreflang qui seront utlisées.
*/
this.assessFile = true;
}
get currentLang() {
return this.langService.lang;
}
/**
* Retourne l'affichage des détails dans cas précis, sinon retourne '' et laisse calculer l'affichage par le script DSFR.
*/
get detail() {
return downloadDetail(this.mimeType, this.sizeBytes, this.sizeUnit);
}
get sizeUnit() {
return this._sizeUnit ? this._sizeUnit : this.langService.lang === 'fr' ? 'octets' : 'bytes';
}
/**
* Permet d'afficher la taille soit en bytes (KB, MB, ...) soit en octets (Ko, Mo, ...). Par défaut, l'unité est
* en octets lorsque la langue courante est 'fr', 'bytes' dans les autres cas.
*/
set sizeUnit(value) {
this._sizeUnit = value;
}
/**
* Retourne vrai si on affiche un bouton à la place d'une ancre.
* @internal
*/
hasButtonMarkup() {
return !this.link;
}
/**
* Si === 'true', télécharge directement le fichier sans l'ouvrir, 'false' par défaut.
* @internal
*/
isDirectDownload() {
return this.directDownload !== false;
}
/** @internal */
getNewFileName() {
return typeof this.directDownload === 'string' ? this.directDownload : '';
}
/** @internal */
isBlockMode() {
return this.variant === DsfrDownloadVariantConst.BLOCK;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrDownloadComponent, deps: [{ token: i1.LangService }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrDownloadComponent, selector: "dsfr-download", inputs: { langCode: "langCode", directDownload: "directDownload", link: "link", mimeType: "mimeType", fileName: "fileName", sizeBytes: "sizeBytes", variant: "variant", description: "description", assessFile: "assessFile", sizeUnit: "sizeUnit" }, ngImport: i0, template: "<div\n class=\"fr-download\"\n [ngClass]=\"{\n 'fr-enlarge-link fr-download--card': isBlockMode(),\n 'edu-cardWithButton': hasButtonMarkup()\n }\"\n [attr.lang]=\"currentLang || null\">\n <p>\n <!-- T\u00E9l\u00E9chargement avec une ancre -->\n <a\n *ngIf=\"!hasButtonMarkup()\"\n [href]=\"link\"\n [attr.download]=\"!isDirectDownload() ? null : getNewFileName()\"\n [attr.hreflang]=\"langCode ? langCode : null\"\n class=\"fr-download__link\"\n [attr.data-fr-assess-file]=\"assessFile && sizeBytes ? sizeUnit : null\">\n {{ i18n.t('commons.download') }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </a>\n\n <!-- T\u00E9l\u00E9chargement avec un bouton (sans m\u00E9tadata) -->\n <button *ngIf=\"hasButtonMarkup()\" type=\"button\" class=\"fr-download__link\">\n {{ i18n.t('commons.download') }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </button>\n </p>\n <p *ngIf=\"description && isBlockMode()\" class=\"fr-download__desc\">{{ description }}</p>\n</div>\n", styles: ["@charset \"UTF-8\";button.fr-download__link{background-position:0% 100%,0% calc(100% - .0625em);background-position:var(--underline-x) 100%,var(--underline-x) calc(100% - .0625em);background-repeat:no-repeat,no-repeat;transition:background-size 0s;background-size:0 .125em,100% .0625em;background-size:var(--underline-hover-width) .125em,var(--underline-idle-width) .0625em}button.fr-download__link:before{content:\"\";display:block;position:absolute;inset:0;width:100%;height:100%;outline-offset:2px;outline-style:inherit;outline-color:inherit;outline-width:2px;z-index:1}button.fr-download__link:focus-visible:before{outline-style:solid;outline-color:#0a76f6}.edu-cardWithButton{cursor:pointer}.edu-cardWithButton button{background-image:none}.edu-cardWithButton button:focus-visible{outline-style:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrDownloadComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-download', encapsulation: ViewEncapsulation.None, template: "<div\n class=\"fr-download\"\n [ngClass]=\"{\n 'fr-enlarge-link fr-download--card': isBlockMode(),\n 'edu-cardWithButton': hasButtonMarkup()\n }\"\n [attr.lang]=\"currentLang || null\">\n <p>\n <!-- T\u00E9l\u00E9chargement avec une ancre -->\n <a\n *ngIf=\"!hasButtonMarkup()\"\n [href]=\"link\"\n [attr.download]=\"!isDirectDownload() ? null : getNewFileName()\"\n [attr.hreflang]=\"langCode ? langCode : null\"\n class=\"fr-download__link\"\n [attr.data-fr-assess-file]=\"assessFile && sizeBytes ? sizeUnit : null\">\n {{ i18n.t('commons.download') }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </a>\n\n <!-- T\u00E9l\u00E9chargement avec un bouton (sans m\u00E9tadata) -->\n <button *ngIf=\"hasButtonMarkup()\" type=\"button\" class=\"fr-download__link\">\n {{ i18n.t('commons.download') }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </button>\n </p>\n <p *ngIf=\"description && isBlockMode()\" class=\"fr-download__desc\">{{ description }}</p>\n</div>\n", styles: ["@charset \"UTF-8\";button.fr-download__link{background-position:0% 100%,0% calc(100% - .0625em);background-position:var(--underline-x) 100%,var(--underline-x) calc(100% - .0625em);background-repeat:no-repeat,no-repeat;transition:background-size 0s;background-size:0 .125em,100% .0625em;background-size:var(--underline-hover-width) .125em,var(--underline-idle-width) .0625em}button.fr-download__link:before{content:\"\";display:block;position:absolute;inset:0;width:100%;height:100%;outline-offset:2px;outline-style:inherit;outline-color:inherit;outline-width:2px;z-index:1}button.fr-download__link:focus-visible:before{outline-style:solid;outline-color:#0a76f6}.edu-cardWithButton{cursor:pointer}.edu-cardWithButton button{background-image:none}.edu-cardWithButton button:focus-visible{outline-style:none}\n"] }]
}], ctorParameters: function () { return [{ type: i1.LangService }, { type: i1.I18nService }]; }, propDecorators: { langCode: [{
type: Input
}], directDownload: [{
type: Input
}], link: [{
type: Input
}], mimeType: [{
type: Input
}], fileName: [{
type: Input
}], sizeBytes: [{
type: Input
}], variant: [{
type: Input
}], description: [{
type: Input
}], assessFile: [{
type: Input
}], sizeUnit: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZG93bmxvYWQvZG93bmxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZG93bmxvYWQvZG93bmxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUE4QyxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUYsT0FBTyxFQUF1Qix3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7O0FBU25GLE1BQU0sT0FBTyxxQkFBcUI7SUE2Q2hDLFlBQ1UsV0FBd0I7SUFDaEMsZ0JBQWdCLENBQVEsSUFBaUI7UUFEakMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDUixTQUFJLEdBQUosSUFBSSxDQUFhO1FBeEMzQzs7OztXQUlHO1FBQ00sbUJBQWMsR0FBcUIsS0FBSyxDQUFDO1FBaUJsRCxrREFBa0Q7UUFDekMsWUFBTyxHQUF3Qix3QkFBd0IsQ0FBQyxJQUFJLENBQUM7UUFLdEU7Ozs7V0FJRztRQUNNLGVBQVUsR0FBRyxJQUFJLENBQUM7SUFReEIsQ0FBQztJQUVKLElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxNQUFNO1FBQ1IsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQy9GLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFFBQVEsQ0FBQyxLQUF1QjtRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsY0FBYztRQUNaLE9BQU8sT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7SUFDekQsQ0FBQzsrR0FqR1UscUJBQXFCO21HQUFyQixxQkFBcUIsMlNDWGxDLGlsQ0E0QkE7OzRGRGpCYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJOzRIQU81QixRQUFRO3NCQUFoQixLQUFLO2dCQU9HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBTUcsSUFBSTtzQkFBWixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBNkJPLFFBQVE7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckZpbGVTaXplVW5pdCwgSTE4blNlcnZpY2UsIExhbmdTZXJ2aWNlLCBkb3dubG9hZERldGFpbCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyRG93bmxvYWRWYXJpYW50LCBEc2ZyRG93bmxvYWRWYXJpYW50Q29uc3QgfSBmcm9tICcuL2Rvd25sb2FkLXZhcmlhbnQnO1xuaW1wb3J0IHsgRHNmckRvd25sb2FkIH0gZnJvbSAnLi9kb3dubG9hZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZG93bmxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG93bmxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3dubG9hZC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRG93bmxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBEc2ZyRG93bmxvYWQge1xuICAvKipcbiAgICogT2JsaWdhdG9pcmUgc2kgbGUgZG9jdW1lbnQgbidlc3QgcGFzIGR1IG3Dqm1lIGxhbmdhZ2UgcXVlIGxhIHBhZ2UgY291cmFudGUuXG4gICAqIEV4IDogbGFuZ0NvZGU9XCJlblwiLlxuICAgKi9cbiAgQElucHV0KCkgbGFuZ0NvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogRXF1aXZhbGVudCDDoCBsJ2F0dHJpYnV0IGh0bWwgbmF0aWYgJ2Rvd25sb2FkJy5cbiAgICogU2kgPT0gJ3RydWUnLCB0w6lsw6ljaGFyZ2UgZGlyZWN0ZW1lbnQgbGUgZmljaGllciBzYW5zIGwnb3V2cmlyLCAnZmFsc2UnIHBhciBkw6lmYXV0LlxuICAgKiBQZXV0IHByZW5kcmUgbGUgbm9tIGR1IGZpY2hpZXIgw6AgdMOpbMOpY2hhcmdlciBzaSBvbiBzb3VoYWl0ZSByZW5vbW1lciBjZSBmaWNoaWVyLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0RG93bmxvYWQ6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogTGllbiBkZSB0w6lsw6ljaGFyZ2VtZW50IGR1IGZpY2hpZXIuXG4gICAqIFNpIGNldHRlIHByb3ByacOpdMOpIG4nZXN0IHBhcyByZW5zZWlnbsOpZSwgdW4gYm91dG9uIHJlbXBsYWNlIGwnYW5jcmUgZXQgbCfDqXbDqW5lbWVudCAoY2xpY2spIGR1IGJvdXRvbiBkb2l0IMOqdHJlIGludGVyY2VwdMOpLlxuICAgKi9cbiAgQElucHV0KCkgbGluazogc3RyaW5nO1xuXG4gIC8qKiBGb3JtYXQgZHUgZmljaGllciAtIG9ibGlnYXRvaXJlLiBDZi4gRHNmck1pbWVUeXBlICovXG4gIEBJbnB1dCgpIG1pbWVUeXBlOiBzdHJpbmc7XG5cbiAgLyoqIE5vbSBkdSBmaWNoZXIgLSBvYmxpZ2F0b2lyZS4gKi9cbiAgQElucHV0KCkgZmlsZU5hbWU6IHN0cmluZztcblxuICAvKiogUG9pZHMgZHUgZmljaGllciBlbiBvY3RldHMuIE9ibGlnYXRvaXJlIGRhbnMgbGUgRHNmciBtYWlzIHBldXQgw6p0cmUgcmVuc2VpZ27DqSB1bHTDqXJpZXVyZW1lbnQuICovXG4gIEBJbnB1dCgpIHNpemVCeXRlczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBQZXJtZXQgZGUgYmFzY3VsZXIgbGEgcHLDqXNlbnRhdGlvbiBlbiBjYXJkLiAqL1xuICBASW5wdXQoKSB2YXJpYW50OiBEc2ZyRG93bmxvYWRWYXJpYW50ID0gRHNmckRvd25sb2FkVmFyaWFudENvbnN0LkxJTks7XG5cbiAgLyoqIERlc2NyaXB0aW9uIGR1IGZpY2hpZXIgKHVuaXF1ZW1lbnQgZW4gbW9kZSBibG9jKS4gKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaXF1ZSBxdWUgbGVzIG3DqXRhZG9ubsOpZXMgZHUgZmljaGllciBzZXJvbnQgcG9zaXRpb25uw6llcyBhdXRvbWF0aXF1ZW1lbnQgcGFyIGxlIHNjcmlwdCBEU0ZSLiBMZXMgcHJvcHJpw6l0w6lzXG4gICAqIGZpbGVNaW1lVHlwZSwgZmlsZVNpemVCeXRlcywgaHJlZmxhbmcgc29udCBhbG9ycyBpZ25vcsOpZXMuIFNpIGxhIHByb3ByacOpdMOpIGVzdCBwb3NpdGlvbm7DqWUgw6AgZmFsc2UgYWxvcnMgY2Ugc29udFxuICAgKiBsZXMgdmFsZXVycyBkZXMgcHJvcHJpw6l0w6lzIGZpbGVNaW1lVHlwZSwgZmlsZVNpemVCeXRlcywgaHJlZmxhbmcgcXVpIHNlcm9udCB1dGxpc8OpZXMuXG4gICAqL1xuICBASW5wdXQoKSBhc3Nlc3NGaWxlID0gdHJ1ZTtcblxuICAvKiogY2YuIGFjY2Vzc2V1cnMuICovXG4gIHByaXZhdGUgX3NpemVVbml0OiBEc2ZyRmlsZVNpemVVbml0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlLFxuICAgIC8qKiBAaW50ZXJuYWwgKi8gcHVibGljIGkxOG46IEkxOG5TZXJ2aWNlLFxuICApIHt9XG5cbiAgZ2V0IGN1cnJlbnRMYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ1NlcnZpY2UubGFuZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvdXJuZSBsJ2FmZmljaGFnZSBkZXMgZMOpdGFpbHMgZGFucyBjYXMgcHLDqWNpcywgc2lub24gcmV0b3VybmUgJycgZXQgbGFpc3NlIGNhbGN1bGVyIGwnYWZmaWNoYWdlIHBhciBsZSBzY3JpcHQgRFNGUi5cbiAgICovXG4gIGdldCBkZXRhaWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG93bmxvYWREZXRhaWwodGhpcy5taW1lVHlwZSwgdGhpcy5zaXplQnl0ZXMsIHRoaXMuc2l6ZVVuaXQpO1xuICB9XG5cbiAgZ2V0IHNpemVVbml0KCk6IERzZnJGaWxlU2l6ZVVuaXQge1xuICAgIHJldHVybiB0aGlzLl9zaXplVW5pdCA/IHRoaXMuX3NpemVVbml0IDogdGhpcy5sYW5nU2VydmljZS5sYW5nID09PSAnZnInID8gJ29jdGV0cycgOiAnYnl0ZXMnO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1ldCBkJ2FmZmljaGVyIGxhIHRhaWxsZSBzb2l0IGVuIGJ5dGVzIChLQiwgTUIsIC4uLikgc29pdCBlbiBvY3RldHMgKEtvLCBNbywgLi4uKS4gUGFyIGTDqWZhdXQsIGwndW5pdMOpIGVzdFxuICAgKiBlbiBvY3RldHMgbG9yc3F1ZSBsYSBsYW5ndWUgY291cmFudGUgZXN0ICdmcicsICdieXRlcycgZGFucyBsZXMgYXV0cmVzIGNhcy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzaXplVW5pdCh2YWx1ZTogRHNmckZpbGVTaXplVW5pdCkge1xuICAgIHRoaXMuX3NpemVVbml0ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgdnJhaSBzaSBvbiBhZmZpY2hlIHVuIGJvdXRvbiDDoCBsYSBwbGFjZSBkJ3VuZSBhbmNyZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBoYXNCdXR0b25NYXJrdXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmxpbms7XG4gIH1cblxuICAvKipcbiAgICogU2kgPT09ICd0cnVlJywgdMOpbMOpY2hhcmdlIGRpcmVjdGVtZW50IGxlIGZpY2hpZXIgc2FucyBsJ291dnJpciwgJ2ZhbHNlJyBwYXIgZMOpZmF1dC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBpc0RpcmVjdERvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdERvd25sb2FkICE9PSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0TmV3RmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuZGlyZWN0RG93bmxvYWQgPT09ICdzdHJpbmcnID8gdGhpcy5kaXJlY3REb3dubG9hZCA6ICcnO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc0Jsb2NrTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYW50ID09PSBEc2ZyRG93bmxvYWRWYXJpYW50Q29uc3QuQkxPQ0s7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJmci1kb3dubG9hZFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnZnItZW5sYXJnZS1saW5rIGZyLWRvd25sb2FkLS1jYXJkJzogaXNCbG9ja01vZGUoKSxcbiAgICAnZWR1LWNhcmRXaXRoQnV0dG9uJzogaGFzQnV0dG9uTWFya3VwKClcbiAgfVwiXG4gIFthdHRyLmxhbmddPVwiY3VycmVudExhbmcgfHwgbnVsbFwiPlxuICA8cD5cbiAgICA8IS0tIFTDqWzDqWNoYXJnZW1lbnQgYXZlYyB1bmUgYW5jcmUgLS0+XG4gICAgPGFcbiAgICAgICpuZ0lmPVwiIWhhc0J1dHRvbk1hcmt1cCgpXCJcbiAgICAgIFtocmVmXT1cImxpbmtcIlxuICAgICAgW2F0dHIuZG93bmxvYWRdPVwiIWlzRGlyZWN0RG93bmxvYWQoKSA/IG51bGwgOiBnZXROZXdGaWxlTmFtZSgpXCJcbiAgICAgIFthdHRyLmhyZWZsYW5nXT1cImxhbmdDb2RlID8gbGFuZ0NvZGUgOiBudWxsXCJcbiAgICAgIGNsYXNzPVwiZnItZG93bmxvYWRfX2xpbmtcIlxuICAgICAgW2F0dHIuZGF0YS1mci1hc3Nlc3MtZmlsZV09XCJhc3Nlc3NGaWxlICYmIHNpemVCeXRlcyA/IHNpemVVbml0IDogbnVsbFwiPlxuICAgICAge3sgaTE4bi50KCdjb21tb25zLmRvd25sb2FkJykgfX0ge3sgZmlsZU5hbWUgfX1cbiAgICAgIDxzcGFuIGNsYXNzPVwiZnItZG93bmxvYWRfX2RldGFpbFwiPnt7IGRldGFpbCB9fTwvc3Bhbj5cbiAgICA8L2E+XG5cbiAgICA8IS0tIFTDqWzDqWNoYXJnZW1lbnQgYXZlYyB1biBib3V0b24gKHNhbnMgbcOpdGFkYXRhKSAtLT5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaGFzQnV0dG9uTWFya3VwKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmci1kb3dubG9hZF9fbGlua1wiPlxuICAgICAge3sgaTE4bi50KCdjb21tb25zLmRvd25sb2FkJykgfX0ge3sgZmlsZU5hbWUgfX1cbiAgICAgIDxzcGFuIGNsYXNzPVwiZnItZG93bmxvYWRfX2RldGFpbFwiPnt7IGRldGFpbCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9wPlxuICA8cCAqbmdJZj1cImRlc2NyaXB0aW9uICYmIGlzQmxvY2tNb2RlKClcIiBjbGFzcz1cImZyLWRvd25sb2FkX19kZXNjXCI+e3sgZGVzY3JpcHRpb24gfX08L3A+XG48L2Rpdj5cbiJdfQ==