@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).
73 lines • 26.1 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { DsfrI18nPipe } from '../../../../shared';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
export class ConsentServiceComponent {
constructor() {
/**
* Émis lors l'utilisateur accepte/refuse la finalité.
*/
this.finalityChange = new EventEmitter(); // changement accept/refuse d'une finalité ou sous-finalité
this.buttonDescribedBy = 'finality-{{idxFinality}}-legend';
this.buttonControls = 'finality-{{idxFinality}}-collapse';
}
/**
* Au changement utilisateur accepter tout / refuser tout, mettre a jour la finalité et finalités enfants
* Pas de mise à jour si la finalité est en disabled ou exempt (toujours accept=true)
* @param value true (accept all), false (refuse all), undefined (pas de sélection)
*/
set acceptAll(value) {
this._acceptAll = value;
if (this._acceptAll !== undefined && !this.finality.disabled && !this.finality.exempt) {
this.finality.accept = this._acceptAll;
this.finality.subFinalities?.map((f) => (f.accept = this._acceptAll));
}
}
ngOnInit() {
const index = this.idxFinality;
this.fieldsetLabelledBy = `finality-${index}-legend finality-${index}}-desc`;
this.buttonDescribedBy = `finality-${index}-legend`;
this.buttonControls = `finality-${index}-collapse`;
if (this.finality.exempt || this.finality.disabled) {
this.finality.accept = true;
}
}
/**
* Changement accept/refuse de la finalité, mettre a jour les sous-finalités enfant
* @param subFinality sous-finalité concernée
*/
onFinalityRadioChange() {
if (this.finality.subFinalities) {
this.finality.subFinalities.map((f) => (f.accept = this.finality.accept));
}
this.finalityChange.emit(this.finality);
}
/**
* Changement accept/refuse d'une sous finalité, remettre la finalité parente en accept undefined si necessaire
* @param subFinality sous-finalité concernée
*/
onSubFinalityRadioChange(subFinality) {
if ((this.finality.accept && subFinality.accept === false) ||
(this.finality.accept === false && subFinality.accept)) {
this.finality.accept = undefined;
}
this.finalityChange.emit(this.finality);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConsentServiceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ConsentServiceComponent, isStandalone: true, selector: "edu-consent-service", inputs: { finality: "finality", idxFinality: "idxFinality", acceptAll: "acceptAll" }, outputs: { finalityChange: "finalityChange" }, ngImport: i0, template: "<div class=\"fr-consent-service\">\n <fieldset\n class=\"fr-fieldset\"\n [attr.role]=\"finality.description ? 'group' : null\"\n [attr.aria-labelledby]=\"finality.description ? fieldsetLabelledBy : null\">\n <legend class=\"fr-consent-service__title\">{{ finality.name }}</legend>\n <div class=\"fr-consent-service__radios\">\n @if (!finality.exempt) {\n <div class=\"fr-radio-group\">\n <input\n (change)=\"onFinalityRadioChange()\"\n [value]=\"true\"\n [(ngModel)]=\"finality.accept\"\n [disabled]=\"finality.disabled ? true : false\"\n type=\"radio\"\n id=\"consent-finality-{{ idxFinality }}-accept\"\n name=\"consent-finality-{{ idxFinality }}\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-accept\">\n {{ 'commons.accept' | dsfrI18n }}\n </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n [value]=\"false\"\n [(ngModel)]=\"finality.accept\"\n [disabled]=\"finality.disabled ? true : false\"\n (change)=\"onFinalityRadioChange()\"\n type=\"radio\"\n id=\"consent-finality-{{ idxFinality }}-refuse\"\n name=\"consent-finality-{{ idxFinality }}\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-refuse\">\n {{ 'commons.refuse' | dsfrI18n }}\n </label>\n </div>\n } @else {\n <p>{{ 'consent.manager.finalityExempt' | dsfrI18n }}</p>\n }\n </div>\n @if (finality.description) {\n <p id=\"finality-{{ idxFinality }}-desc\" class=\"fr-consent-service__desc\">\n {{ finality.description }}\n </p>\n }\n @if (finality.subFinalities) {\n <div class=\"fr-consent-service__collapse\">\n <button\n type=\"button\"\n class=\"fr-consent-service__collapse-btn\"\n aria-expanded=\"false\"\n [attr.aria-describedby]=\"buttonDescribedBy\"\n [attr.aria-controls]=\"buttonControls\">\n {{ 'consent.manager.showDetails' | dsfrI18n }}\n </button>\n </div>\n }\n <div class=\"fr-consent-services fr-collapse\" id=\"finality-{{ idxFinality }}-collapse\">\n <!-- Sous finalit\u00E9s -->\n @for (subfinality of finality.subFinalities; track subfinality; let idx_sub = $index) {\n <div class=\"fr-consent-service\">\n <fieldset class=\"fr-fieldset fr-fieldset--inline\">\n <legend id=\"finality-{{ idxFinality }}-sub-{{ idx_sub }}-legend\" class=\"fr-consent-service__title\">\n {{ subfinality.name }}\n </legend>\n <div class=\"fr-consent-service__radios fr-fieldset--inline\">\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"subfinality.accept\"\n type=\"radio\"\n (change)=\"onSubFinalityRadioChange(subfinality)\"\n [value]=\"true\"\n id=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-accept\"\n name=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-accept\">\n {{ 'commons.accept' | dsfrI18n }}\n </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n (change)=\"onSubFinalityRadioChange(subfinality)\"\n type=\"radio\"\n [value]=\"false\"\n [(ngModel)]=\"subfinality.accept\"\n id=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-refuse\"\n name=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-refuse\">\n {{ 'commons.refuse' | dsfrI18n }}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n }\n </div>\n </fieldset>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConsentServiceComponent, decorators: [{
type: Component,
args: [{ selector: 'edu-consent-service', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrI18nPipe], template: "<div class=\"fr-consent-service\">\n <fieldset\n class=\"fr-fieldset\"\n [attr.role]=\"finality.description ? 'group' : null\"\n [attr.aria-labelledby]=\"finality.description ? fieldsetLabelledBy : null\">\n <legend class=\"fr-consent-service__title\">{{ finality.name }}</legend>\n <div class=\"fr-consent-service__radios\">\n @if (!finality.exempt) {\n <div class=\"fr-radio-group\">\n <input\n (change)=\"onFinalityRadioChange()\"\n [value]=\"true\"\n [(ngModel)]=\"finality.accept\"\n [disabled]=\"finality.disabled ? true : false\"\n type=\"radio\"\n id=\"consent-finality-{{ idxFinality }}-accept\"\n name=\"consent-finality-{{ idxFinality }}\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-accept\">\n {{ 'commons.accept' | dsfrI18n }}\n </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n [value]=\"false\"\n [(ngModel)]=\"finality.accept\"\n [disabled]=\"finality.disabled ? true : false\"\n (change)=\"onFinalityRadioChange()\"\n type=\"radio\"\n id=\"consent-finality-{{ idxFinality }}-refuse\"\n name=\"consent-finality-{{ idxFinality }}\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-refuse\">\n {{ 'commons.refuse' | dsfrI18n }}\n </label>\n </div>\n } @else {\n <p>{{ 'consent.manager.finalityExempt' | dsfrI18n }}</p>\n }\n </div>\n @if (finality.description) {\n <p id=\"finality-{{ idxFinality }}-desc\" class=\"fr-consent-service__desc\">\n {{ finality.description }}\n </p>\n }\n @if (finality.subFinalities) {\n <div class=\"fr-consent-service__collapse\">\n <button\n type=\"button\"\n class=\"fr-consent-service__collapse-btn\"\n aria-expanded=\"false\"\n [attr.aria-describedby]=\"buttonDescribedBy\"\n [attr.aria-controls]=\"buttonControls\">\n {{ 'consent.manager.showDetails' | dsfrI18n }}\n </button>\n </div>\n }\n <div class=\"fr-consent-services fr-collapse\" id=\"finality-{{ idxFinality }}-collapse\">\n <!-- Sous finalit\u00E9s -->\n @for (subfinality of finality.subFinalities; track subfinality; let idx_sub = $index) {\n <div class=\"fr-consent-service\">\n <fieldset class=\"fr-fieldset fr-fieldset--inline\">\n <legend id=\"finality-{{ idxFinality }}-sub-{{ idx_sub }}-legend\" class=\"fr-consent-service__title\">\n {{ subfinality.name }}\n </legend>\n <div class=\"fr-consent-service__radios fr-fieldset--inline\">\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"subfinality.accept\"\n type=\"radio\"\n (change)=\"onSubFinalityRadioChange(subfinality)\"\n [value]=\"true\"\n id=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-accept\"\n name=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-accept\">\n {{ 'commons.accept' | dsfrI18n }}\n </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n (change)=\"onSubFinalityRadioChange(subfinality)\"\n type=\"radio\"\n [value]=\"false\"\n [(ngModel)]=\"subfinality.accept\"\n id=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-refuse\"\n name=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-\" />\n <label class=\"fr-label\" for=\"consent-finality-{{ idxFinality }}-sub-{{ idx_sub }}-refuse\">\n {{ 'commons.refuse' | dsfrI18n }}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n }\n </div>\n </fieldset>\n</div>\n" }]
}], propDecorators: { finality: [{
type: Input
}], idxFinality: [{
type: Input
}], finalityChange: [{
type: Output
}], acceptAll: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2VudC1zZXJ2aWNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NvbnNlbnQtYmFubmVyL2NvbnNlbnQtbWFuYWdlci9jb25zZW50LXNlcnZpY2UvY29uc2VudC1zZXJ2aWNlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NvbnNlbnQtYmFubmVyL2NvbnNlbnQtbWFuYWdlci9jb25zZW50LXNlcnZpY2UvY29uc2VudC1zZXJ2aWNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVVsRCxNQUFNLE9BQU8sdUJBQXVCO0lBUHBDO1FBZ0JFOztXQUVHO1FBQ08sbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQyxDQUFDLDJEQUEyRDtRQUl4SCxzQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztRQUN0RCxtQkFBYyxHQUFHLG1DQUFtQyxDQUFDO0tBa0R0RDtJQWhEQzs7OztPQUlHO0lBQ0gsSUFBYSxTQUFTLENBQUMsS0FBMEI7UUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0RixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFlBQVksS0FBSyxvQkFBb0IsS0FBSyxRQUFRLENBQUM7UUFDN0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksS0FBSyxTQUFTLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLEtBQUssV0FBVyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxxQkFBcUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0JBQXdCLENBQUMsV0FBNEI7UUFDbkQsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDO1lBQ3RELENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFDdEQsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7K0dBbEVVLHVCQUF1QjttR0FBdkIsdUJBQXVCLG9OQ2JwQywybUlBK0ZBLDJDRHBGWSxZQUFZLDhCQUFFLFdBQVcsNnpCQUFFLFlBQVk7OzRGQUV0Qyx1QkFBdUI7a0JBUG5DLFNBQVM7K0JBQ0UscUJBQXFCLGlCQUVoQixpQkFBaUIsQ0FBQyxJQUFJLGNBQ3pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDOzhCQU16QyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUksY0FBYztzQkFBdkIsTUFBTTtnQkFZTSxTQUFTO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERzZnJJMThuUGlwZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyRmluYWxpdHksIERzZnJTdWJGaW5hbGl0eSB9IGZyb20gJy4uLy4uL2NvbnNlbnQtYmFubmVyLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWR1LWNvbnNlbnQtc2VydmljZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25zZW50LXNlcnZpY2UuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHNmckkxOG5QaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29uc2VudFNlcnZpY2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogTGUgbW9kw6hsZSBkZSBwcsOpc2VudGF0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgZmluYWxpdHk6IERzZnJGaW5hbGl0eTtcbiAgLyoqXG4gICAqIEwnaW5kZXggZGUgbGEgZmluYWxpdMOpIGF1IHNlaW4gZHUgcGFubmVhdSBkZSBnZXN0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgaWR4RmluYWxpdHk6IG51bWJlcjtcbiAgLyoqXG4gICAqIMOJbWlzIGxvcnMgbCd1dGlsaXNhdGV1ciBhY2NlcHRlL3JlZnVzZSBsYSBmaW5hbGl0w6kuXG4gICAqL1xuICBAT3V0cHV0KCkgZmluYWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERzZnJGaW5hbGl0eT4oKTsgLy8gY2hhbmdlbWVudCBhY2NlcHQvcmVmdXNlIGQndW5lIGZpbmFsaXTDqSBvdSBzb3VzLWZpbmFsaXTDqVxuXG4gIF9hY2NlcHRBbGw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGZpZWxkc2V0TGFiZWxsZWRCeTogc3RyaW5nO1xuICBidXR0b25EZXNjcmliZWRCeSA9ICdmaW5hbGl0eS17e2lkeEZpbmFsaXR5fX0tbGVnZW5kJztcbiAgYnV0dG9uQ29udHJvbHMgPSAnZmluYWxpdHkte3tpZHhGaW5hbGl0eX19LWNvbGxhcHNlJztcblxuICAvKipcbiAgICogQXUgY2hhbmdlbWVudCB1dGlsaXNhdGV1ciBhY2NlcHRlciB0b3V0IC8gcmVmdXNlciB0b3V0LCBtZXR0cmUgYSBqb3VyIGxhIGZpbmFsaXTDqSBldCBmaW5hbGl0w6lzIGVuZmFudHNcbiAgICogUGFzIGRlIG1pc2Ugw6Agam91ciBzaSBsYSBmaW5hbGl0w6kgZXN0IGVuIGRpc2FibGVkIG91IGV4ZW1wdCAodG91am91cnMgYWNjZXB0PXRydWUpXG4gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIChhY2NlcHQgYWxsKSwgZmFsc2UgKHJlZnVzZSBhbGwpLCB1bmRlZmluZWQgKHBhcyBkZSBzw6lsZWN0aW9uKVxuICAgKi9cbiAgQElucHV0KCkgc2V0IGFjY2VwdEFsbCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2FjY2VwdEFsbCA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9hY2NlcHRBbGwgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5maW5hbGl0eS5kaXNhYmxlZCAmJiAhdGhpcy5maW5hbGl0eS5leGVtcHQpIHtcbiAgICAgIHRoaXMuZmluYWxpdHkuYWNjZXB0ID0gdGhpcy5fYWNjZXB0QWxsO1xuICAgICAgdGhpcy5maW5hbGl0eS5zdWJGaW5hbGl0aWVzPy5tYXAoKGYpID0+IChmLmFjY2VwdCA9IHRoaXMuX2FjY2VwdEFsbCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pZHhGaW5hbGl0eTtcbiAgICB0aGlzLmZpZWxkc2V0TGFiZWxsZWRCeSA9IGBmaW5hbGl0eS0ke2luZGV4fS1sZWdlbmQgZmluYWxpdHktJHtpbmRleH19LWRlc2NgO1xuICAgIHRoaXMuYnV0dG9uRGVzY3JpYmVkQnkgPSBgZmluYWxpdHktJHtpbmRleH0tbGVnZW5kYDtcbiAgICB0aGlzLmJ1dHRvbkNvbnRyb2xzID0gYGZpbmFsaXR5LSR7aW5kZXh9LWNvbGxhcHNlYDtcbiAgICBpZiAodGhpcy5maW5hbGl0eS5leGVtcHQgfHwgdGhpcy5maW5hbGl0eS5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5maW5hbGl0eS5hY2NlcHQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VtZW50IGFjY2VwdC9yZWZ1c2UgZGUgbGEgZmluYWxpdMOpLCBtZXR0cmUgYSBqb3VyIGxlcyBzb3VzLWZpbmFsaXTDqXMgZW5mYW50XG4gICAqIEBwYXJhbSBzdWJGaW5hbGl0eSBzb3VzLWZpbmFsaXTDqSBjb25jZXJuw6llXG4gICAqL1xuICBvbkZpbmFsaXR5UmFkaW9DaGFuZ2UoKSB7XG4gICAgaWYgKHRoaXMuZmluYWxpdHkuc3ViRmluYWxpdGllcykge1xuICAgICAgdGhpcy5maW5hbGl0eS5zdWJGaW5hbGl0aWVzLm1hcCgoZjogRHNmclN1YkZpbmFsaXR5KSA9PiAoZi5hY2NlcHQgPSB0aGlzLmZpbmFsaXR5LmFjY2VwdCkpO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXR5Q2hhbmdlLmVtaXQodGhpcy5maW5hbGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlbWVudCBhY2NlcHQvcmVmdXNlIGQndW5lIHNvdXMgZmluYWxpdMOpLCByZW1ldHRyZSBsYSBmaW5hbGl0w6kgcGFyZW50ZSBlbiBhY2NlcHQgdW5kZWZpbmVkIHNpIG5lY2Vzc2FpcmVcbiAgICogQHBhcmFtIHN1YkZpbmFsaXR5IHNvdXMtZmluYWxpdMOpIGNvbmNlcm7DqWVcbiAgICovXG4gIG9uU3ViRmluYWxpdHlSYWRpb0NoYW5nZShzdWJGaW5hbGl0eTogRHNmclN1YkZpbmFsaXR5KSB7XG4gICAgaWYgKFxuICAgICAgKHRoaXMuZmluYWxpdHkuYWNjZXB0ICYmIHN1YkZpbmFsaXR5LmFjY2VwdCA9PT0gZmFsc2UpIHx8XG4gICAgICAodGhpcy5maW5hbGl0eS5hY2NlcHQgPT09IGZhbHNlICYmIHN1YkZpbmFsaXR5LmFjY2VwdClcbiAgICApIHtcbiAgICAgIHRoaXMuZmluYWxpdHkuYWNjZXB0ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuZmluYWxpdHlDaGFuZ2UuZW1pdCh0aGlzLmZpbmFsaXR5KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZyLWNvbnNlbnQtc2VydmljZVwiPlxuICA8ZmllbGRzZXRcbiAgICBjbGFzcz1cImZyLWZpZWxkc2V0XCJcbiAgICBbYXR0ci5yb2xlXT1cImZpbmFsaXR5LmRlc2NyaXB0aW9uID8gJ2dyb3VwJyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJmaW5hbGl0eS5kZXNjcmlwdGlvbiA/IGZpZWxkc2V0TGFiZWxsZWRCeSA6IG51bGxcIj5cbiAgICA8bGVnZW5kIGNsYXNzPVwiZnItY29uc2VudC1zZXJ2aWNlX190aXRsZVwiPnt7IGZpbmFsaXR5Lm5hbWUgfX08L2xlZ2VuZD5cbiAgICA8ZGl2IGNsYXNzPVwiZnItY29uc2VudC1zZXJ2aWNlX19yYWRpb3NcIj5cbiAgICAgIEBpZiAoIWZpbmFsaXR5LmV4ZW1wdCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZnItcmFkaW8tZ3JvdXBcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaW5hbGl0eVJhZGlvQ2hhbmdlKClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaW5hbGl0eS5hY2NlcHRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbmFsaXR5LmRpc2FibGVkID8gdHJ1ZSA6IGZhbHNlXCJcbiAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBpZD1cImNvbnNlbnQtZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tYWNjZXB0XCJcbiAgICAgICAgICAgIG5hbWU9XCJjb25zZW50LWZpbmFsaXR5LXt7IGlkeEZpbmFsaXR5IH19XCIgLz5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIGZvcj1cImNvbnNlbnQtZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tYWNjZXB0XCI+XG4gICAgICAgICAgICB7eyAnY29tbW9ucy5hY2NlcHQnIHwgZHNmckkxOG4gfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZyLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbdmFsdWVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaW5hbGl0eS5hY2NlcHRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbmFsaXR5LmRpc2FibGVkID8gdHJ1ZSA6IGZhbHNlXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaW5hbGl0eVJhZGlvQ2hhbmdlKClcIlxuICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgIGlkPVwiY29uc2VudC1maW5hbGl0eS17eyBpZHhGaW5hbGl0eSB9fS1yZWZ1c2VcIlxuICAgICAgICAgICAgbmFtZT1cImNvbnNlbnQtZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX1cIiAvPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZyLWxhYmVsXCIgZm9yPVwiY29uc2VudC1maW5hbGl0eS17eyBpZHhGaW5hbGl0eSB9fS1yZWZ1c2VcIj5cbiAgICAgICAgICAgIHt7ICdjb21tb25zLnJlZnVzZScgfCBkc2ZySTE4biB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwPnt7ICdjb25zZW50Lm1hbmFnZXIuZmluYWxpdHlFeGVtcHQnIHwgZHNmckkxOG4gfX08L3A+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmIChmaW5hbGl0eS5kZXNjcmlwdGlvbikge1xuICAgICAgPHAgaWQ9XCJmaW5hbGl0eS17eyBpZHhGaW5hbGl0eSB9fS1kZXNjXCIgY2xhc3M9XCJmci1jb25zZW50LXNlcnZpY2VfX2Rlc2NcIj5cbiAgICAgICAge3sgZmluYWxpdHkuZGVzY3JpcHRpb24gfX1cbiAgICAgIDwvcD5cbiAgICB9XG4gICAgQGlmIChmaW5hbGl0eS5zdWJGaW5hbGl0aWVzKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItY29uc2VudC1zZXJ2aWNlX19jb2xsYXBzZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJmci1jb25zZW50LXNlcnZpY2VfX2NvbGxhcHNlLWJ0blwiXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImJ1dHRvbkRlc2NyaWJlZEJ5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImJ1dHRvbkNvbnRyb2xzXCI+XG4gICAgICAgICAge3sgJ2NvbnNlbnQubWFuYWdlci5zaG93RGV0YWlscycgfCBkc2ZySTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPVwiZnItY29uc2VudC1zZXJ2aWNlcyBmci1jb2xsYXBzZVwiIGlkPVwiZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tY29sbGFwc2VcIj5cbiAgICAgIDwhLS0gU291cyBmaW5hbGl0w6lzIC0tPlxuICAgICAgQGZvciAoc3ViZmluYWxpdHkgb2YgZmluYWxpdHkuc3ViRmluYWxpdGllczsgdHJhY2sgc3ViZmluYWxpdHk7IGxldCBpZHhfc3ViID0gJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmci1jb25zZW50LXNlcnZpY2VcIj5cbiAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJmci1maWVsZHNldCBmci1maWVsZHNldC0taW5saW5lXCI+XG4gICAgICAgICAgICA8bGVnZW5kIGlkPVwiZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tc3ViLXt7IGlkeF9zdWIgfX0tbGVnZW5kXCIgY2xhc3M9XCJmci1jb25zZW50LXNlcnZpY2VfX3RpdGxlXCI+XG4gICAgICAgICAgICAgIHt7IHN1YmZpbmFsaXR5Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbnNlbnQtc2VydmljZV9fcmFkaW9zIGZyLWZpZWxkc2V0LS1pbmxpbmVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN1YmZpbmFsaXR5LmFjY2VwdFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN1YkZpbmFsaXR5UmFkaW9DaGFuZ2Uoc3ViZmluYWxpdHkpXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY29uc2VudC1maW5hbGl0eS17eyBpZHhGaW5hbGl0eSB9fS1zdWIte3sgaWR4X3N1YiB9fS1hY2NlcHRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImNvbnNlbnQtZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tc3ViLXt7IGlkeF9zdWIgfX0tXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIGZvcj1cImNvbnNlbnQtZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tc3ViLXt7IGlkeF9zdWIgfX0tYWNjZXB0XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnY29tbW9ucy5hY2NlcHQnIHwgZHNmckkxOG4gfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU3ViRmluYWxpdHlSYWRpb0NoYW5nZShzdWJmaW5hbGl0eSlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN1YmZpbmFsaXR5LmFjY2VwdFwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNvbnNlbnQtZmluYWxpdHkte3sgaWR4RmluYWxpdHkgfX0tc3ViLXt7IGlkeF9zdWIgfX0tcmVmdXNlXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJjb25zZW50LWZpbmFsaXR5LXt7IGlkeEZpbmFsaXR5IH19LXN1Yi17eyBpZHhfc3ViIH19LVwiIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZnItbGFiZWxcIiBmb3I9XCJjb25zZW50LWZpbmFsaXR5LXt7IGlkeEZpbmFsaXR5IH19LXN1Yi17eyBpZHhfc3ViIH19LXJlZnVzZVwiPlxuICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbnMucmVmdXNlJyB8IGRzZnJJMThuIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9maWVsZHNldD5cbjwvZGl2PlxuIl19