@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).
125 lines • 25.4 kB
JavaScript
import { CommonModule, NgOptimizedImage } from '@angular/common';
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { DsfrSizeConst } from '../../shared';
import { DsfrLinkComponent } from '../link';
import { DsfrTranscriptionComponent } from '../transcription';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "../../shared/services/logger.service";
import * as i3 from "@angular/common";
export class DsfrContentComponent {
constructor(sanitizer, loggerService) {
this.sanitizer = sanitizer;
this.loggerService = loggerService;
// -- Commun images / vidéos -----------------------------------------------------------------------------------------
/** Type du média 'image' | 'video', 'image' par défaut. */
this.type = 'image';
/** Le format conseillé par défaut est le 16:9. */
this.ratio = '16:9';
// -------------------------------------------------------------------------------------------------------------------
/**
* Si une route est spécifiée, émet un événement avec la route comme valeur, sinon n'émet rien.
*/
this.linkSelect = new EventEmitter();
this._size = DsfrSizeConst.MD;
}
get size() {
return this._size;
}
/** @deprecated (since 1.6) utiliser `transcriptionContent` à la place */
get transcription() {
return this.transcriptionContent;
}
/** @deprecated (since 1.6) utiliser `transcriptionLinkLabel` à la place */
get transcriptionLabel() {
return this.linkLabel;
}
/** @deprecated (since 1.6) utiliser `transcriptionContent` à la place */
set transcription(value) {
this.transcriptionContent = value;
}
/** @deprecated (since 1.6) utiliser `transcriptionLinkLabel` à la place */
set transcriptionLabel(value) {
this.linkLabel = value;
}
/** Redimensionnement du composant : `LG` : 125%, `MD` : 100% (défault), `SM` : 75%. */
set size(value) {
this._size = value?.toUpperCase();
}
/**
* @deprecated (since 1.11.5) utiliser `routePath` à la place.
* routerLink provoque un bug accessibilité sur la navigation au clavier (ajout d'un tabindex=0)
**/
set routerLink(value) {
if (value)
this.routePath = value;
}
ngOnInit() {
this.verifyAccessibility();
}
/** @internal */
onLinkSelect() {
if (this.route) {
this.linkSelect.emit(this.route);
}
}
/**
* @internal
*/
sanitizedSource() {
return this.sanitizer.bypassSecurityTrustResourceUrl(this.source);
}
verifyAccessibility() {
const missingVideoTitle = this.type === 'video' && !this.tooltipMessage;
if (missingVideoTitle) {
this.loggerService.warn('dsfr-content : Renseigner le titre du contenu est obligatoire (tooltipMessage).');
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrContentComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrContentComponent, isStandalone: true, selector: "dsfr-content", inputs: { type: "type", legend: "legend", ratio: "ratio", source: "source", linkLabel: "linkLabel", link: "link", linkTarget: "linkTarget", route: "route", routePath: "routePath", routerLinkActive: "routerLinkActive", routerLinkExtras: "routerLinkExtras", tooltipMessage: "tooltipMessage", transcriptionContent: "transcriptionContent", transcriptionHeading: "transcriptionHeading", alternate: "alternate", transcription: "transcription", transcriptionLabel: "transcriptionLabel", size: "size", routerLink: "routerLink" }, outputs: { linkSelect: "linkSelect" }, ngImport: i0, template: "<figure\n class=\"fr-content-media\"\n [class.fr-content-media--lg]=\"size === 'LG'\"\n [class.fr-content-media--sm]=\"size === 'SM'\"\n role=\"group\"\n [attr.aria-label]=\"legend\">\n @if (type === 'image') {\n <div class=\"fr-content-media__img\">\n @if (source) {\n <img\n class=\"fr-responsive-img\"\n [attr.title]=\"tooltipMessage || null\"\n [ngClass]=\"{\n 'fr-ratio-32x9': ratio === '16:9/2',\n 'fr-ratio-16x9': ratio === '16:9',\n 'fr-ratio-3x2': ratio === '3:2',\n 'fr-ratio-4x3': ratio === '4:3',\n 'fr-ratio-1x1': ratio === '1:1',\n 'fr-ratio-3x4': ratio === '3:4',\n 'fr-ratio-2x3': ratio === '2:3'\n }\"\n [src]=\"source\"\n [alt]=\"alternate\" />\n }\n <!-- since 1.6 slot par d\u00E9faut d\u00E9pr\u00E9ci\u00E9 -->\n <ng-content></ng-content>\n <!-- since 1.6 ajout du slot 'svg' -->\n <ng-content select=\"[svg]\"></ng-content>\n </div>\n } @else if (type === 'video') {\n <iframe\n [attr.title]=\"tooltipMessage || null\"\n class=\"fr-responsive-vid\"\n [class.fr-ratio-16x9]=\"ratio === '16:9'\"\n [class.fr-ratio-4x3]=\"ratio === '4:3'\"\n [class.fr-ratio-1x1]=\"ratio === '1:1'\"\n [src]=\"sanitizedSource()\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen></iframe>\n }\n\n @if (legend || linkLabel) {\n <figcaption class=\"fr-content-media__caption\">\n {{ legend }}\n @if (linkLabel) {\n <dsfr-link\n [link]=\"link\"\n [label]=\"linkLabel\"\n [linkTarget]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n (linkSelect)=\"onLinkSelect()\">\n </dsfr-link>\n }\n </figcaption>\n }\n</figure>\n@if (transcriptionContent) {\n <dsfr-transcription [heading]=\"transcriptionHeading\" [content]=\"transcriptionContent\"></dsfr-transcription>\n} @else {\n <!-- since 1.6 ajout du slot 'transcription' -->\n <ng-content select=\"[transcription]\"></ng-content>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DsfrTranscriptionComponent, selector: "dsfr-transcription", inputs: ["content", "heading"] }, { 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"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrContentComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-content', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, DsfrTranscriptionComponent, DsfrLinkComponent, NgOptimizedImage], template: "<figure\n class=\"fr-content-media\"\n [class.fr-content-media--lg]=\"size === 'LG'\"\n [class.fr-content-media--sm]=\"size === 'SM'\"\n role=\"group\"\n [attr.aria-label]=\"legend\">\n @if (type === 'image') {\n <div class=\"fr-content-media__img\">\n @if (source) {\n <img\n class=\"fr-responsive-img\"\n [attr.title]=\"tooltipMessage || null\"\n [ngClass]=\"{\n 'fr-ratio-32x9': ratio === '16:9/2',\n 'fr-ratio-16x9': ratio === '16:9',\n 'fr-ratio-3x2': ratio === '3:2',\n 'fr-ratio-4x3': ratio === '4:3',\n 'fr-ratio-1x1': ratio === '1:1',\n 'fr-ratio-3x4': ratio === '3:4',\n 'fr-ratio-2x3': ratio === '2:3'\n }\"\n [src]=\"source\"\n [alt]=\"alternate\" />\n }\n <!-- since 1.6 slot par d\u00E9faut d\u00E9pr\u00E9ci\u00E9 -->\n <ng-content></ng-content>\n <!-- since 1.6 ajout du slot 'svg' -->\n <ng-content select=\"[svg]\"></ng-content>\n </div>\n } @else if (type === 'video') {\n <iframe\n [attr.title]=\"tooltipMessage || null\"\n class=\"fr-responsive-vid\"\n [class.fr-ratio-16x9]=\"ratio === '16:9'\"\n [class.fr-ratio-4x3]=\"ratio === '4:3'\"\n [class.fr-ratio-1x1]=\"ratio === '1:1'\"\n [src]=\"sanitizedSource()\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen></iframe>\n }\n\n @if (legend || linkLabel) {\n <figcaption class=\"fr-content-media__caption\">\n {{ legend }}\n @if (linkLabel) {\n <dsfr-link\n [link]=\"link\"\n [label]=\"linkLabel\"\n [linkTarget]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n (linkSelect)=\"onLinkSelect()\">\n </dsfr-link>\n }\n </figcaption>\n }\n</figure>\n@if (transcriptionContent) {\n <dsfr-transcription [heading]=\"transcriptionHeading\" [content]=\"transcriptionContent\"></dsfr-transcription>\n} @else {\n <!-- since 1.6 ajout du slot 'transcription' -->\n <ng-content select=\"[transcription]\"></ng-content>\n}\n" }]
}], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i2.LoggerService }], propDecorators: { type: [{
type: Input
}], legend: [{
type: Input
}], ratio: [{
type: Input
}], source: [{
type: Input
}], linkLabel: [{
type: Input
}], link: [{
type: Input
}], linkTarget: [{
type: Input
}], route: [{
type: Input
}], routePath: [{
type: Input
}], routerLinkActive: [{
type: Input
}], routerLinkExtras: [{
type: Input
}], tooltipMessage: [{
type: Input
}], transcriptionContent: [{
type: Input
}], transcriptionHeading: [{
type: Input
}], alternate: [{
type: Input
}], linkSelect: [{
type: Output
}], transcription: [{
type: Input
}], transcriptionLabel: [{
type: Input
}], size: [{
type: Input
}], routerLink: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9jb250ZW50L2NvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY29udGVudC9jb250ZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2xHLE9BQU8sRUFBNEMsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7QUFjOUQsTUFBTSxPQUFPLG9CQUFvQjtJQStFL0IsWUFDVSxTQUF1QixFQUN2QixhQUE0QjtRQUQ1QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBaEZ0QyxzSEFBc0g7UUFFdEgsMkRBQTJEO1FBQ2xELFNBQUksR0FBYyxPQUFPLENBQUM7UUFLbkMsa0RBQWtEO1FBQ3pDLFVBQUssR0FBNEIsTUFBTSxDQUFDO1FBNERqRCxzSEFBc0g7UUFFdEg7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUxQyxVQUFLLEdBQWEsYUFBYSxDQUFDLEVBQUUsQ0FBQztJQUt4QyxDQUFDO0lBRUosSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxJQUFhLGFBQWEsQ0FBQyxLQUFhO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxJQUFhLGtCQUFrQixDQUFDLEtBQWE7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELHVGQUF1RjtJQUN2RixJQUFhLElBQUksQ0FBQyxLQUFlO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQWEsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7O1FBR0k7SUFDSixJQUFhLFVBQVUsQ0FBQyxLQUFvQztRQUMxRCxJQUFJLEtBQUs7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRXhFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQzdHLENBQUM7SUFDSCxDQUFDOytHQWpKVSxvQkFBb0I7bUdBQXBCLG9CQUFvQix5bkJDckJqQyx1dUVBaUVBLDJDRDlDWSxZQUFZLDZIQUFFLDBCQUEwQiwrRkFBRSxpQkFBaUI7OzRGQUUxRCxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0UsY0FBYyxpQkFFVCxpQkFBaUIsQ0FBQyxJQUFJLGNBQ3pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSwwQkFBMEIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQzs2R0FNL0UsSUFBSTtzQkFBWixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQVNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQVNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFPRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBU0csU0FBUztzQkFBakIsS0FBSztnQkFPSSxVQUFVO3NCQUFuQixNQUFNO2dCQXdCTSxhQUFhO3NCQUF6QixLQUFLO2dCQUtPLGtCQUFrQjtzQkFBOUIsS0FBSztnQkFLTyxJQUFJO3NCQUFoQixLQUFLO2dCQVFPLFVBQVU7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIE5nT3B0aW1pemVkSW1hZ2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkV4dHJhcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEc2ZyTGlua1RhcmdldCwgRHNmck5hdmlnYXRpb24sIERzZnJTaXplLCBEc2ZyU2l6ZUNvbnN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHNmckxpbmtDb21wb25lbnQgfSBmcm9tICcuLi9saW5rJztcbmltcG9ydCB7IERzZnJUcmFuc2NyaXB0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdHJhbnNjcmlwdGlvbic7XG5pbXBvcnQgeyBEc2ZyTWVkaWEgfSBmcm9tICcuL2NvbnRlbnQubW9kZWwnO1xuXG4vLyBodHRwczovL3d3dy5zeXN0ZW1lLWRlLWRlc2lnbi5nb3V2LmZyL2VsZW1lbnRzLWQtaW50ZXJmYWNlL2ZvbmRhbWVudGF1eC10ZWNobmlxdWVzL21lZGlhcy9cbnR5cGUgUmF0aW9JbWFnZSA9ICcxNjo5LzInIHwgJzE2OjknIHwgJzM6MicgfCAnNDozJyB8ICcxOjEnIHwgJzM6NCcgfCAnMjozJztcbnR5cGUgUmF0aW9WaWRlbyA9ICcxNjo5JyB8ICc0OjMnIHwgJzE6MSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHNmclRyYW5zY3JpcHRpb25Db21wb25lbnQsIERzZnJMaW5rQ29tcG9uZW50LCBOZ09wdGltaXplZEltYWdlXSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmckNvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBEc2ZyTmF2aWdhdGlvbiwgT25Jbml0IHtcbiAgLy8gLS0gQ29tbXVuIGltYWdlcyAvIHZpZMOpb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogVHlwZSBkdSBtw6lkaWEgJ2ltYWdlJyB8ICd2aWRlbycsICdpbWFnZScgcGFyIGTDqWZhdXQuICovXG4gIEBJbnB1dCgpIHR5cGU6IERzZnJNZWRpYSA9ICdpbWFnZSc7XG5cbiAgLyoqIEzDqWdlbmRlLCBvcHRpb25uZWxsZSAqL1xuICBASW5wdXQoKSBsZWdlbmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogTGUgZm9ybWF0IGNvbnNlaWxsw6kgcGFyIGTDqWZhdXQgZXN0IGxlIDE2OjkuICovXG4gIEBJbnB1dCgpIHJhdGlvOiBSYXRpb0ltYWdlIHwgUmF0aW9WaWRlbyA9ICcxNjo5JztcblxuICAvKiogTWVkaWEsIGltYWdlLCB2aWTDqW8gb3UgYXVkaW8sIG9ibGlnYXRvaXJlICovXG4gIEBJbnB1dCgpIHNvdXJjZTogc3RyaW5nO1xuXG4gIC8vIC0tIExpZW4gZGUgdHJhbnNjcmlwdGlvbiBzb3VzIGxlIG1lZGlhIChvcHRpb25uZWwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogTGFiZWwgZHUgbGllbiAoZGUgdHJhbnNjcmlwdGlvbiksIG9wdGlvbm5lbC5cbiAgICpcbiAgICogQHNpbmNlIDEuNiByZW1wbGFjZSAndHJhbnNjcmlwdGlvbkxhYmVsJy5cbiAgICovXG4gIEBJbnB1dCgpIGxpbmtMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBMaWVuIGRlIHRyYW5zY3JpcHRpb24gKG91IGF1dHJlKSwgb3B0aW9ubmVsLiAqL1xuICBASW5wdXQoKSBsaW5rOiBzdHJpbmc7XG5cbiAgLyoqIFRhcmdldCBkdSBsaWVuLiBUYXJnZXQgcGFyIGTDqWZhdXQgZGUgbCdhcHBsaWNhdGlvbiBzaSBsYSBwcm9wcmnDqXTDqSBlc3Qgbm9uIHJlbnNlaWduw6llLiAqL1xuICBASW5wdXQoKSBsaW5rVGFyZ2V0OiBEc2ZyTGlua1RhcmdldDtcblxuICAvKiogUGF0aCBpbnRlcm5lLiBFeGNsdXNpZiBhdmVjIGxpbmsgZXQgcm91dGVQYXRoICovXG4gIEBJbnB1dCgpIHJvdXRlOiBzdHJpbmc7XG5cbiAgLyoqIFBhdGggYW5ndWxhciBnw6lyw6kgZW4gdGFudCBxdWUgZGlyZWN0aXZlIHJvdXRlckxpbmsuIEV4Y2x1c2lmIGF2ZWMgbGluayBldCByb3V0ZS4gKi9cbiAgQElucHV0KCkgcm91dGVQYXRoOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKiogUm91dGVyTGluayA6IGNsYXNzZSB1dGlsaXPDqWUgcG91ciBsYSBkaXJlY3RpdmUgcm91dGVyTGluayBhY3RpdmUuICovXG4gIEBJbnB1dCgpIHJvdXRlckxpbmtBY3RpdmU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSb3V0ZXJMaW5rIDogdmFsZXVycyBhZGRpdGlvbm5lbGxlcyBkZSBuYXZpZ2F0aW9uIHBvdXIgbGUgcm91dGVyTGluayAocXVlcnlQYXJhbXMsIHN0YXRlLCBldGMuKSAqL1xuICBASW5wdXQoKSByb3V0ZXJMaW5rRXh0cmFzOiBOYXZpZ2F0aW9uRXh0cmFzO1xuXG4gIC8qKiBNZXNzYWdlIGR1IHRvb2x0aXAgZHUgbcOpZGlhLiAqL1xuICBASW5wdXQoKSB0b29sdGlwTWVzc2FnZTogc3RyaW5nO1xuXG4gIC8vIC0tIE1vZGFsIGRlIHRyYW5zY3JpcHRpb24gKG9wdGlvbm5lbCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ29udGVudSwgc2ltcGxlLCBvcHRpb25uZWwgZGUgbGEgbW9kYWxlIGRlIHRyYW5zY3JpcHRpb24uXG4gICAqXG4gICAqIEBzaW5jZSAxLjYgcmVtcGxhY2UgJ3RyYW5zY3JpcHRpb24nLlxuICAgKi9cbiAgQElucHV0KCkgdHJhbnNjcmlwdGlvbkNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGl0cmUgZHUgbcOpZGlhIChpbWFnZSBvdSB2aWTDqW8pLCBkZSBuaXZlYXUgaDEuXG4gICAqXG4gICAqIEBzaW5jZSAxLjZcbiAgICovXG4gIEBJbnB1dCgpIHRyYW5zY3JpcHRpb25IZWFkaW5nOiBzdHJpbmc7XG5cbiAgLy8gLS0gSW1hZ2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBTcMOpY2lmaXF1ZSBhdXggaW1hZ2VzLlxuICAgKiBBbHRlcm5hdGl2ZSBkJ3VuZSBpbWFnZSAoYXR0cmlidXQgYWx0KSwgZG9pdCB0b3Vqb3VycyDDqnRyZSBwcsOpc2VudGUsIHNhIHZhbGV1ciBwZXV0IMOqdHJlIHZpZGUgKGltYWdlIG7igJlhcHBvcnRhbnRcbiAgICogcGFzIGRlIHNlbnMgc3VwcGzDqW1lbnRhaXJlIGF1IGNvbnRleHRlKSBvdSBub24gKHBvcnRldXNlIGRlIHRleHRlIG91IGFwcG9ydGFudCBkdSBzZW5zKSBzZWxvbiB2b3RyZSBjb250ZXh0ZS5cbiAgICovXG4gIEBJbnB1dCgpIGFsdGVybmF0ZTogc3RyaW5nO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogU2kgdW5lIHJvdXRlIGVzdCBzcMOpY2lmacOpZSwgw6ltZXQgdW4gw6l2w6luZW1lbnQgYXZlYyBsYSByb3V0ZSBjb21tZSB2YWxldXIsIHNpbm9uIG4nw6ltZXQgcmllbi5cbiAgICovXG4gIEBPdXRwdXQoKSBsaW5rU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBfc2l6ZTogRHNmclNpemUgPSBEc2ZyU2l6ZUNvbnN0Lk1EO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlLFxuICApIHt9XG5cbiAgZ2V0IHNpemUoKTogRHNmclNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIChzaW5jZSAxLjYpIHV0aWxpc2VyIGB0cmFuc2NyaXB0aW9uQ29udGVudGAgw6AgbGEgcGxhY2UgKi9cbiAgZ2V0IHRyYW5zY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2NyaXB0aW9uQ29udGVudDtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAoc2luY2UgMS42KSB1dGlsaXNlciBgdHJhbnNjcmlwdGlvbkxpbmtMYWJlbGAgw6AgbGEgcGxhY2UgICovXG4gIGdldCB0cmFuc2NyaXB0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5saW5rTGFiZWw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuNikgdXRpbGlzZXIgYHRyYW5zY3JpcHRpb25Db250ZW50YCDDoCBsYSBwbGFjZSAgKi9cbiAgQElucHV0KCkgc2V0IHRyYW5zY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudHJhbnNjcmlwdGlvbkNvbnRlbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAoc2luY2UgMS42KSB1dGlsaXNlciBgdHJhbnNjcmlwdGlvbkxpbmtMYWJlbGAgw6AgbGEgcGxhY2UgICovXG4gIEBJbnB1dCgpIHNldCB0cmFuc2NyaXB0aW9uTGFiZWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMubGlua0xhYmVsID0gdmFsdWU7XG4gIH1cblxuICAvKiogUmVkaW1lbnNpb25uZW1lbnQgZHUgY29tcG9zYW50IDogYExHYCA6IDEyNSUsIGBNRGAgOiAxMDAlIChkw6lmYXVsdCksIGBTTWAgOiA3NSUuICovXG4gIEBJbnB1dCgpIHNldCBzaXplKHZhbHVlOiBEc2ZyU2l6ZSkge1xuICAgIHRoaXMuX3NpemUgPSA8RHNmclNpemU+dmFsdWU/LnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuMTEuNSkgdXRpbGlzZXIgYHJvdXRlUGF0aGAgw6AgbGEgcGxhY2UuXG4gICAqIHJvdXRlckxpbmsgcHJvdm9xdWUgdW4gYnVnIGFjY2Vzc2liaWxpdMOpIHN1ciBsYSBuYXZpZ2F0aW9uIGF1IGNsYXZpZXIgKGFqb3V0IGQndW4gdGFiaW5kZXg9MClcbiAgICoqL1xuICBASW5wdXQoKSBzZXQgcm91dGVyTGluayh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUpIHRoaXMucm91dGVQYXRoID0gdmFsdWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZlcmlmeUFjY2Vzc2liaWxpdHkoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb25MaW5rU2VsZWN0KCkge1xuICAgIGlmICh0aGlzLnJvdXRlKSB7XG4gICAgICB0aGlzLmxpbmtTZWxlY3QuZW1pdCh0aGlzLnJvdXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzYW5pdGl6ZWRTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0aGlzLnNvdXJjZSk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjY2Vzc2liaWxpdHkoKTogdm9pZCB7XG4gICAgY29uc3QgbWlzc2luZ1ZpZGVvVGl0bGUgPSB0aGlzLnR5cGUgPT09ICd2aWRlbycgJiYgIXRoaXMudG9vbHRpcE1lc3NhZ2U7XG5cbiAgICBpZiAobWlzc2luZ1ZpZGVvVGl0bGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS53YXJuKCdkc2ZyLWNvbnRlbnQgOiBSZW5zZWlnbmVyIGxlIHRpdHJlIGR1IGNvbnRlbnUgZXN0IG9ibGlnYXRvaXJlICh0b29sdGlwTWVzc2FnZSkuJyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZmlndXJlXG4gIGNsYXNzPVwiZnItY29udGVudC1tZWRpYVwiXG4gIFtjbGFzcy5mci1jb250ZW50LW1lZGlhLS1sZ109XCJzaXplID09PSAnTEcnXCJcbiAgW2NsYXNzLmZyLWNvbnRlbnQtbWVkaWEtLXNtXT1cInNpemUgPT09ICdTTSdcIlxuICByb2xlPVwiZ3JvdXBcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImxlZ2VuZFwiPlxuICBAaWYgKHR5cGUgPT09ICdpbWFnZScpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZnItY29udGVudC1tZWRpYV9faW1nXCI+XG4gICAgICBAaWYgKHNvdXJjZSkge1xuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3M9XCJmci1yZXNwb25zaXZlLWltZ1wiXG4gICAgICAgICAgW2F0dHIudGl0bGVdPVwidG9vbHRpcE1lc3NhZ2UgfHwgbnVsbFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2ZyLXJhdGlvLTMyeDknOiByYXRpbyA9PT0gJzE2OjkvMicsXG4gICAgICAgICAgICAnZnItcmF0aW8tMTZ4OSc6IHJhdGlvID09PSAnMTY6OScsXG4gICAgICAgICAgICAnZnItcmF0aW8tM3gyJzogcmF0aW8gPT09ICczOjInLFxuICAgICAgICAgICAgJ2ZyLXJhdGlvLTR4Myc6IHJhdGlvID09PSAnNDozJyxcbiAgICAgICAgICAgICdmci1yYXRpby0xeDEnOiByYXRpbyA9PT0gJzE6MScsXG4gICAgICAgICAgICAnZnItcmF0aW8tM3g0JzogcmF0aW8gPT09ICczOjQnLFxuICAgICAgICAgICAgJ2ZyLXJhdGlvLTJ4Myc6IHJhdGlvID09PSAnMjozJ1xuICAgICAgICAgIH1cIlxuICAgICAgICAgIFtzcmNdPVwic291cmNlXCJcbiAgICAgICAgICBbYWx0XT1cImFsdGVybmF0ZVwiIC8+XG4gICAgICB9XG4gICAgICA8IS0tIHNpbmNlIDEuNiBzbG90IHBhciBkw6lmYXV0IGTDqXByw6ljacOpIC0tPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPCEtLSBzaW5jZSAxLjYgYWpvdXQgZHUgc2xvdCAnc3ZnJyAtLT5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzdmddXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICB9IEBlbHNlIGlmICh0eXBlID09PSAndmlkZW8nKSB7XG4gICAgPGlmcmFtZVxuICAgICAgW2F0dHIudGl0bGVdPVwidG9vbHRpcE1lc3NhZ2UgfHwgbnVsbFwiXG4gICAgICBjbGFzcz1cImZyLXJlc3BvbnNpdmUtdmlkXCJcbiAgICAgIFtjbGFzcy5mci1yYXRpby0xNng5XT1cInJhdGlvID09PSAnMTY6OSdcIlxuICAgICAgW2NsYXNzLmZyLXJhdGlvLTR4M109XCJyYXRpbyA9PT0gJzQ6MydcIlxuICAgICAgW2NsYXNzLmZyLXJhdGlvLTF4MV09XCJyYXRpbyA9PT0gJzE6MSdcIlxuICAgICAgW3NyY109XCJzYW5pdGl6ZWRTb3VyY2UoKVwiXG4gICAgICBhbGxvdz1cImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCJcbiAgICAgIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT5cbiAgfVxuXG4gIEBpZiAobGVnZW5kIHx8IGxpbmtMYWJlbCkge1xuICAgIDxmaWdjYXB0aW9uIGNsYXNzPVwiZnItY29udGVudC1tZWRpYV9fY2FwdGlvblwiPlxuICAgICAge3sgbGVnZW5kIH19XG4gICAgICBAaWYgKGxpbmtMYWJlbCkge1xuICAgICAgICA8ZHNmci1saW5rXG4gICAgICAgICAgW2xpbmtdPVwibGlua1wiXG4gICAgICAgICAgW2xhYmVsXT1cImxpbmtMYWJlbFwiXG4gICAgICAgICAgW2xpbmtUYXJnZXRdPVwibGlua1RhcmdldFwiXG4gICAgICAgICAgW3JvdXRlXT1cInJvdXRlXCJcbiAgICAgICAgICBbcm91dGVQYXRoXT1cInJvdXRlUGF0aFwiXG4gICAgICAgICAgW3JvdXRlckxpbmtBY3RpdmVdPVwicm91dGVyTGlua0FjdGl2ZSA/PyAnJ1wiXG4gICAgICAgICAgW3JvdXRlckxpbmtFeHRyYXNdPVwicm91dGVyTGlua0V4dHJhc1wiXG4gICAgICAgICAgKGxpbmtTZWxlY3QpPVwib25MaW5rU2VsZWN0KClcIj5cbiAgICAgICAgPC9kc2ZyLWxpbms+XG4gICAgICB9XG4gICAgPC9maWdjYXB0aW9uPlxuICB9XG48L2ZpZ3VyZT5cbkBpZiAodHJhbnNjcmlwdGlvbkNvbnRlbnQpIHtcbiAgPGRzZnItdHJhbnNjcmlwdGlvbiBbaGVhZGluZ109XCJ0cmFuc2NyaXB0aW9uSGVhZGluZ1wiIFtjb250ZW50XT1cInRyYW5zY3JpcHRpb25Db250ZW50XCI+PC9kc2ZyLXRyYW5zY3JpcHRpb24+XG59IEBlbHNlIHtcbiAgPCEtLSBzaW5jZSAxLjYgYWpvdXQgZHUgc2xvdCAndHJhbnNjcmlwdGlvbicgLS0+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlt0cmFuc2NyaXB0aW9uXVwiPjwvbmctY29udGVudD5cbn1cbiJdfQ==