UNPKG

@hxui/angular

Version:

This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.

464 lines (463 loc) 35.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, ElementRef, Renderer2, Input, Output, EventEmitter, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { PaginationConfig } from './pagination.config'; export var /** @type {?} */ PAGER_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return PagerComponent; }), multi: true }; var /** @type {?} */ PAGER_TEMPLATE = "\n <ul class=\"hx-flex hx-flex-justify-between\">\n <li [class.is-disabled]=\"noPrevious()\" [class.is-previous]=\"align\" class=\"{{ pageBtnClass }}\">\n <a href (click)=\"selectPage(page - 1, $event)\">{{getText('previous')}}</a>\n </li>\n <li [class.is-disabled]=\"noNext()\" [class.is-next]=\"align\" class=\"{{ pageBtnClass }}\">\n <a href (click)=\"selectPage(page + 1, $event)\">{{getText('next')}}</a>\n </li>\n </ul>\n"; var PagerComponent = /** @class */ (function () { function PagerComponent(renderer, elementRef, paginationConfig) { /** * fired when total pages count changes, $event:number equals to total pages count */ this.numPages = new EventEmitter(); /** * fired when page was changed, $event:{page, itemsPerPage} equals to object with current page index and number of items per page */ this.pageChanged = new EventEmitter(); this.onChange = Function.prototype; this.onTouched = Function.prototype; this.inited = false; this._page = 1; this.renderer = renderer; this.elementRef = elementRef; if (!this.config) { this.configureOptions(Object.assign({}, paginationConfig.main, paginationConfig.pager)); } } Object.defineProperty(PagerComponent.prototype, "itemsPerPage", { get: /** * maximum number of items per page. If value less than 1 will display all items on one page * @return {?} */ function () { return this._itemsPerPage; }, set: /** * @param {?} v * @return {?} */ function (v) { this._itemsPerPage = v; this.totalPages = this.calculateTotalPages(); }, enumerable: true, configurable: true }); Object.defineProperty(PagerComponent.prototype, "totalItems", { get: /** * total number of items in all pages * @return {?} */ function () { return this._totalItems; }, set: /** * @param {?} v * @return {?} */ function (v) { this._totalItems = v; this.totalPages = this.calculateTotalPages(); }, enumerable: true, configurable: true }); Object.defineProperty(PagerComponent.prototype, "totalPages", { get: /** * @return {?} */ function () { return this._totalPages; }, set: /** * @param {?} v * @return {?} */ function (v) { this._totalPages = v; this.numPages.emit(v); if (this.inited) { this.selectPage(this.page); } }, enumerable: true, configurable: true }); Object.defineProperty(PagerComponent.prototype, "page", { get: /** * @return {?} */ function () { return this._page; }, set: /** * @param {?} value * @return {?} */ function (value) { var /** @type {?} */ _previous = this._page; this._page = (value > this.totalPages) ? this.totalPages : (value || 1); if (_previous === this._page || typeof _previous === 'undefined') { return; } this.pageChanged.emit({ page: this._page, itemsPerPage: this.itemsPerPage }); }, enumerable: true, configurable: true }); /** * @param {?} config * @return {?} */ PagerComponent.prototype.configureOptions = /** * @param {?} config * @return {?} */ function (config) { this.config = Object.assign({}, config); }; /** * @return {?} */ PagerComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.classMap = this.elementRef.nativeElement.getAttribute('class') || ''; // watch for maxSize this.maxSize = typeof this.maxSize !== 'undefined' ? this.maxSize : this.config.maxSize; this.rotate = typeof this.rotate !== 'undefined' ? this.rotate : this.config.rotate; this.boundaryLinks = typeof this.boundaryLinks !== 'undefined' ? this.boundaryLinks : this.config.boundaryLinks; this.directionLinks = typeof this.directionLinks !== 'undefined' ? this.directionLinks : this.config.directionLinks; this.pageBtnClass = typeof this.pageBtnClass !== 'undefined' ? this.pageBtnClass : this.config.pageBtnClass; // base class this.itemsPerPage = typeof this.itemsPerPage !== 'undefined' ? this.itemsPerPage : this.config.itemsPerPage; this.totalPages = this.calculateTotalPages(); // this class this.pages = this.getPages(this.page, this.totalPages); this.inited = true; }; /** * @param {?} value * @return {?} */ PagerComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this.page = value; this.pages = this.getPages(this.page, this.totalPages); }; /** * @param {?} key * @return {?} */ PagerComponent.prototype.getText = /** * @param {?} key * @return {?} */ function (key) { return (/** @type {?} */ (this))[key + 'Text'] || this.config[key + 'Text']; }; /** * @return {?} */ PagerComponent.prototype.noPrevious = /** * @return {?} */ function () { return this.page === 1; }; /** * @return {?} */ PagerComponent.prototype.noNext = /** * @return {?} */ function () { return this.page === this.totalPages; }; /** * @param {?} fn * @return {?} */ PagerComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ PagerComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * @param {?} page * @param {?=} event * @return {?} */ PagerComponent.prototype.selectPage = /** * @param {?} page * @param {?=} event * @return {?} */ function (page, event) { if (event) { event.preventDefault(); } if (!this.disabled) { if (event && event.target) { var /** @type {?} */ target = event.target; target.blur(); } this.writeValue(page); this.onChange(this.page); } }; // Create page object used in template /** * @param {?} num * @param {?} text * @param {?} active * @return {?} */ PagerComponent.prototype.makePage = /** * @param {?} num * @param {?} text * @param {?} active * @return {?} */ function (num, text, active) { return { text: text, number: num, active: active }; }; /** * @param {?} currentPage * @param {?} totalPages * @return {?} */ PagerComponent.prototype.getPages = /** * @param {?} currentPage * @param {?} totalPages * @return {?} */ function (currentPage, totalPages) { var /** @type {?} */ pages = []; // Default page limits var /** @type {?} */ startPage = 1; var /** @type {?} */ endPage = totalPages; var /** @type {?} */ isMaxSized = typeof this.maxSize !== 'undefined' && this.maxSize < totalPages; // recompute if maxSize if (isMaxSized) { if (this.rotate) { // Current page is displayed in the middle of the visible ones startPage = Math.max(currentPage - Math.floor(this.maxSize / 2), 1); endPage = startPage + this.maxSize - 1; // Adjust if limit is exceeded if (endPage > totalPages) { endPage = totalPages; startPage = endPage - this.maxSize + 1; } } else { // Visible pages are paginated with maxSize startPage = ((Math.ceil(currentPage / this.maxSize) - 1) * this.maxSize) + 1; // Adjust last page if limit is exceeded endPage = Math.min(startPage + this.maxSize - 1, totalPages); } } // Add page number links for (var /** @type {?} */ num = startPage; num <= endPage; num++) { var /** @type {?} */ page = this.makePage(num, num.toString(), num === currentPage); pages.push(page); } // Add links to move between page sets if (isMaxSized && !this.rotate) { if (startPage > 1) { var /** @type {?} */ previousPageSet = this.makePage(startPage - 1, '...', false); pages.unshift(previousPageSet); } if (endPage < totalPages) { var /** @type {?} */ nextPageSet = this.makePage(endPage + 1, '...', false); pages.push(nextPageSet); } } return pages; }; // base class /** * @return {?} */ PagerComponent.prototype.calculateTotalPages = /** * @return {?} */ function () { var /** @type {?} */ totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil(this.totalItems / this.itemsPerPage); return Math.max(totalPages || 0, 1); }; PagerComponent.decorators = [ { type: Component, args: [{ selector: 'hx-pager', template: PAGER_TEMPLATE, providers: [PAGER_CONTROL_VALUE_ACCESSOR] },] }, ]; /** @nocollapse */ PagerComponent.ctorParameters = function () { return [ { type: Renderer2, }, { type: ElementRef, }, { type: PaginationConfig, }, ]; }; PagerComponent.propDecorators = { "align": [{ type: Input },], "maxSize": [{ type: Input },], "boundaryLinks": [{ type: Input },], "directionLinks": [{ type: Input },], "firstText": [{ type: Input },], "previousText": [{ type: Input },], "nextText": [{ type: Input },], "lastText": [{ type: Input },], "rotate": [{ type: Input },], "pageBtnClass": [{ type: Input },], "disabled": [{ type: Input },], "numPages": [{ type: Output },], "pageChanged": [{ type: Output },], "itemsPerPage": [{ type: Input },], "totalItems": [{ type: Input },], }; return PagerComponent; }()); export { PagerComponent }; function PagerComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ PagerComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ PagerComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ PagerComponent.propDecorators; /** @type {?} */ PagerComponent.prototype.config; /** * if `true` aligns each link to the sides of pager * @type {?} */ PagerComponent.prototype.align; /** * limit number for page links in pager * @type {?} */ PagerComponent.prototype.maxSize; /** * if false first and last buttons will be hidden * @type {?} */ PagerComponent.prototype.boundaryLinks; /** * if false previous and next buttons will be hidden * @type {?} */ PagerComponent.prototype.directionLinks; /** * first button text * @type {?} */ PagerComponent.prototype.firstText; /** * previous button text * @type {?} */ PagerComponent.prototype.previousText; /** * next button text * @type {?} */ PagerComponent.prototype.nextText; /** * last button text * @type {?} */ PagerComponent.prototype.lastText; /** * if true current page will in the middle of pages list * @type {?} */ PagerComponent.prototype.rotate; /** * add class to <li> * @type {?} */ PagerComponent.prototype.pageBtnClass; /** * if true pagination component will be disabled * @type {?} */ PagerComponent.prototype.disabled; /** * fired when total pages count changes, $event:number equals to total pages count * @type {?} */ PagerComponent.prototype.numPages; /** * fired when page was changed, $event:{page, itemsPerPage} equals to object with current page index and number of items per page * @type {?} */ PagerComponent.prototype.pageChanged; /** @type {?} */ PagerComponent.prototype.onChange; /** @type {?} */ PagerComponent.prototype.onTouched; /** @type {?} */ PagerComponent.prototype.renderer; /** @type {?} */ PagerComponent.prototype.elementRef; /** @type {?} */ PagerComponent.prototype.classMap; /** @type {?} */ PagerComponent.prototype.pages; /** @type {?} */ PagerComponent.prototype._itemsPerPage; /** @type {?} */ PagerComponent.prototype._totalItems; /** @type {?} */ PagerComponent.prototype._totalPages; /** @type {?} */ PagerComponent.prototype.inited; /** @type {?} */ PagerComponent.prototype._page; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGh4dWkvYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9wYWdpbmF0aW9uL3BhZ2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsTUFBTSxDQUFDLHFCQUFNLDRCQUE0QixHQUFRO0lBQy9DLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsY0FBYyxFQUFkLENBQWMsQ0FBQztJQUM3QyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixxQkFBTSxjQUFjLEdBQUcsbWRBU3RCLENBQUM7OzRCQTJHbUIsUUFBbUIsRUFBRSxVQUFzQixFQUFFLGdCQUFrQzs7Ozt3QkF2RWhELElBQUksWUFBWSxFQUFVOzs7OzJCQUViLElBQUksWUFBWSxFQUFvQjt3QkFzRDVFLFFBQVEsQ0FBQyxTQUFTO3lCQUNqQixRQUFRLENBQUMsU0FBUztzQkFXdkIsS0FBSztxQkFDTixDQUFDO1FBR2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxLQUFL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Z0JBQTdCLFVBQVU7Z0JBR3JCLGdCQUFnQjs7OzBCQTJCdEIsS0FBSzs0QkFFTCxLQUFLO2tDQUVMLEtBQUs7bUNBRUwsS0FBSzs4QkFHTCxLQUFLO2lDQUVMLEtBQUs7NkJBRUwsS0FBSzs2QkFFTCxLQUFLOzJCQUVMLEtBQUs7aUNBR0wsS0FBSzs2QkFHTCxLQUFLOzZCQUdMLE1BQU07Z0NBRU4sTUFBTTtpQ0FHTixLQUFLOytCQVdMLEtBQUs7O3lCQXhFUjs7U0EyQmEsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBSZW5kZXJlcjIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFBhZ2VDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL3BhZ2luYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbmZpZyB9IGZyb20gJy4vcGFnaW5hdGlvbi5jb25maWcnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFBBR0VSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQYWdlckNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWVcclxufTtcclxuXHJcbmNvbnN0IFBBR0VSX1RFTVBMQVRFID0gYFxyXG4gICAgPHVsIGNsYXNzPVwiaHgtZmxleCBoeC1mbGV4LWp1c3RpZnktYmV0d2VlblwiPlxyXG4gICAgICA8bGkgW2NsYXNzLmlzLWRpc2FibGVkXT1cIm5vUHJldmlvdXMoKVwiIFtjbGFzcy5pcy1wcmV2aW91c109XCJhbGlnblwiIGNsYXNzPVwie3sgcGFnZUJ0bkNsYXNzIH19XCI+XHJcbiAgICAgICAgPGEgaHJlZiAoY2xpY2spPVwic2VsZWN0UGFnZShwYWdlIC0gMSwgJGV2ZW50KVwiPnt7Z2V0VGV4dCgncHJldmlvdXMnKX19PC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgICA8bGkgW2NsYXNzLmlzLWRpc2FibGVkXT1cIm5vTmV4dCgpXCIgW2NsYXNzLmlzLW5leHRdPVwiYWxpZ25cIiBjbGFzcz1cInt7IHBhZ2VCdG5DbGFzcyB9fVwiPlxyXG4gICAgICAgIDxhIGhyZWYgKGNsaWNrKT1cInNlbGVjdFBhZ2UocGFnZSArIDEsICRldmVudClcIj57e2dldFRleHQoJ25leHQnKX19PC9hPlxyXG4gICAgICA8L2xpPlxyXG4gIDwvdWw+XHJcbmA7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4LXBhZ2VyJyxcclxuICB0ZW1wbGF0ZTogUEFHRVJfVEVNUExBVEUsXHJcbiAgcHJvdmlkZXJzOiBbUEFHRVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XHJcbiAgcHVibGljIGNvbmZpZzogYW55O1xyXG4gIC8qKiBpZiBgdHJ1ZWAgYWxpZ25zIGVhY2ggbGluayB0byB0aGUgc2lkZXMgb2YgcGFnZXIgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgYWxpZ246IGJvb2xlYW47XHJcbiAgLyoqIGxpbWl0IG51bWJlciBmb3IgcGFnZSBsaW5rcyBpbiBwYWdlciAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBtYXhTaXplOiBudW1iZXI7XHJcbiAgLyoqIGlmIGZhbHNlIGZpcnN0IGFuZCBsYXN0IGJ1dHRvbnMgd2lsbCBiZSBoaWRkZW4gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgYm91bmRhcnlMaW5rczogYm9vbGVhbjtcclxuICAvKiogaWYgZmFsc2UgcHJldmlvdXMgYW5kIG5leHQgYnV0dG9ucyB3aWxsIGJlIGhpZGRlbiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkaXJlY3Rpb25MaW5rczogYm9vbGVhbjtcclxuICAvLyBsYWJlbHNcclxuICAvKiogZmlyc3QgYnV0dG9uIHRleHQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZmlyc3RUZXh0OiBzdHJpbmc7XHJcbiAgLyoqIHByZXZpb3VzIGJ1dHRvbiB0ZXh0ICovXHJcbiAgQElucHV0KCkgcHVibGljIHByZXZpb3VzVGV4dDogc3RyaW5nO1xyXG4gIC8qKiBuZXh0IGJ1dHRvbiB0ZXh0ICovXHJcbiAgQElucHV0KCkgcHVibGljIG5leHRUZXh0OiBzdHJpbmc7XHJcbiAgLyoqIGxhc3QgYnV0dG9uIHRleHQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbGFzdFRleHQ6IHN0cmluZztcclxuICAvKiogaWYgdHJ1ZSBjdXJyZW50IHBhZ2Ugd2lsbCBpbiB0aGUgbWlkZGxlIG9mIHBhZ2VzIGxpc3QgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcm90YXRlOiBib29sZWFuO1xyXG4gIC8vIGNzc1xyXG4gIC8qKiBhZGQgY2xhc3MgdG8gPGxpPiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdlQnRuQ2xhc3M6IHN0cmluZztcclxuXHJcbiAgLyoqIGlmIHRydWUgcGFnaW5hdGlvbiBjb21wb25lbnQgd2lsbCBiZSBkaXNhYmxlZCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgLyoqIGZpcmVkIHdoZW4gdG90YWwgcGFnZXMgY291bnQgY2hhbmdlcywgJGV2ZW50Om51bWJlciBlcXVhbHMgdG8gdG90YWwgcGFnZXMgY291bnQgKi9cclxuICBAT3V0cHV0KCkgcHVibGljIG51bVBhZ2VzOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIC8qKiBmaXJlZCB3aGVuIHBhZ2Ugd2FzIGNoYW5nZWQsICRldmVudDp7cGFnZSwgaXRlbXNQZXJQYWdlfSBlcXVhbHMgdG8gb2JqZWN0IHdpdGggY3VycmVudCBwYWdlIGluZGV4IGFuZCBudW1iZXIgb2YgaXRlbXMgcGVyIHBhZ2UgKi9cclxuICBAT3V0cHV0KCkgcHVibGljIHBhZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VDaGFuZ2VkRXZlbnQ+KCk7XHJcblxyXG4gIC8qKiBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBwZXIgcGFnZS4gSWYgdmFsdWUgbGVzcyB0aGFuIDEgd2lsbCBkaXNwbGF5IGFsbCBpdGVtcyBvbiBvbmUgcGFnZSAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBpdGVtc1BlclBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pdGVtc1BlclBhZ2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGl0ZW1zUGVyUGFnZSh2OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2l0ZW1zUGVyUGFnZSA9IHY7XHJcbiAgICB0aGlzLnRvdGFsUGFnZXMgPSB0aGlzLmNhbGN1bGF0ZVRvdGFsUGFnZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gYWxsIHBhZ2VzICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHRvdGFsSXRlbXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90b3RhbEl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCB0b3RhbEl0ZW1zKHY6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdG90YWxJdGVtcyA9IHY7XHJcbiAgICB0aGlzLnRvdGFsUGFnZXMgPSB0aGlzLmNhbGN1bGF0ZVRvdGFsUGFnZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHRvdGFsUGFnZXModjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gdjtcclxuICAgIHRoaXMubnVtUGFnZXMuZW1pdCh2KTtcclxuICAgIGlmICh0aGlzLmluaXRlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdFBhZ2UodGhpcy5wYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcGFnZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBfcHJldmlvdXMgPSB0aGlzLl9wYWdlO1xyXG4gICAgdGhpcy5fcGFnZSA9ICh2YWx1ZSA+IHRoaXMudG90YWxQYWdlcykgPyB0aGlzLnRvdGFsUGFnZXMgOiAodmFsdWUgfHwgMSk7XHJcblxyXG4gICAgaWYgKF9wcmV2aW91cyA9PT0gdGhpcy5fcGFnZSB8fCB0eXBlb2YgX3ByZXZpb3VzID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHtcclxuICAgICAgcGFnZTogdGhpcy5fcGFnZSxcclxuICAgICAgaXRlbXNQZXJQYWdlOiB0aGlzLml0ZW1zUGVyUGFnZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlOiBhbnkgPSBGdW5jdGlvbi5wcm90b3R5cGU7XHJcbiAgcHVibGljIG9uVG91Y2hlZDogYW55ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xyXG5cclxuICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMjtcclxuICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuXHJcbiAgcHVibGljIGNsYXNzTWFwOiBzdHJpbmc7XHJcbiAgcHVibGljIHBhZ2VzOiBhbnlbXTtcclxuXHJcbiAgcHJvdGVjdGVkIF9pdGVtc1BlclBhZ2U6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgX3RvdGFsSXRlbXM6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgX3RvdGFsUGFnZXM6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgaW5pdGVkID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9wYWdlID0gMTtcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlbmRlcmVyOiBSZW5kZXJlcjIsIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHBhZ2luYXRpb25Db25maWc6IFBhZ2luYXRpb25Db25maWcpIHtcclxuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJlT3B0aW9ucyhPYmplY3QuYXNzaWduKHt9LCBwYWdpbmF0aW9uQ29uZmlnLm1haW4sIHBhZ2luYXRpb25Db25maWcucGFnZXIpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb25maWd1cmVPcHRpb25zKGNvbmZpZzogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsYXNzTWFwID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnO1xyXG4gICAgLy8gd2F0Y2ggZm9yIG1heFNpemVcclxuICAgIHRoaXMubWF4U2l6ZSA9IHR5cGVvZiB0aGlzLm1heFNpemUgIT09ICd1bmRlZmluZWQnXHJcbiAgICAgID8gdGhpcy5tYXhTaXplXHJcbiAgICAgIDogdGhpcy5jb25maWcubWF4U2l6ZTtcclxuICAgIHRoaXMucm90YXRlID0gdHlwZW9mIHRoaXMucm90YXRlICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICA/IHRoaXMucm90YXRlXHJcbiAgICAgIDogdGhpcy5jb25maWcucm90YXRlO1xyXG4gICAgdGhpcy5ib3VuZGFyeUxpbmtzID0gdHlwZW9mIHRoaXMuYm91bmRhcnlMaW5rcyAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICAgPyB0aGlzLmJvdW5kYXJ5TGlua3NcclxuICAgICAgOiB0aGlzLmNvbmZpZy5ib3VuZGFyeUxpbmtzO1xyXG4gICAgdGhpcy5kaXJlY3Rpb25MaW5rcyA9IHR5cGVvZiB0aGlzLmRpcmVjdGlvbkxpbmtzICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICA/IHRoaXMuZGlyZWN0aW9uTGlua3NcclxuICAgICAgOiB0aGlzLmNvbmZpZy5kaXJlY3Rpb25MaW5rcztcclxuICAgIHRoaXMucGFnZUJ0bkNsYXNzID0gdHlwZW9mIHRoaXMucGFnZUJ0bkNsYXNzICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICA/IHRoaXMucGFnZUJ0bkNsYXNzXHJcbiAgICAgIDogdGhpcy5jb25maWcucGFnZUJ0bkNsYXNzO1xyXG5cclxuICAgIC8vIGJhc2UgY2xhc3NcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gdHlwZW9mIHRoaXMuaXRlbXNQZXJQYWdlICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICA/IHRoaXMuaXRlbXNQZXJQYWdlXHJcbiAgICAgIDogdGhpcy5jb25maWcuaXRlbXNQZXJQYWdlO1xyXG4gICAgdGhpcy50b3RhbFBhZ2VzID0gdGhpcy5jYWxjdWxhdGVUb3RhbFBhZ2VzKCk7XHJcbiAgICAvLyB0aGlzIGNsYXNzXHJcbiAgICB0aGlzLnBhZ2VzID0gdGhpcy5nZXRQYWdlcyh0aGlzLnBhZ2UsIHRoaXMudG90YWxQYWdlcyk7XHJcbiAgICB0aGlzLmluaXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSB2YWx1ZTtcclxuICAgIHRoaXMucGFnZXMgPSB0aGlzLmdldFBhZ2VzKHRoaXMucGFnZSwgdGhpcy50b3RhbFBhZ2VzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUZXh0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpW2tleSArICdUZXh0J10gfHwgdGhpcy5jb25maWdba2V5ICsgJ1RleHQnXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBub1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZSA9PT0gMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBub05leHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID09PSB0aGlzLnRvdGFsUGFnZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4ge30pOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgdGFyZ2V0LmJsdXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLndyaXRlVmFsdWUocGFnZSk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5wYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENyZWF0ZSBwYWdlIG9iamVjdCB1c2VkIGluIHRlbXBsYXRlXHJcbiAgcHJvdGVjdGVkIG1ha2VQYWdlKG51bTogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGFjdGl2ZTogYm9vbGVhbik6IHtudW1iZXI6IG51bWJlciwgdGV4dDogc3RyaW5nLCBhY3RpdmU6IGJvb2xlYW59IHtcclxuICAgIHJldHVybiB7dGV4dCwgbnVtYmVyOiBudW0sIGFjdGl2ZX07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0UGFnZXMoY3VycmVudFBhZ2U6IG51bWJlciwgdG90YWxQYWdlczogbnVtYmVyKTogYW55W10ge1xyXG4gICAgY29uc3QgcGFnZXM6IGFueVtdID0gW107XHJcblxyXG4gICAgLy8gRGVmYXVsdCBwYWdlIGxpbWl0c1xyXG4gICAgbGV0IHN0YXJ0UGFnZSA9IDE7XHJcbiAgICBsZXQgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICBjb25zdCBpc01heFNpemVkID0gdHlwZW9mIHRoaXMubWF4U2l6ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tYXhTaXplIDwgdG90YWxQYWdlcztcclxuXHJcbiAgICAvLyByZWNvbXB1dGUgaWYgbWF4U2l6ZVxyXG4gICAgaWYgKGlzTWF4U2l6ZWQpIHtcclxuICAgICAgaWYgKHRoaXMucm90YXRlKSB7XHJcbiAgICAgICAgLy8gQ3VycmVudCBwYWdlIGlzIGRpc3BsYXllZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB2aXNpYmxlIG9uZXNcclxuICAgICAgICBzdGFydFBhZ2UgPSBNYXRoLm1heChjdXJyZW50UGFnZSAtIE1hdGguZmxvb3IodGhpcy5tYXhTaXplIC8gMiksIDEpO1xyXG4gICAgICAgIGVuZFBhZ2UgPSBzdGFydFBhZ2UgKyB0aGlzLm1heFNpemUgLSAxO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3QgaWYgbGltaXQgaXMgZXhjZWVkZWRcclxuICAgICAgICBpZiAoZW5kUGFnZSA+IHRvdGFsUGFnZXMpIHtcclxuICAgICAgICAgIGVuZFBhZ2UgPSB0b3RhbFBhZ2VzO1xyXG4gICAgICAgICAgc3RhcnRQYWdlID0gZW5kUGFnZSAtIHRoaXMubWF4U2l6ZSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFZpc2libGUgcGFnZXMgYXJlIHBhZ2luYXRlZCB3aXRoIG1heFNpemVcclxuICAgICAgICBzdGFydFBhZ2UgPSAoKE1hdGguY2VpbChjdXJyZW50UGFnZSAvIHRoaXMubWF4U2l6ZSkgLSAxKSAqIHRoaXMubWF4U2l6ZSkgKyAxO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3QgbGFzdCBwYWdlIGlmIGxpbWl0IGlzIGV4Y2VlZGVkXHJcbiAgICAgICAgZW5kUGFnZSA9IE1hdGgubWluKHN0YXJ0UGFnZSArIHRoaXMubWF4U2l6ZSAtIDEsIHRvdGFsUGFnZXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIHBhZ2UgbnVtYmVyIGxpbmtzXHJcbiAgICBmb3IgKGxldCBudW0gPSBzdGFydFBhZ2U7IG51bSA8PSBlbmRQYWdlOyBudW0rKykge1xyXG4gICAgICBjb25zdCBwYWdlID0gdGhpcy5tYWtlUGFnZShudW0sIG51bS50b1N0cmluZygpLCBudW0gPT09IGN1cnJlbnRQYWdlKTtcclxuICAgICAgcGFnZXMucHVzaChwYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgbGlua3MgdG8gbW92ZSBiZXR3ZWVuIHBhZ2Ugc2V0c1xyXG4gICAgaWYgKGlzTWF4U2l6ZWQgJiYgIXRoaXMucm90YXRlKSB7XHJcbiAgICAgIGlmIChzdGFydFBhZ2UgPiAxKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNQYWdlU2V0ID0gdGhpcy5tYWtlUGFnZShzdGFydFBhZ2UgLSAxLCAnLi4uJywgZmFsc2UpO1xyXG4gICAgICAgIHBhZ2VzLnVuc2hpZnQocHJldmlvdXNQYWdlU2V0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGVuZFBhZ2UgPCB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dFBhZ2VTZXQgPSB0aGlzLm1ha2VQYWdlKGVuZFBhZ2UgKyAxLCAnLi4uJywgZmFsc2UpO1xyXG4gICAgICAgIHBhZ2VzLnB1c2gobmV4dFBhZ2VTZXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhZ2VzO1xyXG4gIH1cclxuXHJcbiAgLy8gYmFzZSBjbGFzc1xyXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVUb3RhbFBhZ2VzKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy5pdGVtc1BlclBhZ2UgPCAxXHJcbiAgICAgID8gMVxyXG4gICAgICA6IE1hdGguY2VpbCh0aGlzLnRvdGFsSXRlbXMgLyB0aGlzLml0ZW1zUGVyUGFnZSk7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgodG90YWxQYWdlcyB8fCAwLCAxKTtcclxuICB9XHJcbn1cclxuIl19