@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).
80 lines • 22.1 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, forwardRef, HostListener } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DsfrButtonModule } from '../../components';
import { InputGroupComponent } from '../../shared';
import { DsfrFormInputComponent } from '../form-input';
import { DsfrInputTypeConst } from '../form-input/form-input.model';
import { formatPhoneNumber, isPhoneNumberValid } from './phone-number-utils';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../../components/button/button.component";
/**
* Saisie d'un n° de téléphone et reformatage (sauf dans le cas d'utilisation d'un pattern)
* @since 1.3.0
*/
export class DsfrFormTelComponent extends DsfrFormInputComponent {
/** @internal */
constructor(i18n) {
super();
this.i18n = i18n;
/** @internal */ this.errorMessage = this.i18n.t('tel.error');
}
/**
* Au fil de la saisie, on ne vérifie le n° de téléphone que s'il y avait déjà une erreur
*/
onValueChange() {
if (this.error)
this.validate();
}
/**
* Vérification quand on sort du champ
*/
onFocusOut() {
if (!this.pattern && this.validate())
this.value = formatPhoneNumber(this.value);
}
/** @internal*/
ngOnInit() {
super.ngOnInit();
this.type = DsfrInputTypeConst.TEL;
this.spellCheck = false;
this.label ??= this.i18n.t('tel.label');
this.hint ??= this.i18n.t('tel.hint');
}
/**
* Méthode validation, positionne la propriété error s'il y a lieu.
*/
validate() {
const isValid = isPhoneNumberValid(this.value, this.pattern);
this.error = isValid ? '' : this.errorMessage;
return isValid;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrFormTelComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrFormTelComponent, isStandalone: true, selector: "dsfr-form-tel", host: { listeners: { "input": "onValueChange()", "change": "onFocusOut()" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrFormTelComponent),
multi: true,
},
], usesInheritance: true, ngImport: i0, template: "<edu-input-group\n [inputId]=\"inputId\"\n [label]=\"label\"\n [hint]=\"hint\"\n [messagesGroupId]=\"messagesGroupId\"\n [disabled]=\"disabled\"\n [message]=\"message\"\n [severity]=\"severity\">\n <label class=\"fr-label\" [for]=\"inputId\">\n <ng-container *ngIf=\"label\">{{ label }}</ng-container>\n <ng-content *ngIf=\"!label\" select=\"[label]\"></ng-content>\n <span *ngIf=\"hint\" class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <ng-container *ngIf=\"!isTextArea(); else textareaTemplate\">\n <ng-container *ngIf=\"!hasInputWrap(); else inputWrapTemplate\" [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n </ng-container>\n</edu-input-group>\n\n<!-- Templates -------------------------------------------------------------------------------------------------------->\n\n<!-- Template input -->\n<ng-template #inputTemplate>\n <input\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-autocomplete]=\"ariaAutocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-required]=\"required || null\"\n [attr.role]=\"role || null\"\n [attr.inputmode]=\"inputMode || null\"\n [attr.autocorrect]=\"autoCorrect ? null : 'off'\"\n [(ngModel)]=\"value\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [attr.type]=\"type || null\"\n [disabled]=\"disabled ?? false\"\n [required]=\"required ?? false\"\n [attr.pattern]=\"pattern || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.spellcheck]=\"spellCheck || null\"\n [ngStyle]=\"width ? { width: width } : {}\" />\n</ng-template>\n\n<!-- Template input wrap -->\n<ng-template #inputWrapTemplate>\n <div [ngClass]=\"getWrapClasses()\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n <dsfr-button\n *ngIf=\"hasButton()\"\n [ariaLabel]=\"buttonAriaLabel\"\n [disabled]=\"buttonDisabled\"\n [icon]=\"buttonIcon\"\n [label]=\"buttonLabel\"\n [tooltipMessage]=\"buttonTooltipMessage\"\n [type]=\"buttonType\"\n [variant]=\"buttonVariant\"\n (click)=\"onButtonClick($event)\"></dsfr-button>\n </div>\n</ng-template>\n\n<!-- Template textarea -->\n<ng-template #textareaTemplate>\n <textarea\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [disabled]=\"disabled ?? false\"\n [attr.required]=\"required || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [(ngModel)]=\"value\"\n [ngStyle]=\"width ? { width: width } : {}\"\n [attr.rows]=\"rows || null\"></textarea>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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: InputGroupComponent, selector: "edu-input-group", inputs: ["label", "inputId", "hint", "disabled", "message", "severity", "messagesGroupId"] }, { kind: "ngmodule", type: DsfrButtonModule }, { kind: "component", type: i4.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "size", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "ariaControls", "customClass"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrFormTelComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-form-tel', standalone: true, imports: [CommonModule, FormsModule, InputGroupComponent, DsfrButtonModule], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrFormTelComponent),
multi: true,
},
], template: "<edu-input-group\n [inputId]=\"inputId\"\n [label]=\"label\"\n [hint]=\"hint\"\n [messagesGroupId]=\"messagesGroupId\"\n [disabled]=\"disabled\"\n [message]=\"message\"\n [severity]=\"severity\">\n <label class=\"fr-label\" [for]=\"inputId\">\n <ng-container *ngIf=\"label\">{{ label }}</ng-container>\n <ng-content *ngIf=\"!label\" select=\"[label]\"></ng-content>\n <span *ngIf=\"hint\" class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <ng-container *ngIf=\"!isTextArea(); else textareaTemplate\">\n <ng-container *ngIf=\"!hasInputWrap(); else inputWrapTemplate\" [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n </ng-container>\n</edu-input-group>\n\n<!-- Templates -------------------------------------------------------------------------------------------------------->\n\n<!-- Template input -->\n<ng-template #inputTemplate>\n <input\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-autocomplete]=\"ariaAutocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-required]=\"required || null\"\n [attr.role]=\"role || null\"\n [attr.inputmode]=\"inputMode || null\"\n [attr.autocorrect]=\"autoCorrect ? null : 'off'\"\n [(ngModel)]=\"value\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [attr.type]=\"type || null\"\n [disabled]=\"disabled ?? false\"\n [required]=\"required ?? false\"\n [attr.pattern]=\"pattern || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.spellcheck]=\"spellCheck || null\"\n [ngStyle]=\"width ? { width: width } : {}\" />\n</ng-template>\n\n<!-- Template input wrap -->\n<ng-template #inputWrapTemplate>\n <div [ngClass]=\"getWrapClasses()\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n <dsfr-button\n *ngIf=\"hasButton()\"\n [ariaLabel]=\"buttonAriaLabel\"\n [disabled]=\"buttonDisabled\"\n [icon]=\"buttonIcon\"\n [label]=\"buttonLabel\"\n [tooltipMessage]=\"buttonTooltipMessage\"\n [type]=\"buttonType\"\n [variant]=\"buttonVariant\"\n (click)=\"onButtonClick($event)\"></dsfr-button>\n </div>\n</ng-template>\n\n<!-- Template textarea -->\n<ng-template #textareaTemplate>\n <textarea\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [disabled]=\"disabled ?? false\"\n [attr.required]=\"required || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [(ngModel)]=\"value\"\n [ngStyle]=\"width ? { width: width } : {}\"\n [attr.rows]=\"rows || null\"></textarea>\n</ng-template>\n" }]
}], ctorParameters: function () { return [{ type: i1.I18nService }]; }, propDecorators: { onValueChange: [{
type: HostListener,
args: ['input']
}], onFocusOut: [{
type: HostListener,
args: ['change']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS10ZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2Zvcm0tdGVsL2Zvcm0tdGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFlLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBZTdFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxzQkFBc0I7SUFHOUQsZ0JBQWdCO0lBQ2hCLFlBQW9CLElBQWlCO1FBQ25DLEtBQUssRUFBRSxDQUFDO1FBRFUsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUhyQyxnQkFBZ0IsQ0FBVSxpQkFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBS2xFLENBQUM7SUFFRDs7T0FFRztJQUNvQixhQUFhO1FBQ2xDLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ3FCLFVBQVU7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxlQUFlO0lBQ2YsUUFBUTtRQUNOLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssUUFBUTtRQUNkLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzsrR0F0Q1Usb0JBQW9CO21HQUFwQixvQkFBb0IsMklBWnBCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbkQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLGlEQ3BCSCxpc0dBd0ZBLDJDRDNFWSxZQUFZLDRkQUFFLFdBQVcsNDBCQUFFLG1CQUFtQix1SkFBRSxnQkFBZ0I7OzRGQWEvRCxvQkFBb0I7a0JBakJoQyxTQUFTOytCQUNFLGVBQWUsY0FFYixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLGFBQ2hFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtrR0FpQnNCLGFBQWE7c0JBQW5DLFlBQVk7dUJBQUMsT0FBTztnQkFPRyxVQUFVO3NCQUFqQyxZQUFZO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHNmckJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UsIElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmckZvcm1JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0taW5wdXQnO1xuaW1wb3J0IHsgRHNmcklucHV0VHlwZUNvbnN0IH0gZnJvbSAnLi4vZm9ybS1pbnB1dC9mb3JtLWlucHV0Lm1vZGVsJztcbmltcG9ydCB7IGZvcm1hdFBob25lTnVtYmVyLCBpc1Bob25lTnVtYmVyVmFsaWQgfSBmcm9tICcuL3Bob25lLW51bWJlci11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZm9ybS10ZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4uL2Zvcm0taW5wdXQvZm9ybS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBJbnB1dEdyb3VwQ29tcG9uZW50LCBEc2ZyQnV0dG9uTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRm9ybVRlbENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbi8qKlxuICogU2Fpc2llIGQndW4gbsKwIGRlIHTDqWzDqXBob25lIGV0IHJlZm9ybWF0YWdlIChzYXVmIGRhbnMgbGUgY2FzIGQndXRpbGlzYXRpb24gZCd1biBwYXR0ZXJuKVxuICogQHNpbmNlIDEuMy4wXG4gKi9cbmV4cG9ydCBjbGFzcyBEc2ZyRm9ybVRlbENvbXBvbmVudCBleHRlbmRzIERzZnJGb3JtSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKiogQGludGVybmFsICovIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IHRoaXMuaTE4bi50KCd0ZWwuZXJyb3InKTtcblxuICAvKiogQGludGVybmFsICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1IGZpbCBkZSBsYSBzYWlzaWUsIG9uIG5lIHbDqXJpZmllIGxlIG7CsCBkZSB0w6lsw6lwaG9uZSBxdWUgcydpbCB5IGF2YWl0IGTDqWrDoCB1bmUgZXJyZXVyXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnB1dCcpIG9uVmFsdWVDaGFuZ2UoKSB7XG4gICAgaWYgKHRoaXMuZXJyb3IpIHRoaXMudmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWw6lyaWZpY2F0aW9uIHF1YW5kIG9uIHNvcnQgZHUgY2hhbXBcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScpIG9uRm9jdXNPdXQoKSB7XG4gICAgaWYgKCF0aGlzLnBhdHRlcm4gJiYgdGhpcy52YWxpZGF0ZSgpKSB0aGlzLnZhbHVlID0gZm9ybWF0UGhvbmVOdW1iZXIodGhpcy52YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLnR5cGUgPSBEc2ZySW5wdXRUeXBlQ29uc3QuVEVMO1xuICAgIHRoaXMuc3BlbGxDaGVjayA9IGZhbHNlO1xuICAgIHRoaXMubGFiZWwgPz89IHRoaXMuaTE4bi50KCd0ZWwubGFiZWwnKTtcbiAgICB0aGlzLmhpbnQgPz89IHRoaXMuaTE4bi50KCd0ZWwuaGludCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRob2RlIHZhbGlkYXRpb24sIHBvc2l0aW9ubmUgbGEgcHJvcHJpw6l0w6kgZXJyb3IgcydpbCB5IGEgbGlldS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNWYWxpZCA9IGlzUGhvbmVOdW1iZXJWYWxpZCh0aGlzLnZhbHVlLCB0aGlzLnBhdHRlcm4pO1xuICAgIHRoaXMuZXJyb3IgPSBpc1ZhbGlkID8gJycgOiB0aGlzLmVycm9yTWVzc2FnZTtcbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxufVxuIiwiPGVkdS1pbnB1dC1ncm91cFxuICBbaW5wdXRJZF09XCJpbnB1dElkXCJcbiAgW2xhYmVsXT1cImxhYmVsXCJcbiAgW2hpbnRdPVwiaGludFwiXG4gIFttZXNzYWdlc0dyb3VwSWRdPVwibWVzc2FnZXNHcm91cElkXCJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW21lc3NhZ2VdPVwibWVzc2FnZVwiXG4gIFtzZXZlcml0eV09XCJzZXZlcml0eVwiPlxuICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIFtmb3JdPVwiaW5wdXRJZFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbFwiPnt7IGxhYmVsIH19PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhbGFiZWxcIiBzZWxlY3Q9XCJbbGFiZWxdXCI+PC9uZy1jb250ZW50PlxuICAgIDxzcGFuICpuZ0lmPVwiaGludFwiIGNsYXNzPVwiZnItaGludC10ZXh0XCI+e3sgaGludCB9fTwvc3Bhbj5cbiAgPC9sYWJlbD5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RleHRBcmVhKCk7IGVsc2UgdGV4dGFyZWFUZW1wbGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzSW5wdXRXcmFwKCk7IGVsc2UgaW5wdXRXcmFwVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnB1dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9lZHUtaW5wdXQtZ3JvdXA+XG5cbjwhLS0gVGVtcGxhdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuXG48IS0tIFRlbXBsYXRlIGlucHV0IC0tPlxuPG5nLXRlbXBsYXRlICNpbnB1dFRlbXBsYXRlPlxuICA8aW5wdXRcbiAgICBjbGFzcz1cImZyLWlucHV0XCJcbiAgICBbbmdDbGFzc109XCJjdXN0b21DbGFzcyB8fCBudWxsXCJcbiAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cImFyaWFBdXRvY29tcGxldGUgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJtZXNzYWdlc0dyb3VwSWRcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJhcmlhRXhwYW5kZWQgIT09IHVuZGVmaW5lZCA/IGFyaWFFeHBhbmRlZCA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIucm9sZV09XCJyb2xlIHx8IG51bGxcIlxuICAgIFthdHRyLmlucHV0bW9kZV09XCJpbnB1dE1vZGUgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXV0b2NvcnJlY3RdPVwiYXV0b0NvcnJlY3QgPyBudWxsIDogJ29mZidcIlxuICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWUgfHwgbnVsbFwiXG4gICAgW2F0dHIudHlwZV09XCJ0eXBlIHx8IG51bGxcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCA/PyBmYWxzZVwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkID8/IGZhbHNlXCJcbiAgICBbYXR0ci5wYXR0ZXJuXT1cInBhdHRlcm4gfHwgbnVsbFwiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXIgfHwgbnVsbFwiXG4gICAgW2F0dHIubWluXT1cIm1pbiB8fCBudWxsXCJcbiAgICBbYXR0ci5tYXhdPVwibWF4IHx8IG51bGxcIlxuICAgIFthdHRyLm1heExlbmd0aF09XCJtYXhMZW5ndGggfHwgbnVsbFwiXG4gICAgW2F0dHIubWluTGVuZ3RoXT1cIm1pbkxlbmd0aCB8fCBudWxsXCJcbiAgICBbYXR0ci5zcGVsbGNoZWNrXT1cInNwZWxsQ2hlY2sgfHwgbnVsbFwiXG4gICAgW25nU3R5bGVdPVwid2lkdGggPyB7IHdpZHRoOiB3aWR0aCB9IDoge31cIiAvPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUZW1wbGF0ZSBpbnB1dCB3cmFwIC0tPlxuPG5nLXRlbXBsYXRlICNpbnB1dFdyYXBUZW1wbGF0ZT5cbiAgPGRpdiBbbmdDbGFzc109XCJnZXRXcmFwQ2xhc3NlcygpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8ZHNmci1idXR0b25cbiAgICAgICpuZ0lmPVwiaGFzQnV0dG9uKClcIlxuICAgICAgW2FyaWFMYWJlbF09XCJidXR0b25BcmlhTGFiZWxcIlxuICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbkRpc2FibGVkXCJcbiAgICAgIFtpY29uXT1cImJ1dHRvbkljb25cIlxuICAgICAgW2xhYmVsXT1cImJ1dHRvbkxhYmVsXCJcbiAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJidXR0b25Ub29sdGlwTWVzc2FnZVwiXG4gICAgICBbdHlwZV09XCJidXR0b25UeXBlXCJcbiAgICAgIFt2YXJpYW50XT1cImJ1dHRvblZhcmlhbnRcIlxuICAgICAgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soJGV2ZW50KVwiPjwvZHNmci1idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUZW1wbGF0ZSB0ZXh0YXJlYSAtLT5cbjxuZy10ZW1wbGF0ZSAjdGV4dGFyZWFUZW1wbGF0ZT5cbiAgPHRleHRhcmVhXG4gICAgY2xhc3M9XCJmci1pbnB1dFwiXG4gICAgW25nQ2xhc3NdPVwiY3VzdG9tQ2xhc3MgfHwgbnVsbFwiXG4gICAgW2lkXT1cImlucHV0SWRcIlxuICAgIFthdHRyLm5hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgPz8gZmFsc2VcIlxuICAgIFthdHRyLnJlcXVpcmVkXT1cInJlcXVpcmVkIHx8IG51bGxcIlxuICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyIHx8IG51bGxcIlxuICAgIFthdHRyLm1pbl09XCJtaW4gfHwgbnVsbFwiXG4gICAgW2F0dHIubWF4XT1cIm1heCB8fCBudWxsXCJcbiAgICBbYXR0ci5tYXhMZW5ndGhdPVwibWF4TGVuZ3RoIHx8IG51bGxcIlxuICAgIFthdHRyLm1pbkxlbmd0aF09XCJtaW5MZW5ndGggfHwgbnVsbFwiXG4gICAgW2F0dHIuYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm1lc3NhZ2VzR3JvdXBJZFwiXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgW25nU3R5bGVdPVwid2lkdGggPyB7IHdpZHRoOiB3aWR0aCB9IDoge31cIlxuICAgIFthdHRyLnJvd3NdPVwicm93cyB8fCBudWxsXCI+PC90ZXh0YXJlYT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=