UNPKG

@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).

182 lines 27.8 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { DsfrI18nPipe } from '../../shared'; import { DsfrLinkComponent } from '../link'; import { DsfrTagModeConst } from './tag.model'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class DsfrTagComponent { constructor() { /** État d'un tag 'selectable'. */ // 1.3 Non automatiquement modifié lorsque l'état du bouton 'aria-pressed' change, 'aria-pressed' est géré // le JavaScript du DSFR, d'où la gestion de l'événement '(click)' pour synchroniser 'selected' et 'aria-pressed'. this.selected = false; /** Taille du tag (small ou médium). */ this.small = false; /** * Événement émis suite au click sur un tag, le contenu de l'événement est soit le lien, la route ou à défaut le label du tag. * @since 1.4.0, si l'id du tag est renseigné, l'événement émet un objet de type DsfrTagEvent. */ this.tagSelect = new EventEmitter(); } get mode() { if (!this._mode) { if (this.selected) this._mode = DsfrTagModeConst.SELECTABLE; else if (this.link || this.route || this.routePath) this._mode = DsfrTagModeConst.CLICKABLE; } return this._mode; } /** Mode spécifique : default / selectable / clickable / deletable (les modes exclusifs entre eux). */ set mode(value) { this._mode = value; } /** * Attention en cas d'utilisation de cet attribut, il doit être utilisé en tant que propriété et non en attribut, * ex. [id]="'monid'" * * @deprecated (since 1.5) utiliser tagId. */ set id(value) { if (value) { this._id = value; this.tagId ??= this._id; } } /** * Activtion du router Angular. * * routerLink provoque un bug accessibilité sur la navigation au clavier (ajout d'un tabindex=0) * * @deprecated (since 1.11.5) utiliser `routePath` à la place. **/ set routerLink(value) { if (value) this.routePath = value; } ngOnChanges({ selected }) { // On ne se préoccupe pas trop du mode qui à l'initialisation est 'default' (comme ça chacun porte ses responsabilités) if (selected) { // On synchronise l'attribut 'aria-pressed' avec la nouvelle valeur de selected this.ariaPressed = this.selected || false; // || false au cas où on reçoit undefined ou null // On n'émet pas d'événement } } /** * Valeur pour le 'href' dans le template. * @internal */ getHrefValue() { return this.route || this.link; } /** * Tag `selectable` : événement `tagSelect()` avec le contenu de du lien ou à défaut son label. * @internal */ onSelectable() { this.selected = !this.selected; // @since 1.3.2 this.emitTagSelect(this.getHrefValue() || this.label); } /** * Événement (click) sur un lien. * @internal */ onClickable(event) { if (this.route) { event.preventDefault(); this.emitTagSelect(this.route); } } /** * Tag `selectable` : événement `tagSelect()` avec le contenu de `link` ou à défaut son `label`. * @internal */ onDeletable() { this.emitTagSelect(this.getHrefValue() || this.label); } /** @internal */ getSelectableClasses() { return this.getDefaultClasses(); } /** @internal */ getClickableClasses() { const classes = this.getDefaultClasses(); if (this.customClass) classes.push(this.customClass); return classes.join(' '); } /** @internal */ getNotClickableClasses() { return this.getDefaultClasses(); } emitTagSelect(value) { if (!this.tagId) this.tagSelect.emit(value); else { this.tagSelect.emit({ id: this.tagId, label: this.label, link: this.link, route: this.route, selected: this.selected, }); } } getDefaultClasses() { const classes = ['fr-tag']; if (this.small) classes.push('fr-tag--sm'); if (this.icon) { classes.push('fr-tag--icon-left'); classes.push(this.icon); } // Un tag non cliquable ne peut pas avoir de custom class return classes; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrTagComponent, isStandalone: true, selector: "dsfr-tag", inputs: { tagId: "tagId", customClass: "customClass", disabled: "disabled", icon: "icon", label: "label", link: "link", linkTarget: "linkTarget", route: "route", routePath: "routePath", routerLinkActive: "routerLinkActive", routerLinkExtras: "routerLinkExtras", selected: "selected", small: "small", tooltipMessage: "tooltipMessage", ariaLabel: "ariaLabel", mode: "mode", id: "id", routerLink: "routerLink" }, outputs: { tagSelect: "tagSelect" }, usesOnChanges: true, ngImport: i0, template: "@switch (mode) {\n <!-- Tag supprimable -->\n @case ('deletable') {\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"{\n 'fr-tag fr-tag--dismiss': true,\n 'fr-tag--sm': small\n }\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : ('tag.removeFilter' | dsfrI18n) + ' ' + label\"\n [disabled]=\"disabled || null\"\n (click)=\"onDeletable()\">\n {{ label }}\n </button>\n }\n <!-- Tag s\u00E9lectionnable -->\n @case ('selectable') {\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"getSelectableClasses()\"\n [attr.class]=\"icon || null\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : ('tag.selectFilter' | dsfrI18n) + ' ' + label\"\n [attr.aria-pressed]=\"ariaPressed\"\n (click)=\"onSelectable()\"\n [disabled]=\"disabled || null\">\n {{ label }}\n </button>\n }\n <!-- Tag cliquable -->\n @case ('clickable') {\n <dsfr-link\n [linkId]=\"tagId\"\n [customClass]=\"getClickableClasses()\"\n [tooltipMessage]=\"tooltipMessage\"\n [ariaLabel]=\"ariaLabel ? ariaLabel : label\"\n (click)=\"onClickable($event)\"\n [link]=\"link\"\n [targetLink]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n [label]=\"label\"\n [disabled]=\"disabled\">\n </dsfr-link>\n }\n <!-- Tag non cliquable -->\n @default {\n <p [attr.id]=\"tagId || null\" [ngClass]=\"getNotClickableClasses()\" [attr.title]=\"tooltipMessage || null\">\n {{ label }}\n </p>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrTagComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-tag', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, DsfrLinkComponent, DsfrI18nPipe], template: "@switch (mode) {\n <!-- Tag supprimable -->\n @case ('deletable') {\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"{\n 'fr-tag fr-tag--dismiss': true,\n 'fr-tag--sm': small\n }\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : ('tag.removeFilter' | dsfrI18n) + ' ' + label\"\n [disabled]=\"disabled || null\"\n (click)=\"onDeletable()\">\n {{ label }}\n </button>\n }\n <!-- Tag s\u00E9lectionnable -->\n @case ('selectable') {\n <button\n type=\"button\"\n [attr.id]=\"tagId || null\"\n [ngClass]=\"getSelectableClasses()\"\n [attr.class]=\"icon || null\"\n [attr.title]=\"tooltipMessage || null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : ('tag.selectFilter' | dsfrI18n) + ' ' + label\"\n [attr.aria-pressed]=\"ariaPressed\"\n (click)=\"onSelectable()\"\n [disabled]=\"disabled || null\">\n {{ label }}\n </button>\n }\n <!-- Tag cliquable -->\n @case ('clickable') {\n <dsfr-link\n [linkId]=\"tagId\"\n [customClass]=\"getClickableClasses()\"\n [tooltipMessage]=\"tooltipMessage\"\n [ariaLabel]=\"ariaLabel ? ariaLabel : label\"\n (click)=\"onClickable($event)\"\n [link]=\"link\"\n [targetLink]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n [label]=\"label\"\n [disabled]=\"disabled\">\n </dsfr-link>\n }\n <!-- Tag non cliquable -->\n @default {\n <p [attr.id]=\"tagId || null\" [ngClass]=\"getNotClickableClasses()\" [attr.title]=\"tooltipMessage || null\">\n {{ label }}\n </p>\n }\n}\n" }] }], propDecorators: { tagId: [{ type: Input }], customClass: [{ type: Input }], disabled: [{ type: Input }], icon: [{ type: Input }], label: [{ type: Input }], link: [{ type: Input }], linkTarget: [{ type: Input }], route: [{ type: Input }], routePath: [{ type: Input }], routerLinkActive: [{ type: Input }], routerLinkExtras: [{ type: Input }], selected: [{ type: Input }], small: [{ type: Input }], tooltipMessage: [{ type: Input }], ariaLabel: [{ type: Input }], tagSelect: [{ type: Output }], mode: [{ type: Input }], id: [{ type: Input }], routerLink: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhZy90YWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGFnL3RhZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEgsT0FBTyxFQUFFLFlBQVksRUFBa0IsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBc0MsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7OztBQVNuRixNQUFNLE9BQU8sZ0JBQWdCO0lBUDdCO1FBd0RFLGtDQUFrQztRQUNsQywwR0FBMEc7UUFDMUcsa0hBQWtIO1FBQ3pHLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUIsdUNBQXVDO1FBQzlCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFPdkI7OztXQUdHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO0tBc0lqRTtJQTVIQyxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7aUJBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElB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RyxTQUFTO3NCQUFqQixLQUFLO2dCQU1JLFNBQVM7c0JBQWxCLE1BQU07Z0JBbUJNLElBQUk7c0JBQWhCLEtBQUs7Z0JBVU8sRUFBRTtzQkFBZCxLQUFLO2dCQWNPLFVBQVU7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FeHRyYXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRHNmckkxOG5QaXBlLCBEc2ZyTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyTGlua0NvbXBvbmVudCB9IGZyb20gJy4uL2xpbmsnO1xuaW1wb3J0IHsgRHNmclRhZywgRHNmclRhZ0V2ZW50LCBEc2ZyVGFnTW9kZSwgRHNmclRhZ01vZGVDb25zdCB9IGZyb20gJy4vdGFnLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci10YWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFnLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHNmckxpbmtDb21wb25lbnQsIERzZnJJMThuUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJUYWdDb21wb25lbnQgaW1wbGVtZW50cyBPbWl0PERzZnJUYWcsICd0aXRsZSc+LCBPbkNoYW5nZXMge1xuICAvKipcbiAgICogSUQgZHUgdGFnLCBvcHRpb25uZWwuXG4gICAqL1xuICBASW5wdXQoKSB0YWdJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgcGVyc29ubmFsaXNlciBsYSBjb3VsZXVyIGR1IHRhZy5cbiAgICpcbiAgICogSWwgZmF1dCBkb25uZXIgbGEgY2xhc3NlIGV4YWN0ZSAoZXggOiBgZnItdGFnLS1ncmVlbi1lbWVyYXVkZWApLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnN5c3RlbWUtZGUtZGVzaWduLmdvdXYuZnIvZm9uZGFtZW50YXV4L2NvdWxldXJzLXBhbGV0dGUjYWNjZW50XG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21DbGFzczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZCdhdm9pciB1biB0YWcgY2xpcXVhYmxlIGRpc2FibGVkLlxuICAgKlxuICAgKiBAc2luY2UgMS4zXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKiogQ2xhc3NlIGRlIGwnaWPDtG5lIChjZi4gRFNGUiBUQUcpLiAqL1xuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIHVuZGVmaW5lZCBjYXIgcGV1dCBwcm92ZW5pciBkJ3VuIERzZnJUYWcuaWNvbiBkYW5zIGxlIGNhcyBkJ3VuIGdyb3VwZVxuXG4gIC8qKiBMaWJlbGxlIGR1IHRhZy4gKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICAvKiogTW9kZSBoeXBlcmxpZW4gZXh0ZXJuZSwgZXhjbHVzaWYgYXZlYyBsZXMgcHJvcHJpw6l0w6lzIGByb3V0ZWAgZXQgYHJvdXRlUGF0aGAuICovXG4gIEBJbnB1dCgpIGxpbms6IHN0cmluZztcblxuICAvKiogVGFyZ2V0IGR1IGxpZW4uIFRhcmdldCBwYXIgZMOpZmF1dCBkZSBsJ2FwcGxpY2F0aW9uIHNpIGxhIHByb3ByacOpdMOpIGVzdCBub24gcmVuc2VpZ27DqWUuICovXG4gIEBJbnB1dCgpIGxpbmtUYXJnZXQ6IERzZnJMaW5rVGFyZ2V0O1xuXG4gIC8qKlxuICAgKiBNb2RlIGFjdGlvbi4gTGEgcm91dGUgc3DDqWNpZmnDqSBzZXJhIHJldHJhbnNtaXNlIGRhbnMgbCfDqXbDqW5lbWVudCBsb3JzIGRlIGxhIHPDqWxlY3Rpb24uXG4gICAqIFVzYWdlIGV4Y2x1c2lmIGF2ZWMgbGVzIHByb3ByacOpdMOpcyBgbGlua2AgZXQgYHJvdXRlUGF0aGAuXG4gICAqL1xuICBASW5wdXQoKSByb3V0ZTogc3RyaW5nO1xuXG4gIC8qKiBBY3RpdmUgbGEgZGlyZWN0aXZlIFJvdXRlckxpbmsuIEV4Y2x1c2lmIGF2ZWMgbGVzIHByb3ByacOpdMOpcyBgbGlua2AgZXQgYHJvdXRlYC4gKi9cbiAgQElucHV0KCkgcm91dGVQYXRoOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKiogRW4gdXNhZ2UgY29uamludCBhdmVjIHJvdXRlUGF0aCAoYWN0aXZhdGlvbiBSb3V0ZXJMaW5rKSA6IGNsYXNzZSB1dGlsaXPDqWUgcG91ciBsYSBkaXJlY3RpdmUgcm91dGVyTGluayBhY3RpdmUuICovXG4gIEBJbnB1dCgpIHJvdXRlckxpbmtBY3RpdmU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBFbiB1c2FnZSBjb25qaW50IGF2ZWMgcm91dGVQYXRoIChhY3RpdmF0aW9uIFJvdXRlckxpbmspIDogdmFsZXVycyBhZGRpdGlvbm5lbGxlcyBkZSBuYXZpZ2F0aW9uIHBvdXIgbGUgcm91dGVyTGluayAocXVlcnlQYXJhbXMsIHN0YXRlIGV0Yy4pICovXG4gIEBJbnB1dCgpIHJvdXRlckxpbmtFeHRyYXM6IE5hdmlnYXRpb25FeHRyYXM7XG5cbiAgLyoqIMOJdGF0IGQndW4gdGFnICdzZWxlY3RhYmxlJy4gKi9cbiAgLy8gMS4zIE5vbiBhdXRvbWF0aXF1ZW1lbnQgbW9kaWZpw6kgbG9yc3F1ZSBsJ8OpdGF0IGR1IGJvdXRvbiAnYXJpYS1wcmVzc2VkJyBjaGFuZ2UsICdhcmlhLXByZXNzZWQnIGVzdCBnw6lyw6lcbiAgLy8gbGUgSmF2YVNjcmlwdCBkdSBEU0ZSLCBkJ2/DuSBsYSBnZXN0aW9uIGRlIGwnw6l2w6luZW1lbnQgJyhjbGljayknIHBvdXIgc3luY2hyb25pc2VyICdzZWxlY3RlZCcgZXQgJ2FyaWEtcHJlc3NlZCcuXG4gIEBJbnB1dCgpIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgLyoqIFRhaWxsZSBkdSB0YWcgKHNtYWxsIG91IG3DqWRpdW0pLiAqL1xuICBASW5wdXQoKSBzbWFsbCA9IGZhbHNlO1xuXG4gIC8qKiBEb25uZSBsJ2F0dHJpYnV0IHRpdGxlIHBvdXIgbGVzIGxpZW5zLiAqL1xuICBASW5wdXQoKSB0b29sdGlwTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiDDiXbDqW5lbWVudCDDqW1pcyBzdWl0ZSBhdSBjbGljayBzdXIgdW4gdGFnLCBsZSBjb250ZW51IGRlIGwnw6l2w6luZW1lbnQgZXN0IHNvaXQgbGUgbGllbiwgbGEgcm91dGUgb3Ugw6AgZMOpZmF1dCBsZSBsYWJlbCBkdSB0YWcuXG4gICAqIEBzaW5jZSAxLjQuMCwgc2kgbCdpZCBkdSB0YWcgZXN0IHJlbnNlaWduw6ksIGwnw6l2w6luZW1lbnQgw6ltZXQgdW4gb2JqZXQgZGUgdHlwZSBEc2ZyVGFnRXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgdGFnU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBEc2ZyVGFnRXZlbnQ+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhcmlhUHJlc3NlZDogYm9vbGVhbjtcblxuICAvKiogTW9kZSBzcMOpY2lmaXF1ZSA6IGRlZmF1bHQgLyBzZWxlY3RhYmxlIC8gY2xpY2thYmxlIC8gZGVsZXRhYmxlIChsZXMgbW9kZXMgZXhjbHVzaWZzIGVudHJlIGV1eCkuICovXG4gIHByaXZhdGUgX21vZGU6IERzZnJUYWdNb2RlO1xuXG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG5cbiAgZ2V0IG1vZGUoKTogRHNmclRhZ01vZGUge1xuICAgIGlmICghdGhpcy5fbW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHRoaXMuX21vZGUgPSBEc2ZyVGFnTW9kZUNvbnN0LlNFTEVDVEFCTEU7XG4gICAgICBlbHNlIGlmICh0aGlzLmxpbmsgfHwgdGhpcy5yb3V0ZSB8fCB0aGlzLnJvdXRlUGF0aCkgdGhpcy5fbW9kZSA9IERzZnJUYWdNb2RlQ29uc3QuQ0xJQ0tBQkxFO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8qKiBNb2RlIHNww6ljaWZpcXVlIDogZGVmYXVsdCAvIHNlbGVjdGFibGUgLyBjbGlja2FibGUgLyBkZWxldGFibGUgKGxlcyBtb2RlcyBleGNsdXNpZnMgZW50cmUgZXV4KS4gKi9cbiAgQElucHV0KCkgc2V0IG1vZGUodmFsdWU6IERzZnJUYWdNb2RlKSB7XG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVudGlvbiBlbiBjYXMgZCd1dGlsaXNhdGlvbiBkZSBjZXQgYXR0cmlidXQsIGlsIGRvaXQgw6p0cmUgdXRpbGlzw6kgZW4gdGFudCBxdWUgcHJvcHJpw6l0w6kgZXQgbm9uIGVuIGF0dHJpYnV0LFxuICAgKiBleC4gW2lkXT1cIidtb25pZCdcIlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCAoc2luY2UgMS41KSB1dGlsaXNlciB0YWdJZC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgICAgdGhpcy50YWdJZCA/Pz0gdGhpcy5faWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2dGlvbiBkdSByb3V0ZXIgQW5ndWxhci5cbiAgICpcbiAgICogcm91dGVyTGluayBwcm92b3F1ZSB1biBidWcgYWNjZXNzaWJpbGl0w6kgc3VyIGxhIG5hdmlnYXRpb24gYXUgY2xhdmllciAoYWpvdXQgZCd1biB0YWJpbmRleD0wKVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCAoc2luY2UgMS4xMS41KSB1dGlsaXNlciBgcm91dGVQYXRoYCDDoCBsYSBwbGFjZS5cbiAgICoqL1xuICBASW5wdXQoKSBzZXQgcm91dGVyTGluayh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUpIHRoaXMucm91dGVQYXRoID0gdmFsdWU7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyh7IHNlbGVjdGVkIH06IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBPbiBuZSBzZSBwcsOpb2NjdXBlIHBhcyB0cm9wIGR1IG1vZGUgcXVpIMOgIGwnaW5pdGlhbGlzYXRpb24gZXN0ICdkZWZhdWx0JyAoY29tbWUgw6dhIGNoYWN1biBwb3J0ZSBzZXMgcmVzcG9uc2FiaWxpdMOpcylcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIC8vIE9uIHN5bmNocm9uaXNlIGwnYXR0cmlidXQgJ2FyaWEtcHJlc3NlZCcgYXZlYyBsYSBub3V2ZWxsZSB2YWxldXIgZGUgc2VsZWN0ZWRcbiAgICAgIHRoaXMuYXJpYVByZXNzZWQgPSB0aGlzLnNlbGVjdGVkIHx8IGZhbHNlOyAvLyB8fCBmYWxzZSBhdSBjYXMgb8O5IG9uIHJlw6dvaXQgdW5kZWZpbmVkIG91IG51bGxcbiAgICAgIC8vIE9uIG4nw6ltZXQgcGFzIGQnw6l2w6luZW1lbnRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsZXVyIHBvdXIgbGUgJ2hyZWYnIGRhbnMgbGUgdGVtcGxhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0SHJlZlZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm91dGUgfHwgdGhpcy5saW5rO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhZyBgc2VsZWN0YWJsZWAgOiDDqXbDqW5lbWVudCBgdGFnU2VsZWN0KClgIGF2ZWMgbGUgY29udGVudSBkZSBkdSBsaWVuIG91IMOgIGTDqWZhdXQgc29uIGxhYmVsLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uU2VsZWN0YWJsZSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gIXRoaXMuc2VsZWN0ZWQ7IC8vIEBzaW5jZSAxLjMuMlxuICAgIHRoaXMuZW1pdFRhZ1NlbGVjdCh0aGlzLmdldEhyZWZWYWx1ZSgpIHx8IHRoaXMubGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIMOJdsOpbmVtZW50IChjbGljaykgc3VyIHVuIGxpZW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25DbGlja2FibGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMucm91dGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmVtaXRUYWdTZWxlY3QodGhpcy5yb3V0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRhZyBgc2VsZWN0YWJsZWAgOiDDqXbDqW5lbWVudCBgdGFnU2VsZWN0KClgIGF2ZWMgbGUgY29udGVudSBkZSBgbGlua2Agb3Ugw6AgZMOpZmF1dCBzb24gYGxhYmVsYC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbkRlbGV0YWJsZSgpIHtcbiAgICB0aGlzLmVtaXRUYWdTZWxlY3QodGhpcy5nZXRIcmVmVmFsdWUoKSB8fCB0aGlzLmxhYmVsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0YWJsZUNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDbGFzc2VzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldENsaWNrYWJsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5nZXREZWZhdWx0Q2xhc3NlcygpO1xuICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSBjbGFzc2VzLnB1c2godGhpcy5jdXN0b21DbGFzcyk7XG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXROb3RDbGlja2FibGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0Q2xhc3NlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFnU2VsZWN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMudGFnSWQpIHRoaXMudGFnU2VsZWN0LmVtaXQodmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy50YWdTZWxlY3QuZW1pdCh7XG4gICAgICAgIGlkOiB0aGlzLnRhZ0lkLFxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbCxcbiAgICAgICAgbGluazogdGhpcy5saW5rLFxuICAgICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFsnZnItdGFnJ107XG5cbiAgICBpZiAodGhpcy5zbWFsbCkgY2xhc3Nlcy5wdXNoKCdmci10YWctLXNtJyk7XG4gICAgaWYgKHRoaXMuaWNvbikge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmci10YWctLWljb24tbGVmdCcpO1xuICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuaWNvbik7XG4gICAgfVxuICAgIC8vIFVuIHRhZyBub24gY2xpcXVhYmxlIG5lIHBldXQgcGFzIGF2b2lyIGRlIGN1c3RvbSBjbGFzc1xuXG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbn1cbiIsIkBzd2l0Y2ggKG1vZGUpIHtcbiAgPCEtLSBUYWcgc3VwcHJpbWFibGUgLS0+XG4gIEBjYXNlICgnZGVsZXRhYmxlJykge1xuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuaWRdPVwidGFnSWQgfHwgbnVsbFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdmci10YWcgZnItdGFnLS1kaXNtaXNzJzogdHJ1ZSxcbiAgICAgICAgJ2ZyLXRhZy0tc20nOiBzbWFsbFxuICAgICAgfVwiXG4gICAgICBbYXR0ci50aXRsZV09XCJ0b29sdGlwTWVzc2FnZSB8fCBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogKCd0YWcucmVtb3ZlRmlsdGVyJyB8IGRzZnJJMThuKSArICcgJyArIGxhYmVsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBudWxsXCJcbiAgICAgIChjbGljayk9XCJvbkRlbGV0YWJsZSgpXCI+XG4gICAgICB7eyBsYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICB9XG4gIDwhLS0gVGFnIHPDqWxlY3Rpb25uYWJsZSAtLT5cbiAgQGNhc2UgKCdzZWxlY3RhYmxlJykge1xuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuaWRdPVwidGFnSWQgfHwgbnVsbFwiXG4gICAgICBbbmdDbGFzc109XCJnZXRTZWxlY3RhYmxlQ2xhc3NlcygpXCJcbiAgICAgIFthdHRyLmNsYXNzXT1cImljb24gfHwgbnVsbFwiXG4gICAgICBbYXR0ci50aXRsZV09XCJ0b29sdGlwTWVzc2FnZSB8fCBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogKCd0YWcuc2VsZWN0RmlsdGVyJyB8IGRzZnJJMThuKSArICcgJyArIGxhYmVsXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJhcmlhUHJlc3NlZFwiXG4gICAgICAoY2xpY2spPVwib25TZWxlY3RhYmxlKClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIH1cbiAgPCEtLSBUYWcgY2xpcXVhYmxlIC0tPlxuICBAY2FzZSAoJ2NsaWNrYWJsZScpIHtcbiAgICA8ZHNmci1saW5rXG4gICAgICBbbGlua0lkXT1cInRhZ0lkXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCJnZXRDbGlja2FibGVDbGFzc2VzKClcIlxuICAgICAgW3Rvb2x0aXBNZXNzYWdlXT1cInRvb2x0aXBNZXNzYWdlXCJcbiAgICAgIFthcmlhTGFiZWxdPVwiYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogbGFiZWxcIlxuICAgICAgKGNsaWNrKT1cIm9uQ2xpY2thYmxlKCRldmVudClcIlxuICAgICAgW2xpbmtdPVwibGlua1wiXG4gICAgICBbdGFyZ2V0TGlua109XCJsaW5rVGFyZ2V0XCJcbiAgICAgIFtyb3V0ZV09XCJyb3V0ZVwiXG4gICAgICBbcm91dGVQYXRoXT1cInJvdXRlUGF0aFwiXG4gICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJyb3V0ZXJMaW5rQWN0aXZlID8/ICcnXCJcbiAgICAgIFtyb3V0ZXJMaW5rRXh0cmFzXT1cInJvdXRlckxpbmtFeHRyYXNcIlxuICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgIDwvZHNmci1saW5rPlxuICB9XG4gIDwhLS0gVGFnIG5vbiBjbGlxdWFibGUgLS0+XG4gIEBkZWZhdWx0IHtcbiAgICA8cCBbYXR0ci5pZF09XCJ0YWdJZCB8fCBudWxsXCIgW25nQ2xhc3NdPVwiZ2V0Tm90Q2xpY2thYmxlQ2xhc3NlcygpXCIgW2F0dHIudGl0bGVdPVwidG9vbHRpcE1lc3NhZ2UgfHwgbnVsbFwiPlxuICAgICAge3sgbGFiZWwgfX1cbiAgICA8L3A+XG4gIH1cbn1cbiJdfQ==