@datorama/akita
Version:
State Management Tailored-Made for JS Applications
452 lines • 32.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { delay, map, switchMap, take } from 'rxjs/operators';
import { BehaviorSubject, from, isObservable } from 'rxjs';
import { AkitaPlugin } from '../plugin';
import { applyTransaction } from '../../transaction';
import { isUndefined } from '../../isUndefined';
import { action, logAction } from '../../actions';
import { isNil } from '../../isNil';
/**
* @record
* @template E
*/
export function PaginationResponse() { }
if (false) {
/** @type {?} */
PaginationResponse.prototype.currentPage;
/** @type {?} */
PaginationResponse.prototype.perPage;
/** @type {?} */
PaginationResponse.prototype.lastPage;
/** @type {?} */
PaginationResponse.prototype.data;
/** @type {?|undefined} */
PaginationResponse.prototype.total;
/** @type {?|undefined} */
PaginationResponse.prototype.from;
/** @type {?|undefined} */
PaginationResponse.prototype.to;
/** @type {?|undefined} */
PaginationResponse.prototype.pageControls;
}
/** @type {?} */
const paginatorDefaults = {
pagesControls: false,
range: false,
startWith: 1,
cacheTimeout: undefined,
clearStoreWithCache: true
};
/**
* @template State
*/
export class PaginatorPlugin extends AkitaPlugin {
/**
* @param {?} query
* @param {?=} config
*/
constructor(query, config = {}) {
super(query, {
resetFn: (/**
* @return {?}
*/
() => {
this.initial = false;
this.destroy({ clearCache: true, currentPage: 1 });
})
});
this.query = query;
this.config = config;
/**
* Save current filters, sorting, etc. in cache
*/
this.metadata = new Map();
this.pages = new Map();
this.pagination = {
currentPage: 1,
perPage: 0,
total: 0,
lastPage: 0,
data: []
};
/**
* When the user navigates to a different page and return
* we don't want to call `clearCache` on first time.
*/
this.initial = true;
/**
* Proxy to the query loading
*/
this.isLoading$ = this.query.selectLoading().pipe(delay(0));
this.config = Object.assign(paginatorDefaults, config);
const { startWith, cacheTimeout } = this.config;
this.page = new BehaviorSubject(startWith);
if (isObservable(cacheTimeout)) {
this.clearCacheSubscription = cacheTimeout.subscribe((/**
* @return {?}
*/
() => this.clearCache()));
}
}
/**
* Listen to page changes
* @return {?}
*/
get pageChanges() {
return this.page.asObservable();
}
/**
* Get the current page number
* @return {?}
*/
get currentPage() {
return this.pagination.currentPage;
}
/**
* Check if current page is the first one
* @return {?}
*/
get isFirst() {
return this.currentPage === 1;
}
/**
* Check if current page is the last one
* @return {?}
*/
get isLast() {
return this.currentPage === this.pagination.lastPage;
}
/**
* Whether to generate an array of pages for *ngFor
* [1, 2, 3, 4]
* @template THIS
* @this {THIS}
* @return {THIS}
*/
withControls() {
(/** @type {?} */ (this)).config.pagesControls = true;
return (/** @type {?} */ (this));
}
/**
* Whether to generate the `from` and `to` keys
* [1, 2, 3, 4]
* @template THIS
* @this {THIS}
* @return {THIS}
*/
withRange() {
(/** @type {?} */ (this)).config.range = true;
return (/** @type {?} */ (this));
}
/**
* Set the loading state
* @param {?=} value
* @return {?}
*/
setLoading(value = true) {
this.getStore().setLoading(value);
}
/**
* Update the pagination object and add the page
* @param {?} response
* @return {?}
*/
update(response) {
this.pagination = response;
this.addPage(response.data);
}
/**
*
* Set the ids and add the page to store
* @param {?} data
* @return {?}
*/
addPage(data) {
this.pages.set(this.currentPage, { ids: data.map((/**
* @param {?} entity
* @return {?}
*/
entity => entity[this.getStore().idKey])) });
this.getStore().add(data);
}
/**
* Clear the cache.
* @param {?=} options
* @return {?}
*/
clearCache(options = {}) {
if (!this.initial) {
logAction('@Pagination - Clear Cache');
if (options.clearStore !== false && (this.config.clearStoreWithCache || options.clearStore)) {
this.getStore().remove();
}
this.pages = new Map();
this.metadata = new Map();
}
this.initial = false;
}
/**
* @param {?} page
* @return {?}
*/
clearPage(page) {
this.pages.delete(page);
}
/**
* Clear the cache timeout and optionally the pages
* @param {?=} __0
* @return {?}
*/
destroy({ clearCache, currentPage } = {}) {
if (this.clearCacheSubscription) {
this.clearCacheSubscription.unsubscribe();
}
if (clearCache) {
this.clearCache();
}
if (!isUndefined(currentPage)) {
this.setPage(currentPage);
}
this.initial = true;
}
/**
* Whether the provided page is active
* @param {?} page
* @return {?}
*/
isPageActive(page) {
return this.currentPage === page;
}
/**
* Set the current page
* @param {?} page
* @return {?}
*/
setPage(page) {
if (page !== this.currentPage || !this.hasPage(page)) {
this.page.next((this.pagination.currentPage = page));
}
}
/**
* Increment current page
* @return {?}
*/
nextPage() {
if (this.currentPage !== this.pagination.lastPage) {
this.setPage(this.pagination.currentPage + 1);
}
}
/**
* Decrement current page
* @return {?}
*/
prevPage() {
if (this.pagination.currentPage > 1) {
this.setPage(this.pagination.currentPage - 1);
}
}
/**
* Set current page to last
* @return {?}
*/
setLastPage() {
this.setPage(this.pagination.lastPage);
}
/**
* Set current page to first
* @return {?}
*/
setFirstPage() {
this.setPage(1);
}
/**
* Check if page exists in cache
* @param {?} page
* @return {?}
*/
hasPage(page) {
return this.pages.has(page);
}
/**
* Get the current page if it's in cache, otherwise invoke the request
* @param {?} req
* @return {?}
*/
getPage(req) {
/** @type {?} */
let page = this.pagination.currentPage;
if (this.hasPage(page)) {
return this.selectPage(page);
}
else {
this.setLoading(true);
return from(req()).pipe(switchMap((/**
* @param {?} config
* @return {?}
*/
(config) => {
page = config.currentPage;
applyTransaction((/**
* @return {?}
*/
() => {
this.setLoading(false);
this.update(config);
}));
return this.selectPage(page);
})));
}
}
/**
* @return {?}
*/
getQuery() {
return this.query;
}
/**
* @return {?}
*/
refreshCurrentPage() {
if (isNil(this.currentPage) === false) {
this.clearPage(this.currentPage);
this.setPage(this.currentPage);
}
}
/**
* @private
* @return {?}
*/
getFrom() {
if (this.isFirst) {
return 1;
}
return (this.currentPage - 1) * this.pagination.perPage + 1;
}
/**
* @private
* @return {?}
*/
getTo() {
if (this.isLast) {
return this.pagination.total;
}
return this.currentPage * this.pagination.perPage;
}
/**
* Select the page
* @private
* @param {?} page
* @return {?}
*/
selectPage(page) {
return this.query.selectAll({ asObject: true }).pipe(take(1), map((/**
* @param {?} entities
* @return {?}
*/
entities => {
/** @type {?} */
let response = Object.assign({}, this.pagination, { data: this.pages.get(page).ids.map((/**
* @param {?} id
* @return {?}
*/
id => entities[id])) });
const { range, pagesControls } = this.config;
/** If no total - calc it */
if (isNaN(this.pagination.total)) {
if (response.lastPage === 1) {
response.total = response.data ? response.data.length : 0;
}
else {
response.total = response.perPage * response.lastPage;
}
this.pagination.total = response.total;
}
if (range) {
response.from = this.getFrom();
response.to = this.getTo();
}
if (pagesControls) {
response.pageControls = generatePages(this.pagination.total, this.pagination.perPage);
}
return response;
})));
}
}
tslib_1.__decorate([
action('@Pagination - New Page'),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [Object]),
tslib_1.__metadata("design:returntype", void 0)
], PaginatorPlugin.prototype, "update", null);
if (false) {
/**
* Save current filters, sorting, etc. in cache
* @type {?}
*/
PaginatorPlugin.prototype.metadata;
/**
* @type {?}
* @private
*/
PaginatorPlugin.prototype.page;
/**
* @type {?}
* @private
*/
PaginatorPlugin.prototype.pages;
/**
* @type {?}
* @private
*/
PaginatorPlugin.prototype.clearCacheSubscription;
/**
* @type {?}
* @private
*/
PaginatorPlugin.prototype.pagination;
/**
* When the user navigates to a different page and return
* we don't want to call `clearCache` on first time.
* @type {?}
* @private
*/
PaginatorPlugin.prototype.initial;
/**
* Proxy to the query loading
* @type {?}
*/
PaginatorPlugin.prototype.isLoading$;
/**
* @type {?}
* @protected
*/
PaginatorPlugin.prototype.query;
/** @type {?} */
PaginatorPlugin.prototype.config;
}
/**
* Generate an array so we can ngFor them to navigate between pages
* @param {?} total
* @param {?} perPage
* @return {?}
*/
function generatePages(total, perPage) {
/** @type {?} */
const len = Math.ceil(total / perPage);
/** @type {?} */
let arr = [];
for (let i = 0; i < len; i++) {
arr.push(i + 1);
}
return arr;
}
/**
* backward compatibility
* @type {?}
*/
export const Paginator = PaginatorPlugin;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yUGx1Z2luLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2FraXRhLyIsInNvdXJjZXMiOlsic3JjL3BsdWdpbnMvcGFnaW5hdG9yL3BhZ2luYXRvclBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRXJGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7O0FBRXBDLHdDQVNDOzs7SUFSQyx5Q0FBb0I7O0lBQ3BCLHFDQUFnQjs7SUFDaEIsc0NBQWlCOztJQUNqQixrQ0FBVTs7SUFDVixtQ0FBZTs7SUFDZixrQ0FBYzs7SUFDZCxnQ0FBWTs7SUFDWiwwQ0FBd0I7OztNQVdwQixpQkFBaUIsR0FBb0I7SUFDekMsYUFBYSxFQUFFLEtBQUs7SUFDcEIsS0FBSyxFQUFFLEtBQUs7SUFDWixTQUFTLEVBQUUsQ0FBQztJQUNaLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLG1CQUFtQixFQUFFLElBQUk7Q0FDMUI7Ozs7QUFFRCxNQUFNLE9BQU8sZUFBMkMsU0FBUSxXQUFrQjs7Ozs7SUFzQmhGLFlBQXNCLEtBQXlCLEVBQVMsU0FBMEIsRUFBRTtRQUNsRixLQUFLLENBQUMsS0FBSyxFQUFFO1lBQ1gsT0FBTzs7O1lBQUUsR0FBRyxFQUFFO2dCQUNa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Li8uLi9xdWVyeUVudGl0eSc7XG5pbXBvcnQgeyBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbnRpdHlTdGF0ZSwgSUQsIGdldEVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBa2l0YVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbic7XG5pbXBvcnQgeyBhcHBseVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICcuLi8uLi9pc1VuZGVmaW5lZCc7XG5pbXBvcnQgeyBhY3Rpb24sIGxvZ0FjdGlvbiB9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi9pc05pbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblJlc3BvbnNlPEU+IHtcbiAgY3VycmVudFBhZ2U6IG51bWJlcjtcbiAgcGVyUGFnZTogbnVtYmVyO1xuICBsYXN0UGFnZTogbnVtYmVyO1xuICBkYXRhOiBFW107XG4gIHRvdGFsPzogbnVtYmVyO1xuICBmcm9tPzogbnVtYmVyO1xuICB0bz86IG51bWJlcjtcbiAgcGFnZUNvbnRyb2xzPzogbnVtYmVyW107XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRvckNvbmZpZyA9IHtcbiAgcGFnZXNDb250cm9scz86IGJvb2xlYW47XG4gIHJhbmdlPzogYm9vbGVhbjtcbiAgc3RhcnRXaXRoPzogbnVtYmVyO1xuICBjYWNoZVRpbWVvdXQ/OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGNsZWFyU3RvcmVXaXRoQ2FjaGU/OiBib29sZWFuO1xufTtcblxuY29uc3QgcGFnaW5hdG9yRGVmYXVsdHM6IFBhZ2luYXRvckNvbmZpZyA9IHtcbiAgcGFnZXNDb250cm9sczogZmFsc2UsXG4gIHJhbmdlOiBmYWxzZSxcbiAgc3RhcnRXaXRoOiAxLFxuICBjYWNoZVRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgY2xlYXJTdG9yZVdpdGhDYWNoZTogdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRvclBsdWdpbjxTdGF0ZSBleHRlbmRzIEVudGl0eVN0YXRlPiBleHRlbmRzIEFraXRhUGx1Z2luPFN0YXRlPiB7XG4gIC8qKiBTYXZlIGN1cnJlbnQgZmlsdGVycywgc29ydGluZywgZXRjLiBpbiBjYWNoZSAqL1xuICBtZXRhZGF0YSA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIHBhZ2U6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuICBwcml2YXRlIHBhZ2VzID0gbmV3IE1hcDxudW1iZXIsIHsgaWRzOiBJRFtdIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xlYXJDYWNoZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgcGFnaW5hdGlvbjogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PiA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBwZXJQYWdlOiAwLFxuICAgIHRvdGFsOiAwLFxuICAgIGxhc3RQYWdlOiAwLFxuICAgIGRhdGE6IFtdXG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIHRvIGEgZGlmZmVyZW50IHBhZ2UgYW5kIHJldHVyblxuICAgKiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYGNsZWFyQ2FjaGVgIG9uIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcnlFbnRpdHk8U3RhdGU+LCBwdWJsaWMgY29uZmlnOiBQYWdpbmF0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKHF1ZXJ5LCB7XG4gICAgICByZXNldEZuOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3koeyBjbGVhckNhY2hlOiB0cnVlLCBjdXJyZW50UGFnZTogMSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24ocGFnaW5hdG9yRGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgeyBzdGFydFdpdGgsIGNhY2hlVGltZW91dCB9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5wYWdlID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGFydFdpdGgpO1xuICAgIGlmIChpc09ic2VydmFibGUoY2FjaGVUaW1lb3V0KSkge1xuICAgICAgdGhpcy5jbGVhckNhY2hlU3Vic2NyaXB0aW9uID0gY2FjaGVUaW1lb3V0LnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsZWFyQ2FjaGUoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3h5IHRvIHRoZSBxdWVyeSBsb2FkaW5nXG4gICAqL1xuICBpc0xvYWRpbmckID0gdGhpcy5xdWVyeS5zZWxlY3RMb2FkaW5nKCkucGlwZShkZWxheSgwKSk7XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBwYWdlIGNoYW5nZXNcbiAgICovXG4gIGdldCBwYWdlQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlIG51bWJlclxuICAgKi9cbiAgZ2V0IGN1cnJlbnRQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmVcbiAgICovXG4gIGdldCBpc0ZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmVcbiAgICovXG4gIGdldCBpc0xhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucGFnaW5hdGlvbi5sYXN0UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIGFuIGFycmF5IG9mIHBhZ2VzIGZvciAqbmdGb3JcbiAgICogWzEsIDIsIDMsIDRdXG4gICAqL1xuICB3aXRoQ29udHJvbHMoKSB7XG4gICAgdGhpcy5jb25maWcucGFnZXNDb250cm9scyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgYGZyb21gIGFuZCBgdG9gIGtleXNcbiAgICogWzEsIDIsIDMsIDRdXG4gICAqL1xuICB3aXRoUmFuZ2UoKSB7XG4gICAgdGhpcy5jb25maWcucmFuZ2UgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKi9cbiAgc2V0TG9hZGluZyh2YWx1ZSA9IHRydWUpIHtcbiAgICB0aGlzLmdldFN0b3JlKCkuc2V0TG9hZGluZyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwYWdpbmF0aW9uIG9iamVjdCBhbmQgYWRkIHRoZSBwYWdlXG4gICAqL1xuICBAYWN0aW9uKCdAUGFnaW5hdGlvbiAtIE5ldyBQYWdlJylcbiAgdXBkYXRlKHJlc3BvbnNlOiBQYWdpbmF0aW9uUmVzcG9uc2U8Z2V0RW50aXR5VHlwZTxTdGF0ZT4+KSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0gcmVzcG9uc2U7XG4gICAgdGhpcy5hZGRQYWdlKHJlc3BvbnNlLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFNldCB0aGUgaWRzIGFuZCBhZGQgdGhlIHBhZ2UgdG8gc3RvcmVcbiAgICovXG4gIGFkZFBhZ2UoZGF0YTogZ2V0RW50aXR5VHlwZTxTdGF0ZT5bXSkge1xuICAgIHRoaXMucGFnZXMuc2V0KHRoaXMuY3VycmVudFBhZ2UsIHsgaWRzOiBkYXRhLm1hcChlbnRpdHkgPT4gZW50aXR5W3RoaXMuZ2V0U3RvcmUoKS5pZEtleV0pIH0pO1xuICAgIHRoaXMuZ2V0U3RvcmUoKS5hZGQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxuICAgKi9cbiAgY2xlYXJDYWNoZShvcHRpb25zOiB7IGNsZWFyU3RvcmU/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pbml0aWFsKSB7XG4gICAgICBsb2dBY3Rpb24oJ0BQYWdpbmF0aW9uIC0gQ2xlYXIgQ2FjaGUnKTtcblxuICAgICAgaWYgKG9wdGlvbnMuY2xlYXJTdG9yZSAhPT0gZmFsc2UgJiYgKHRoaXMuY29uZmlnLmNsZWFyU3RvcmVXaXRoQ2FjaGUgfHwgb3B0aW9ucy5jbGVhclN0b3JlKSkge1xuICAgICAgICB0aGlzLmdldFN0b3JlKCkucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFnZXMgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWwgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VzLmRlbGV0ZShwYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGUgdGltZW91dCBhbmQgb3B0aW9uYWxseSB0aGUgcGFnZXNcbiAgICovXG4gIGRlc3Ryb3koeyBjbGVhckNhY2hlLCBjdXJyZW50UGFnZSB9OiB7IGNsZWFyQ2FjaGU/OiBib29sZWFuOyBjdXJyZW50UGFnZT86IG51bWJlciB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5jbGVhckNhY2hlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNsZWFyQ2FjaGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQ2FjaGUpIHtcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGN1cnJlbnRQYWdlKSkge1xuICAgICAgdGhpcy5zZXRQYWdlKGN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcm92aWRlZCBwYWdlIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNQYWdlQWN0aXZlKHBhZ2U6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSBwYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBzZXRQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIGlmIChwYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlIHx8ICF0aGlzLmhhc1BhZ2UocGFnZSkpIHtcbiAgICAgIHRoaXMucGFnZS5uZXh0KCh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgPSBwYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBjdXJyZW50IHBhZ2VcbiAgICovXG4gIG5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSB0aGlzLnBhZ2luYXRpb24ubGFzdFBhZ2UpIHtcbiAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50IGN1cnJlbnQgcGFnZVxuICAgKi9cbiAgcHJldlBhZ2UoKSB7XG4gICAgaWYgKHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSA+IDEpIHtcbiAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgcGFnZSB0byBsYXN0XG4gICAqL1xuICBzZXRMYXN0UGFnZSgpIHtcbiAgICB0aGlzLnNldFBhZ2UodGhpcy5wYWdpbmF0aW9uLmxhc3RQYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCBwYWdlIHRvIGZpcnN0XG4gICAqL1xuICBzZXRGaXJzdFBhZ2UoKSB7XG4gICAgdGhpcy5zZXRQYWdlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhZ2UgZXhpc3RzIGluIGNhY2hlXG4gICAqL1xuICBoYXNQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmhhcyhwYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBpZiBpdCdzIGluIGNhY2hlLCBvdGhlcndpc2UgaW52b2tlIHRoZSByZXF1ZXN0XG4gICAqL1xuICBnZXRQYWdlKHJlcTogKCkgPT4gT2JzZXJ2YWJsZTxQYWdpbmF0aW9uUmVzcG9uc2U8Z2V0RW50aXR5VHlwZTxTdGF0ZT4+Pikge1xuICAgIGxldCBwYWdlID0gdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlO1xuICAgIGlmICh0aGlzLmhhc1BhZ2UocGFnZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdFBhZ2UocGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgIHJldHVybiBmcm9tKHJlcSgpKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbmZpZzogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PikgPT4ge1xuICAgICAgICAgIHBhZ2UgPSBjb25maWcuY3VycmVudFBhZ2U7XG4gICAgICAgICAgYXBwbHlUcmFuc2FjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoY29uZmlnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RQYWdlKHBhZ2UpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXRRdWVyeSgpOiBRdWVyeUVudGl0eTxTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG5cbiAgcmVmcmVzaEN1cnJlbnRQYWdlKCkge1xuICAgIGlmIChpc05pbCh0aGlzLmN1cnJlbnRQYWdlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY2xlYXJQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgICAgdGhpcy5zZXRQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RnJvbSgpIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0KSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZSArIDE7XG4gIH1cblxuICBwcml2YXRlIGdldFRvKCkge1xuICAgIGlmICh0aGlzLmlzTGFzdCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbi50b3RhbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIHBhZ2VcbiAgICovXG4gIHByaXZhdGUgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIpOiBPYnNlcnZhYmxlPFBhZ2luYXRpb25SZXNwb25zZTxnZXRFbnRpdHlUeXBlPFN0YXRlPj4+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeS5zZWxlY3RBbGwoeyBhc09iamVjdDogdHJ1ZSB9KS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcChlbnRpdGllcyA9PiB7XG4gICAgICAgIGxldCByZXNwb25zZTogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PiA9IHtcbiAgICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgICAgZGF0YTogdGhpcy5wYWdlcy5nZXQocGFnZSkuaWRzLm1hcChpZCA9PiBlbnRpdGllc1tpZF0pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyByYW5nZSwgcGFnZXNDb250cm9scyB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAgICAgLyoqIElmIG5vIHRvdGFsIC0gY2FsYyBpdCAqL1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5wYWdpbmF0aW9uLnRvdGFsKSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5sYXN0UGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgcmVzcG9uc2UudG90YWwgPSByZXNwb25zZS5kYXRhID8gcmVzcG9uc2UuZGF0YS5sZW5ndGggOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZS50b3RhbCA9IHJlc3BvbnNlLnBlclBhZ2UgKiByZXNwb25zZS5sYXN0UGFnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnRvdGFsID0gcmVzcG9uc2UudG90YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICByZXNwb25zZS5mcm9tID0gdGhpcy5nZXRGcm9tKCk7XG4gICAgICAgICAgcmVzcG9uc2UudG8gPSB0aGlzLmdldFRvKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZXNDb250cm9scykge1xuICAgICAgICAgIHJlc3BvbnNlLnBhZ2VDb250cm9scyA9IGdlbmVyYXRlUGFnZXModGhpcy5wYWdpbmF0aW9uLnRvdGFsLCB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhcnJheSBzbyB3ZSBjYW4gbmdGb3IgdGhlbSB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUGFnZXModG90YWw6IG51bWJlciwgcGVyUGFnZTogbnVtYmVyKSB7XG4gIGNvbnN0IGxlbiA9IE1hdGguY2VpbCh0b3RhbCAvIHBlclBhZ2UpO1xuICBsZXQgYXJyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChpICsgMSk7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi9cbmV4cG9ydCBjb25zdCBQYWdpbmF0b3IgPSBQYWdpbmF0b3JQbHVnaW47XG4iXX0=