@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).
109 lines • 31.8 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Inject, Input, Output, ViewEncapsulation } from '@angular/core';
import { DsfrButtonComponent, DsfrButtonsGroupComponent } from '../../components';
import { DsfrI18nPipe } from '../../shared';
import { DSFR_CONFIG_TOKEN } from '../../shared/config/config-token';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../components/button/button.component";
import * as i3 from "../../components/buttons-group/buttons-group.component";
import * as i4 from "../../shared/i18n/i18n.pipe";
export class DsfrResponseComponent {
/** @internal */
constructor(config) {
this.config = config;
/**
* Type d'erreur (404, 500,...).
*/
this.error = 500;
/**
* Conditionne l'affichage du bouton contactez-nous.
*/
this.showContact = true;
/**
* Conditionne l'affichage du bouton page d'accueil'.
*/
this.showBackToHome = false;
/**
* Indique que le bouton contact est cliqué.
*/
this.contactSelect = new EventEmitter();
/**
* Indique que le bouton page d'accueil est cliqué.
*/
this.backToHomeSelect = new EventEmitter();
}
get pictoPath() {
return this.artworkDirPath;
}
/**
* 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;
}
ngOnInit() {
if (this.artworkDirPath === undefined) {
this.artworkDirPath = this.config.artworkDirPath;
}
}
/** @internal */
onContact() {
this.contactSelect.emit();
}
/** @internal */
onHome() {
this.backToHomeSelect.emit();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrResponseComponent, deps: [{ token: DSFR_CONFIG_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrResponseComponent, isStandalone: true, selector: "dsfr-response", inputs: { heading: "heading", headingLevel: "headingLevel", error: "error", description: "description", detail: "detail", showContact: "showContact", showBackToHome: "showBackToHome", artworkDirPath: "artworkDirPath", imagePath: "imagePath", imageAlt: "imageAlt", pictoPath: "pictoPath" }, outputs: { contactSelect: "contactSelect", backToHomeSelect: "backToHomeSelect" }, ngImport: i0, template: "<div class=\"fr-container\">\n <div\n class=\"fr-my-7w fr-mt-md-12w fr-mb-md-10w fr-grid-row fr-grid-row--gutters fr-grid-row--middle fr-grid-row--center\">\n <div class=\"fr-py-0 fr-col-12 fr-col-md-6\">\n <!-- Titre du contenu -->\n <ng-container>\n <ng-container *ngTemplateOutlet=\"dsfrPageResponseHeading\"></ng-container>\n </ng-container>\n <p class=\"fr-text--sm fr-mb-3w\">Erreur {{ error }}</p>\n <p class=\"fr-text--lead fr-mb-3w\">\n {{ description ?? 'pageResponse.description' | dsfrI18n }}\n </p>\n <p class=\"fr-text--sm fr-mb-5w\">\n {{ detail ?? ('pageResponse.detail' | dsfrI18n) }}\n </p>\n <dsfr-buttons-group *ngIf=\"showBackToHome || showContact\" inline=\"always\">\n <dsfr-button\n type=\"button\"\n *ngIf=\"showBackToHome\"\n label=\"Page d'accueil\"\n variant=\"primary\"\n (click)=\"onHome()\"></dsfr-button>\n <dsfr-button\n type=\"button\"\n *ngIf=\"showContact\"\n [label]=\"'response.contactUs' | dsfrI18n\"\n variant=\"secondary\"\n (click)=\"onContact()\"></dsfr-button>\n </dsfr-buttons-group>\n </div>\n <div class=\"fr-col-12 fr-col-md-3 fr-col-offset-md-1 fr-px-6w fr-px-md-0 fr-py-0\">\n @if (imagePath) {\n <img class=\"fr-responsive-img\" [src]=\"imagePath\" [attr.alt]=\"imageAlt\" />\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"fr-responsive-img fr-artwork\"\n aria-hidden=\"true\"\n width=\"160\"\n height=\"200\"\n viewBox=\"0 0 160 200\"\n data-fr-js-ratio=\"true\">\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-motif'\"></use>\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-background'\"></use>\n <g transform=\"translate(40, 60)\">\n <use\n class=\"fr-artwork-decorative\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-decorative'\"></use>\n <use\n class=\"fr-artwork-minor\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-minor'\"></use>\n <use\n class=\"fr-artwork-major\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-major'\"></use>\n </g>\n </svg>\n }\n </div>\n </div>\n</div>\n\n<ng-template #dsfrPageResponseHeading>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchDefault>{{ heading }}</h1>\n <h2 *ngSwitchCase=\"'H2'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h2>\n <h3 *ngSwitchCase=\"'H3'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h3>\n <h4 *ngSwitchCase=\"'H4'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h4>\n <h5 *ngSwitchCase=\"'H5'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h5>\n <h6 *ngSwitchCase=\"'H6'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h6>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "buttonSize", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "buttonId", "ariaControls", "ariaPressed", "ariaHasPopup", "ariaExpanded", "tabIndex", "customClass", "buttonRole", "labelSrOnly", "size"] }, { kind: "component", type: DsfrButtonsGroupComponent, selector: "dsfr-buttons-group", inputs: ["inline", "alignment", "equisized", "buttonGroupSize", "groupMarkup", "size", "iconPosition"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrResponseComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-response', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, DsfrButtonComponent, DsfrButtonsGroupComponent, DsfrI18nPipe], template: "<div class=\"fr-container\">\n <div\n class=\"fr-my-7w fr-mt-md-12w fr-mb-md-10w fr-grid-row fr-grid-row--gutters fr-grid-row--middle fr-grid-row--center\">\n <div class=\"fr-py-0 fr-col-12 fr-col-md-6\">\n <!-- Titre du contenu -->\n <ng-container>\n <ng-container *ngTemplateOutlet=\"dsfrPageResponseHeading\"></ng-container>\n </ng-container>\n <p class=\"fr-text--sm fr-mb-3w\">Erreur {{ error }}</p>\n <p class=\"fr-text--lead fr-mb-3w\">\n {{ description ?? 'pageResponse.description' | dsfrI18n }}\n </p>\n <p class=\"fr-text--sm fr-mb-5w\">\n {{ detail ?? ('pageResponse.detail' | dsfrI18n) }}\n </p>\n <dsfr-buttons-group *ngIf=\"showBackToHome || showContact\" inline=\"always\">\n <dsfr-button\n type=\"button\"\n *ngIf=\"showBackToHome\"\n label=\"Page d'accueil\"\n variant=\"primary\"\n (click)=\"onHome()\"></dsfr-button>\n <dsfr-button\n type=\"button\"\n *ngIf=\"showContact\"\n [label]=\"'response.contactUs' | dsfrI18n\"\n variant=\"secondary\"\n (click)=\"onContact()\"></dsfr-button>\n </dsfr-buttons-group>\n </div>\n <div class=\"fr-col-12 fr-col-md-3 fr-col-offset-md-1 fr-px-6w fr-px-md-0 fr-py-0\">\n @if (imagePath) {\n <img class=\"fr-responsive-img\" [src]=\"imagePath\" [attr.alt]=\"imageAlt\" />\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"fr-responsive-img fr-artwork\"\n aria-hidden=\"true\"\n width=\"160\"\n height=\"200\"\n viewBox=\"0 0 160 200\"\n data-fr-js-ratio=\"true\">\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-motif'\"></use>\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-background'\"></use>\n <g transform=\"translate(40, 60)\">\n <use\n class=\"fr-artwork-decorative\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-decorative'\"></use>\n <use\n class=\"fr-artwork-minor\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-minor'\"></use>\n <use\n class=\"fr-artwork-major\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-major'\"></use>\n </g>\n </svg>\n }\n </div>\n </div>\n</div>\n\n<ng-template #dsfrPageResponseHeading>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchDefault>{{ heading }}</h1>\n <h2 *ngSwitchCase=\"'H2'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h2>\n <h3 *ngSwitchCase=\"'H3'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h3>\n <h4 *ngSwitchCase=\"'H4'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h4>\n <h5 *ngSwitchCase=\"'H5'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h5>\n <h6 *ngSwitchCase=\"'H6'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h6>\n </ng-container>\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DSFR_CONFIG_TOKEN]
}] }], propDecorators: { heading: [{
type: Input
}], headingLevel: [{
type: Input
}], error: [{
type: Input
}], description: [{
type: Input
}], detail: [{
type: Input
}], showContact: [{
type: Input
}], showBackToHome: [{
type: Input
}], artworkDirPath: [{
type: Input
}], imagePath: [{
type: Input
}], imageAlt: [{
type: Input
}], contactSelect: [{
type: Output
}], backToHomeSelect: [{
type: Output
}], pictoPath: [{
type: Input
}] } });
/**
* @deprecated use DsfrResponseComponent instead
*/
export class DsfrPageResponseComponent extends DsfrResponseComponent {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrPageResponseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrPageResponseComponent, selector: "dsfr-page-response", usesInheritance: true, ngImport: i0, template: "<div class=\"fr-container\">\n <div\n class=\"fr-my-7w fr-mt-md-12w fr-mb-md-10w fr-grid-row fr-grid-row--gutters fr-grid-row--middle fr-grid-row--center\">\n <div class=\"fr-py-0 fr-col-12 fr-col-md-6\">\n <!-- Titre du contenu -->\n <ng-container>\n <ng-container *ngTemplateOutlet=\"dsfrPageResponseHeading\"></ng-container>\n </ng-container>\n <p class=\"fr-text--sm fr-mb-3w\">Erreur {{ error }}</p>\n <p class=\"fr-text--lead fr-mb-3w\">\n {{ description ?? 'pageResponse.description' | dsfrI18n }}\n </p>\n <p class=\"fr-text--sm fr-mb-5w\">\n {{ detail ?? ('pageResponse.detail' | dsfrI18n) }}\n </p>\n <dsfr-buttons-group *ngIf=\"showBackToHome || showContact\" inline=\"always\">\n <dsfr-button\n type=\"button\"\n *ngIf=\"showBackToHome\"\n label=\"Page d'accueil\"\n variant=\"primary\"\n (click)=\"onHome()\"></dsfr-button>\n <dsfr-button\n type=\"button\"\n *ngIf=\"showContact\"\n [label]=\"'response.contactUs' | dsfrI18n\"\n variant=\"secondary\"\n (click)=\"onContact()\"></dsfr-button>\n </dsfr-buttons-group>\n </div>\n <div class=\"fr-col-12 fr-col-md-3 fr-col-offset-md-1 fr-px-6w fr-px-md-0 fr-py-0\">\n @if (imagePath) {\n <img class=\"fr-responsive-img\" [src]=\"imagePath\" [attr.alt]=\"imageAlt\" />\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"fr-responsive-img fr-artwork\"\n aria-hidden=\"true\"\n width=\"160\"\n height=\"200\"\n viewBox=\"0 0 160 200\"\n data-fr-js-ratio=\"true\">\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-motif'\"></use>\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-background'\"></use>\n <g transform=\"translate(40, 60)\">\n <use\n class=\"fr-artwork-decorative\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-decorative'\"></use>\n <use\n class=\"fr-artwork-minor\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-minor'\"></use>\n <use\n class=\"fr-artwork-major\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-major'\"></use>\n </g>\n </svg>\n }\n </div>\n </div>\n</div>\n\n<ng-template #dsfrPageResponseHeading>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchDefault>{{ heading }}</h1>\n <h2 *ngSwitchCase=\"'H2'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h2>\n <h3 *ngSwitchCase=\"'H3'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h3>\n <h4 *ngSwitchCase=\"'H4'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h4>\n <h5 *ngSwitchCase=\"'H5'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h5>\n <h6 *ngSwitchCase=\"'H6'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h6>\n </ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "buttonSize", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "buttonId", "ariaControls", "ariaPressed", "ariaHasPopup", "ariaExpanded", "tabIndex", "customClass", "buttonRole", "labelSrOnly", "size"] }, { kind: "component", type: i3.DsfrButtonsGroupComponent, selector: "dsfr-buttons-group", inputs: ["inline", "alignment", "equisized", "buttonGroupSize", "groupMarkup", "size", "iconPosition"] }, { kind: "pipe", type: i4.DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrPageResponseComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-page-response', encapsulation: ViewEncapsulation.None, template: "<div class=\"fr-container\">\n <div\n class=\"fr-my-7w fr-mt-md-12w fr-mb-md-10w fr-grid-row fr-grid-row--gutters fr-grid-row--middle fr-grid-row--center\">\n <div class=\"fr-py-0 fr-col-12 fr-col-md-6\">\n <!-- Titre du contenu -->\n <ng-container>\n <ng-container *ngTemplateOutlet=\"dsfrPageResponseHeading\"></ng-container>\n </ng-container>\n <p class=\"fr-text--sm fr-mb-3w\">Erreur {{ error }}</p>\n <p class=\"fr-text--lead fr-mb-3w\">\n {{ description ?? 'pageResponse.description' | dsfrI18n }}\n </p>\n <p class=\"fr-text--sm fr-mb-5w\">\n {{ detail ?? ('pageResponse.detail' | dsfrI18n) }}\n </p>\n <dsfr-buttons-group *ngIf=\"showBackToHome || showContact\" inline=\"always\">\n <dsfr-button\n type=\"button\"\n *ngIf=\"showBackToHome\"\n label=\"Page d'accueil\"\n variant=\"primary\"\n (click)=\"onHome()\"></dsfr-button>\n <dsfr-button\n type=\"button\"\n *ngIf=\"showContact\"\n [label]=\"'response.contactUs' | dsfrI18n\"\n variant=\"secondary\"\n (click)=\"onContact()\"></dsfr-button>\n </dsfr-buttons-group>\n </div>\n <div class=\"fr-col-12 fr-col-md-3 fr-col-offset-md-1 fr-px-6w fr-px-md-0 fr-py-0\">\n @if (imagePath) {\n <img class=\"fr-responsive-img\" [src]=\"imagePath\" [attr.alt]=\"imageAlt\" />\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"fr-responsive-img fr-artwork\"\n aria-hidden=\"true\"\n width=\"160\"\n height=\"200\"\n viewBox=\"0 0 160 200\"\n data-fr-js-ratio=\"true\">\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-motif'\"></use>\n <use class=\"fr-artwork-motif\" [attr.href]=\"pictoPath + '/background/ovoid.svg#artwork-background'\"></use>\n <g transform=\"translate(40, 60)\">\n <use\n class=\"fr-artwork-decorative\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-decorative'\"></use>\n <use\n class=\"fr-artwork-minor\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-minor'\"></use>\n <use\n class=\"fr-artwork-major\"\n [attr.href]=\"pictoPath + '/pictograms/system/technical-error.svg#artwork-major'\"></use>\n </g>\n </svg>\n }\n </div>\n </div>\n</div>\n\n<ng-template #dsfrPageResponseHeading>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h1 *ngSwitchDefault>{{ heading }}</h1>\n <h2 *ngSwitchCase=\"'H2'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h2>\n <h3 *ngSwitchCase=\"'H3'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h3>\n <h4 *ngSwitchCase=\"'H4'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h4>\n <h5 *ngSwitchCase=\"'H5'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h5>\n <h6 *ngSwitchCase=\"'H6'\">{{ heading ?? ('pageResponse.heading' | dsfrI18n) }}</h6>\n </ng-container>\n</ng-template>\n" }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL3BhZ2VzL3Jlc3BvbnNlL3Jlc3BvbnNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9wYWdlcy9yZXNwb25zZS9yZXNwb25zZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEYsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7OztBQVVyRSxNQUFNLE9BQU8scUJBQXFCO0lBMkRoQyxnQkFBZ0I7SUFDaEIsWUFBK0MsTUFBa0I7UUFBbEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQW5EakU7O1dBRUc7UUFDTSxVQUFLLEdBQUcsR0FBRyxDQUFDO1FBWXJCOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDNUI7O1dBRUc7UUFDTSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQWlCaEM7O1dBRUc7UUFDTyxrQkFBYSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25FOztXQUVHO1FBQ08scUJBQWdCLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7SUFLRixDQUFDO0lBRXJFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBYSxTQUFTLENBQUMsSUFBWTtRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQVM7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTTtRQUNKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQTNGVSxxQkFBcUIsa0JBNERaLGlCQUFpQjttR0E1RDFCLHFCQUFxQiw4YkNkbEMseW5HQXVFQSwyQ0QzRFksWUFBWSxzakJBQUUsbUJBQW1CLGtYQUFFLHlCQUF5QixrS0FBRSxZQUFZOzs0RkFFekUscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNFLGVBQWUsaUJBRVYsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxDQUFDOzswQkE4RHhFLE1BQU07MkJBQUMsaUJBQWlCO3lDQXhENUIsT0FBTztzQkFBZixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUcsY0FBYztzQkFBdEIsS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLSSxhQUFhO3NCQUF0QixNQUFNO2dCQUlHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFrQk0sU0FBUztzQkFBckIsS0FBSzs7QUFxQlI7O0dBRUc7QUFNSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEscUJBQXFCOytHQUF2RCx5QkFBeUI7bUdBQXpCLHlCQUF5QixpRkNwSHRDLHluR0F1RUE7OzRGRDZDYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usb0JBQW9CLGlCQUVmLGlCQUFpQixDQUFDLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckJ1dHRvbkNvbXBvbmVudCwgRHNmckJ1dHRvbnNHcm91cENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgRHNmckhlYWRpbmdMZXZlbCwgRHNmckkxOG5QaXBlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IERTRlJfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2NvbmZpZy9jb25maWctdG9rZW4nO1xuaW1wb3J0IHsgRHNmckNvbmZpZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25maWcvY29uZmlnLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1yZXNwb25zZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXNwb25zZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIERzZnJCdXR0b25Db21wb25lbnQsIERzZnJCdXR0b25zR3JvdXBDb21wb25lbnQsIERzZnJJMThuUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJSZXNwb25zZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBUaXRyZSBkZSBsYSBwYWdlIChwYXIgZMOpZmF1dCA6ICdFcnJldXIgaW5hdHRlbmR1ZScpLlxuICAgKi9cbiAgQElucHV0KCkgaGVhZGluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBMZSBuaXZlYXUgZGUgdGl0cmUgZGV2YW50IMOqdHJlIHV0aWxpc8OpLiAqL1xuICBASW5wdXQoKSBoZWFkaW5nTGV2ZWw6IERzZnJIZWFkaW5nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFR5cGUgZCdlcnJldXIgKDQwNCwgNTAwLC4uLikuXG4gICAqL1xuICBASW5wdXQoKSBlcnJvciA9IDUwMDtcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gZGUgbGEgcGFnZSAocGFyIGTDqWZhdXQ6ICdFc3NheWV6IGRlIHJhZnJhaWNoaXIgbGEgcGFnZSBvdSBiaWVuIHJlc3NheWV6IHBsdXMgdGFyZC4nKS5cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIETDqXRhaWwgZGUgbGEgcGFnZSAocGFyIGTDqWZhdXQgOiAnRMOpc29sw6ksIGxlIHNlcnZpY2UgcmVuY29udHJlIHVuIHByb2JsZcyAbWUsIG5vdXMgdHJhdmFpbGxvbnMgcG91ciBsZSByZcyBc291ZHJlIGxlIHBsdXMgcmFwaWRlbWVudCBwb3NzaWJsZS4nKS5cbiAgICovXG4gIEBJbnB1dCgpIGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDb25kaXRpb25uZSBsJ2FmZmljaGFnZSBkdSBib3V0b24gY29udGFjdGV6LW5vdXMuXG4gICAqL1xuICBASW5wdXQoKSBzaG93Q29udGFjdCA9IHRydWU7XG4gIC8qKlxuICAgKiBDb25kaXRpb25uZSBsJ2FmZmljaGFnZSBkdSBib3V0b24gcGFnZSBkJ2FjY3VlaWwnLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd0JhY2tUb0hvbWUgPSBmYWxzZTtcblxuICAvKipcbiAgICogQ2hlbWluIHZlcnMgbGUgcsOpcGVydG9pcmUgZXhwb3NhbnQgbGVzIHBpY3RvZ3JhbW1lcyBpbGx1c3RyYXRpZnMgRFNGUi5cbiAgICovXG4gIEBJbnB1dCgpIGFydHdvcmtEaXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoZW1pbiBkZSBsJ2ltYWdlLlxuICAgKi9cbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRleHRlIGFsdGVybmF0aWYgZGUgbCdpbWFnZS5cbiAgICovXG4gIEBJbnB1dCgpIGltYWdlQWx0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGlxdWUgcXVlIGxlIGJvdXRvbiBjb250YWN0IGVzdCBjbGlxdcOpLlxuICAgKi9cbiAgQE91dHB1dCgpIGNvbnRhY3RTZWxlY3Q6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKipcbiAgICogSW5kaXF1ZSBxdWUgbGUgYm91dG9uIHBhZ2UgZCdhY2N1ZWlsIGVzdCBjbGlxdcOpLlxuICAgKi9cbiAgQE91dHB1dCgpIGJhY2tUb0hvbWVTZWxlY3Q6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi8gbm9GaXJzdE5hbWVNb2RlbDogYm9vbGVhbjtcblxuICAvKiogQGludGVybmFsICovXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRFNGUl9DT05GSUdfVE9LRU4pIHByaXZhdGUgY29uZmlnOiBEc2ZyQ29uZmlnKSB7fVxuXG4gIGdldCBwaWN0b1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcnR3b3JrRGlyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVtaW4gZGVzIHBpY3RvZ3JhbW1lcyAoZHUgY29tcG9zYW50IGRpc3BsYXkpIHJlbnNlaWduw6kgcGFyIGxlIGTDqXZlbG9wcGV1ci5cbiAgICpcbiAgICogTm90ZTogY2UgY2hlbWluIGRvaXQgcGVybWV0dHJlIGRlIHLDqWN1cMOpcmVyIGRpcmVjdGVtZW50IGxlcyBmaWNoaWVycyBTVkcgc3VpdmFudHMgOiBtb29uLnN2Zywgc3VuLnN2Zywgc3lzdGVtLnN2Z1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFydHdvcmtEaXJQYXRoYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHBpY3RvUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFydHdvcmtEaXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFydHdvcmtEaXJQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXJ0d29ya0RpclBhdGggPSB0aGlzLmNvbmZpZy5hcnR3b3JrRGlyUGF0aDtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uQ29udGFjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhY3RTZWxlY3QuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkhvbWUoKTogdm9pZCB7XG4gICAgdGhpcy5iYWNrVG9Ib21lU2VsZWN0LmVtaXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBEc2ZyUmVzcG9uc2VDb21wb25lbnQgaW5zdGVhZFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLXBhZ2UtcmVzcG9uc2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzcG9uc2UuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyUGFnZVJlc3BvbnNlQ29tcG9uZW50IGV4dGVuZHMgRHNmclJlc3BvbnNlQ29tcG9uZW50IHt9XG4iLCI8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImZyLW15LTd3IGZyLW10LW1kLTEydyBmci1tYi1tZC0xMHcgZnItZ3JpZC1yb3cgZnItZ3JpZC1yb3ctLWd1dHRlcnMgZnItZ3JpZC1yb3ctLW1pZGRsZSBmci1ncmlkLXJvdy0tY2VudGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLXB5LTAgZnItY29sLTEyIGZyLWNvbC1tZC02XCI+XG4gICAgICA8IS0tIFRpdHJlIGR1IGNvbnRlbnUgLS0+XG4gICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHNmclBhZ2VSZXNwb25zZUhlYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHAgY2xhc3M9XCJmci10ZXh0LS1zbSBmci1tYi0zd1wiPkVycmV1ciB7eyBlcnJvciB9fTwvcD5cbiAgICAgIDxwIGNsYXNzPVwiZnItdGV4dC0tbGVhZCBmci1tYi0zd1wiPlxuICAgICAgICB7eyBkZXNjcmlwdGlvbiA/PyAncGFnZVJlc3BvbnNlLmRlc2NyaXB0aW9uJyB8IGRzZnJJMThuIH19XG4gICAgICA8L3A+XG4gICAgICA8cCBjbGFzcz1cImZyLXRleHQtLXNtIGZyLW1iLTV3XCI+XG4gICAgICAgIHt7IGRldGFpbCA/PyAoJ3BhZ2VSZXNwb25zZS5kZXRhaWwnIHwgZHNmckkxOG4pIH19XG4gICAgICA8L3A+XG4gICAgICA8ZHNmci1idXR0b25zLWdyb3VwICpuZ0lmPVwic2hvd0JhY2tUb0hvbWUgfHwgc2hvd0NvbnRhY3RcIiBpbmxpbmU9XCJhbHdheXNcIj5cbiAgICAgICAgPGRzZnItYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCJzaG93QmFja1RvSG9tZVwiXG4gICAgICAgICAgbGFiZWw9XCJQYWdlIGQnYWNjdWVpbFwiXG4gICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIlxuICAgICAgICAgIChjbGljayk9XCJvbkhvbWUoKVwiPjwvZHNmci1idXR0b24+XG4gICAgICAgIDxkc2ZyLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICpuZ0lmPVwic2hvd0NvbnRhY3RcIlxuICAgICAgICAgIFtsYWJlbF09XCIncmVzcG9uc2UuY29udGFjdFVzJyB8IGRzZnJJMThuXCJcbiAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Db250YWN0KClcIj48L2RzZnItYnV0dG9uPlxuICAgICAgPC9kc2ZyLWJ1dHRvbnMtZ3JvdXA+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtMyBmci1jb2wtb2Zmc2V0LW1kLTEgZnItcHgtNncgZnItcHgtbWQtMCBmci1weS0wXCI+XG4gICAgICBAaWYgKGltYWdlUGF0aCkge1xuICAgICAgICA8aW1nIGNsYXNzPVwiZnItcmVzcG9uc2l2ZS1pbWdcIiBbc3JjXT1cImltYWdlUGF0aFwiIFthdHRyLmFsdF09XCJpbWFnZUFsdFwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgIGNsYXNzPVwiZnItcmVzcG9uc2l2ZS1pbWcgZnItYXJ0d29ya1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICB3aWR0aD1cIjE2MFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjAwXCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2MCAyMDBcIlxuICAgICAgICAgIGRhdGEtZnItanMtcmF0aW89XCJ0cnVlXCI+XG4gICAgICAgICAgPHVzZSBjbGFzcz1cImZyLWFydHdvcmstbW90aWZcIiBbYXR0ci5ocmVmXT1cInBpY3RvUGF0aCArICcvYmFja2dyb3VuZC9vdm9pZC5zdmcjYXJ0d29yay1tb3RpZidcIj48L3VzZT5cbiAgICAgICAgICA8dXNlIGNsYXNzPVwiZnItYXJ0d29yay1tb3RpZlwiIFthdHRyLmhyZWZdPVwicGljdG9QYXRoICsgJy9iYWNrZ3JvdW5kL292b2lkLnN2ZyNhcnR3b3JrLWJhY2tncm91bmQnXCI+PC91c2U+XG4gICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDQwLCA2MClcIj5cbiAgICAgICAgICAgIDx1c2VcbiAgICAgICAgICAgICAgY2xhc3M9XCJmci1hcnR3b3JrLWRlY29yYXRpdmVcIlxuICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cInBpY3RvUGF0aCArICcvcGljdG9ncmFtcy9zeXN0ZW0vdGVjaG5pY2FsLWVycm9yLnN2ZyNhcnR3b3JrLWRlY29yYXRpdmUnXCI+PC91c2U+XG4gICAgICAgICAgICA8dXNlXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnItYXJ0d29yay1taW5vclwiXG4gICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwicGljdG9QYXRoICsgJy9waWN0b2dyYW1zL3N5c3RlbS90ZWNobmljYWwtZXJyb3Iuc3ZnI2FydHdvcmstbWlub3InXCI+PC91c2U+XG4gICAgICAgICAgICA8dXNlXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnItYXJ0d29yay1tYWpvclwiXG4gICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwicGljdG9QYXRoICsgJy9waWN0b2dyYW1zL3N5c3RlbS90ZWNobmljYWwtZXJyb3Iuc3ZnI2FydHdvcmstbWFqb3InXCI+PC91c2U+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkc2ZyUGFnZVJlc3BvbnNlSGVhZGluZz5cbiAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaGVhZGluZ0xldmVsXCI+XG4gICAgPGgxICpuZ1N3aXRjaERlZmF1bHQ+e3sgaGVhZGluZyB9fTwvaDE+XG4gICAgPGgyICpuZ1N3aXRjaENhc2U9XCInSDInXCI+e3sgaGVhZGluZyA/PyAoJ3BhZ2VSZXNwb25zZS5oZWFkaW5nJyB8IGRzZnJJMThuKSB9fTwvaDI+XG4gICAgPGgzICpuZ1N3aXRjaENhc2U9XCInSDMnXCI+e3sgaGVhZGluZyA/PyAoJ3BhZ2VSZXNwb25zZS5oZWFkaW5nJyB8IGRzZnJJMThuKSB9fTwvaDM+XG4gICAgPGg0ICpuZ1N3aXRjaENhc2U9XCInSDQnXCI+e3sgaGVhZGluZyA/PyAoJ3BhZ2VSZXNwb25zZS5oZWFkaW5nJyB8IGRzZnJJMThuKSB9fTwvaDQ+XG4gICAgPGg1ICpuZ1N3aXRjaENhc2U9XCInSDUnXCI+e3sgaGVhZGluZyA/PyAoJ3BhZ2VSZXNwb25zZS5oZWFkaW5nJyB8IGRzZnJJMThuKSB9fTwvaDU+XG4gICAgPGg2ICpuZ1N3aXRjaENhc2U9XCInSDYnXCI+e3sgaGVhZGluZyA/PyAoJ3BhZ2VSZXNwb25zZS5oZWFkaW5nJyB8IGRzZnJJMThuKSB9fTwvaDY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==