@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).
163 lines • 26 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, forwardRef, Input, ViewEncapsulation } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DefaultControlComponent, DsfrPositionConst, DsfrSeverityConst, newUniqueId, } from '../../shared';
import { EduMessageSeverityDirective } from '../../shared/directives/message-severity.directive';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
export class DsfrFormToggleComponent extends DefaultControlComponent {
constructor(i18n) {
super();
this.i18n = i18n;
/** Position du libellé, à droite par défaut. */
this.labelPosition = DsfrPositionConst.RIGHT;
/**
* Cache le label visuellement en le laissant disponible aux lecteurs d'écran.
*/
this.labelSrOnly = false;
/**
* Permet d'afficher le libellé, court, décrivant l'état de l’interrupteur (activé / désactivé), placé en dessous du
* switch. Il est affiché par défaut, il est conseillé de le mettre afin de faciliter la compréhension de
* l’utilisateur - Optionnel.
*/
this.showStatusLabel = true;
/**
* Message d'information lié au composant @since 1.12
*/
this.message = undefined;
/**
* Id de la div affichant les messages d'erreur ou de validation.
* @internal
*/
this.messagesGroupId = newUniqueId();
//FIXME: Au niveau de `DefaultControlComponent`, déplacer l'initialisation de `inputId` dans le constructor.
this.inputId = this.inputId || newUniqueId();
}
get hintId() {
return this.inputId + '-hint';
}
/** @deprecated since 1.12 use showStatus instead */
get showCheckedHint() {
return this.showStatusLabel;
}
/** @deprecated since 1.12 use checkedLabel instead */
get checkedHintLabel() {
return this.checkedStatusLabel;
}
/** @deprecated since 1.12 use uncheckedLabel instead */
get uncheckedHintLabel() {
return this.uncheckedStatusLabel;
}
/** @deprecated since 1.12 use showStatus instead */
set showCheckedHint(value) {
this.showStatusLabel = value;
}
/** @deprecated since 1.12 use checkedLabel instead */
set checkedHintLabel(value) {
this.checkedStatusLabel = value;
}
/** @deprecated since 1.12 use uncheckedLabel instead */
set uncheckedHintLabel(value) {
this.uncheckedStatusLabel = value;
}
ngOnChanges({ message, hint }) {
if (message || hint) {
if (this.hint && this.message) {
this.ariaDescribedbyValue = this.messagesGroupId + ' ' + this.hintId;
}
else if (this.message) {
this.ariaDescribedbyValue = this.messagesGroupId;
}
else if (this.hint) {
this.ariaDescribedbyValue = this.hintId;
}
else {
this.ariaDescribedbyValue = undefined;
}
}
}
/**
* Permet d'initialiser de forcer la valeur initiale à une valeur booléenne
* @internal
*/
writeValue(value) {
super.writeValue(value ?? false);
}
/**
* @ignore
*/
getDataLabelChecked() {
return this.showStatusLabel ? this.checkedStatusLabel || this.i18n.t('toggle.dataLabelChecked') : null;
}
/**
* @ignore
*/
getDataLabelUnchecked() {
return this.showStatusLabel ? this.uncheckedStatusLabel || this.i18n.t('toggle.dataLabelUnchecked') : null;
}
/** @internal */
hasError() {
return this.error || (this.messageSeverity === DsfrSeverityConst.ERROR && !!this.message);
}
/** @internal */
hasSuccess() {
return (this.valid ||
(!!this.message &&
(this.messageSeverity === DsfrSeverityConst.SUCCESS || this.messageSeverity === DsfrSeverityConst.VALID)));
}
/** @internal */
hasMessage(severity) {
return !!this.message && severity === this.messageSeverity;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFormToggleComponent, deps: [{ token: i1.DsfrI18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrFormToggleComponent, isStandalone: true, selector: "dsfr-form-toggle", inputs: { labelPosition: "labelPosition", labelSrOnly: "labelSrOnly", ariaInvalid: "ariaInvalid", showStatusLabel: "showStatusLabel", checkedStatusLabel: "checkedStatusLabel", uncheckedStatusLabel: "uncheckedStatusLabel", showSeparator: "showSeparator", error: "error", valid: "valid", message: "message", messageSeverity: "messageSeverity", messagesGroupId: "messagesGroupId", showCheckedHint: "showCheckedHint", checkedHintLabel: "checkedHintLabel", uncheckedHintLabel: "uncheckedHintLabel" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrFormToggleComponent),
multi: true,
},
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"fr-toggle\"\n [ngClass]=\"{\n 'fr-toggle--label-left': labelPosition === 'left',\n 'fr-toggle--border-bottom': showSeparator,\n 'fr-toggle--valid': hasSuccess(),\n 'fr-toggle--error': hasError(),\n }\">\n <input\n type=\"checkbox\"\n class=\"fr-toggle__input\"\n [id]=\"inputId\"\n [attr.name]=\"name ? name : null\"\n [attr.aria-describedby]=\"ariaDescribedbyValue\"\n [disabled]=\"disabled\"\n [attr.checked]=\"value ? true : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n [(ngModel)]=\"value\" />\n <label\n class=\"fr-toggle__label\"\n [for]=\"inputId\"\n [attr.data-fr-checked-label]=\"getDataLabelChecked()\"\n [attr.data-fr-unchecked-label]=\"getDataLabelUnchecked()\">\n @if (labelSrOnly) {\n <span class=\"fr-sr-only\">\n <ng-container [ngTemplateOutlet]=\"labelTemplate\"></ng-container>\n </span>\n } @else {\n <ng-container [ngTemplateOutlet]=\"labelTemplate\"></ng-container>\n }\n </label>\n @if (hint) {\n <p [id]=\"hintId\" class=\"fr-hint-text\">{{ hint }}</p>\n }\n <!-- messages -->\n <div class=\"fr-messages-group\" [id]=\"messagesGroupId\" aria-live=\"polite\">\n <!-- prettier-ignore -->\n @if (message) {\n <p class=\"fr-message\"\n [eduMessageSeverity]=\"messageSeverity\"\n >{{ message }}</p>\n }\n </div>\n</div>\n\n<ng-template #labelTemplate>\n @if (label) {\n {{ label }}\n } @else {\n <ng-content></ng-content>\n }\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: EduMessageSeverityDirective, selector: "[eduMessageSeverity]", inputs: ["eduMessageSeverity"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFormToggleComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-form-toggle', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrFormToggleComponent),
multi: true,
},
], standalone: true, imports: [CommonModule, FormsModule, EduMessageSeverityDirective], template: "<div\n class=\"fr-toggle\"\n [ngClass]=\"{\n 'fr-toggle--label-left': labelPosition === 'left',\n 'fr-toggle--border-bottom': showSeparator,\n 'fr-toggle--valid': hasSuccess(),\n 'fr-toggle--error': hasError(),\n }\">\n <input\n type=\"checkbox\"\n class=\"fr-toggle__input\"\n [id]=\"inputId\"\n [attr.name]=\"name ? name : null\"\n [attr.aria-describedby]=\"ariaDescribedbyValue\"\n [disabled]=\"disabled\"\n [attr.checked]=\"value ? true : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n [(ngModel)]=\"value\" />\n <label\n class=\"fr-toggle__label\"\n [for]=\"inputId\"\n [attr.data-fr-checked-label]=\"getDataLabelChecked()\"\n [attr.data-fr-unchecked-label]=\"getDataLabelUnchecked()\">\n @if (labelSrOnly) {\n <span class=\"fr-sr-only\">\n <ng-container [ngTemplateOutlet]=\"labelTemplate\"></ng-container>\n </span>\n } @else {\n <ng-container [ngTemplateOutlet]=\"labelTemplate\"></ng-container>\n }\n </label>\n @if (hint) {\n <p [id]=\"hintId\" class=\"fr-hint-text\">{{ hint }}</p>\n }\n <!-- messages -->\n <div class=\"fr-messages-group\" [id]=\"messagesGroupId\" aria-live=\"polite\">\n <!-- prettier-ignore -->\n @if (message) {\n <p class=\"fr-message\"\n [eduMessageSeverity]=\"messageSeverity\"\n >{{ message }}</p>\n }\n </div>\n</div>\n\n<ng-template #labelTemplate>\n @if (label) {\n {{ label }}\n } @else {\n <ng-content></ng-content>\n }\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: i1.DsfrI18nService }], propDecorators: { labelPosition: [{
type: Input
}], labelSrOnly: [{
type: Input
}], ariaInvalid: [{
type: Input
}], showStatusLabel: [{
type: Input
}], checkedStatusLabel: [{
type: Input
}], uncheckedStatusLabel: [{
type: Input
}], showSeparator: [{
type: Input
}], error: [{
type: Input
}], valid: [{
type: Input
}], message: [{
type: Input
}], messageSeverity: [{
type: Input
}], messagesGroupId: [{
type: Input
}], showCheckedHint: [{
type: Input
}], checkedHintLabel: [{
type: Input
}], uncheckedHintLabel: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS10b2dnbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2Zvcm0tdG9nZ2xlL2Zvcm0tdG9nZ2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLXRvZ2dsZS9mb3JtLXRvZ2dsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUE0QixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUNMLHVCQUF1QixFQUd2QixpQkFBaUIsRUFFakIsaUJBQWlCLEVBQ2pCLFdBQVcsR0FDWixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7QUFnQmpHLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSx1QkFBZ0M7SUFxRTNFLFlBQW9CLElBQXFCO1FBQ3ZDLEtBQUssRUFBRSxDQUFDO1FBRFUsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFwRXpDLGdEQUFnRDtRQUN2QyxrQkFBYSxHQUFpQixpQkFBaUIsQ0FBQyxLQUFLLENBQUM7UUFFL0Q7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQU83Qjs7OztXQUlHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFnQ2hDOztXQUVHO1FBQ00sWUFBTyxHQUF1QixTQUFTLENBQUM7UUFPakQ7OztXQUdHO1FBQ00sb0JBQWUsR0FB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QUFLO2dCQUtHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBTUcsZUFBZTtzQkFBdkIsS0FBSztnQkE4Qk8sZUFBZTtzQkFBM0IsS0FBSztnQkFLTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBS08sa0JBQWtCO3NCQUE5QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIERlZmF1bHRDb250cm9sQ29tcG9uZW50LFxuICBEc2ZySTE4blNlcnZpY2UsXG4gIERzZnJQb3NpdGlvbixcbiAgRHNmclBvc2l0aW9uQ29uc3QsXG4gIERzZnJTZXZlcml0eSxcbiAgRHNmclNldmVyaXR5Q29uc3QsXG4gIG5ld1VuaXF1ZUlkLFxufSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRWR1TWVzc2FnZVNldmVyaXR5RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpcmVjdGl2ZXMvbWVzc2FnZS1zZXZlcml0eS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWZvcm0tdG9nZ2xlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tdG9nZ2xlLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRm9ybVRvZ2dsZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRWR1TWVzc2FnZVNldmVyaXR5RGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmckZvcm1Ub2dnbGVDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbENvbXBvbmVudDxib29sZWFuPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBQb3NpdGlvbiBkdSBsaWJlbGzDqSwgw6AgZHJvaXRlIHBhciBkw6lmYXV0LiAqL1xuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiBEc2ZyUG9zaXRpb24gPSBEc2ZyUG9zaXRpb25Db25zdC5SSUdIVDtcblxuICAvKipcbiAgICogQ2FjaGUgbGUgbGFiZWwgdmlzdWVsbGVtZW50IGVuIGxlIGxhaXNzYW50IGRpc3BvbmlibGUgYXV4IGxlY3RldXJzIGQnw6ljcmFuLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxTck9ubHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWpvdXRlciBsJ2F0dHJpYnV0ICdhcmlhLWludmFsaWQnIHN1ciBsZSBjaGFtcCBkZSBmb3JtdWxhaXJlLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUludmFsaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogUGVybWV0IGQnYWZmaWNoZXIgbGUgbGliZWxsw6ksIGNvdXJ0LCBkw6ljcml2YW50IGwnw6l0YXQgZGUgbOKAmWludGVycnVwdGV1ciAoYWN0aXbDqSAvIGTDqXNhY3RpdsOpKSwgcGxhY8OpIGVuIGRlc3NvdXMgZHVcbiAgICogc3dpdGNoLiBJbCBlc3QgYWZmaWNow6kgcGFyIGTDqWZhdXQsIGlsIGVzdCBjb25zZWlsbMOpIGRlIGxlIG1ldHRyZSBhZmluIGRlIGZhY2lsaXRlciBsYSBjb21wcsOpaGVuc2lvbiBkZVxuICAgKiBs4oCZdXRpbGlzYXRldXIgLSBPcHRpb25uZWwuXG4gICAqL1xuICBASW5wdXQoKSBzaG93U3RhdHVzTGFiZWwgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBQcm9wcmnDqXTDqSBwZXJtZXR0YW50IGRlIHN1cmNoYXJnZXIgbGUgbGliZWxsw6ksIGNvdXJ0LCBkw6lub3RhbnQgbCfDqXRhdCBjaGVja2VkIGR1IHRvZ2dsZSwgc2FucyBhdm9pciDDoCBwYXNzZXJcbiAgICogcGFyIGxlIGZpY2hpZXIgZCdpbnRlcm5hdGlvbmFsaXNhdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrZWRTdGF0dXNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm9wcmnDqXTDqSBwZXJtZXR0YW50IGRlIHN1cmNoYXJnZXIgbGUgbGliZWxsw6kgY291cnQgZMOpbm90YW50IGwnw6l0YXQgY2hlY2tlZCBkdSB0b2dnbGUsIHNhbnMgYXZvaXIgw6AgcGFzc2VyXG4gICAqIHBhciBsZSBmaWNoaWVyIGQnaW50ZXJuYXRpb25hbGlzYXRpb24uXG4gICAqL1xuICBASW5wdXQoKSB1bmNoZWNrZWRTdGF0dXNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZmZpY2hlIHVuIHPDqXBhcmF0ZXVyIGhvcml6b250YWwgc291cyBsZSBjb21wb3NhbnQuXG4gICAqIE5lIGRldnJhaXQgw6p0cmUgdXRpbGlzw6kgcXVlIGRhbnMgbGUgY2FkcmUgZCd1biB0b2dnbGVzLWdyb3VwLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NlcGFyYXRvcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3ltYm9saXNlIGwnZXJyZXVyIGR1IHRvZ2dsZVxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjEyIHVzZSBgbWVzc2FnZWAgYW5kIGBzZXZlcml0eWAgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgZXJyb3I6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFN5bWJvbGlzZSBsZSBzdWNjw6hzIGR1IHRvZ2dsZVxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjEyIHVzZSBgbWVzc2FnZWAgYW5kIGBzZXZlcml0eWAgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgdmFsaWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgZCdpbmZvcm1hdGlvbiBsacOpIGF1IGNvbXBvc2FudCBAc2luY2UgMS4xMlxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXByw6lzZW50ZSBsYSBzw6l2w6lyaXTDqSBkdSBtZXNzYWdlLCBgd2FybmluZ2Agbidlc3QgcGFzIHN1cHBvcnTDqVxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVNldmVyaXR5OiBEc2ZyU2V2ZXJpdHk7XG5cbiAgLyoqXG4gICAqIElkIGRlIGxhIGRpdiBhZmZpY2hhbnQgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyIG91IGRlIHZhbGlkYXRpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZXNHcm91cElkID0gbmV3VW5pcXVlSWQoKTtcblxuICBwcm90ZWN0ZWQgYXJpYURlc2NyaWJlZGJ5VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGkxOG46IERzZnJJMThuU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLy9GSVhNRTogQXUgbml2ZWF1IGRlIGBEZWZhdWx0Q29udHJvbENvbXBvbmVudGAsIGTDqXBsYWNlciBsJ2luaXRpYWxpc2F0aW9uIGRlIGBpbnB1dElkYCBkYW5zIGxlIGNvbnN0cnVjdG9yLlxuICAgIHRoaXMuaW5wdXRJZCA9IHRoaXMuaW5wdXRJZCB8fCBuZXdVbmlxdWVJZCgpO1xuICB9XG5cbiAgZ2V0IGhpbnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgJy1oaW50JztcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjEyIHVzZSBzaG93U3RhdHVzIGluc3RlYWQgKi9cbiAgZ2V0IHNob3dDaGVja2VkSGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U3RhdHVzTGFiZWw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgMS4xMiB1c2UgY2hlY2tlZExhYmVsIGluc3RlYWQgKi9cbiAgZ2V0IGNoZWNrZWRIaW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja2VkU3RhdHVzTGFiZWw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgMS4xMiB1c2UgdW5jaGVja2VkTGFiZWwgaW5zdGVhZCAqL1xuICBnZXQgdW5jaGVja2VkSGludExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudW5jaGVja2VkU3RhdHVzTGFiZWw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgMS4xMiB1c2Ugc2hvd1N0YXR1cyBpbnN0ZWFkICovXG4gIEBJbnB1dCgpIHNldCBzaG93Q2hlY2tlZEhpbnQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dTdGF0dXNMYWJlbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHNpbmNlIDEuMTIgdXNlIGNoZWNrZWRMYWJlbCBpbnN0ZWFkICovXG4gIEBJbnB1dCgpIHNldCBjaGVja2VkSGludExhYmVsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNoZWNrZWRTdGF0dXNMYWJlbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHNpbmNlIDEuMTIgdXNlIHVuY2hlY2tlZExhYmVsIGluc3RlYWQgKi9cbiAgQElucHV0KCkgc2V0IHVuY2hlY2tlZEhpbnRMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy51bmNoZWNrZWRTdGF0dXNMYWJlbCA9IHZhbHVlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoeyBtZXNzYWdlLCBoaW50IH06IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAobWVzc2FnZSB8fCBoaW50KSB7XG4gICAgICBpZiAodGhpcy5oaW50ICYmIHRoaXMubWVzc2FnZSkge1xuICAgICAgICB0aGlzLmFyaWFEZXNjcmliZWRieVZhbHVlID0gdGhpcy5tZXNzYWdlc0dyb3VwSWQgKyAnICcgKyB0aGlzLmhpbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5VmFsdWUgPSB0aGlzLm1lc3NhZ2VzR3JvdXBJZDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaW50KSB7XG4gICAgICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5VmFsdWUgPSB0aGlzLmhpbnRJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1ldCBkJ2luaXRpYWxpc2VyIGRlIGZvcmNlciBsYSB2YWxldXIgaW5pdGlhbGUgw6AgdW5lIHZhbGV1ciBib29sw6llbm5lXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUgPz8gZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldERhdGFMYWJlbENoZWNrZWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1N0YXR1c0xhYmVsID8gdGhpcy5jaGVja2VkU3RhdHVzTGFiZWwgfHwgdGhpcy5pMThuLnQoJ3RvZ2dsZS5kYXRhTGFiZWxDaGVja2VkJykgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldERhdGFMYWJlbFVuY2hlY2tlZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U3RhdHVzTGFiZWwgPyB0aGlzLnVuY2hlY2tlZFN0YXR1c0xhYmVsIHx8IHRoaXMuaTE4bi50KCd0b2dnbGUuZGF0YUxhYmVsVW5jaGVja2VkJykgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgaGFzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3IgfHwgKHRoaXMubWVzc2FnZVNldmVyaXR5ID09PSBEc2ZyU2V2ZXJpdHlDb25zdC5FUlJPUiAmJiAhIXRoaXMubWVzc2FnZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBoYXNTdWNjZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZhbGlkIHx8XG4gICAgICAoISF0aGlzLm1lc3NhZ2UgJiZcbiAgICAgICAgKHRoaXMubWVzc2FnZVNldmVyaXR5ID09PSBEc2ZyU2V2ZXJpdHlDb25zdC5TVUNDRVNTIHx8IHRoaXMubWVzc2FnZVNldmVyaXR5ID09PSBEc2ZyU2V2ZXJpdHlDb25zdC5WQUxJRCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGhhc01lc3NhZ2Uoc2V2ZXJpdHk6IERzZnJTZXZlcml0eSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubWVzc2FnZSAmJiBzZXZlcml0eSA9PT0gdGhpcy5tZXNzYWdlU2V2ZXJpdHk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJmci10b2dnbGVcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ2ZyLXRvZ2dsZS0tbGFiZWwtbGVmdCc6IGxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyxcbiAgICAnZnItdG9nZ2xlLS1ib3JkZXItYm90dG9tJzogc2hvd1NlcGFyYXRvcixcbiAgICAnZnItdG9nZ2xlLS12YWxpZCc6IGhhc1N1Y2Nlc3MoKSxcbiAgICAnZnItdG9nZ2xlLS1lcnJvcic6IGhhc0Vycm9yKCksXG4gIH1cIj5cbiAgPGlucHV0XG4gICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICBjbGFzcz1cImZyLXRvZ2dsZV9faW5wdXRcIlxuICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWUgPyBuYW1lIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJhcmlhRGVzY3JpYmVkYnlWYWx1ZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5jaGVja2VkXT1cInZhbHVlID8gdHJ1ZSA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJhcmlhSW52YWxpZCB8fCBudWxsXCJcbiAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCIgLz5cbiAgPGxhYmVsXG4gICAgY2xhc3M9XCJmci10b2dnbGVfX2xhYmVsXCJcbiAgICBbZm9yXT1cImlucHV0SWRcIlxuICAgIFthdHRyLmRhdGEtZnItY2hlY2tlZC1sYWJlbF09XCJnZXREYXRhTGFiZWxDaGVja2VkKClcIlxuICAgIFthdHRyLmRhdGEtZnItdW5jaGVja2VkLWxhYmVsXT1cImdldERhdGFMYWJlbFVuY2hlY2tlZCgpXCI+XG4gICAgQGlmIChsYWJlbFNyT25seSkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJmci1zci1vbmx5XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9zcGFuPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICA8L2xhYmVsPlxuICBAaWYgKGhpbnQpIHtcbiAgICA8cCBbaWRdPVwiaGludElkXCIgY2xhc3M9XCJmci1oaW50LXRleHRcIj57eyBoaW50IH19PC9wPlxuICB9XG4gIDwhLS0gbWVzc2FnZXMgLS0+XG4gIDxkaXYgY2xhc3M9XCJmci1tZXNzYWdlcy1ncm91cFwiIFtpZF09XCJtZXNzYWdlc0dyb3VwSWRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICA8IS0tIHByZXR0aWVyLWlnbm9yZSAtLT5cbiAgICBAaWYgKG1lc3NhZ2UpIHtcbiAgICAgIDxwIGNsYXNzPVwiZnItbWVzc2FnZVwiXG4gICAgICAgW2VkdU1lc3NhZ2VTZXZlcml0eV09XCJtZXNzYWdlU2V2ZXJpdHlcIlxuICAgICAgPnt7IG1lc3NhZ2UgfX08L3A+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gIEBpZiAobGFiZWwpIHtcbiAgICB7eyBsYWJlbCB9fVxuICB9IEBlbHNlIHtcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=