ngx-obelisco-example
Version:
Componentes funcionales y reutilizables para Angular.
104 lines • 19.5 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
export class OSearchComponent {
constructor(router, elementRef, renderer) {
this.router = router;
this.elementRef = elementRef;
this.renderer = renderer;
this.maxLengthResults = 10;
this.placeholder = 'Buscar...';
this.type = '';
this.term = '';
this.isHover = false;
this.noResults = false;
this.filteredResults = [];
this.selectedIndex = 0;
}
adjustResultsWidth() {
const inputWidth = this.inputElement.nativeElement.getBoundingClientRect().width;
const searchResults = this.elementRef.nativeElement.querySelector('.search-results');
const noResults = this.elementRef.nativeElement.querySelector('.no-results');
if (searchResults && noResults) {
if (inputWidth > 0) {
this.renderer.setStyle(searchResults, 'width', inputWidth + 'px');
this.renderer.setStyle(noResults, 'width', inputWidth + 'px');
}
}
}
search() {
if (this.term === '') {
this.resetSearch();
}
else {
this.filteredResults = this.searchbarItems
.filter((e) => e.title.toLowerCase().includes(this.term.toLowerCase()))
.slice(0, this.maxLengthResults);
this.noResults = this.filteredResults.length === 0;
}
}
ngAfterViewInit() {
this.adjustResultsWidth();
}
resetSearch() {
this.term = '';
this.isHover = false;
this.noResults = false;
this.filteredResults = [];
this.selectedIndex = 0;
}
goTo(e) {
if (this.onSelectItem) {
this.onSelectItem(e);
}
else {
this.router.navigate([e.route]);
}
this.resetSearch();
}
onEnter() {
if (this.filteredResults.length > 0) {
this.goTo(this.filteredResults[this.selectedIndex]);
}
}
onUp() {
if (this.selectedIndex > 0) {
this.selectedIndex--;
this.isHover = false;
}
}
onDown() {
if (this.selectedIndex < this.filteredResults.length - 1) {
this.selectedIndex++;
this.isHover = false;
}
}
onMouseEnter() {
this.isHover = true;
}
onMouseLeave() {
this.isHover = false;
}
}
OSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OSearchComponent, deps: [{ token: i1.Router }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
OSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OSearchComponent, selector: "o-search", inputs: { searchbarItems: "searchbarItems", maxLengthResults: "maxLengthResults", placeholder: "placeholder", type: "type", onSelectItem: "onSelectItem" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div class=\"navbar-search\" *ngIf=\"searchbarItems\">\r\n <form class=\"form-search\">\r\n <div class=\"form-group\">\r\n <label class=\"sr-only\" for=\"search-input\">Buscador</label>\r\n <input\r\n #inputElement\r\n type=\"search\"\r\n class=\"form-control input-search\"\r\n [ngClass]=\"type ? 'bg-' + type : ''\"\r\n id=\"name-input\"\r\n name=\"name\"\r\n aria-label=\"Ingrese su b\u00FAsqueda\"\r\n [placeholder]=\"placeholder\"\r\n [(ngModel)]=\"term\"\r\n (input)=\"search()\"\r\n (keydown.enter)=\"onEnter()\"\r\n (keydown.ArrowUp)=\"onUp()\"\r\n (keydown.ArrowDown)=\"onDown()\"\r\n />\r\n <button class=\"reset\" type=\"reset\" aria-label=\"Borrar\" (click)=\"resetSearch()\"></button>\r\n </div>\r\n </form>\r\n <div class=\"search-results\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\r\n <ng-container *ngIf=\"filteredResults.length > 0\">\r\n <div\r\n class=\"search-item\"\r\n *ngFor=\"let result of filteredResults; let i = index\"\r\n [class.selected-search-item]=\"i === selectedIndex\"\r\n [class.first-search-item]=\"i === selectedIndex && !isHover\"\r\n (click)=\"goTo(result)\"\r\n >\r\n {{ result.title }}\r\n </div>\r\n </ng-container>\r\n <div class=\"no-results\" *ngIf=\"noResults\">No se encontraron resultados\uD83D\uDE22.</div>\r\n </div>\r\n</div>\r\n", styles: [".navbar-search{display:flex;flex-direction:column;align-items:center;gap:0px}.navbar-search .form-search{width:100%}.navbar-search .input-search{text-transform:capitalize}.navbar-search .search-results{z-index:999;background-color:#f3f6f9;border-bottom-left-radius:8px;border-bottom-right-radius:8px;width:98%;margin-top:8px}.navbar-search .search-results .search-item{padding:.5rem 1rem}.navbar-search .search-results .search-item:hover{cursor:pointer;color:#007bc7}.navbar-search .search-results .no-results{padding:.5rem 1rem}.navbar-search .search-results .first-search-item,.navbar-search .search-results .selected-search-item{color:#007bc7}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OSearchComponent, decorators: [{
type: Component,
args: [{ selector: 'o-search', template: "<div class=\"navbar-search\" *ngIf=\"searchbarItems\">\r\n <form class=\"form-search\">\r\n <div class=\"form-group\">\r\n <label class=\"sr-only\" for=\"search-input\">Buscador</label>\r\n <input\r\n #inputElement\r\n type=\"search\"\r\n class=\"form-control input-search\"\r\n [ngClass]=\"type ? 'bg-' + type : ''\"\r\n id=\"name-input\"\r\n name=\"name\"\r\n aria-label=\"Ingrese su b\u00FAsqueda\"\r\n [placeholder]=\"placeholder\"\r\n [(ngModel)]=\"term\"\r\n (input)=\"search()\"\r\n (keydown.enter)=\"onEnter()\"\r\n (keydown.ArrowUp)=\"onUp()\"\r\n (keydown.ArrowDown)=\"onDown()\"\r\n />\r\n <button class=\"reset\" type=\"reset\" aria-label=\"Borrar\" (click)=\"resetSearch()\"></button>\r\n </div>\r\n </form>\r\n <div class=\"search-results\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\r\n <ng-container *ngIf=\"filteredResults.length > 0\">\r\n <div\r\n class=\"search-item\"\r\n *ngFor=\"let result of filteredResults; let i = index\"\r\n [class.selected-search-item]=\"i === selectedIndex\"\r\n [class.first-search-item]=\"i === selectedIndex && !isHover\"\r\n (click)=\"goTo(result)\"\r\n >\r\n {{ result.title }}\r\n </div>\r\n </ng-container>\r\n <div class=\"no-results\" *ngIf=\"noResults\">No se encontraron resultados\uD83D\uDE22.</div>\r\n </div>\r\n</div>\r\n", styles: [".navbar-search{display:flex;flex-direction:column;align-items:center;gap:0px}.navbar-search .form-search{width:100%}.navbar-search .input-search{text-transform:capitalize}.navbar-search .search-results{z-index:999;background-color:#f3f6f9;border-bottom-left-radius:8px;border-bottom-right-radius:8px;width:98%;margin-top:8px}.navbar-search .search-results .search-item{padding:.5rem 1rem}.navbar-search .search-results .search-item:hover{cursor:pointer;color:#007bc7}.navbar-search .search-results .no-results{padding:.5rem 1rem}.navbar-search .search-results .first-search-item,.navbar-search .search-results .selected-search-item{color:#007bc7}\n"] }]
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { searchbarItems: [{
type: Input
}], maxLengthResults: [{
type: Input
}], placeholder: [{
type: Input
}], type: [{
type: Input
}], onSelectItem: [{
type: Input
}], inputElement: [{
type: ViewChild,
args: ['inputElement']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1zZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW9iZWxpc2NvL3NlYXJjaC9vLXNlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2JlbGlzY28vc2VhcmNoL28tc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBU2xHLE1BQU0sT0FBTyxnQkFBZ0I7SUFlM0IsWUFBb0IsTUFBYyxFQUFVLFVBQXNCLEVBQVUsUUFBbUI7UUFBM0UsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBYi9FLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFXLFdBQVcsQ0FBQztRQUNsQyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBR2xDLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDVixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsb0JBQWUsR0FBb0IsRUFBRSxDQUFDO1FBQ3RDLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO0lBSXdFLENBQUM7SUFFbkcsa0JBQWtCO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2pGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztR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QUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBUXFCLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFNlYXJjaGJhckl0ZW0gfSBmcm9tICduZ3gtb2JlbGlzY28tZXhhbXBsZS9jb3JlL21vZGVscyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ28tc2VhcmNoJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vby1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL28tc2VhcmNoLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE9TZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoYmFySXRlbXMhOiBTZWFyY2hiYXJJdGVtW107XHJcbiAgQElucHV0KCkgcHVibGljIG1heExlbmd0aFJlc3VsdHM6IG51bWJlciA9IDEwO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ0J1c2Nhci4uLic7XHJcbiAgQElucHV0KCkgcHVibGljIHR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvblNlbGVjdEl0ZW0/OiAoaXRlbTogU2VhcmNoYmFySXRlbSkgPT4gdm9pZDtcclxuXHJcbiAgdGVybSA9ICcnO1xyXG4gIGlzSG92ZXIgPSBmYWxzZTtcclxuICBub1Jlc3VsdHMgPSBmYWxzZTtcclxuICBmaWx0ZXJlZFJlc3VsdHM6IFNlYXJjaGJhckl0ZW1bXSA9IFtdO1xyXG4gIHNlbGVjdGVkSW5kZXg6IG51bWJlciA9IDA7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RWxlbWVudCcpIGlucHV0RWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxyXG5cclxuICBhZGp1c3RSZXN1bHRzV2lkdGgoKSB7XHJcbiAgICBjb25zdCBpbnB1dFdpZHRoID0gdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLXJlc3VsdHMnKTtcclxuICAgIGNvbnN0IG5vUmVzdWx0cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uby1yZXN1bHRzJyk7XHJcblxyXG4gICAgaWYgKHNlYXJjaFJlc3VsdHMgJiYgbm9SZXN1bHRzKSB7XHJcbiAgICAgIGlmIChpbnB1dFdpZHRoID4gMCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc2VhcmNoUmVzdWx0cywgJ3dpZHRoJywgaW5wdXRXaWR0aCArICdweCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobm9SZXN1bHRzLCAnd2lkdGgnLCBpbnB1dFdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlYXJjaCgpIHtcclxuICAgIGlmICh0aGlzLnRlcm0gPT09ICcnKSB7XHJcbiAgICAgIHRoaXMucmVzZXRTZWFyY2goKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRSZXN1bHRzID0gdGhpcy5zZWFyY2hiYXJJdGVtc1xyXG4gICAgICAgIC5maWx0ZXIoKGUpID0+IGUudGl0bGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnRlcm0udG9Mb3dlckNhc2UoKSkpXHJcbiAgICAgICAgLnNsaWNlKDAsIHRoaXMubWF4TGVuZ3RoUmVzdWx0cyk7XHJcbiAgICAgIHRoaXMubm9SZXN1bHRzID0gdGhpcy5maWx0ZXJlZFJlc3VsdHMubGVuZ3RoID09PSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5hZGp1c3RSZXN1bHRzV2lkdGgoKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U2VhcmNoKCkge1xyXG4gICAgdGhpcy50ZXJtID0gJyc7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMubm9SZXN1bHRzID0gZmFsc2U7XHJcbiAgICB0aGlzLmZpbHRlcmVkUmVzdWx0cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuICB9XHJcblxyXG4gIGdvVG8oZTogU2VhcmNoYmFySXRlbSkge1xyXG4gICAgaWYgKHRoaXMub25TZWxlY3RJdGVtKSB7XHJcbiAgICAgIHRoaXMub25TZWxlY3RJdGVtKGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Uucm91dGVdKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXRTZWFyY2goKTtcclxuICB9XHJcblxyXG4gIG9uRW50ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJlZFJlc3VsdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmdvVG8odGhpcy5maWx0ZXJlZFJlc3VsdHNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblVwKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4LS07XHJcbiAgICAgIHRoaXMuaXNIb3ZlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Eb3duKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMuZmlsdGVyZWRSZXN1bHRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4Kys7XHJcbiAgICAgIHRoaXMuaXNIb3ZlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Nb3VzZUVudGVyKCkge1xyXG4gICAgdGhpcy5pc0hvdmVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VMZWF2ZSgpIHtcclxuICAgIHRoaXMuaXNIb3ZlciA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibmF2YmFyLXNlYXJjaFwiICpuZ0lmPVwic2VhcmNoYmFySXRlbXNcIj5cclxuICA8Zm9ybSBjbGFzcz1cImZvcm0tc2VhcmNoXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJzci1vbmx5XCIgZm9yPVwic2VhcmNoLWlucHV0XCI+QnVzY2Fkb3I8L2xhYmVsPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICAjaW5wdXRFbGVtZW50XHJcbiAgICAgICAgdHlwZT1cInNlYXJjaFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtc2VhcmNoXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ0eXBlID8gJ2JnLScgKyB0eXBlIDogJydcIlxyXG4gICAgICAgIGlkPVwibmFtZS1pbnB1dFwiXHJcbiAgICAgICAgbmFtZT1cIm5hbWVcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJJbmdyZXNlIHN1IGLDunNxdWVkYVwiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRlcm1cIlxyXG4gICAgICAgIChpbnB1dCk9XCJzZWFyY2goKVwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25FbnRlcigpXCJcclxuICAgICAgICAoa2V5ZG93bi5BcnJvd1VwKT1cIm9uVXAoKVwiXHJcbiAgICAgICAgKGtleWRvd24uQXJyb3dEb3duKT1cIm9uRG93bigpXCJcclxuICAgICAgLz5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlc2V0XCIgdHlwZT1cInJlc2V0XCIgYXJpYS1sYWJlbD1cIkJvcnJhclwiIChjbGljayk9XCJyZXNldFNlYXJjaCgpXCI+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbiAgPGRpdiBjbGFzcz1cInNlYXJjaC1yZXN1bHRzXCIgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIiAobW91c2VsZWF2ZSk9XCJvbk1vdXNlTGVhdmUoKVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkUmVzdWx0cy5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInNlYXJjaC1pdGVtXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgcmVzdWx0IG9mIGZpbHRlcmVkUmVzdWx0czsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgW2NsYXNzLnNlbGVjdGVkLXNlYXJjaC1pdGVtXT1cImkgPT09IHNlbGVjdGVkSW5kZXhcIlxyXG4gICAgICAgIFtjbGFzcy5maXJzdC1zZWFyY2gtaXRlbV09XCJpID09PSBzZWxlY3RlZEluZGV4ICYmICFpc0hvdmVyXCJcclxuICAgICAgICAoY2xpY2spPVwiZ29UbyhyZXN1bHQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHJlc3VsdC50aXRsZSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPGRpdiBjbGFzcz1cIm5vLXJlc3VsdHNcIiAqbmdJZj1cIm5vUmVzdWx0c1wiPk5vIHNlIGVuY29udHJhcm9uIHJlc3VsdGFkb3Pwn5iiLjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19