UNPKG

@rangertechnologies/ngnxt

Version:

This library was used for creating dymanic UI based on the input JSON/data

101 lines 27.7 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CustomTranslatePipe } from '../../pipe/custom-translate.pipe'; 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 {{'APP.SHOWING_DATA' | customTranslate : 'Showing data'}} {{ startIndex + 1 }} {{'APP.TO' | customTranslate : 'to'}} {{ endIndex }} {{'APP.OF' | customTranslate : 'of'}} {{ collectionSize }} {{'APP.ENTRIES' | customTranslate : '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\">{{'APP.RESULT_PER_PAGE' | customTranslate : '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"] }, { kind: "pipe", type: CustomTranslatePipe, name: "customTranslate" }] }); } 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, CustomTranslatePipe], template: "<!-- SKS24JAN25 -->\n<div class=\"flex content-space-between main-cont\">\n <div class=\"info\">\n <div *ngIf=\"endIndex\">\n {{'APP.SHOWING_DATA' | customTranslate : 'Showing data'}} {{ startIndex + 1 }} {{'APP.TO' | customTranslate : 'to'}} {{ endIndex }} {{'APP.OF' | customTranslate : 'of'}} {{ collectionSize }} {{'APP.ENTRIES' | customTranslate : '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\">{{'APP.RESULT_PER_PAGE' | customTranslate : '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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFVdkUsTUFBTSxPQUFPLGFBQWE7SUFDZCxLQUFLLEdBQUcsSUFBSSxZQUFpQixDQUFDO0lBQ3hDLG9CQUFvQjtJQUNYLGVBQWUsR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxrQ0FBa0M7SUFDekIsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUU1Qix1Q0FBdUM7SUFDOUIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUV2QixtQkFBbUI7SUFDVixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXpCLG9FQUFvRTtJQUMzRCxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRXJCLHFDQUFxQztJQUM1QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFbEMsd0NBQXdDO0lBQy9CLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUVwQyx1Q0FBdUM7SUFDOUIsS0FBSyxHQUFHLEtBQUssQ0FB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QzVDLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQzt3R0FoRlUsYUFBYTs0RkFBYixhQUFhLHNYQ2IxQiw0aEdBOENHLDBuRERyQ1MsWUFBWSwrUEFBRSxXQUFXLHF2QkFBRSxtQkFBbUI7OzRGQUk3QyxhQUFhO2tCQVB6QixTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUM7d0RBSy9DLEtBQUs7c0JBQWQsTUFBTTtnQkFFRSxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEN1c3RvbVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LXBhZ2luYXRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTnh0UGFnaW5hdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gcGFnZSBzaXplIE9wdGlvbnNcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMTUsIDIwLCA1MF07XG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgKi9cbiAgQElucHV0KCkgY29sbGVjdGlvblNpemUgPSAwO1xuXG4gIC8qKiBUaGUgbnVtYmVyIG9mIHJlY29yZHMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xuXG4gIC8qKiBDdXJyZW50IHBhZ2UgKi9cbiAgQElucHV0KCkgY3VycmVudFBhZ2UgPSAxO1xuXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGJ1dHRvbnMgdG8gc2hvdyBlaXRoZXIgc2lkZSBvZiB0aGUgY3VycmVudCBwYWdlICovXG4gIEBJbnB1dCgpIG1heFNpemUgPSAyO1xuXG4gIC8qKiBEaXNwbGF5IHRoZSBGaXJzdC9MYXN0IGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgZmlyc3RMYXN0QnV0dG9ucyA9IGZhbHNlO1xuXG4gIC8qKiBEaXNwbGF5IHRoZSBOZXh0L1ByZXZpb3VzIGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgbmV4dFByZXZpb3VzQnV0dG9ucyA9IHRydWU7XG5cbiAgLyoqIERpc3BsYXkgc21hbGwgcGFnaW5hdGlvbiBidXR0b25zICovXG4gIEBJbnB1dCgpIHNtYWxsID0gZmFsc2U7XG5cbiAgdG90YWxQYWdlczogYW55W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemUgPz8gMTA7IC8vIEVuc3VyZSBhIGRlZmF1bHQgdmFsdWVcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZSA9PT0gMCA/IDEgOiB0aGlzLmN1cnJlbnRQYWdlXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblNpemUpIHtcbiAgICAgIHRoaXMudG90YWxQYWdlcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5jb2xsZWN0aW9uU2l6ZSAvIE51bWJlcih0aGlzLnBhZ2VTaXplKSkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZSA/PyAxMDsgLy8gRW5zdXJlIGEgZGVmYXVsdCB2YWx1ZVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlID09PSAwID8gMSA6IHRoaXMuY3VycmVudFBhZ2UgPz8gMVxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25TaXplKSB7XG4gICAgICB0aGlzLnRvdGFsUGFnZXMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMuY29sbGVjdGlvblNpemUgLyBOdW1iZXIodGhpcy5wYWdlU2l6ZSkpKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHN0YXJ0SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldCBlbmRJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbiggTnVtYmVyKHRoaXMuc3RhcnRJbmRleCkgKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSksIHRoaXMuY29sbGVjdGlvblNpemUpO1xuICB9XG4gIC8qKiBTZXQgcGFnZSBudW1iZXIgKi9cbiAgc2VsZWN0UGFnZU51bWJlcihwYWdlTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZU51bWJlcjtcbiAgICB0aGlzLmVtaXQoKVxuICB9XG5cbiAgLyoqIFNldCBuZXh0IHBhZ2UgbnVtYmVyICovXG4gIG5leHQoKSB7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlICsgMTtcbiAgICBuZXh0UGFnZSA8PSB0aGlzLnRvdGFsUGFnZXMubGVuZ3RoICYmIHRoaXMuc2VsZWN0UGFnZU51bWJlcihuZXh0UGFnZSk7XG4gIH1cblxuICAvKiogU2V0IHByZXZpb3VzIHBhZ2UgbnVtYmVyICovXG4gIHByZXZpb3VzKCkge1xuICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHRoaXMuY3VycmVudFBhZ2UgLSAxO1xuICAgIHByZXZpb3VzUGFnZSA+PSAxICYmIHRoaXMuc2VsZWN0UGFnZU51bWJlcihwcmV2aW91c1BhZ2UpO1xuICB9XG4gIG9uUGFnZVNpemVDaGFuZ2UobmV3U2l6ZTphbnkpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gbmV3U2l6ZTsgLy8gVXBkYXRlIHRoZSBwYWdlU2l6ZVxuICAgIHRoaXMudG90YWxQYWdlcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5jb2xsZWN0aW9uU2l6ZSAvIHRoaXMucGFnZVNpemUpKTtcbiAgICAvLyBFbnN1cmUgdGhlIGN1cnJlbnQgcGFnZSBpcyB3aXRoaW4gYm91bmRzXG4gICAgLy8gaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLnRvdGFsUGFnZXMubGVuZ3RoKSB7XG4gICAgLy8gICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy50b3RhbFBhZ2VzLmxlbmd0aDtcbiAgICAvLyB9XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDFcbiAgICB0aGlzLmVtaXQoKTsgLy8gRW1pdCBhbiBldmVudCBpZiBuZWNlc3NhcnlcbiAgfSAgICBcbiAgZW1pdCgpe1xuICAgIHRoaXMuZXZlbnQuZW1pdCh7XCJsZW5ndGhcIjp0aGlzLmNvbGxlY3Rpb25TaXplLCBcInBhZ2VTaXplXCI6IHRoaXMucGFnZVNpemUsIFwicGFnZUluZGV4XCIgOiB0aGlzLmN1cnJlbnRQYWdlfSlcbiAgfVxufSIsIjwhLS0gU0tTMjRKQU4yNSAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4IGNvbnRlbnQtc3BhY2UtYmV0d2VlbiBtYWluLWNvbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5mb1wiPlxuICAgICA8ZGl2ICpuZ0lmPVwiZW5kSW5kZXhcIj5cbiAgICAge3snQVBQLlNIT1dJTkdfREFUQScgfCBjdXN0b21UcmFuc2xhdGUgOiAnU2hvd2luZyBkYXRhJ319ICB7eyBzdGFydEluZGV4ICsgMSB9fSB7eydBUFAuVE8nIHwgY3VzdG9tVHJhbnNsYXRlIDogJ3RvJ319IHt7IGVuZEluZGV4IH19IHt7J0FQUC5PRicgfCBjdXN0b21UcmFuc2xhdGUgOiAnb2YnfX0gIHt7IGNvbGxlY3Rpb25TaXplIH19IHt7J0FQUC5FTlRSSUVTJyB8IGN1c3RvbVRyYW5zbGF0ZSA6ICdlbnRyaWVzJ319IFxuICAgIDwvZGl2PlxuICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgPHVsIFtjbGFzc109XCJzbWFsbCA/ICdwYWdpbmF0aW9uIHBhZ2luYXRpb24tc20nIDogJ3BhZ2luYXRpb24nXCIgc3R5bGU9XCJhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nLXRvcDogMThweDtcIj5cbiAgICAgICAgPCEtLSBzZWxlY3QgYnV0dG9uIC0tPlxuICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA0MDA7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCIgZm9yPVwicGVyUGFnZVwiPnt7J0FQUC5SRVNVTFRfUEVSX1BBR0UnIHwgY3VzdG9tVHJhbnNsYXRlIDogJ1Jlc3VsdCBwZXIgcGFnZSd9fTwvZGl2PlxuICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi13cmFwcGVyXCI+XG4gICAgICAgICA8c2VsZWN0IGlkPVwicGVyUGFnZVwiIFtuZ01vZGVsXT1cInBhZ2VTaXplXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNpemUgb2YgcGFnZVNpemVPcHRpb25zXCIgW3ZhbHVlXT1cInNpemVcIj57eyBzaXplIH19PC9vcHRpb24+XG4gICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgIDxzdmcgY2xhc3M9XCJkcm9wZG93bi1hcnJvd1wiIHdpZHRoPVwiOVwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDkgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMC42ODQxMzYgMC43Njc0NzdDMC45MjI5OTkgMC41Mzc4IDEuMzAyODIgMC41NDUyNDggMS41MzI1IDAuNzg0MTExTDQuNSAzLjkzNDMxTDcuNDY3NSAwLjc4NDExMUM3LjY5NzE4IDAuNTQ1MjQ4IDguMDc3IDAuNTM3OCA4LjMxNTg3IDAuNzY3NDc3QzguNTU0NzMgMC45OTcxNTMgOC41NjIxOCAxLjM3Njk4IDguMzMyNSAxLjYxNTg0TDQuOTMyNSA1LjIxNTg0QzQuODE5MzggNS4zMzM0OSA0LjY2MzIxIDUuMzk5OTggNC41IDUuMzk5OThDNC4zMzY3OSA1LjM5OTk4IDQuMTgwNjIgNS4zMzM0OSA0LjA2NzUgNS4yMTU4NEwwLjY2NzUwMSAxLjYxNTg0QzAuNDM3ODI1IDEuMzc2OTggMC40NDUyNzIgMC45OTcxNTMgMC42ODQxMzYgMC43Njc0NzdaXCIgZmlsbD1cIiM2MjYyNjJcIi8+XG4gICAgICAgICAgPC9zdmc+ICAgXG4gICAgICAgPC9kaXY+ICAgICBcbiAgICAgICA8IS0tIGZpcnN0IGJ1dHRvbiAtLT5cbiAgICAgICA8bGkgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSAxID8gJ3BhZ2UtaXRlbSBkaXNhYmxlZCcgOiAncGFnZS1pdGVtJ1wiICpuZ0lmPVwiZmlyc3RMYXN0QnV0dG9uc1wiID5cbiAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwic2VsZWN0UGFnZU51bWJlcigxKVwiPsKrwqs8L2J1dHRvbj5cbiAgICAgICA8L2xpPlxuICAgICAgIDwhLS0gbGFzdCBidXR0b24gLS0+XG4gICAgICAgPGxpIFtjbGFzc109XCJjdXJyZW50UGFnZSA9PT0gdG90YWxQYWdlcy5sZW5ndGggPyAncGFnZS1pdGVtIGRpc2FibGVkJyA6ICdwYWdlLWl0ZW0nXCIgKm5nSWY9XCJmaXJzdExhc3RCdXR0b25zXCI+XG4gICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInNlbGVjdFBhZ2VOdW1iZXIodG90YWxQYWdlcy5sZW5ndGgpXCI+wrvCuzwvYnV0dG9uPlxuICAgICAgIDwvbGk+XG4gICAgICAgPCEtLSBwcmV2aW91cyBidXR0b24gLS0+XG4gICAgICAgPGxpIFtjbGFzc109XCJjdXJyZW50UGFnZSA9PT0gMSA/ICdwYWdlLWl0ZW0gZGlzYWJsZWQnIDogJ3BhZ2UtaXRlbSdcIiAqbmdJZj1cIm5leHRQcmV2aW91c0J1dHRvbnNcIiA+XG4gICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInByZXZpb3VzKClcIj7CqzwvYnV0dG9uPlxuICAgICAgIDwvbGk+XG4gICAgICAgPCEtLSBwYWdlIG51bWJlcnMgLS0+XG4gICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcCBvZiB0b3RhbFBhZ2VzOyBpbmRleCBhcyBpXCI+XG4gICAgICAgICA8bGkgKm5nSWY9XCJpICsgMSA+PSBjdXJyZW50UGFnZSAtIG1heFNpemUgJiYgaSArIDEgPD0gY3VycmVudFBhZ2UgKyBtYXhTaXplXCIgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSBpICsgMSA/ICdwYWdlLWl0ZW0gYWN0aXZlJyA6ICdwYWdlLWl0ZW0nXCI+XG4gICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwic2VsZWN0UGFnZU51bWJlcihpICsgMSlcIj5cbiAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgIDwvbGk+XG4gICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgPCEtLSBuZXh0IGJ1dHRvbiAtLT5cbiAgICAgICA8bGkgW2NsYXNzXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzLmxlbmd0aCA/ICdwYWdlLWl0ZW0gZGlzYWJsZWQnIDogJ3BhZ2UtaXRlbSdcIiAqbmdJZj1cIm5leHRQcmV2aW91c0J1dHRvbnNcIj5cbiAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdlLWxpbmtcIiAoY2xpY2spPVwibmV4dCgpXCI+wrs8L2J1dHRvbj5cbiAgICAgICA8L2xpPlxuICAgICA8L3VsPlxuICAgIDwvZGl2PlxuIDwvZGl2PlxuICAgIl19