@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 • 17 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/i18n/i18n.pipe';
import { DsfrSearchBarComponent } from '../../search-bar';
import { DsfrSegmentedControlComponent } from '../../segmented-control';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* Composant en-tête du tableau.
* Il peut contenir quatre éléments optionnel mais dans cet ordre :
* - le nombre de lignes sélectionnées
* - une barre de recherche
* - des boutons d’actions liés à la sélection de lignes
* - un contrôle segmenté.
*/
export class EduTableHeaderComponent {
constructor() {
/** Affiche la barre de recherche dans le header */
this.showSearch = false;
/** Changement de type de vue */
this.viewSelect = new EventEmitter();
/** Emet le texte lors de l'évènement keyup sur l'input de recherche. */
this.searchChange = new EventEmitter();
/** Emet le texte lors du clic sur le bouton "rechercher". */
this.searchSelect = new EventEmitter();
}
/**
* Permet de positionner la valeur intiale du champ de recherche (si utilisé)
*
* @deprecated (since 1.15) Utiliser `searchInputValue` à la place.
*/
set searchInputInitialValue(value) {
this.searchInputValue = value;
}
/**
* Changement de type d'affichage (liste ou tableau)
* @internal */
onViewSelect(value) {
this.viewSelect.emit(value);
}
/** @internal */
onSearch(e) {
this.searchChange.emit(e);
}
/** @internal */
onSearchClick(e) {
this.searchSelect.emit(e);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EduTableHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: EduTableHeaderComponent, isStandalone: true, selector: "edu-table-header", inputs: { headerActionsTemplate: "headerActionsTemplate", countSelectedRows: "countSelectedRows", showHeaderViews: "showHeaderViews", headerViewsOptions: "headerViewsOptions", showSearch: "showSearch", searchInputPlaceholder: "searchInputPlaceholder", searchButtonTitle: "searchButtonTitle", searchInputValue: "searchInputValue", searchInputInitialValue: "searchInputInitialValue" }, outputs: { viewSelect: "viewSelect", searchChange: "searchChange", searchSelect: "searchSelect" }, ngImport: i0, template: "<div class=\"fr-table__header\">\n <!-- Controle segment\u00E9 pour le changement de type d'affichage-->\n @if (showHeaderViews) {\n <div class=\"edu-table-segmented\">\n <dsfr-segmented-control\n legend=\"Type d'affichage\"\n [legendSrOnly]=\"true\"\n (segmentedControlSelect)=\"onViewSelect($event)\"\n [segments]=\"headerViewsOptions\"></dsfr-segmented-control>\n </div>\n }\n\n <!-- Nombre de lignes s\u00E9lectionn\u00E9es -->\n @if (countSelectedRows !== undefined) {\n <p class=\"fr-table__detail\">\n @if (countSelectedRows === 0) {\n {{ 'table.noSelectedRows' | dsfrI18n }}\n } @else if (countSelectedRows === 1) {\n {{ countSelectedRows }} {{ 'table.oneSelectedRow' | dsfrI18n }}\n } @else if (countSelectedRows && countSelectedRows > 1) {\n {{ countSelectedRows }} {{ 'table.selectedRows' | dsfrI18n }}\n }\n </p>\n }\n\n <!-- Template barre de recherche -->\n @if (showSearch) {\n <div class=\"edu-table__search\">\n <dsfr-search-bar\n [placeholder]=\"searchInputPlaceholder\"\n [buttonTitle]=\"searchButtonTitle\"\n [value]=\"searchInputValue\"\n (searchSelect)=\"onSearchClick($event)\"\n (searchChange)=\"onSearch($event)\">\n </dsfr-search-bar>\n </div>\n }\n\n <!-- Template actions group\u00E9es -->\n @if (headerActionsTemplate) {\n <ng-container *ngTemplateOutlet=\"headerActionsTemplate\"></ng-container>\n }\n</div>\n", styles: [".fr-table__header{gap:.5rem;align-items:center}.fr-table__header .edu-table-segmented{order:3;flex:0}.fr-table__header dsfr-buttons-group{order:2}.fr-table__header dsfr-buttons-group:has(.fr-btns-group--right){margin-left:auto}.fr-table__header .edu-table__search{margin-bottom:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: DsfrSegmentedControlComponent, selector: "dsfr-segmented-control", inputs: ["segments", "legend", "legendSrOnly", "hint", "segmentedControlSize", "inline", "size", "name"], outputs: ["segmentedControlSelect"] }, { kind: "component", type: DsfrSearchBarComponent, selector: "dsfr-search-bar", inputs: ["inputId", "buttonText", "label", "large", "placeholder", "buttonTitle", "value", "initialValue", "id"], outputs: ["searchChange", "searchSelect"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EduTableHeaderComponent, decorators: [{
type: Component,
args: [{ selector: 'edu-table-header', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrSegmentedControlComponent, DsfrSearchBarComponent, DsfrI18nPipe], template: "<div class=\"fr-table__header\">\n <!-- Controle segment\u00E9 pour le changement de type d'affichage-->\n @if (showHeaderViews) {\n <div class=\"edu-table-segmented\">\n <dsfr-segmented-control\n legend=\"Type d'affichage\"\n [legendSrOnly]=\"true\"\n (segmentedControlSelect)=\"onViewSelect($event)\"\n [segments]=\"headerViewsOptions\"></dsfr-segmented-control>\n </div>\n }\n\n <!-- Nombre de lignes s\u00E9lectionn\u00E9es -->\n @if (countSelectedRows !== undefined) {\n <p class=\"fr-table__detail\">\n @if (countSelectedRows === 0) {\n {{ 'table.noSelectedRows' | dsfrI18n }}\n } @else if (countSelectedRows === 1) {\n {{ countSelectedRows }} {{ 'table.oneSelectedRow' | dsfrI18n }}\n } @else if (countSelectedRows && countSelectedRows > 1) {\n {{ countSelectedRows }} {{ 'table.selectedRows' | dsfrI18n }}\n }\n </p>\n }\n\n <!-- Template barre de recherche -->\n @if (showSearch) {\n <div class=\"edu-table__search\">\n <dsfr-search-bar\n [placeholder]=\"searchInputPlaceholder\"\n [buttonTitle]=\"searchButtonTitle\"\n [value]=\"searchInputValue\"\n (searchSelect)=\"onSearchClick($event)\"\n (searchChange)=\"onSearch($event)\">\n </dsfr-search-bar>\n </div>\n }\n\n <!-- Template actions group\u00E9es -->\n @if (headerActionsTemplate) {\n <ng-container *ngTemplateOutlet=\"headerActionsTemplate\"></ng-container>\n }\n</div>\n", styles: [".fr-table__header{gap:.5rem;align-items:center}.fr-table__header .edu-table-segmented{order:3;flex:0}.fr-table__header dsfr-buttons-group{order:2}.fr-table__header dsfr-buttons-group:has(.fr-btns-group--right){margin-left:auto}.fr-table__header .edu-table__search{margin-bottom:1rem}\n"] }]
}], propDecorators: { headerActionsTemplate: [{
type: Input
}], countSelectedRows: [{
type: Input
}], showHeaderViews: [{
type: Input
}], headerViewsOptions: [{
type: Input
}], showSearch: [{
type: Input
}], searchInputPlaceholder: [{
type: Input
}], searchButtonTitle: [{
type: Input
}], searchInputValue: [{
type: Input
}], viewSelect: [{
type: Output
}], searchChange: [{
type: Output
}], searchSelect: [{
type: Output
}], searchInputInitialValue: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2NvbXBvbmVudC90YWJsZS1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvY29tcG9uZW50L3RhYmxlLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7QUFHeEU7Ozs7Ozs7R0FPRztBQVNILE1BQU0sT0FBTyx1QkFBdUI7SUFScEM7UUFxQkUsbURBQW1EO1FBQzFDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFpQjVCLGdDQUFnQztRQUN0QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRCx5RUFBeUU7UUFDL0QsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXBELDhEQUE4RDtRQUNwRCxpQkFBWSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO0tBMkIzRTtJQXpCQzs7OztPQUlHO0lBQ0gsSUFBYSx1QkFBdUIsQ0FBQyxLQUF5QjtRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7bUJBRWU7SUFDUixZQUFZLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFFBQVEsQ0FBQyxDQUFTO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsYUFBYSxDQUFDLENBQVM7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQzsrR0FoRVUsdUJBQXVCO21HQUF2Qix1QkFBdUIsK2lCQ3hCcEMscTlDQTJDQSxzVkRyQlksWUFBWSxxTUFBRSxXQUFXLCtCQUFFLDZCQUE2QixrTkFBRSxzQkFBc0Isb05BQUUsWUFBWTs7NEZBRTdGLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxrQkFBa0IsaUJBRWIsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBRVAsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLDZCQUE2QixFQUFFLHNCQUFzQixFQUFFLFlBQVksQ0FBQzs4QkFJaEcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQU9NLHVCQUF1QjtzQkFBbkMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERzZnJJMThuUGlwZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9pMThuL2kxOG4ucGlwZSc7XG5pbXBvcnQgeyBEc2ZyU2VhcmNoQmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VhcmNoLWJhcic7XG5pbXBvcnQgeyBEc2ZyU2VnbWVudGVkQ29udHJvbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NlZ21lbnRlZC1jb250cm9sJztcbmltcG9ydCB7IERzZnJTZWdtZW50ZWRDb250cm9sIH0gZnJvbSAnLi4vLi4vc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wubW9kZWwnO1xuXG4vKipcbiAqIENvbXBvc2FudCBlbi10w6p0ZSBkdSB0YWJsZWF1LlxuICogSWwgcGV1dCBjb250ZW5pciBxdWF0cmUgw6lsw6ltZW50cyBvcHRpb25uZWwgbWFpcyBkYW5zIGNldCBvcmRyZSA6XG4gKiAtIGxlIG5vbWJyZSBkZSBsaWduZXMgc8OpbGVjdGlvbm7DqWVzXG4gKiAtIHVuZSBiYXJyZSBkZSByZWNoZXJjaGVcbiAqIC0gZGVzIGJvdXRvbnMgZOKAmWFjdGlvbnMgbGnDqXMgw6AgbGEgc8OpbGVjdGlvbiBkZSBsaWduZXNcbiAqIC0gdW4gY29udHLDtGxlIHNlZ21lbnTDqS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWR1LXRhYmxlLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZVVybHM6IFsndGFibGUtaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBEc2ZyU2VnbWVudGVkQ29udHJvbENvbXBvbmVudCwgRHNmclNlYXJjaEJhckNvbXBvbmVudCwgRHNmckkxOG5QaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgRWR1VGFibGVIZWFkZXJDb21wb25lbnQge1xuICAvKiogVGVtcGxhdGUgb3B0aW9ubmVsIGFmZmljaGVyIGRlcyBib3V0b25zIGQnYWN0aW9ucyBkYW5zIGxlIGhlYWRlciAqL1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKiBOb21icmUgZGUgbGlnbmVzIHPDqWxlY3Rpb25uw6llcyAqL1xuICBASW5wdXQoKSBjb3VudFNlbGVjdGVkUm93czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBBZmZpY2hlciBsZSBjaGFuZ2VtZW50IGRlIHR5cGUgZCdhZmZpY2hhZ2UgKHRhYmxlYXUgLyBsaXN0ZSkgKi9cbiAgQElucHV0KCkgc2hvd0hlYWRlclZpZXdzOiBib29sZWFuO1xuXG4gIC8qKiBDb250csO0bGUgc2VnbWVudMOpIGNvbnRlbmFudCBsZXMgdHlwZXMgZCdhZmZpY2hhZ2VzICh0YWJsZWF1IC8gbGlzdGUgcGFyIGTDqWZhdXQpICAqL1xuICBASW5wdXQoKSBoZWFkZXJWaWV3c09wdGlvbnM6IERzZnJTZWdtZW50ZWRDb250cm9sW107XG5cbiAgLyoqIEFmZmljaGUgbGEgYmFycmUgZGUgcmVjaGVyY2hlIGRhbnMgbGUgaGVhZGVyICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcblxuICAvKipcbiAgICogVmFsZXVyIGR1IHBsYWNlaG9sZGVyIGRlIGwnaW5wdXQgZGUgcmVjaGVyY2hlLCBzaSBzaG93U2VhcmNoIGVzdCBgdHJ1ZWAuXG4gICAqL1xuICBASW5wdXQoKSBzZWFyY2hJbnB1dFBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFZhbGV1ciBkdSB0aXRsZSBkdSBib3V0b24gZGUgbGEgYmFycmUgZGUgcmVjaGVyY2hlLCBzaSBzaG93U2VhcmNoIGVzdCBgdHJ1ZWAuXG4gICAqL1xuICBASW5wdXQoKSBzZWFyY2hCdXR0b25UaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQb3NpdGlvbm5lIGxhIHZhbGV1ciBkZSBsYSBiYXJyZSBkZSByZWNoZXJjaGUgcmVjaGVyY2hlLCBzaSBgc2hvd1NlYXJjaGAgZXN0IGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCgpIHNlYXJjaElucHV0VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogQ2hhbmdlbWVudCBkZSB0eXBlIGRlIHZ1ZSAqL1xuICBAT3V0cHV0KCkgdmlld1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWV0IGxlIHRleHRlIGxvcnMgZGUgbCfDqXbDqG5lbWVudCBrZXl1cCBzdXIgbCdpbnB1dCBkZSByZWNoZXJjaGUuICAqL1xuICBAT3V0cHV0KCkgc2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtZXQgbGUgdGV4dGUgbG9ycyBkdSBjbGljIHN1ciBsZSBib3V0b24gXCJyZWNoZXJjaGVyXCIuICAqL1xuICBAT3V0cHV0KCkgc2VhcmNoU2VsZWN0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgcG9zaXRpb25uZXIgbGEgdmFsZXVyIGludGlhbGUgZHUgY2hhbXAgZGUgcmVjaGVyY2hlIChzaSB1dGlsaXPDqSlcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuMTUpIFV0aWxpc2VyIGBzZWFyY2hJbnB1dFZhbHVlYCDDoCBsYSBwbGFjZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWFyY2hJbnB1dEluaXRpYWxWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zZWFyY2hJbnB1dFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlbWVudCBkZSB0eXBlIGQnYWZmaWNoYWdlIChsaXN0ZSBvdSB0YWJsZWF1KVxuICAgKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIG9uVmlld1NlbGVjdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52aWV3U2VsZWN0LmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvblNlYXJjaChlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlYXJjaENoYW5nZS5lbWl0KGUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvblNlYXJjaENsaWNrKGU6IHN0cmluZykge1xuICAgIHRoaXMuc2VhcmNoU2VsZWN0LmVtaXQoZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmci10YWJsZV9faGVhZGVyXCI+XG4gIDwhLS0gQ29udHJvbGUgc2VnbWVudMOpIHBvdXIgbGUgY2hhbmdlbWVudCBkZSB0eXBlIGQnYWZmaWNoYWdlLS0+XG4gIEBpZiAoc2hvd0hlYWRlclZpZXdzKSB7XG4gICAgPGRpdiBjbGFzcz1cImVkdS10YWJsZS1zZWdtZW50ZWRcIj5cbiAgICAgIDxkc2ZyLXNlZ21lbnRlZC1jb250cm9sXG4gICAgICAgIGxlZ2VuZD1cIlR5cGUgZCdhZmZpY2hhZ2VcIlxuICAgICAgICBbbGVnZW5kU3JPbmx5XT1cInRydWVcIlxuICAgICAgICAoc2VnbWVudGVkQ29udHJvbFNlbGVjdCk9XCJvblZpZXdTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgIFtzZWdtZW50c109XCJoZWFkZXJWaWV3c09wdGlvbnNcIj48L2RzZnItc2VnbWVudGVkLWNvbnRyb2w+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8IS0tIE5vbWJyZSBkZSBsaWduZXMgc8OpbGVjdGlvbm7DqWVzIC0tPlxuICBAaWYgKGNvdW50U2VsZWN0ZWRSb3dzICE9PSB1bmRlZmluZWQpIHtcbiAgICA8cCBjbGFzcz1cImZyLXRhYmxlX19kZXRhaWxcIj5cbiAgICAgIEBpZiAoY291bnRTZWxlY3RlZFJvd3MgPT09IDApIHtcbiAgICAgICAge3sgJ3RhYmxlLm5vU2VsZWN0ZWRSb3dzJyB8IGRzZnJJMThuIH19XG4gICAgICB9IEBlbHNlIGlmIChjb3VudFNlbGVjdGVkUm93cyA9PT0gMSkge1xuICAgICAgICB7eyBjb3VudFNlbGVjdGVkUm93cyB9fSB7eyAndGFibGUub25lU2VsZWN0ZWRSb3cnIHwgZHNmckkxOG4gfX1cbiAgICAgIH0gQGVsc2UgaWYgKGNvdW50U2VsZWN0ZWRSb3dzICYmIGNvdW50U2VsZWN0ZWRSb3dzID4gMSkge1xuICAgICAgICB7eyBjb3VudFNlbGVjdGVkUm93cyB9fSB7eyAndGFibGUuc2VsZWN0ZWRSb3dzJyB8IGRzZnJJMThuIH19XG4gICAgICB9XG4gICAgPC9wPlxuICB9XG5cbiAgPCEtLSBUZW1wbGF0ZSBiYXJyZSBkZSByZWNoZXJjaGUgLS0+XG4gIEBpZiAoc2hvd1NlYXJjaCkge1xuICAgIDxkaXYgY2xhc3M9XCJlZHUtdGFibGVfX3NlYXJjaFwiPlxuICAgICAgPGRzZnItc2VhcmNoLWJhclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoSW5wdXRQbGFjZWhvbGRlclwiXG4gICAgICAgIFtidXR0b25UaXRsZV09XCJzZWFyY2hCdXR0b25UaXRsZVwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hJbnB1dFZhbHVlXCJcbiAgICAgICAgKHNlYXJjaFNlbGVjdCk9XCJvblNlYXJjaENsaWNrKCRldmVudClcIlxuICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VhcmNoKCRldmVudClcIj5cbiAgICAgIDwvZHNmci1zZWFyY2gtYmFyPlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBUZW1wbGF0ZSBhY3Rpb25zIGdyb3Vww6llcyAtLT5cbiAgQGlmIChoZWFkZXJBY3Rpb25zVGVtcGxhdGUpIHtcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQWN0aW9uc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbjwvZGl2PlxuIl19