@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).
81 lines • 25.4 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 { DsfrLinkComponent } from '../../link';
import { ConsentServiceComponent } from './consent-service/consent-service.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
export const CONSENT_MODAL_ID = 'consent-modal-id';
export class ConsentManagerComponent {
constructor() {
/** Confirmation de la personnalisation des finalités. */
this.confirmSelect = new EventEmitter();
/** Changement selection accept/refuse d'une finalité ou sous-finalité. */
this.finalityChange = new EventEmitter();
/**
* Signale quand la route rgdp est sélectionnée.
*
* @since 1.7
*/
this.rgpdRouteSelect = new EventEmitter();
/*Identifiant de la modale ('consent-modal-id' par défaut) */
this.modalId = CONSENT_MODAL_ID;
}
ngOnInit() {
this.acceptAll = undefined;
this.titleId = this.modalId + '-title';
}
/**
* Changement selection accept/refuse d'une finalité ou sous-finalité
* @param finality
*/
onFinalityChange(finality) {
// update selon l'état des sous-finalités
if (finality.subFinalities) {
if (finality.subFinalities.every((f) => f.accept === true)) {
finality.accept = true;
}
else if (finality.subFinalities.every((f) => f.accept === false)) {
finality.accept = false;
}
}
// update état global
this.acceptAll = this.finalities.every((f) => f.accept === finality.accept || f.exempt || f.disabled)
? finality.accept
: undefined;
this.finalityChange.emit(finality);
}
/**
* Confirmation de la sélection
*/
onConfirm() {
this.confirmSelect.emit(this.finalities);
}
/** @since 1.7 */
onRgpdSelect() {
// Signale quand la route rgdp est sélectionnée
const route = this.rgpdNavigation.route;
if (route)
this.rgpdRouteSelect.emit(route);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConsentManagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ConsentManagerComponent, isStandalone: true, selector: "edu-consent-manager", inputs: { rgpdNavigation: "rgpdNavigation", finalities: "finalities", modalId: "modalId" }, outputs: { confirmSelect: "confirmSelect", finalityChange: "finalityChange", rgpdRouteSelect: "rgpdRouteSelect" }, ngImport: i0, template: "<dialog [id]=\"modalId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-10 fr-col-lg-8\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"modalId\"\n [attr.aria-label]=\"'modal.ariaLabel' | dsfrI18n\">\n {{ 'commons.close' | dsfrI18n }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"titleId\" class=\"fr-modal__title\">{{ 'consent.manager.title' | dsfrI18n }}</h1>\n <!-- BUG: Classe 'fr-consent-manager' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-consent-manager\">\n <!-- Finalit\u00E9s -->\n <div class=\"fr-consent-service fr-consent-manager__header\">\n <fieldset class=\"fr-fieldset\">\n <legend id=\"finality-legend\" class=\"fr-consent-service__title\">\n {{ 'consent.manager.preferences' | dsfrI18n }}\n <dsfr-link\n [customClass]=\"'edu-link'\"\n [link]=\"rgpdNavigation.link ?? ''\"\n [linkTarget]=\"rgpdNavigation.linkTarget\"\n [route]=\"rgpdNavigation.route ?? ''\"\n [routePath]=\"rgpdNavigation.routerLink ?? ''\"\n [routerLinkActive]=\"rgpdNavigation.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"rgpdNavigation.routerLinkExtras\"\n (linkSelect)=\"onRgpdSelect()\"\n >{{ 'consent.manager.personalData' | dsfrI18n }}</dsfr-link\n >\n </legend>\n <div class=\"fr-consent-service__radios\">\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"true\"\n type=\"radio\"\n id=\"consent-all-accept\"\n name=\"consent-all\" />\n <label class=\"fr-label\" for=\"consent-all-accept\"> {{ 'consent.acceptAll' | dsfrI18n }} </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"false\"\n type=\"radio\"\n id=\"consent-all-refuse\"\n name=\"consent-all\" />\n <label class=\"fr-label\" for=\"consent-all-refuse\"> {{ 'consent.refuseAll' | dsfrI18n }} </label>\n </div>\n </div>\n </fieldset>\n </div>\n\n @for (finality of finalities; track finality; let i = $index) {\n <edu-consent-service\n [finality]=\"finality\"\n [idxFinality]=\"i\"\n [acceptAll]=\"acceptAll\"\n (finalityChange)=\"onFinalityChange(finality)\"></edu-consent-service>\n }\n\n <!-- Bouton de confirmation/fermeture -->\n <ul class=\"fr-consent-manager__buttons fr-btns-group fr-btns-group--right fr-btns-group--inline-sm\">\n <li>\n <button type=\"button\" (click)=\"onConfirm()\" [attr.aria-controls]=\"modalId\" class=\"fr-btn\">\n {{ 'consent.manager.confirmChoices' | dsfrI18n }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\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: "component", type: DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "linkSize", "tooltipMessage", "mode", "ariaCurrentWhenActive", "size", "targetLink", "routerLink"], outputs: ["linkSelect"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "component", type: ConsentServiceComponent, selector: "edu-consent-service", inputs: ["finality", "idxFinality", "acceptAll"], outputs: ["finalityChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConsentManagerComponent, decorators: [{
type: Component,
args: [{ selector: 'edu-consent-manager', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrLinkComponent, DsfrI18nPipe, ConsentServiceComponent], template: "<dialog [id]=\"modalId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-10 fr-col-lg-8\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"modalId\"\n [attr.aria-label]=\"'modal.ariaLabel' | dsfrI18n\">\n {{ 'commons.close' | dsfrI18n }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"titleId\" class=\"fr-modal__title\">{{ 'consent.manager.title' | dsfrI18n }}</h1>\n <!-- BUG: Classe 'fr-consent-manager' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-consent-manager\">\n <!-- Finalit\u00E9s -->\n <div class=\"fr-consent-service fr-consent-manager__header\">\n <fieldset class=\"fr-fieldset\">\n <legend id=\"finality-legend\" class=\"fr-consent-service__title\">\n {{ 'consent.manager.preferences' | dsfrI18n }}\n <dsfr-link\n [customClass]=\"'edu-link'\"\n [link]=\"rgpdNavigation.link ?? ''\"\n [linkTarget]=\"rgpdNavigation.linkTarget\"\n [route]=\"rgpdNavigation.route ?? ''\"\n [routePath]=\"rgpdNavigation.routerLink ?? ''\"\n [routerLinkActive]=\"rgpdNavigation.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"rgpdNavigation.routerLinkExtras\"\n (linkSelect)=\"onRgpdSelect()\"\n >{{ 'consent.manager.personalData' | dsfrI18n }}</dsfr-link\n >\n </legend>\n <div class=\"fr-consent-service__radios\">\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"true\"\n type=\"radio\"\n id=\"consent-all-accept\"\n name=\"consent-all\" />\n <label class=\"fr-label\" for=\"consent-all-accept\"> {{ 'consent.acceptAll' | dsfrI18n }} </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"false\"\n type=\"radio\"\n id=\"consent-all-refuse\"\n name=\"consent-all\" />\n <label class=\"fr-label\" for=\"consent-all-refuse\"> {{ 'consent.refuseAll' | dsfrI18n }} </label>\n </div>\n </div>\n </fieldset>\n </div>\n\n @for (finality of finalities; track finality; let i = $index) {\n <edu-consent-service\n [finality]=\"finality\"\n [idxFinality]=\"i\"\n [acceptAll]=\"acceptAll\"\n (finalityChange)=\"onFinalityChange(finality)\"></edu-consent-service>\n }\n\n <!-- Bouton de confirmation/fermeture -->\n <ul class=\"fr-consent-manager__buttons fr-btns-group fr-btns-group--right fr-btns-group--inline-sm\">\n <li>\n <button type=\"button\" (click)=\"onConfirm()\" [attr.aria-controls]=\"modalId\" class=\"fr-btn\">\n {{ 'consent.manager.confirmChoices' | dsfrI18n }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n" }]
}], propDecorators: { rgpdNavigation: [{
type: Input
}], finalities: [{
type: Input
}], confirmSelect: [{
type: Output
}], finalityChange: [{
type: Output
}], rgpdRouteSelect: [{
type: Output
}], modalId: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2VudC1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NvbnNlbnQtYmFubmVyL2NvbnNlbnQtbWFuYWdlci9jb25zZW50LW1hbmFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY29uc2VudC1iYW5uZXIvY29uc2VudC1tYW5hZ2VyL2NvbnNlbnQtbWFuYWdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBa0IsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQUV0RixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztBQVNuRCxNQUFNLE9BQU8sdUJBQXVCO0lBUHBDO1FBY0UseURBQXlEO1FBQy9DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFN0QsMEVBQTBFO1FBQ2hFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFFNUQ7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV2RCw2REFBNkQ7UUFDcEQsWUFBTyxHQUFXLGdCQUFnQixDQUFDO0tBOEM3QztJQXhDQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsUUFBc0I7UUFDckMseUNBQXlDO1FBQ3pDLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDekIsQ0FBQztpQkFBTSxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDbkcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQ2pCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsWUFBWTtRQUNWLCtDQUErQztRQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUN4QyxJQUFJLEtBQUs7WUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDOytHQWxFVSx1QkFBdUI7bUdBQXZCLHVCQUF1Qiw4UkNqQnBDLHcySEFpRkEsMkNEbEVZLFlBQVksOEJBQUUsV0FBVyxrMEJBQUUsaUJBQWlCLHdaQUFFLFlBQVksaURBQUUsdUJBQXVCOzs0RkFFbEYsdUJBQXVCO2tCQVBuQyxTQUFTOytCQUNFLHFCQUFxQixpQkFFaEIsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQzs4QkFJckYsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0csY0FBYztzQkFBdkIsTUFBTTtnQkFPRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdFLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEc2ZySTE4blBpcGUsIERzZnJOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IERzZnJMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbGluayc7XG5pbXBvcnQgeyBEc2ZyRmluYWxpdHkgfSBmcm9tICcuLi9jb25zZW50LWJhbm5lci5tb2RlbCc7XG5pbXBvcnQgeyBDb25zZW50U2VydmljZUNvbXBvbmVudCB9IGZyb20gJy4vY29uc2VudC1zZXJ2aWNlL2NvbnNlbnQtc2VydmljZS5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgQ09OU0VOVF9NT0RBTF9JRCA9ICdjb25zZW50LW1vZGFsLWlkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWR1LWNvbnNlbnQtbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25zZW50LW1hbmFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHNmckxpbmtDb21wb25lbnQsIERzZnJJMThuUGlwZSwgQ29uc2VudFNlcnZpY2VDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBDb25zZW50TWFuYWdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKiBVUkwgZGUgcHLDqXNlbnRhdGlvbiBkZXMgZG9ubsOpZXMgcGVyc29ubmVsbGVzLiAqL1xuICBASW5wdXQoKSByZ3BkTmF2aWdhdGlvbjogRHNmck5hdmlnYXRpb247XG5cbiAgLyoqIE1vZMOobGUgZGUgcHLDqXNlbnRhdGlvbiA6IGxpc3RlIGRlIGZpbmFsaXTDqXMuICovXG4gIEBJbnB1dCgpIGZpbmFsaXRpZXM6IERzZnJGaW5hbGl0eVtdO1xuXG4gIC8qKiBDb25maXJtYXRpb24gZGUgbGEgcGVyc29ubmFsaXNhdGlvbiBkZXMgZmluYWxpdMOpcy4gKi9cbiAgQE91dHB1dCgpIGNvbmZpcm1TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPERzZnJGaW5hbGl0eVtdPigpO1xuXG4gIC8qKiBDaGFuZ2VtZW50IHNlbGVjdGlvbiBhY2NlcHQvcmVmdXNlIGQndW5lIGZpbmFsaXTDqSBvdSBzb3VzLWZpbmFsaXTDqS4gKi9cbiAgQE91dHB1dCgpIGZpbmFsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEc2ZyRmluYWxpdHk+KCk7XG5cbiAgLyoqXG4gICAqIFNpZ25hbGUgcXVhbmQgbGEgcm91dGUgcmdkcCBlc3Qgc8OpbGVjdGlvbm7DqWUuXG4gICAqXG4gICAqIEBzaW5jZSAxLjdcbiAgICovXG4gIEBPdXRwdXQoKSByZ3BkUm91dGVTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKklkZW50aWZpYW50IGRlIGxhIG1vZGFsZSAoJ2NvbnNlbnQtbW9kYWwtaWQnIHBhciBkw6lmYXV0KSAqL1xuICBASW5wdXQoKSBtb2RhbElkOiBzdHJpbmcgPSBDT05TRU5UX01PREFMX0lEO1xuXG4gIC8qKiBpbnRlcm5hbCAqLyB0aXRsZUlkOiBzdHJpbmc7XG5cbiAgYWNjZXB0QWxsOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWNjZXB0QWxsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGl0bGVJZCA9IHRoaXMubW9kYWxJZCArICctdGl0bGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZW1lbnQgc2VsZWN0aW9uIGFjY2VwdC9yZWZ1c2UgZCd1bmUgZmluYWxpdMOpIG91IHNvdXMtZmluYWxpdMOpXG4gICAqIEBwYXJhbSBmaW5hbGl0eVxuICAgKi9cbiAgb25GaW5hbGl0eUNoYW5nZShmaW5hbGl0eTogRHNmckZpbmFsaXR5KTogdm9pZCB7XG4gICAgLy8gdXBkYXRlIHNlbG9uIGwnw6l0YXQgZGVzIHNvdXMtZmluYWxpdMOpc1xuICAgIGlmIChmaW5hbGl0eS5zdWJGaW5hbGl0aWVzKSB7XG4gICAgICBpZiAoZmluYWxpdHkuc3ViRmluYWxpdGllcy5ldmVyeSgoZikgPT4gZi5hY2NlcHQgPT09IHRydWUpKSB7XG4gICAgICAgIGZpbmFsaXR5LmFjY2VwdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGZpbmFsaXR5LnN1YkZpbmFsaXRpZXMuZXZlcnkoKGYpID0+IGYuYWNjZXB0ID09PSBmYWxzZSkpIHtcbiAgICAgICAgZmluYWxpdHkuYWNjZXB0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIMOpdGF0IGdsb2JhbFxuICAgIHRoaXMuYWNjZXB0QWxsID0gdGhpcy5maW5hbGl0aWVzLmV2ZXJ5KChmKSA9PiBmLmFjY2VwdCA9PT0gZmluYWxpdHkuYWNjZXB0IHx8IGYuZXhlbXB0IHx8IGYuZGlzYWJsZWQpXG4gICAgICA/IGZpbmFsaXR5LmFjY2VwdFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmZpbmFsaXR5Q2hhbmdlLmVtaXQoZmluYWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm1hdGlvbiBkZSBsYSBzw6lsZWN0aW9uXG4gICAqL1xuICBvbkNvbmZpcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jb25maXJtU2VsZWN0LmVtaXQodGhpcy5maW5hbGl0aWVzKTtcbiAgfVxuXG4gIC8qKiBAc2luY2UgMS43ICovXG4gIG9uUmdwZFNlbGVjdCgpOiB2b2lkIHtcbiAgICAvLyBTaWduYWxlIHF1YW5kIGxhIHJvdXRlIHJnZHAgZXN0IHPDqWxlY3Rpb25uw6llXG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLnJncGROYXZpZ2F0aW9uLnJvdXRlO1xuICAgIGlmIChyb3V0ZSkgdGhpcy5yZ3BkUm91dGVTZWxlY3QuZW1pdChyb3V0ZSk7XG4gIH1cbn1cbiIsIjxkaWFsb2cgW2lkXT1cIm1vZGFsSWRcIiBjbGFzcz1cImZyLW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aXRsZUlkXCI+XG4gIDxkaXYgY2xhc3M9XCJmci1jb250YWluZXIgZnItY29udGFpbmVyLS1mbHVpZCBmci1jb250YWluZXItbWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnItZ3JpZC1yb3cgZnItZ3JpZC1yb3ctLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtMTAgZnItY29sLWxnLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZyLW1vZGFsX19ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZyLW1vZGFsX19oZWFkZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnItYnRuLS1jbG9zZSBmci1idG5cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm1vZGFsSWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidtb2RhbC5hcmlhTGFiZWwnIHwgZHNmckkxOG5cIj5cbiAgICAgICAgICAgICAge3sgJ2NvbW1vbnMuY2xvc2UnIHwgZHNmckkxOG4gfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1tb2RhbF9fY29udGVudFwiPlxuICAgICAgICAgICAgPGgxIFtpZF09XCJ0aXRsZUlkXCIgY2xhc3M9XCJmci1tb2RhbF9fdGl0bGVcIj57eyAnY29uc2VudC5tYW5hZ2VyLnRpdGxlJyB8IGRzZnJJMThuIH19PC9oMT5cbiAgICAgICAgICAgIDwhLS0gQlVHOiBDbGFzc2UgJ2ZyLWNvbnNlbnQtbWFuYWdlcicgaW5jb25udWUgZW4gRFNGUiAxLjkuMyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1jb25zZW50LW1hbmFnZXJcIj5cbiAgICAgICAgICAgICAgPCEtLSBGaW5hbGl0w6lzIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItY29uc2VudC1zZXJ2aWNlIGZyLWNvbnNlbnQtbWFuYWdlcl9faGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiZnItZmllbGRzZXRcIj5cbiAgICAgICAgICAgICAgICAgIDxsZWdlbmQgaWQ9XCJmaW5hbGl0eS1sZWdlbmRcIiBjbGFzcz1cImZyLWNvbnNlbnQtc2VydmljZV9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2NvbnNlbnQubWFuYWdlci5wcmVmZXJlbmNlcycgfCBkc2ZySTE4biB9fVxuICAgICAgICAgICAgICAgICAgICA8ZHNmci1saW5rXG4gICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidlZHUtbGluaydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaW5rXT1cInJncGROYXZpZ2F0aW9uLmxpbmsgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaW5rVGFyZ2V0XT1cInJncGROYXZpZ2F0aW9uLmxpbmtUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZV09XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3JvdXRlUGF0aF09XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZXJMaW5rID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZXJMaW5rQWN0aXZlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0V4dHJhc109XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZXJMaW5rRXh0cmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAobGlua1NlbGVjdCk9XCJvblJncGRTZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPnt7ICdjb25zZW50Lm1hbmFnZXIucGVyc29uYWxEYXRhJyB8IGRzZnJJMThuIH19PC9kc2ZyLWxpbmtcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItY29uc2VudC1zZXJ2aWNlX19yYWRpb3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjY2VwdEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJjb25zZW50LWFsbC1hY2NlcHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImNvbnNlbnQtYWxsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIGZvcj1cImNvbnNlbnQtYWxsLWFjY2VwdFwiPiB7eyAnY29uc2VudC5hY2NlcHRBbGwnIHwgZHNmckkxOG4gfX0gPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1yYWRpby1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2NlcHRBbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbnNlbnQtYWxsLXJlZnVzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29uc2VudC1hbGxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZyLWxhYmVsXCIgZm9yPVwiY29uc2VudC1hbGwtcmVmdXNlXCI+IHt7ICdjb25zZW50LnJlZnVzZUFsbCcgfCBkc2ZySTE4biB9fSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIEBmb3IgKGZpbmFsaXR5IG9mIGZpbmFsaXRpZXM7IHRyYWNrIGZpbmFsaXR5OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxlZHUtY29uc2VudC1zZXJ2aWNlXG4gICAgICAgICAgICAgICAgICBbZmluYWxpdHldPVwiZmluYWxpdHlcIlxuICAgICAgICAgICAgICAgICAgW2lkeEZpbmFsaXR5XT1cImlcIlxuICAgICAgICAgICAgICAgICAgW2FjY2VwdEFsbF09XCJhY2NlcHRBbGxcIlxuICAgICAgICAgICAgICAgICAgKGZpbmFsaXR5Q2hhbmdlKT1cIm9uRmluYWxpdHlDaGFuZ2UoZmluYWxpdHkpXCI+PC9lZHUtY29uc2VudC1zZXJ2aWNlPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgPCEtLSBCb3V0b24gZGUgY29uZmlybWF0aW9uL2Zlcm1ldHVyZSAtLT5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZnItY29uc2VudC1tYW5hZ2VyX19idXR0b25zIGZyLWJ0bnMtZ3JvdXAgZnItYnRucy1ncm91cC0tcmlnaHQgZnItYnRucy1ncm91cC0taW5saW5lLXNtXCI+XG4gICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ29uZmlybSgpXCIgW2F0dHIuYXJpYS1jb250cm9sc109XCJtb2RhbElkXCIgY2xhc3M9XCJmci1idG5cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2NvbnNlbnQubWFuYWdlci5jb25maXJtQ2hvaWNlcycgfCBkc2ZySTE4biB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGlhbG9nPlxuIl19