@rangertechnologies/ngnxt
Version:
This library was used for creating dymanic UI based on the input JSON/data
100 lines • 26.6 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { FormsModule } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class NxtPagination {
event = new EventEmitter;
// page size Options
pageSizeOptions = [5, 10, 15, 20, 50];
/** The total number of records */
collectionSize = 0;
/** The number of records to display */
pageSize = 10;
/** Current page */
currentPage = 1;
/** The number of buttons to show either side of the current page */
maxSize = 2;
/** Display the First/Last buttons */
firstLastButtons = false;
/** Display the Next/Previous buttons */
nextPreviousButtons = true;
/** Display small pagination buttons */
small = false;
totalPages = [];
constructor() { }
ngOnInit() {
this.pageSize = this.pageSize ?? 10; // Ensure a default value
this.currentPage = this.currentPage === 0 ? 1 : this.currentPage;
if (this.collectionSize) {
this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));
}
}
ngOnChanges(changes) {
this.pageSize = this.pageSize ?? 10; // Ensure a default value
this.currentPage = this.currentPage === 0 ? 1 : this.currentPage ?? 1;
if (this.collectionSize) {
this.totalPages = new Array(Math.ceil(this.collectionSize / Number(this.pageSize)));
}
}
get startIndex() {
return (this.currentPage - 1) * Number(this.pageSize);
}
get endIndex() {
return Math.min(Number(this.startIndex) + Number(this.pageSize), this.collectionSize);
}
/** Set page number */
selectPageNumber(pageNumber) {
this.currentPage = pageNumber;
this.emit();
}
/** Set next page number */
next() {
const nextPage = this.currentPage + 1;
nextPage <= this.totalPages.length && this.selectPageNumber(nextPage);
}
/** Set previous page number */
previous() {
const previousPage = this.currentPage - 1;
previousPage >= 1 && this.selectPageNumber(previousPage);
}
onPageSizeChange(newSize) {
this.pageSize = newSize; // Update the pageSize
this.totalPages = new Array(Math.ceil(this.collectionSize / this.pageSize));
// Ensure the current page is within bounds
// if (this.currentPage > this.totalPages.length) {
// this.currentPage = this.totalPages.length;
// }
this.currentPage = 1;
this.emit(); // Emit an event if necessary
}
emit() {
this.event.emit({ "length": this.collectionSize, "pageSize": this.pageSize, "pageIndex": this.currentPage });
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtPagination, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NxtPagination, isStandalone: true, selector: "nxt-pagination", inputs: { pageSizeOptions: "pageSizeOptions", collectionSize: "collectionSize", pageSize: "pageSize", currentPage: "currentPage", maxSize: "maxSize", firstLastButtons: "firstLastButtons", nextPreviousButtons: "nextPreviousButtons", small: "small" }, outputs: { event: "event" }, usesOnChanges: true, ngImport: i0, template: "<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n Showing data {{ startIndex + 1 }} to {{ endIndex }} of {{ collectionSize }} entries\n </div>\n </div>\n <div>\n <ul [class]=\"small ? 'pagination pagination-sm' : 'pagination'\" style=\"align-items: center; padding-top: 18px;\">\n <!-- select button -->\n <div style=\"font-size: 14px; font-weight: 400; padding-right: 10px; align-items: center;\" for=\"perPage\">Result per page</div>\n <div class=\"dropdown-wrapper\">\n <select id=\"perPage\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n <svg class=\"dropdown-arrow\" width=\"9\" height=\"6\" viewBox=\"0 0 9 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.684136 0.767477C0.922999 0.5378 1.30282 0.545248 1.5325 0.784111L4.5 3.93431L7.4675 0.784111C7.69718 0.545248 8.077 0.5378 8.31587 0.767477C8.55473 0.997153 8.56218 1.37698 8.3325 1.61584L4.9325 5.21584C4.81938 5.33349 4.66321 5.39998 4.5 5.39998C4.33679 5.39998 4.18062 5.33349 4.0675 5.21584L0.667501 1.61584C0.437825 1.37698 0.445272 0.997153 0.684136 0.767477Z\" fill=\"#626262\"/>\n </svg> \n </div> \n <!-- first button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\" >\n <button class=\"page-link\" (click)=\"selectPageNumber(1)\">\u00AB\u00AB</button>\n </li>\n <!-- last button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\">\n <button class=\"page-link\" (click)=\"selectPageNumber(totalPages.length)\">\u00BB\u00BB</button>\n </li>\n <!-- previous button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\" >\n <button class=\"page-link\" (click)=\"previous()\">\u00AB</button>\n </li>\n <!-- page numbers -->\n <ng-container *ngFor=\"let p of totalPages; index as i\">\n <li *ngIf=\"i + 1 >= currentPage - maxSize && i + 1 <= currentPage + maxSize\" [class]=\"currentPage === i + 1 ? 'page-item active' : 'page-item'\">\n <button class=\"page-link\" (click)=\"selectPageNumber(i + 1)\">\n {{ i + 1 }}\n </button>\n </li>\n </ng-container>\n <!-- next button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\">\n <button class=\"page-link\" (click)=\"next()\">\u00BB</button>\n </li>\n </ul>\n </div>\n </div>\n ", styles: [".info{color:#b5b7c0;font-size:14px;font-weight:500}button{background:#f5f5f5;border:1px solid #E9E9E9;padding:2px 10px;cursor:pointer;transition:.3s}button:hover{border:1px solid #E9E9E9;background:#fff;color:#404b52!important}button:disabled{opacity:.5;color:#73797d;cursor:not-allowed}button.active{background:#5088ff;color:#fff;border-color:#5088ff}select{margin-right:10px}select.value{font-size:2px;margin-right:10px}.main-cont{align-items:center}#perPage{font-size:14px;color:#313131;background-color:#fff;border:1px solid #E9E9E9;border-radius:4px;padding-top:2px;padding-left:7px;padding-bottom:2px;font-weight:400;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative}#perPage:hover{background-color:#f5f5f5;color:#404b52!important}.dropdown-wrapper{position:relative;display:inline-block;width:60px;margin-right:10px}.dropdown-wrapper select{width:88%;padding:7px;font-size:16px;border:1px solid #ccc;border-radius:4px;appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none}.dropdown-wrapper .dropdown-arrow{position:absolute;right:15px;top:50%;transform:translateY(-50%);pointer-events:none;color:#333}li{color:#404b52!important;font-family:inter,sans-serif!important;font-size:12px!important;padding:6px!important}::ng-deep .pagination{--bs-pagination-font-size: none !important}::ng-deep .page-item:not(:first-child) .page-link{border-radius:4px!important}.page-link{color:#404b52!important}::ng-deep .page-link.active,.active>.page-link{color:#fff!important}::ng-deep .page-link.active:hover,.active>.page-link:hover{color:#000!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtPagination, decorators: [{
type: Component,
args: [{ selector: 'nxt-pagination', standalone: true, imports: [CommonModule, FormsModule], template: "<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n Showing data {{ startIndex + 1 }} to {{ endIndex }} of {{ collectionSize }} entries\n </div>\n </div>\n <div>\n <ul [class]=\"small ? 'pagination pagination-sm' : 'pagination'\" style=\"align-items: center; padding-top: 18px;\">\n <!-- select button -->\n <div style=\"font-size: 14px; font-weight: 400; padding-right: 10px; align-items: center;\" for=\"perPage\">Result per page</div>\n <div class=\"dropdown-wrapper\">\n <select id=\"perPage\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n <svg class=\"dropdown-arrow\" width=\"9\" height=\"6\" viewBox=\"0 0 9 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M0.684136 0.767477C0.922999 0.5378 1.30282 0.545248 1.5325 0.784111L4.5 3.93431L7.4675 0.784111C7.69718 0.545248 8.077 0.5378 8.31587 0.767477C8.55473 0.997153 8.56218 1.37698 8.3325 1.61584L4.9325 5.21584C4.81938 5.33349 4.66321 5.39998 4.5 5.39998C4.33679 5.39998 4.18062 5.33349 4.0675 5.21584L0.667501 1.61584C0.437825 1.37698 0.445272 0.997153 0.684136 0.767477Z\" fill=\"#626262\"/>\n </svg> \n </div> \n <!-- first button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\" >\n <button class=\"page-link\" (click)=\"selectPageNumber(1)\">\u00AB\u00AB</button>\n </li>\n <!-- last button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"firstLastButtons\">\n <button class=\"page-link\" (click)=\"selectPageNumber(totalPages.length)\">\u00BB\u00BB</button>\n </li>\n <!-- previous button -->\n <li [class]=\"currentPage === 1 ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\" >\n <button class=\"page-link\" (click)=\"previous()\">\u00AB</button>\n </li>\n <!-- page numbers -->\n <ng-container *ngFor=\"let p of totalPages; index as i\">\n <li *ngIf=\"i + 1 >= currentPage - maxSize && i + 1 <= currentPage + maxSize\" [class]=\"currentPage === i + 1 ? 'page-item active' : 'page-item'\">\n <button class=\"page-link\" (click)=\"selectPageNumber(i + 1)\">\n {{ i + 1 }}\n </button>\n </li>\n </ng-container>\n <!-- next button -->\n <li [class]=\"currentPage === totalPages.length ? 'page-item disabled' : 'page-item'\" *ngIf=\"nextPreviousButtons\">\n <button class=\"page-link\" (click)=\"next()\">\u00BB</button>\n </li>\n </ul>\n </div>\n </div>\n ", styles: [".info{color:#b5b7c0;font-size:14px;font-weight:500}button{background:#f5f5f5;border:1px solid #E9E9E9;padding:2px 10px;cursor:pointer;transition:.3s}button:hover{border:1px solid #E9E9E9;background:#fff;color:#404b52!important}button:disabled{opacity:.5;color:#73797d;cursor:not-allowed}button.active{background:#5088ff;color:#fff;border-color:#5088ff}select{margin-right:10px}select.value{font-size:2px;margin-right:10px}.main-cont{align-items:center}#perPage{font-size:14px;color:#313131;background-color:#fff;border:1px solid #E9E9E9;border-radius:4px;padding-top:2px;padding-left:7px;padding-bottom:2px;font-weight:400;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative}#perPage:hover{background-color:#f5f5f5;color:#404b52!important}.dropdown-wrapper{position:relative;display:inline-block;width:60px;margin-right:10px}.dropdown-wrapper select{width:88%;padding:7px;font-size:16px;border:1px solid #ccc;border-radius:4px;appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none}.dropdown-wrapper .dropdown-arrow{position:absolute;right:15px;top:50%;transform:translateY(-50%);pointer-events:none;color:#333}li{color:#404b52!important;font-family:inter,sans-serif!important;font-size:12px!important;padding:6px!important}::ng-deep .pagination{--bs-pagination-font-size: none !important}::ng-deep .page-item:not(:first-child) .page-link{border-radius:4px!important}.page-link{color:#404b52!important}::ng-deep .page-link.active,.active>.page-link{color:#fff!important}::ng-deep .page-link.active:hover,.active>.page-link:hover{color:#000!important}\n"] }]
}], ctorParameters: () => [], propDecorators: { event: [{
type: Output
}], pageSizeOptions: [{
type: Input
}], collectionSize: [{
type: Input
}], pageSize: [{
type: Input
}], currentPage: [{
type: Input
}], maxSize: [{
type: Input
}], firstLastButtons: [{
type: Input
}], nextPreviousButtons: [{
type: Input
}], small: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFVN0MsTUFBTSxPQUFPLGFBQWE7SUFDZCxLQUFLLEdBQUcsSUFBSSxZQUFpQixDQUFDO0lBQ3hDLG9CQUFvQjtJQUNYLGVBQWUsR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxrQ0FBa0M7SUFDekIsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUU1Qix1Q0FBdUM7SUFDOUIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUV2QixtQkFBbUI7SUFDVixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXpCLG9FQUFvRTtJQUMzRCxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRXJCLHFDQUFxQztJQUM1QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFbEMsd0NBQXdDO0lBQy9CLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUVwQyx1Q0FBdUM7SUFDOUIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUV2QixVQUFVLEdBQVUsRUFBRSxDQUFDO0lBRXZCLGdCQUFlLENBQUM7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QUFJLENBQUMsRUFBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQzt3R0FoRlUsYUFBYTs0RkFBYixhQUFhLHNYQ1oxQiwrMEZBOENHLDBuRER0Q1MsWUFBWSwrUEFBRSxXQUFXOzs0RkFJeEIsYUFBYTtrQkFQekIsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDO3dEQUsxQixLQUFLO3NCQUFkLE1BQU07Z0JBRUUsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LXBhZ2luYXRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTnh0UGFnaW5hdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gcGFnZSBzaXplIE9wdGlvbnNcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMTUsIDIwLCA1MF07XG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgKi9cbiAgQElucHV0KCkgY29sbGVjdGlvblNpemUgPSAwO1xuXG4gIC8qKiBUaGUgbnVtYmVyIG9mIHJlY29yZHMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xuXG4gIC8qKiBDdXJyZW50IHBhZ2UgKi9cbiAgQElucHV0KCkgY3VycmVudFBhZ2UgPSAxO1xuXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGJ1dHRvbnMgdG8gc2hvdyBlaXRoZXIgc2lkZSBvZiB0aGUgY3VycmVudCBwYWdlICovXG4gIEBJbnB1dCgpIG1heFNpemUgPSAyO1xuXG4gIC8qKiBEaXNwbGF5IHRoZSBGaXJzdC9MYXN0IGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgZmlyc3RMYXN0QnV0dG9ucyA9IGZhbHNlO1xuXG4gIC8qKiBEaXNwbGF5IHRoZSBOZXh0L1ByZXZpb3VzIGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgbmV4dFByZXZpb3VzQnV0dG9ucyA9IHRydWU7XG5cbiAgLyoqIERpc3BsYXkgc21hbGwgcGFnaW5hdGlvbiBidXR0b25zICovXG4gIEBJbnB1dCgpIHNtYWxsID0gZmFsc2U7XG5cbiAgdG90YWxQYWdlczogYW55W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemUgPz8gMTA7IC8vIEVuc3VyZSBhIGRlZmF1bHQgdmFsdWVcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZSA9PT0gMCA/IDEgOiB0aGlzLmN1cnJlbnRQYWdlXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNpemUpIHtcbiAgICAgIHRoaXMudG90YWxQYWdlcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5jb2xsZWN0aW9uU2l6ZSAvIE51bWJlcih0aGlzLnBhZ2VTaXplKSkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZSA/PyAxMDsgLy8gRW5zdXJlIGEgZGVmYXVsdCB2YWx1ZVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlID09PSAwID8gMSA6IHRoaXMuY3VycmVudFBhZ2UgPz8gMVxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25TaXplKSB7XG4gICAgICB0aGlzLnRvdGFsUGFnZXMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMuY29sbGVjdGlvblNpemUgLyBOdW1iZXIodGhpcy5wYWdlU2l6ZSkpKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHN0YXJ0SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldCBlbmRJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbiggTnVtYmVyKHRoaXMuc3RhcnRJbmRleCkgKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSksIHRoaXMuY29sbGVjdGlvblNpemUpO1xuICB9XG4gIC8qKiBTZXQgcGFnZSBudW1iZXIgKi9cbiAgc2VsZWN0UGFnZU51bWJlcihwYWdlTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZU51bWJlcjtcbiAgICB0aGlzLmVtaXQoKVxuICB9XG5cbiAgLyoqIFNldCBuZXh0IHBhZ2UgbnVtYmVyICovXG4gIG5leHQoKSB7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlICsgMTtcbiAgICBuZXh0UGFnZSA8PSB0aGlzLnRvdGFsUGFnZXMubGVuZ3RoICYmIHRoaXMuc2VsZWN0UGFnZU51bWJlcihuZXh0UGFnZSk7XG4gIH1cblxuICAvKiogU2V0IHByZXZpb3VzIHBhZ2UgbnVtYmVyICovXG4gIHByZXZpb3VzKCkge1xuICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHRoaXMuY3VycmVudFBhZ2UgLSAxO1xuICAgIHByZXZpb3VzUGFnZSA+PSAxICYmIHRoaXMuc2VsZWN0UGFnZU51bWJlcihwcmV2aW91c1BhZ2UpO1xuICB9XG4gIG9uUGFnZVNpemVDaGFuZ2UobmV3U2l6ZTphbnkpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gbmV3U2l6ZTsgLy8gVXBkYXRlIHRoZSBwYWdlU2l6ZVxuICAgIHRoaXMudG90YWxQYWdlcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5jb2xsZWN0aW9uU2l6ZSAvIHRoaXMucGFnZVNpemUpKTtcbiAgICAvLyBFbnN1cmUgdGhlIGN1cnJlbnQgcGFnZSBpcyB3aXRoaW4gYm91bmRzXG4gICAgLy8gaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLnRvdGFsUGFnZXMubGVuZ3RoKSB7XG4gICAgLy8gICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy50b3RhbFBhZ2VzLmxlbmd0aDtcbiAgICAvLyB9XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDFcbiAgICB0aGlzLmVtaXQoKTsgLy8gRW1pdCBhbiBldmVudCBpZiBuZWNlc3NhcnlcbiAgfSAgICBcbiAgZW1pdCgpe1xuICAgIHRoaXMuZXZlbnQuZW1pdCh7XCJsZW5ndGhcIjp0aGlzLmNvbGxlY3Rpb25TaXplLCBcInBhZ2VTaXplXCI6IHRoaXMucGFnZVNpemUsIFwicGFnZUluZGV4XCIgOiB0aGlzLmN1cnJlbnRQYWdlfSlcbiAgfVxufSIsIjwhLS0gU0tTMjRKQU4yNSAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4IGNvbnRlbnQtc3BhY2UtYmV0d2VlbiBtYWluLWNvbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5mb1wiPlxuICAgICA8ZGl2ICpuZ0lmPVwiZW5kSW5kZXhcIj5cbiAgICAgIFNob3dpbmcgZGF0YSB7eyBzdGFydEluZGV4ICsgMSB9fSB0byB7eyBlbmRJbmRleCB9fSBvZiB7eyBjb2xsZWN0aW9uU2l6ZSB9fSBlbnRyaWVzXG4gICAgPC9kaXY+XG4gICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICA8dWwgW2NsYXNzXT1cInNtYWxsID8gJ3BhZ2luYXRpb24gcGFnaW5hdGlvbi1zbScgOiAncGFnaW5hdGlvbidcIiBzdHlsZT1cImFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmctdG9wOiAxOHB4O1wiPlxuICAgICAgICA8IS0tIHNlbGVjdCBidXR0b24gLS0+XG4gICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDsgcGFkZGluZy1yaWdodDogMTBweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIiBmb3I9XCJwZXJQYWdlXCI+UmVzdWx0IHBlciBwYWdlPC9kaXY+XG4gICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXdyYXBwZXJcIj5cbiAgICAgICAgIDxzZWxlY3QgaWQ9XCJwZXJQYWdlXCIgW25nTW9kZWxdPVwicGFnZVNpemVcIiAobmdNb2RlbENoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBwYWdlU2l6ZU9wdGlvbnNcIiBbdmFsdWVdPVwic2l6ZVwiPnt7IHNpemUgfX08L29wdGlvbj5cbiAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgPHN2ZyBjbGFzcz1cImRyb3Bkb3duLWFycm93XCIgd2lkdGg9XCI5XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgOSA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0wLjY4NDEzNiAwLjc2NzQ3N0MwLjkyMjk5OSAwLjUzNzggMS4zMDI4MiAwLjU0NTI0OCAxLjUzMjUgMC43ODQxMTFMNC41IDMuOTM0MzFMNy40Njc1IDAuNzg0MTExQzcuNjk3MTggMC41NDUyNDggOC4wNzcgMC41Mzc4IDguMzE1ODcgMC43Njc0NzdDOC41NTQ3MyAwLjk5NzE1MyA4LjU2MjE4IDEuMzc2OTggOC4zMzI1IDEuNjE1ODRMNC45MzI1IDUuMjE1ODRDNC44MTkzOCA1LjMzMzQ5IDQuNjYzMjEgNS4zOTk5OCA0LjUgNS4zOTk5OEM0LjMzNjc5IDUuMzk5OTggNC4xODA2MiA1LjMzMzQ5IDQuMDY3NSA1LjIxNTg0TDAuNjY3NTAxIDEuNjE1ODRDMC40Mzc4MjUgMS4zNzY5OCAwLjQ0NTI3MiAwLjk5NzE1MyAwLjY4NDEzNiAwLjc2NzQ3N1pcIiBmaWxsPVwiIzYyNjI2MlwiLz5cbiAgICAgICAgICA8L3N2Zz4gICBcbiAgICAgICA8L2Rpdj4gICAgIFxuICAgICAgIDwhLS0gZmlyc3QgYnV0dG9uIC0tPlxuICAgICAgIDxsaSBbY2xhc3NdPVwiY3VycmVudFBhZ2UgPT09IDEgPyAncGFnZS1pdGVtIGRpc2FibGVkJyA6ICdwYWdlLWl0ZW0nXCIgKm5nSWY9XCJmaXJzdExhc3RCdXR0b25zXCIgPlxuICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhZ2UtbGlua1wiIChjbGljayk9XCJzZWxlY3RQYWdlTnVtYmVyKDEpXCI+wqvCqzwvYnV0dG9uPlxuICAgICAgIDwvbGk+XG4gICAgICAgPCEtLSBsYXN0IGJ1dHRvbiAtLT5cbiAgICAgICA8bGkgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzLmxlbmd0aCA/ICdwYWdlLWl0ZW0gZGlzYWJsZWQnIDogJ3BhZ2UtaXRlbSdcIiAqbmdJZj1cImZpcnN0TGFzdEJ1dHRvbnNcIj5cbiAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwic2VsZWN0UGFnZU51bWJlcih0b3RhbFBhZ2VzLmxlbmd0aClcIj7Cu8K7PC9idXR0b24+XG4gICAgICAgPC9saT5cbiAgICAgICA8IS0tIHByZXZpb3VzIGJ1dHRvbiAtLT5cbiAgICAgICA8bGkgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSAxID8gJ3BhZ2UtaXRlbSBkaXNhYmxlZCcgOiAncGFnZS1pdGVtJ1wiICpuZ0lmPVwibmV4dFByZXZpb3VzQnV0dG9uc1wiID5cbiAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwicHJldmlvdXMoKVwiPsKrPC9idXR0b24+XG4gICAgICAgPC9saT5cbiAgICAgICA8IS0tIHBhZ2UgbnVtYmVycyAtLT5cbiAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwIG9mIHRvdGFsUGFnZXM7IGluZGV4IGFzIGlcIj5cbiAgICAgICAgIDxsaSAqbmdJZj1cImkgKyAxID49IGN1cnJlbnRQYWdlIC0gbWF4U2l6ZSAmJiBpICsgMSA8PSBjdXJyZW50UGFnZSArIG1heFNpemVcIiBbY2xhc3NdPVwiY3VycmVudFBhZ2UgPT09IGkgKyAxID8gJ3BhZ2UtaXRlbSBhY3RpdmUnIDogJ3BhZ2UtaXRlbSdcIj5cbiAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhZ2UtbGlua1wiIChjbGljayk9XCJzZWxlY3RQYWdlTnVtYmVyKGkgKyAxKVwiPlxuICAgICAgICAgICAgIHt7IGkgKyAxIH19XG4gICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgPC9saT5cbiAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICA8IS0tIG5leHQgYnV0dG9uIC0tPlxuICAgICAgIDxsaSBbY2xhc3NdPVwiY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXMubGVuZ3RoID8gJ3BhZ2UtaXRlbSBkaXNhYmxlZCcgOiAncGFnZS1pdGVtJ1wiICpuZ0lmPVwibmV4dFByZXZpb3VzQnV0dG9uc1wiPlxuICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhZ2UtbGlua1wiIChjbGljayk9XCJuZXh0KClcIj7CuzwvYnV0dG9uPlxuICAgICAgIDwvbGk+XG4gICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gPC9kaXY+XG4gICAiXX0=