@wizco/fenixds-ngx
Version:
Componentes fenix design system para Angular.
113 lines • 25.4 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class PaginationComponent {
/**
* Evento que se emite quando se clica em um item da paginação
*/
changePage = new EventEmitter();
/**
* Total de páginas
* @default 0
* @type number
*/
totalPage = 0;
/**
* Página atual
* @default 1
* @type number
* */
currenPage = 1;
/**
* Modo de exibição da paginação
* @default default
* @type string
*/
mode = 'default';
/**
* Verifica tamanho da tela para exibir modo simples
*/
ngAfterContentInit() {
if (window.innerWidth < 768) {
this.mode = 'simple';
}
}
/**
* Retorna um array com os números das páginas e os pontos de suspensão
*/
pagination() {
const current = this.currenPage;
const last = this.totalPage;
const delta = current >= 2 ? current >= 4 ? 1 : 2 : 3;
const left = current - delta;
const right = current + delta + 1;
const range = [];
const rangeWithDots = [];
let l;
for (let i = 1; i <= last; i++) {
if (i === 1 || i === last || (i >= left && i < right)) {
range.push(i);
}
}
for (const i of range) {
if (l) {
if (i - l === 2) {
rangeWithDots.push(l + 1);
}
else if (i - l !== 1) {
rangeWithDots.push('...');
}
else {
// empty
}
}
rangeWithDots.push(i);
l = i;
}
return rangeWithDots;
}
/**
* Seguir para a próxima página
*/
nextPage() {
if (this.currenPage < this.totalPage) {
this.currenPage += 1;
this.changePage.emit(this.currenPage);
}
}
/**
* Voltar para a página anterior
*/
previousPage() {
if (this.currenPage >= 2) {
this.currenPage -= 1;
this.changePage.emit(this.currenPage);
}
}
/**
* Ir para a página selecionada
* @param i
* @returns void
*/
out(i) {
this.currenPage = parseInt(`${i}`, 10);
console.log(i, this.currenPage);
this.changePage.emit(i);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaginationComponent, isStandalone: true, selector: "wco-pagination", inputs: { totalPage: "totalPage", currenPage: "currenPage", mode: "mode" }, outputs: { changePage: "changePage" }, ngImport: i0, template: "<div class=\"pagination\"\n *ngIf=\"!!totalPage && totalPage >= 2\"\n ngClass=\"pagination-{{mode}}\"\n>\n\n <ng-container *ngIf=\"mode === 'simple'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button class=\"active\">{{currenPage}}</button>\n <span>/</span>\n <button>{{totalPage}}</button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"mode === 'default'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button *ngFor=\"let i of pagination()\" [ngClass]=\"{ \n active: currenPage === i,\n disable: i === '...'\n }\" (click)=\"out(i)\">\n {{ i }}\n </button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n</div>\n\n", styles: [".pagination{--wco-paginator-size: 32px;--wco-paginator-border-radius: var(--wco-radius-sm);--wco-paginator-color: var(--wco-color-primary-900);--wco-paginator-bg: transparent;display:flex;gap:var(--wco-spacing-nano);justify-content:center;align-items:center}.pagination.pagination-simple{gap:var(--wco-spacing-quark);--wco-paginator-size: 26px;--wco-paginator-padding: 0 var(--wco-spacing-quark)}.pagination.pagination-simple>span{color:var(--wco-color-neutral-500)}.pagination button{border:0px solid transparent;display:flex;justify-content:center;align-items:center;background-color:transparent;transition:all .2s ease-in-out;color:var(--wco-color-primary-900);min-width:var(--wco-paginator-size, 32px);min-height:var(--wco-paginator-size, 32px);border-radius:var(--wco-paginator-border-radius);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xs);font-weight:var(--wco-paginator-fontweight);letter-spacing:var(--wco-paginator-letterspacing);padding:var(--wco-paginator-padding, 0)}.pagination button:hover:not(.active){background-color:var(--wco-color-primary-50);color:var(--wco-color-primary-700);cursor:pointer}.pagination button:focus-within{outline:none;box-shadow:inset 0 0 0 2px var(--wco-color-primary-700)}.pagination button.last-button svg{transform:scale(-1)}.pagination button.disable{cursor:default;color:#999;pointer-events:none}.pagination button.disable svg path{fill:var(--wco-color-neutral-300)}.pagination .active{background-color:var(--wco-color-primary-600);color:var(--wco-color-neutral-50)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, decorators: [{
type: Component,
args: [{ selector: 'wco-pagination', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"pagination\"\n *ngIf=\"!!totalPage && totalPage >= 2\"\n ngClass=\"pagination-{{mode}}\"\n>\n\n <ng-container *ngIf=\"mode === 'simple'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button class=\"active\">{{currenPage}}</button>\n <span>/</span>\n <button>{{totalPage}}</button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"mode === 'default'\">\n <button (click)=\"previousPage()\" [ngClass]=\"{ disable: currenPage === 1 }\" title=\"P\u00E1gina anterior\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n <button *ngFor=\"let i of pagination()\" [ngClass]=\"{ \n active: currenPage === i,\n disable: i === '...'\n }\" (click)=\"out(i)\">\n {{ i }}\n </button>\n <button (click)=\"nextPage()\" class=\"last-button\" [ngClass]=\"{ disable: currenPage === totalPage }\"\n title=\"Proxima P\u00E1gina\">\n <svg width=\"8\" height=\"12\" viewBox=\"0 0 8 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.00002 9.87498L3.12002 5.99498L7.00002 2.11498C7.39002 1.72498 7.39002 1.09498 7.00002 0.704976C6.61002 0.314976 5.98002 0.314976 5.59002 0.704976L1.00002 5.29498C0.61002 5.68498 0.61002 6.31498 1.00002 6.70498L5.59002 11.295C5.98002 11.685 6.61002 11.685 7.00002 11.295C7.38002 10.905 7.39002 10.265 7.00002 9.87498Z\"\n fill=\"var(--wco-color-primary-600)\" />\n </svg>\n </button>\n </ng-container>\n\n\n\n</div>\n\n", styles: [".pagination{--wco-paginator-size: 32px;--wco-paginator-border-radius: var(--wco-radius-sm);--wco-paginator-color: var(--wco-color-primary-900);--wco-paginator-bg: transparent;display:flex;gap:var(--wco-spacing-nano);justify-content:center;align-items:center}.pagination.pagination-simple{gap:var(--wco-spacing-quark);--wco-paginator-size: 26px;--wco-paginator-padding: 0 var(--wco-spacing-quark)}.pagination.pagination-simple>span{color:var(--wco-color-neutral-500)}.pagination button{border:0px solid transparent;display:flex;justify-content:center;align-items:center;background-color:transparent;transition:all .2s ease-in-out;color:var(--wco-color-primary-900);min-width:var(--wco-paginator-size, 32px);min-height:var(--wco-paginator-size, 32px);border-radius:var(--wco-paginator-border-radius);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xs);font-weight:var(--wco-paginator-fontweight);letter-spacing:var(--wco-paginator-letterspacing);padding:var(--wco-paginator-padding, 0)}.pagination button:hover:not(.active){background-color:var(--wco-color-primary-50);color:var(--wco-color-primary-700);cursor:pointer}.pagination button:focus-within{outline:none;box-shadow:inset 0 0 0 2px var(--wco-color-primary-700)}.pagination button.last-button svg{transform:scale(-1)}.pagination button.disable{cursor:default;color:#999;pointer-events:none}.pagination button.disable svg path{fill:var(--wco-color-neutral-300)}.pagination .active{background-color:var(--wco-color-primary-600);color:var(--wco-color-neutral-50)}\n"] }]
}], propDecorators: { changePage: [{
type: Output
}], totalPage: [{
type: Input
}], currenPage: [{
type: Input
}], mode: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7OztBQVV2QixNQUFNLE9BQU8sbUJBQW1CO0lBQzlCOztNQUVFO0lBRUssVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFdkM7Ozs7TUFJRTtJQUVLLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFHckI7Ozs7U0FJSztJQUVFLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFdEI7Ozs7TUFJRTtJQUVLLElBQUksR0FBeUIsU0FBUyxDQUFDO0lBSTlDOztNQUVFO0lBQ0Ysa0JBQWtCO1FBQ2hCLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUdEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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JztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3djby1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAvKipcbiAgKiBFdmVudG8gcXVlIHNlIGVtaXRlIHF1YW5kbyBzZSBjbGljYSBlbSB1bSBpdGVtIGRhIHBhZ2luYcOnw6NvXG4gICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2hhbmdlUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgKiBUb3RhbCBkZSBww6FnaW5hc1xuICAqIEBkZWZhdWx0IDBcbiAgKiBAdHlwZSBudW1iZXJcbiAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRvdGFsUGFnZSA9IDA7XG5cblxuICAvKipcbiAgICogUMOhZ2luYSBhdHVhbFxuICAgKiBAZGVmYXVsdCAxXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY3VycmVuUGFnZSA9IDE7XG5cbiAgLyoqXG4gICAqICBNb2RvIGRlIGV4aWJpw6fDo28gZGEgcGFnaW5hw6fDo29cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAdHlwZSBzdHJpbmdcbiAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG1vZGU6ICdkZWZhdWx0JyB8ICdzaW1wbGUnID0gJ2RlZmF1bHQnO1xuXG4gIFxuXG4gIC8qKlxuICAqIFZlcmlmaWNhIHRhbWFuaG8gZGEgdGVsYSBwYXJhIGV4aWJpciBtb2RvIHNpbXBsZXNcbiAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDc2OCkge1xuICAgICAgdGhpcy5tb2RlID0gJ3NpbXBsZSc7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogUmV0b3JuYSB1bSBhcnJheSBjb20gb3MgbsO6bWVyb3MgZGFzIHDDoWdpbmFzIGUgb3MgcG9udG9zIGRlIHN1c3BlbnPDo29cbiAgICovXG4gIHB1YmxpYyBwYWdpbmF0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlblBhZ2U7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMudG90YWxQYWdlO1xuICAgIGNvbnN0IGRlbHRhID0gY3VycmVudCA+PSAyID8gY3VycmVudCA+PSA0ID8gMSA6IDIgOiAzO1xuICAgIGNvbnN0IGxlZnQgPSBjdXJyZW50IC0gZGVsdGE7XG4gICAgY29uc3QgcmlnaHQgPSBjdXJyZW50ICsgZGVsdGEgKyAxO1xuICAgIGNvbnN0IHJhbmdlID0gW107XG4gICAgY29uc3QgcmFuZ2VXaXRoRG90cyA9IFtdO1xuICAgIGxldCBsO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbGFzdDsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gMSB8fCBpID09PSBsYXN0IHx8IChpID49IGxlZnQgJiYgaSA8IHJpZ2h0KSkge1xuICAgICAgICByYW5nZS5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgaSBvZiByYW5nZSkge1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgaWYgKGkgLSBsID09PSAyKSB7XG4gICAgICAgICAgcmFuZ2VXaXRoRG90cy5wdXNoKGwgKyAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChpIC0gbCAhPT0gMSkge1xuICAgICAgICAgIHJhbmdlV2l0aERvdHMucHVzaCgnLi4uJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZW1wdHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmFuZ2VXaXRoRG90cy5wdXNoKGkpO1xuICAgICAgbCA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlV2l0aERvdHM7XG4gIH1cblxuICAvKipcbiAgKiBTZWd1aXIgcGFyYSBhIHByw7N4aW1hIHDDoWdpbmFcbiAgKi9cbiAgcHVibGljIG5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlblBhZ2UgPCB0aGlzLnRvdGFsUGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW5QYWdlICs9IDE7XG4gICAgICB0aGlzLmNoYW5nZVBhZ2UuZW1pdCh0aGlzLmN1cnJlblBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIFZvbHRhciBwYXJhIGEgcMOhZ2luYSBhbnRlcmlvclxuICAqL1xuICBwdWJsaWMgcHJldmlvdXNQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlblBhZ2UgPj0gMikge1xuICAgICAgdGhpcy5jdXJyZW5QYWdlIC09IDE7XG4gICAgICB0aGlzLmNoYW5nZVBhZ2UuZW1pdCh0aGlzLmN1cnJlblBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJciBwYXJhIGEgcMOhZ2luYSBzZWxlY2lvbmFkYVxuICAgKiBAcGFyYW0gaVxuICAgKiBAcmV0dXJucyB2b2lkXG4gICovXG4gIHB1YmxpYyBvdXQoaTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW5QYWdlID0gcGFyc2VJbnQoYCR7aX1gLCAxMCk7XG4gICAgY29uc29sZS5sb2coaSwgdGhpcy5jdXJyZW5QYWdlKTtcbiAgICB0aGlzLmNoYW5nZVBhZ2UuZW1pdChpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBhZ2luYXRpb25cIlxuICAqbmdJZj1cIiEhdG90YWxQYWdlICYmIHRvdGFsUGFnZSA+PSAyXCJcbiAgbmdDbGFzcz1cInBhZ2luYXRpb24te3ttb2RlfX1cIlxuPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAnc2ltcGxlJ1wiPlxuICAgIDxidXR0b24gKGNsaWNrKT1cInByZXZpb3VzUGFnZSgpXCIgW25nQ2xhc3NdPVwieyBkaXNhYmxlOiBjdXJyZW5QYWdlID09PSAxIH1cIiB0aXRsZT1cIlDDoWdpbmEgYW50ZXJpb3JcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTcuMDAwMDIgOS44NzQ5OEwzLjEyMDAyIDUuOTk0OThMNy4wMDAwMiAyLjExNDk4QzcuMzkwMDIgMS43MjQ5OCA3LjM5MDAyIDEuMDk0OTggNy4wMDAwMiAwLjcwNDk3NkM2LjYxMDAyIDAuMzE0OTc2IDUuOTgwMDIgMC4zMTQ5NzYgNS41OTAwMiAwLjcwNDk3NkwxLjAwMDAyIDUuMjk0OThDMC42MTAwMiA1LjY4NDk4IDAuNjEwMDIgNi4zMTQ5OCAxLjAwMDAyIDYuNzA0OThMNS41OTAwMiAxMS4yOTVDNS45ODAwMiAxMS42ODUgNi42MTAwMiAxMS42ODUgNy4wMDAwMiAxMS4yOTVDNy4zODAwMiAxMC45MDUgNy4zOTAwMiAxMC4yNjUgNy4wMDAwMiA5Ljg3NDk4WlwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImFjdGl2ZVwiPnt7Y3VycmVuUGFnZX19PC9idXR0b24+XG4gICAgPHNwYW4+Lzwvc3Bhbj5cbiAgICA8YnV0dG9uPnt7dG90YWxQYWdlfX08L2J1dHRvbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJuZXh0UGFnZSgpXCIgY2xhc3M9XCJsYXN0LWJ1dHRvblwiIFtuZ0NsYXNzXT1cInsgZGlzYWJsZTogY3VycmVuUGFnZSA9PT0gdG90YWxQYWdlIH1cIlxuICAgICAgdGl0bGU9XCJQcm94aW1hIFDDoWdpbmFcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkPVwiTTcuMDAwMDIgOS44NzQ5OEwzLjEyMDAyIDUuOTk0OThMNy4wMDAwMiAyLjExNDk4QzcuMzkwMDIgMS43MjQ5OCA3LjM5MDAyIDEuMDk0OTggNy4wMDAwMiAwLjcwNDk3NkM2LjYxMDAyIDAuMzE0OTc2IDUuOTgwMDIgMC4zMTQ5NzYgNS41OTAwMiAwLjcwNDk3NkwxLjAwMDAyIDUuMjk0OThDMC42MTAwMiA1LjY4NDk4IDAuNjEwMDIgNi4zMTQ5OCAxLjAwMDAyIDYuNzA0OThMNS41OTAwMiAxMS4yOTVDNS45ODAwMiAxMS42ODUgNi42MTAwMiAxMS42ODUgNy4wMDAwMiAxMS4yOTVDNy4zODAwMiAxMC45MDUgNy4zOTAwMiAxMC4yNjUgNy4wMDAwMiA5Ljg3NDk4WlwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvbmctY29udGFpbmVyPlxuXG5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ2RlZmF1bHQnXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJwcmV2aW91c1BhZ2UoKVwiIFtuZ0NsYXNzXT1cInsgZGlzYWJsZTogY3VycmVuUGFnZSA9PT0gMSB9XCIgdGl0bGU9XCJQw6FnaW5hIGFudGVyaW9yXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk03LjAwMDAyIDkuODc0OThMMy4xMjAwMiA1Ljk5NDk4TDcuMDAwMDIgMi4xMTQ5OEM3LjM5MDAyIDEuNzI0OTggNy4zOTAwMiAxLjA5NDk4IDcuMDAwMDIgMC43MDQ5NzZDNi42MTAwMiAwLjMxNDk3NiA1Ljk4MDAyIDAuMzE0OTc2IDUuNTkwMDIgMC43MDQ5NzZMMS4wMDAwMiA1LjI5NDk4QzAuNjEwMDIgNS42ODQ5OCAwLjYxMDAyIDYuMzE0OTggMS4wMDAwMiA2LjcwNDk4TDUuNTkwMDIgMTEuMjk1QzUuOTgwMDIgMTEuNjg1IDYuNjEwMDIgMTEuNjg1IDcuMDAwMDIgMTEuMjk1QzcuMzgwMDIgMTAuOTA1IDcuMzkwMDIgMTAuMjY1IDcuMDAwMDIgOS44NzQ5OFpcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgaSBvZiBwYWdpbmF0aW9uKClcIiBbbmdDbGFzc109XCJ7IFxuICAgICAgICAgICAgYWN0aXZlOiBjdXJyZW5QYWdlID09PSBpLFxuICAgICAgICAgICAgZGlzYWJsZTogaSA9PT0gJy4uLidcbiAgICAgICAgICB9XCIgKGNsaWNrKT1cIm91dChpKVwiPlxuICAgICAgICB7eyBpIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5leHRQYWdlKClcIiBjbGFzcz1cImxhc3QtYnV0dG9uXCIgW25nQ2xhc3NdPVwieyBkaXNhYmxlOiBjdXJyZW5QYWdlID09PSB0b3RhbFBhZ2UgfVwiXG4gICAgICAgIHRpdGxlPVwiUHJveGltYSBQw6FnaW5hXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDggMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk03LjAwMDAyIDkuODc0OThMMy4xMjAwMiA1Ljk5NDk4TDcuMDAwMDIgMi4xMTQ5OEM3LjM5MDAyIDEuNzI0OTggNy4zOTAwMiAxLjA5NDk4IDcuMDAwMDIgMC43MDQ5NzZDNi42MTAwMiAwLjMxNDk3NiA1Ljk4MDAyIDAuMzE0OTc2IDUuNTkwMDIgMC43MDQ5NzZMMS4wMDAwMiA1LjI5NDk4QzAuNjEwMDIgNS42ODQ5OCAwLjYxMDAyIDYuMzE0OTggMS4wMDAwMiA2LjcwNDk4TDUuNTkwMDIgMTEuMjk1QzUuOTgwMDIgMTEuNjg1IDYuNjEwMDIgMTEuNjg1IDcuMDAwMDIgMTEuMjk1QzcuMzgwMDIgMTAuOTA1IDcuMzkwMDIgMTAuMjY1IDcuMDAwMDIgOS44NzQ5OFpcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXdjby1jb2xvci1wcmltYXJ5LTYwMClcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuXG5cbjwvZGl2PlxuXG4iXX0=