@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).
180 lines • 29.5 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation } from '@angular/core';
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { DsfrFormFieldsetComponent, DsfrFormFieldsetElementDirective, DsfrFormInputComponent } from '../../forms';
import { DefaultValueAccessorComponent, DsfrI18nPipe, DsfrSeverityConst, } from '../../shared';
import { DateModel } from './date.model';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "../../shared/services/logger.service";
import * as i3 from "@angular/forms";
const PATH_ERR_I18N = {
err_invalid_format_day: 'date.error.invalid.format_day',
err_invalid_format_month: 'date.error.invalid.format_month',
err_invalid_format_year: 'date.error.invalid.format_year',
err_invalid_day: 'date.error.invalid.day',
err_invalid_month: 'date.error.invalid.month',
err_invalid_date: 'date.error.invalid.date',
err_required: 'date.error.required',
};
export class DsfrDateComponent extends DefaultValueAccessorComponent {
/** @internal */
constructor(i18n, logger) {
super();
this.i18n = i18n;
this.logger = logger;
/**
* Indique si les champs de saisie doivent être auto-complétés à partir de la date de naissance de l'utilisateur.
*/
this.autocomplete = false;
/**
* Indique si la date est obligatoire.
*/
this.required = false;
/**
* Message d'information lié au composant
*/
this.message = undefined;
/**
* Signale le changement de date.
*/
// Certainement inutile vs ngModelChange, à voir !
this.dateChange = new EventEmitter();
/** @internal */ this.dateModel = new DateModel(); // View-Model
/** @internal */ this.validationErrors = null;
/** Permet de stocker la fonction pouvant être appelée pour forcer une revalidation. */
this.fnOnValidatorChange = () => { };
}
get errors() {
const internalError = this.validationErrors === null ? [] : this.validationErrors.map((err) => Object.values(err)[0]);
return internalError.length > 0 ? internalError : this.error;
}
/**
* Permet de récupérer le message de validation s'il existe
* @deprecated (since 1.15) utiliser message/messageSeverity à la place
*/
get valid() {
if (this.messageSeverity === DsfrSeverityConst.VALID && typeof this.message === 'string') {
return this.message;
}
else if (this.messageSeverity === DsfrSeverityConst.VALID && Array.isArray(this.message)) {
return this.message[0];
}
else {
return undefined;
}
}
/**
* Positionne le champ en statut `VALID` avec le message indiqué.
* @deprecated (since 1.15) utiliser message/messageSeverity à la place
*/
set valid(value) {
if (value && !this.message && !this.messageSeverity) {
this.message = value;
this.messageSeverity = DsfrSeverityConst.VALID;
}
}
// Sur changement de la date, on réécrit jour mois année
/** @internal */
writeValue(value) {
// Bien que la value soit de type date, le développeur peut, à notre insu, nous envoyer une chaine ou un nombre (comme Storybook), ex : Date.now()
this.dateModel = DateModel.of(value, this.logger);
super.writeValue(this.dateModel.toDate());
this.validationErrors = this.internalValidate(); // la validation doit être rejouée sur une modification programmatique
this.dateChange.emit(this.value);
}
// Sur changement du modèle, c.-à-d. jour, mois ou année, on récrit la date
/** @internal */
onFocusOut() {
const { fullYear, monthNum, dayNum } = this.dateModel;
const hourTimezoneOffset = new Date(fullYear, monthNum - 1, dayNum).getTimezoneOffset() / 60;
this.validationErrors = this.internalValidate();
this.value = this.dateModel.toDate(hourTimezoneOffset);
this.dateChange.emit(this.value);
}
/** @internal */
registerOnValidatorChange(fn) {
this.fnOnValidatorChange = fn;
}
/** @internal */
validate(control) {
return this.internalValidate();
}
/**
* Valide le composant et retourne ValidationErrors
*/
internalValidate() {
const errors = this.dateModel.validate(this.required);
// Pas d'erreur, on retourne null
if (errors.length === 0)
return null;
// On transforme la liste des codes d'erreur en ValidationErrors
return errors.map((codeErr) => {
// @ts-ignore
const pathErr = PATH_ERR_I18N[codeErr];
const labelErr = this.i18n.t(pathErr);
const validationErr = {};
// @ts-ignore
validationErr[codeErr] = labelErr;
return validationErr;
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDateComponent, deps: [{ token: i1.DsfrI18nService }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DsfrDateComponent, isStandalone: true, selector: "dsfr-date", inputs: { autocomplete: "autocomplete", error: "error", hint: "hint", legend: "legend", required: "required", readonly: "readonly", legendRegular: "legendRegular", message: "message", messageSeverity: "messageSeverity", valid: "valid" }, outputs: { dateChange: "dateChange" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
], usesInheritance: true, ngImport: i0, template: "<dsfr-fieldset\n [disabled]=\"disabled\"\n [legend]=\"legend\"\n [legendRegular]=\"legendRegular\"\n [hint]=\"hint\"\n [error]=\"errors\"\n [valid]=\"valid\"\n [message]=\"message\"\n [messageSeverity]=\"messageSeverity\">\n <!-- Day -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"'date.day.label' | dsfrI18n\"\n [maxLength]=\"2\"\n [hint]=\"'date.day.hint' | dsfrI18n\"\n [autocomplete]=\"autocomplete ? 'bday-day' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"dateModel.dayNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Month -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"'date.month.label' | dsfrI18n\"\n [maxLength]=\"2\"\n [hint]=\"'date.month.hint' | dsfrI18n\"\n [autocomplete]=\"autocomplete ? 'bday-month' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"dateModel.monthNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Year -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year'\"\n [label]=\"'date.year.label' | dsfrI18n\"\n [maxLength]=\"4\"\n [hint]=\"'date.year.hint' | dsfrI18n\"\n [autocomplete]=\"autocomplete ? 'bday-year' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"dateModel.fullYear\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n</dsfr-fieldset>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsfrFormFieldsetComponent, selector: "dsfr-fieldset, dsfr-form-fieldset", inputs: ["inline"] }, { kind: "component", type: DsfrFormInputComponent, selector: "dsfr-form-input", inputs: ["rows", "labelSrOnly", "width", "textarea"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "directive", type: DsfrFormFieldsetElementDirective, selector: "[fieldsetElement]", inputs: ["fieldsetElement"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDateComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-date', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
], standalone: true, imports: [
CommonModule,
FormsModule,
DsfrFormFieldsetComponent,
DsfrFormInputComponent,
DsfrI18nPipe,
DsfrFormFieldsetElementDirective,
], template: "<dsfr-fieldset\n [disabled]=\"disabled\"\n [legend]=\"legend\"\n [legendRegular]=\"legendRegular\"\n [hint]=\"hint\"\n [error]=\"errors\"\n [valid]=\"valid\"\n [message]=\"message\"\n [messageSeverity]=\"messageSeverity\">\n <!-- Day -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"'date.day.label' | dsfrI18n\"\n [maxLength]=\"2\"\n [hint]=\"'date.day.hint' | dsfrI18n\"\n [autocomplete]=\"autocomplete ? 'bday-day' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"dateModel.dayNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Month -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"'date.month.label' | dsfrI18n\"\n [maxLength]=\"2\"\n [hint]=\"'date.month.hint' | dsfrI18n\"\n [autocomplete]=\"autocomplete ? 'bday-month' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"dateModel.monthNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Year -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year'\"\n [label]=\"'date.year.label' | dsfrI18n\"\n [maxLength]=\"4\"\n [hint]=\"'date.year.hint' | dsfrI18n\"\n [autocomplete]=\"autocomplete ? 'bday-year' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"dateModel.fullYear\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n</dsfr-fieldset>\n" }]
}], ctorParameters: () => [{ type: i1.DsfrI18nService }, { type: i2.LoggerService }], propDecorators: { autocomplete: [{
type: Input
}], error: [{
type: Input
}], hint: [{
type: Input
}], legend: [{
type: Input
}], required: [{
type: Input
}], readonly: [{
type: Input
}], legendRegular: [{
type: Input
}], message: [{
type: Input
}], messageSeverity: [{
type: Input
}], dateChange: [{
type: Output
}], valid: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvcGF0dGVybnMvZGF0ZS9kYXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9wYXR0ZXJucy9kYXRlL2RhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFFTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQ0FBZ0MsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsSCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLFlBQVksRUFHWixpQkFBaUIsR0FDbEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7QUFFekMsTUFBTSxhQUFhLEdBQUc7SUFDcEIsc0JBQXNCLEVBQUUsK0JBQStCO0lBQ3ZELHdCQUF3QixFQUFFLGlDQUFpQztJQUMzRCx1QkFBdUIsRUFBRSxnQ0FBZ0M7SUFDekQsZUFBZSxFQUFFLHdCQUF3QjtJQUN6QyxpQkFBaUIsRUFBRSwwQkFBMEI7SUFDN0MsZ0JBQWdCLEVBQUUseUJBQXlCO0lBQzNDLFlBQVksRUFBRSxxQkFBcUI7Q0FDcEMsQ0FBQztBQTRCRixNQUFNLE9BQU8saUJBQWtCLFNBQVEsNkJBQW1DO0lBbUR4RSxnQkFBZ0I7SUFDaEIsWUFDUyxJQUFxQixFQUNwQixNQUFxQjtRQUU3QixLQUFLLEVBQUUsQ0FBQztRQUhELFNBQUksR0FBSixJQUFJLENBQWlCO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFyRC9COztXQUVHO1FBQ00saUJBQVksR0FBRyxLQUFLLENBQUM7UUFpQjlCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQVExQjs7V0FFRztRQUNNLFlBQU8sR0FBa0MsU0FBUyxDQUFDO1FBTzVEOztXQUVHO1FBQ0gsa0RBQWtEO1FBQ3hDLGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU5RCxnQkFBZ0IsQ0FBQyxjQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLGFBQWE7UUFDM0QsZ0JBQWdCLENBQUMscUJBQWdCLEdBQTRCLElBQUksQ0FBQztRQXlFbEUsdUZBQXVGO1FBQy9FLHdCQUFtQixHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQWxFdkMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RyxPQUFPLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYSxLQUFLLENBQUMsS0FBYTtRQUM5QixJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsZ0JBQWdCO0lBQ2hCLFVBQVUsQ0FBQyxLQUF1QjtRQUNoQyxrSkFBa0o7UUFDbEosSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsc0VBQXNFO1FBRXZILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLGdCQUFnQjtJQUNoQixVQUFVO1FBQ1IsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0RCxNQUFNLGtCQUFrQixHQUFHLElBQUksSUFBSSxDQUFDLFFBQVMsRUFBRSxRQUFTLEdBQUcsQ0FBQyxFQUFFLE1BQU8sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBRWhHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIseUJBQXlCLENBQUMsRUFBYztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsUUFBUSxDQUFDLE9BQXdCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUtEOztPQUVHO0lBQ0ssZ0JBQWdCO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0RCxpQ0FBaUM7UUFDakMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVyQyxnRUFBZ0U7UUFDaEUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUIsYUFBYTtZQUNiLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDekIsYUFBYTtZQUNiLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDbEMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQWhKVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2VUF0QmpCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsaURDOUNILG9yREE4Q0EsMkNER0ksWUFBWSw4QkFDWixXQUFXLDRqQkFDWCx5QkFBeUIsa0dBQ3pCLHNCQUFzQiw2R0FDdEIsWUFBWSxpREFDWixnQ0FBZ0M7OzRGQUd2QixpQkFBaUI7a0JBMUI3QixTQUFTOytCQUNFLFdBQVcsaUJBRU4saUJBQWlCLENBQUMsSUFBSSxhQUMxQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs0QkFDaEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixjQUNXLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gseUJBQXlCO3dCQUN6QixzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osZ0NBQWdDO3FCQUNqQztnSEFNUSxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxlQUFlO3NCQUF2QixLQUFLO2dCQU1JLFVBQVU7c0JBQW5CLE1BQU07Z0JBcUNNLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEc2ZyRm9ybUZpZWxkc2V0Q29tcG9uZW50LCBEc2ZyRm9ybUZpZWxkc2V0RWxlbWVudERpcmVjdGl2ZSwgRHNmckZvcm1JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm1zJztcbmltcG9ydCB7XG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yQ29tcG9uZW50LFxuICBEc2ZySTE4blBpcGUsXG4gIERzZnJJMThuU2VydmljZSxcbiAgRHNmclNldmVyaXR5LFxuICBEc2ZyU2V2ZXJpdHlDb25zdCxcbn0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZU1vZGVsIH0gZnJvbSAnLi9kYXRlLm1vZGVsJztcblxuY29uc3QgUEFUSF9FUlJfSTE4TiA9IHtcbiAgZXJyX2ludmFsaWRfZm9ybWF0X2RheTogJ2RhdGUuZXJyb3IuaW52YWxpZC5mb3JtYXRfZGF5JyxcbiAgZXJyX2ludmFsaWRfZm9ybWF0X21vbnRoOiAnZGF0ZS5lcnJvci5pbnZhbGlkLmZvcm1hdF9tb250aCcsXG4gIGVycl9pbnZhbGlkX2Zvcm1hdF95ZWFyOiAnZGF0ZS5lcnJvci5pbnZhbGlkLmZvcm1hdF95ZWFyJyxcbiAgZXJyX2ludmFsaWRfZGF5OiAnZGF0ZS5lcnJvci5pbnZhbGlkLmRheScsXG4gIGVycl9pbnZhbGlkX21vbnRoOiAnZGF0ZS5lcnJvci5pbnZhbGlkLm1vbnRoJyxcbiAgZXJyX2ludmFsaWRfZGF0ZTogJ2RhdGUuZXJyb3IuaW52YWxpZC5kYXRlJyxcbiAgZXJyX3JlcXVpcmVkOiAnZGF0ZS5lcnJvci5yZXF1aXJlZCcsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWRhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHNmckRhdGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHNmckRhdGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBEc2ZyRm9ybUZpZWxkc2V0Q29tcG9uZW50LFxuICAgIERzZnJGb3JtSW5wdXRDb21wb25lbnQsXG4gICAgRHNmckkxOG5QaXBlLFxuICAgIERzZnJGb3JtRmllbGRzZXRFbGVtZW50RGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRGF0ZUNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yQ29tcG9uZW50PERhdGU+IGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIEluZGlxdWUgc2kgbGVzIGNoYW1wcyBkZSBzYWlzaWUgZG9pdmVudCDDqnRyZSBhdXRvLWNvbXBsw6l0w6lzIMOgIHBhcnRpciBkZSBsYSBkYXRlIGRlIG5haXNzYW5jZSBkZSBsJ3V0aWxpc2F0ZXVyLlxuICAgKi9cbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ubmUgbGUgY2hhbXAgZW4gc3RhdHV0IGBFUlJPUmAgYXZlYyBsZSBtZXNzYWdlIGluZGlxdcOpLlxuICAgKi9cbiAgQElucHV0KCkgZXJyb3I6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUZXh0ZSBkZSBkZXNjcmlwdGlvbiBhZGRpdGlvbm5lbCBkdSBmaWVsZHNldC5cbiAgICovXG4gIEBJbnB1dCgpIGhpbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogTMOpZ2VuZGUgZHUgZmllbGRzZXQuXG4gICAqL1xuICBASW5wdXQoKSBsZWdlbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaXF1ZSBzaSBsYSBkYXRlIGVzdCBvYmxpZ2F0b2lyZS5cbiAgICovXG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgLyoqIEF0dHJpYnV0IHJlYWRvbmx5IGRlIGwnaW5wdXQgKi9cbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW47XG5cbiAgLyoqIFBlcm1ldCBkZSByw6l0YWJsaXIgdW5lIGdyYWlzc2Ugc3RhbmRhcmQgc3VyIGxhIGzDqWdlbmRlLiAqL1xuICBASW5wdXQoKSBsZWdlbmRSZWd1bGFyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGQnaW5mb3JtYXRpb24gbGnDqSBhdSBjb21wb3NhbnRcbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXByw6lzZW50ZSBsYSBzw6l2w6lyaXTDqSBkdSBtZXNzYWdlLlxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVNldmVyaXR5OiBEc2ZyU2V2ZXJpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNpZ25hbGUgbGUgY2hhbmdlbWVudCBkZSBkYXRlLlxuICAgKi9cbiAgLy8gQ2VydGFpbmVtZW50IGludXRpbGUgdnMgbmdNb2RlbENoYW5nZSwgw6Agdm9pciAhXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqLyBkYXRlTW9kZWwgPSBuZXcgRGF0ZU1vZGVsKCk7IC8vIFZpZXctTW9kZWxcbiAgLyoqIEBpbnRlcm5hbCAqLyB2YWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaTE4bjogRHNmckkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0IGVycm9ycygpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW50ZXJuYWxFcnJvciA9XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPT09IG51bGwgPyBbXSA6IHRoaXMudmFsaWRhdGlvbkVycm9ycy5tYXAoKGVycjoge30pID0+IE9iamVjdC52YWx1ZXMoZXJyKVswXSk7XG4gICAgcmV0dXJuIGludGVybmFsRXJyb3IubGVuZ3RoID4gMCA/IGludGVybmFsRXJyb3IgOiB0aGlzLmVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1ldCBkZSByw6ljdXDDqXJlciBsZSBtZXNzYWdlIGRlIHZhbGlkYXRpb24gcydpbCBleGlzdGVcbiAgICogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuMTUpIHV0aWxpc2VyIG1lc3NhZ2UvbWVzc2FnZVNldmVyaXR5IMOgIGxhIHBsYWNlXG4gICAqL1xuICBnZXQgdmFsaWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlU2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eUNvbnN0LlZBTElEICYmIHR5cGVvZiB0aGlzLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tZXNzYWdlU2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eUNvbnN0LlZBTElEICYmIEFycmF5LmlzQXJyYXkodGhpcy5tZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9zaXRpb25uZSBsZSBjaGFtcCBlbiBzdGF0dXQgYFZBTElEYCBhdmVjIGxlIG1lc3NhZ2UgaW5kaXF1w6kuXG4gICAqIEBkZXByZWNhdGVkIChzaW5jZSAxLjE1KSB1dGlsaXNlciBtZXNzYWdlL21lc3NhZ2VTZXZlcml0eSDDoCBsYSBwbGFjZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHZhbGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgJiYgIXRoaXMubWVzc2FnZSAmJiAhdGhpcy5tZXNzYWdlU2V2ZXJpdHkpIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICAgICAgdGhpcy5tZXNzYWdlU2V2ZXJpdHkgPSBEc2ZyU2V2ZXJpdHlDb25zdC5WQUxJRDtcbiAgICB9XG4gIH1cblxuICAvLyBTdXIgY2hhbmdlbWVudCBkZSBsYSBkYXRlLCBvbiByw6nDqWNyaXQgam91ciBtb2lzIGFubsOpZVxuICAvKiogQGludGVybmFsICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICAvLyBCaWVuIHF1ZSBsYSB2YWx1ZSBzb2l0IGRlIHR5cGUgZGF0ZSwgbGUgZMOpdmVsb3BwZXVyIHBldXQsIMOgIG5vdHJlIGluc3UsIG5vdXMgZW52b3llciB1bmUgY2hhaW5lIG91IHVuIG5vbWJyZSAoY29tbWUgU3Rvcnlib29rKSwgZXggOiBEYXRlLm5vdygpXG4gICAgdGhpcy5kYXRlTW9kZWwgPSBEYXRlTW9kZWwub2YodmFsdWUsIHRoaXMubG9nZ2VyKTtcbiAgICBzdXBlci53cml0ZVZhbHVlKHRoaXMuZGF0ZU1vZGVsLnRvRGF0ZSgpKTtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB0aGlzLmludGVybmFsVmFsaWRhdGUoKTsgLy8gbGEgdmFsaWRhdGlvbiBkb2l0IMOqdHJlIHJlam91w6llIHN1ciB1bmUgbW9kaWZpY2F0aW9uIHByb2dyYW1tYXRpcXVlXG5cbiAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIFN1ciBjaGFuZ2VtZW50IGR1IG1vZMOobGUsIGMuLcOgLWQuIGpvdXIsIG1vaXMgb3UgYW5uw6llLCBvbiByw6ljcml0IGxhIGRhdGVcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkZvY3VzT3V0KCkge1xuICAgIGNvbnN0IHsgZnVsbFllYXIsIG1vbnRoTnVtLCBkYXlOdW0gfSA9IHRoaXMuZGF0ZU1vZGVsO1xuICAgIGNvbnN0IGhvdXJUaW1lem9uZU9mZnNldCA9IG5ldyBEYXRlKGZ1bGxZZWFyISwgbW9udGhOdW0hIC0gMSwgZGF5TnVtISkuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xuXG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0gdGhpcy5pbnRlcm5hbFZhbGlkYXRlKCk7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGF0ZU1vZGVsLnRvRGF0ZShob3VyVGltZXpvbmVPZmZzZXQpO1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5mbk9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFZhbGlkYXRlKCk7XG4gIH1cblxuICAvKiogUGVybWV0IGRlIHN0b2NrZXIgbGEgZm9uY3Rpb24gcG91dmFudCDDqnRyZSBhcHBlbMOpZSBwb3VyIGZvcmNlciB1bmUgcmV2YWxpZGF0aW9uLiAqL1xuICBwcml2YXRlIGZuT25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogVmFsaWRlIGxlIGNvbXBvc2FudCBldCByZXRvdXJuZSBWYWxpZGF0aW9uRXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGludGVybmFsVmFsaWRhdGUoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZGF0ZU1vZGVsLnZhbGlkYXRlKHRoaXMucmVxdWlyZWQpO1xuXG4gICAgLy8gUGFzIGQnZXJyZXVyLCBvbiByZXRvdXJuZSBudWxsXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgLy8gT24gdHJhbnNmb3JtZSBsYSBsaXN0ZSBkZXMgY29kZXMgZCdlcnJldXIgZW4gVmFsaWRhdGlvbkVycm9yc1xuICAgIHJldHVybiBlcnJvcnMubWFwKChjb2RlRXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBwYXRoRXJyID0gUEFUSF9FUlJfSTE4Tltjb2RlRXJyXTtcbiAgICAgIGNvbnN0IGxhYmVsRXJyID0gdGhpcy5pMThuLnQocGF0aEVycik7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyID0ge307XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB2YWxpZGF0aW9uRXJyW2NvZGVFcnJdID0gbGFiZWxFcnI7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvbkVycjtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRzZnItZmllbGRzZXRcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2xlZ2VuZF09XCJsZWdlbmRcIlxuICBbbGVnZW5kUmVndWxhcl09XCJsZWdlbmRSZWd1bGFyXCJcbiAgW2hpbnRdPVwiaGludFwiXG4gIFtlcnJvcl09XCJlcnJvcnNcIlxuICBbdmFsaWRdPVwidmFsaWRcIlxuICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgW21lc3NhZ2VTZXZlcml0eV09XCJtZXNzYWdlU2V2ZXJpdHlcIj5cbiAgPCEtLSBEYXkgLS0+XG4gIDxkc2ZyLWZvcm0taW5wdXRcbiAgICAqZmllbGRzZXRFbGVtZW50PVwiJ2ZyLWZpZWxkc2V0X19lbGVtZW50LS1pbmxpbmUgZnItZmllbGRzZXRfX2VsZW1lbnQtLW51bWJlcidcIlxuICAgIFtsYWJlbF09XCInZGF0ZS5kYXkubGFiZWwnIHwgZHNmckkxOG5cIlxuICAgIFttYXhMZW5ndGhdPVwiMlwiXG4gICAgW2hpbnRdPVwiJ2RhdGUuZGF5LmhpbnQnIHwgZHNmckkxOG5cIlxuICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlID8gJ2JkYXktZGF5JyA6IHVuZGVmaW5lZFwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgWyhuZ01vZGVsKV09XCJkYXRlTW9kZWwuZGF5TnVtXCJcbiAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCI+PC9kc2ZyLWZvcm0taW5wdXQ+XG4gIDwhLS0gTW9udGggLS0+XG4gIDxkc2ZyLWZvcm0taW5wdXRcbiAgICAqZmllbGRzZXRFbGVtZW50PVwiJ2ZyLWZpZWxkc2V0X19lbGVtZW50LS1pbmxpbmUgZnItZmllbGRzZXRfX2VsZW1lbnQtLW51bWJlcidcIlxuICAgIFtsYWJlbF09XCInZGF0ZS5tb250aC5sYWJlbCcgfCBkc2ZySTE4blwiXG4gICAgW21heExlbmd0aF09XCIyXCJcbiAgICBbaGludF09XCInZGF0ZS5tb250aC5oaW50JyB8IGRzZnJJMThuXCJcbiAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZSA/ICdiZGF5LW1vbnRoJyA6IHVuZGVmaW5lZFwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgWyhuZ01vZGVsKV09XCJkYXRlTW9kZWwubW9udGhOdW1cIlxuICAgIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIj48L2RzZnItZm9ybS1pbnB1dD5cbiAgPCEtLSBZZWFyIC0tPlxuICA8ZHNmci1mb3JtLWlucHV0XG4gICAgKmZpZWxkc2V0RWxlbWVudD1cIidmci1maWVsZHNldF9fZWxlbWVudC0taW5saW5lIGZyLWZpZWxkc2V0X19lbGVtZW50LS1pbmxpbmUtZ3JvdyBmci1maWVsZHNldF9fZWxlbWVudC0teWVhcidcIlxuICAgIFtsYWJlbF09XCInZGF0ZS55ZWFyLmxhYmVsJyB8IGRzZnJJMThuXCJcbiAgICBbbWF4TGVuZ3RoXT1cIjRcIlxuICAgIFtoaW50XT1cIidkYXRlLnllYXIuaGludCcgfCBkc2ZySTE4blwiXG4gICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGUgPyAnYmRheS15ZWFyJyA6IHVuZGVmaW5lZFwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgWyhuZ01vZGVsKV09XCJkYXRlTW9kZWwuZnVsbFllYXJcIlxuICAgIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIj48L2RzZnItZm9ybS1pbnB1dD5cbjwvZHNmci1maWVsZHNldD5cbiJdfQ==