@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
220 lines • 30.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, forkJoin, of, Subject, timer } from 'rxjs';
import { LoadingEmitter } from '../../utility/loading-emitter';
import { catchError, map, mergeMap, scan, tap } from 'rxjs/operators';
import { HttpParams } from '@angular/common/http';
import { PaginationParams } from '../../utility/pagination/pagination-params';
import * as i0 from "@angular/core";
import * as i1 from "../../resources/engine-endpoint/user-resource.service";
import * as i2 from "../../logger/services/logger.service";
import * as i3 from "../../snack-bar/services/snack-bar.service";
import * as i4 from "@ngx-translate/core";
/**
* Performs paged loading users from backend for [UserAssignComponent]{@link AbstractUserAssignComponent}.
*/
export class UserListService {
_resources;
_log;
_snackbar;
_translate;
/**
* UserValue array stream, that represents users loading from backend.
*/
_users$;
/**
* Emit users loading status from backend.
*/
_loading$;
/**
* Number stream of next page users list, that to be requested from backend.
*/
_nextPage$;
/**
* Signals the end of loaded users.
*/
_endOfData;
/**
* Necessary for pagination parameters in user assign loading from backend.
*/
_pagination;
/**
* Signals if response is empty or no.
*/
_clear;
/**
* The search content that should be applied to the request
*/
_searchQuery;
/**
* Roles that should be applied to the request
*/
rolesQuery;
/**
* negative Roles that should be applied to the request
*/
negativeRolesQuery;
_updateProgress$;
_usersReload$;
/**
* Inject services.
* Initialize declared attributes.
*
* Loading and mapped stream of users.
* @param _resources Loading users from backend.
* @param _log Logging action status.
* @param _snackbar Display info about loading from backend for user.
* @param _translate Translate messages for user.
*/
constructor(_resources, _log, _snackbar, _translate) {
this._resources = _resources;
this._log = _log;
this._snackbar = _snackbar;
this._translate = _translate;
this._loading$ = new LoadingEmitter();
this._updateProgress$ = new LoadingEmitter();
this._usersReload$ = new Subject();
this._endOfData = false;
this._nextPage$ = new BehaviorSubject(null);
this._pagination = {
size: 20,
totalElements: undefined,
totalPages: undefined,
number: -1
};
this._clear = false;
this._searchQuery = '';
this.rolesQuery = new Array();
this.negativeRolesQuery = new Array();
const usersMap = this._nextPage$.pipe(mergeMap(p => this.loadPage(p)), tap(() => {
if (!this._clear) {
this._usersReload$.next();
}
}), scan((acc, value) => {
const result = this._clear ? {} : { ...acc, ...value };
this._clear = false;
return result;
}, {}));
this._users$ = usersMap.pipe(map(v => Object.values(v)));
}
ngOnDestroy() {
this._loading$.complete();
this._updateProgress$.complete();
this._usersReload$.complete();
this._nextPage$.complete();
}
get loading() {
return this._loading$.isActive;
}
get loading$() {
return this._loading$.asObservable();
}
get usersReload$() {
return this._usersReload$.asObservable();
}
get users$() {
return this._users$;
}
get updating$() {
return this._updateProgress$.asObservable();
}
get totalUsers() {
return this._pagination.totalElements ? this._pagination.totalElements : 0;
}
/**
* Get all users from backend and mapped to [UserValue]{@link UserValue} interface with catching errors.
* @param page Page number that is requested. / Next page users list.
*/
loadPage(page) {
if (page === null || page === undefined || this._clear) {
return of({});
}
let params = new HttpParams();
params = this.addPageParams(params, page);
this._loading$.on();
return this._resources.search({ fulltext: this._searchQuery, roles: this.rolesQuery, negativeRoles: this.negativeRolesQuery }, params).pipe(catchError(err => {
this._log.error('Loading users has failed on page ' + this._pagination.number, err);
return of({ content: [], pagination: { ...this._pagination, number: this._pagination.number - 1 } });
}), tap(u => this._endOfData = !Array.isArray(u.content) ||
(Array.isArray(u.content) && u.content.length === 0) ||
u.pagination.number === u.pagination.totalPages), map(users => (Array.isArray(users.content) ? users : { ...users, content: [] })), map(users => {
this._pagination = users.pagination;
return users.content.reduce((acc, curr) => {
const item = curr;
item.roles = new Set(curr.processRoles.map(pr => pr.stringId));
item.processRoles = undefined;
item.selected = false;
item.toggle = function () {
this.selected = !this.selected;
};
return { ...acc, [curr.id]: item };
}, {});
}), tap(_ => this._loading$.off()));
}
/**
* Set value to nextPage stream as next page users list.
* @param lastRendered Last rendered user index.
* @param totalRendered Total loaded size users.
*/
nextPage(lastRendered, totalRendered) {
if (this.loading || this._endOfData) {
return;
}
if (lastRendered === totalRendered) {
this._nextPage$.next(this._pagination.number + 1);
}
}
/**
* Reload page with users.
*/
reload(newSearchQuery = '') {
if (!this._users$ || !this._pagination) {
return;
}
this._searchQuery = newSearchQuery;
this._clear = true;
this._pagination.number = -1;
this._endOfData = false;
this.nextPage(0, 0);
timer(100).subscribe(_ => {
this._pagination.number = -1;
this.nextPage(0, 0);
});
}
updateRoles(selectedUsers, selectedRoles = []) {
if (!selectedUsers || selectedUsers.length === 0) {
return of([]);
}
this._updateProgress$.on();
return forkJoin(selectedUsers.map(user => this._resources.assignRoles(user.id, user.realmId, selectedRoles))).pipe(tap(messages => {
messages.forEach((message, idx) => {
if (message.error) {
this._log.error(message.error, message);
this._snackbar.openErrorSnackBar(message.error);
}
else {
this._log.info(message.success);
selectedUsers[idx].roles = new Set(selectedRoles);
this._snackbar.openSuccessSnackBar(this._translate.instant('tasks.snackbar.rolesSuccessAssign'));
}
});
this._updateProgress$.off();
}));
}
/**
* Returns HttpParams with page params addition.
* @param params Existing HttpParams.
* @param page Page number that is requested. / Next page users list.
*/
addPageParams(params, page) {
params = params.set(PaginationParams.PAGE_SIZE, `${this._pagination.size}`);
page = page !== null ? page : this._pagination.number;
params = params.set(PaginationParams.PAGE_NUMBER, `${page}`);
return params;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserListService, deps: [{ token: i1.UserResourceService }, { token: i2.LoggerService }, { token: i3.SnackBarService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserListService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserListService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.UserResourceService }, { type: i2.LoggerService }, { type: i3.SnackBarService }, { type: i4.TranslateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3VzZXIvc2VydmljZXMvdXNlci1saXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMvRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFNN0QsT0FBTyxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFJaEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNENBQTRDLENBQUM7Ozs7OztBQW1CNUU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQW1ESjtJQUNBO0lBQ0E7SUFDQTtJQXBEcEI7O09BRUc7SUFDYyxPQUFPLENBQWtDO0lBQzFEOztPQUVHO0lBQ0ssU0FBUyxDQUFpQjtJQUNsQzs7T0FFRztJQUNLLFVBQVUsQ0FBMEI7SUFDNUM7O09BRUc7SUFDSyxVQUFVLENBQVU7SUFDNUI7O09BRUc7SUFDSyxXQUFXLENBQWE7SUFDaEM7O09BRUc7SUFDSyxNQUFNLENBQVU7SUFDeEI7O09BRUc7SUFDSyxZQUFZLENBQVM7SUFDN0I7O09BRUc7SUFDSSxVQUFVLENBQWdCO0lBQ2pDOztPQUVHO0lBQ0ksa0JBQWtCLENBQWdCO0lBQ2pDLGdCQUFnQixDQUFpQjtJQUNqQyxhQUFhLENBQWdCO0lBRXJDOzs7Ozs7Ozs7T0FTRztJQUNILFlBQW9C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QUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYSxDQUFDLE1BQWtCLEVBQUUsSUFBYTtRQUNuRCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDdEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO3dHQTVOUSxlQUFlOzRHQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge1BhZ2luYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnaW5hdGlvbic7XG5pbXBvcnQge1VzZXJSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvdXNlci1yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7U25hY2tCYXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9zbmFjay1iYXIvc2VydmljZXMvc25hY2stYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwLCBtZXJnZU1hcCwgc2NhbiwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0h0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7TWVzc2FnZVJlc291cmNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL21lc3NhZ2UtcmVzb3VyY2UnO1xuaW1wb3J0IHtQYWdlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3BhZ2UnO1xuaW1wb3J0IHtVc2VyUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvdXNlci1yZXNvdXJjZSc7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckxpc3RJdGVtIGV4dGVuZHMgVXNlclJlc291cmNlIHtcbiAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICByb2xlczogU2V0PHN0cmluZz47XG5cbiAgICB0b2dnbGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb2xlc09iamVjdCB7XG4gICAgW2s6IHN0cmluZ106IFJvbGVPYmplY3Q7XG59XG5cbmludGVyZmFjZSBSb2xlT2JqZWN0IHtcbiAgICBwZXJmb3JtPzogYm9vbGVhbjtcbiAgICBkZWxlZ2F0ZT86IGJvb2xlYW47XG4gICAgdmlldz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGVyZm9ybXMgcGFnZWQgbG9hZGluZyB1c2VycyBmcm9tIGJhY2tlbmQgZm9yIFtVc2VyQXNzaWduQ29tcG9uZW50XXtAbGluayBBYnN0cmFjdFVzZXJBc3NpZ25Db21wb25lbnR9LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVXNlckxpc3RTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8qKlxuICAgICAqIFVzZXJWYWx1ZSBhcnJheSBzdHJlYW0sIHRoYXQgcmVwcmVzZW50cyB1c2VycyBsb2FkaW5nIGZyb20gYmFja2VuZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF91c2VycyQ6IE9ic2VydmFibGU8QXJyYXk8VXNlckxpc3RJdGVtPj47XG4gICAgLyoqXG4gICAgICogRW1pdCB1c2VycyBsb2FkaW5nIHN0YXR1cyBmcm9tIGJhY2tlbmQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9hZGluZyQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBzdHJlYW0gb2YgbmV4dCBwYWdlIHVzZXJzIGxpc3QsIHRoYXQgdG8gYmUgcmVxdWVzdGVkIGZyb20gYmFja2VuZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9uZXh0UGFnZSQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhlIGVuZCBvZiBsb2FkZWQgdXNlcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZW5kT2ZEYXRhOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIE5lY2Vzc2FyeSBmb3IgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIGluIHVzZXIgYXNzaWduIGxvYWRpbmcgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3BhZ2luYXRpb246IFBhZ2luYXRpb247XG4gICAgLyoqXG4gICAgICogU2lnbmFscyBpZiByZXNwb25zZSBpcyBlbXB0eSBvciBuby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbGVhcjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIGNvbnRlbnQgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcmVxdWVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgX3NlYXJjaFF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUm9sZXMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpYyByb2xlc1F1ZXJ5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIG5lZ2F0aXZlIFJvbGVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgbmVnYXRpdmVSb2xlc1F1ZXJ5OiBBcnJheTxzdHJpbmc+O1xuICAgIHByaXZhdGUgX3VwZGF0ZVByb2dyZXNzJDogTG9hZGluZ0VtaXR0ZXI7XG4gICAgcHJpdmF0ZSBfdXNlcnNSZWxvYWQkOiBTdWJqZWN0PHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogSW5qZWN0IHNlcnZpY2VzLlxuICAgICAqIEluaXRpYWxpemUgZGVjbGFyZWQgYXR0cmlidXRlcy5cbiAgICAgKlxuICAgICAqIExvYWRpbmcgYW5kIG1hcHBlZCBzdHJlYW0gb2YgdXNlcnMuXG4gICAgICogQHBhcmFtIF9yZXNvdXJjZXMgTG9hZGluZyB1c2VycyBmcm9tIGJhY2tlbmQuXG4gICAgICogQHBhcmFtIF9sb2cgTG9nZ2luZyBhY3Rpb24gc3RhdHVzLlxuICAgICAqIEBwYXJhbSBfc25hY2tiYXIgRGlzcGxheSBpbmZvIGFib3V0IGxvYWRpbmcgZnJvbSBiYWNrZW5kIGZvciB1c2VyLlxuICAgICAqIEBwYXJhbSBfdHJhbnNsYXRlIFRyYW5zbGF0ZSBtZXNzYWdlcyBmb3IgdXNlci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZXNvdXJjZXM6IFVzZXJSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3NuYWNrYmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuICAgICAgICB0aGlzLl91c2Vyc1JlbG9hZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICB0aGlzLl9lbmRPZkRhdGEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbmV4dFBhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KG51bGwpO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uID0ge1xuICAgICAgICAgICAgc2l6ZTogMjAsXG4gICAgICAgICAgICB0b3RhbEVsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0b3RhbFBhZ2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudW1iZXI6IC0xXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2NsZWFyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgICAgIHRoaXMucm9sZXNRdWVyeSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICAgIHRoaXMubmVnYXRpdmVSb2xlc1F1ZXJ5ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgICAgICBjb25zdCB1c2Vyc01hcCA9IHRoaXMuX25leHRQYWdlJC5waXBlKFxuICAgICAgICAgICAgbWVyZ2VNYXAocCA9PiB0aGlzLmxvYWRQYWdlKHApKSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jbGVhcikgeyB0aGlzLl91c2Vyc1JlbG9hZCQubmV4dCgpOyB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjYW4oKGFjYywgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jbGVhciA/IHt9IDogey4uLmFjYywgLi4udmFsdWV9O1xuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIHt9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl91c2VycyQgPSB1c2Vyc01hcC5waXBlKFxuICAgICAgICAgICAgbWFwKHYgPT4gT2JqZWN0LnZhbHVlcyh2KSBhcyBBcnJheTxVc2VyTGlzdEl0ZW0+KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbG9hZGluZyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUHJvZ3Jlc3MkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX3VzZXJzUmVsb2FkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9uZXh0UGFnZSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2Vyc1JlbG9hZCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2Vyc1JlbG9hZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2VycyQoKTogT2JzZXJ2YWJsZTxBcnJheTxVc2VyTGlzdEl0ZW0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VycyQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1cGRhdGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b3RhbFVzZXJzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmF0aW9uLnRvdGFsRWxlbWVudHMgPyB0aGlzLl9wYWdpbmF0aW9uLnRvdGFsRWxlbWVudHMgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgdXNlcnMgZnJvbSBiYWNrZW5kIGFuZCBtYXBwZWQgdG8gW1VzZXJWYWx1ZV17QGxpbmsgVXNlclZhbHVlfSBpbnRlcmZhY2Ugd2l0aCBjYXRjaGluZyBlcnJvcnMuXG4gICAgICogQHBhcmFtIHBhZ2UgUGFnZSBudW1iZXIgdGhhdCBpcyByZXF1ZXN0ZWQuIC8gTmV4dCBwYWdlIHVzZXJzIGxpc3QuXG4gICAgICovXG4gICAgcHVibGljIGxvYWRQYWdlKHBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8eyBbazogc3RyaW5nXTogVXNlckxpc3RJdGVtIH0+IHtcbiAgICAgICAgaWYgKHBhZ2UgPT09IG51bGwgfHwgcGFnZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX2NsZWFyKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgICAgICBwYXJhbXMgPSB0aGlzLmFkZFBhZ2VQYXJhbXMocGFyYW1zLCBwYWdlKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZyQub24oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlcy5zZWFyY2goXG4gICAgICAgICAgICB7ZnVsbHRleHQ6IHRoaXMuX3NlYXJjaFF1ZXJ5LCByb2xlczogdGhpcy5yb2xlc1F1ZXJ5LCBuZWdhdGl2ZVJvbGVzOiB0aGlzLm5lZ2F0aXZlUm9sZXNRdWVyeX0sIHBhcmFtcykucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0xvYWRpbmcgdXNlcnMgaGFzIGZhaWxlZCBvbiBwYWdlICcgKyB0aGlzLl9wYWdpbmF0aW9uLm51bWJlciwgZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2Yoe2NvbnRlbnQ6IFtdLCBwYWdpbmF0aW9uOiB7Li4udGhpcy5fcGFnaW5hdGlvbiwgbnVtYmVyOiB0aGlzLl9wYWdpbmF0aW9uLm51bWJlciAtIDF9fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCh1ID0+IHRoaXMuX2VuZE9mRGF0YSA9ICFBcnJheS5pc0FycmF5KHUuY29udGVudCkgfHxcbiAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh1LmNvbnRlbnQpICYmIHUuY29udGVudC5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICAgICAgICAgdS5wYWdpbmF0aW9uLm51bWJlciA9PT0gdS5wYWdpbmF0aW9uLnRvdGFsUGFnZXMpLFxuICAgICAgICAgICAgbWFwKHVzZXJzID0+IChBcnJheS5pc0FycmF5KHVzZXJzLmNvbnRlbnQpID8gdXNlcnMgOiB7Li4udXNlcnMsIGNvbnRlbnQ6IFtdfSkgYXMgUGFnZTxVc2VyUmVzb3VyY2U+KSxcbiAgICAgICAgICAgIG1hcCh1c2VycyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFnaW5hdGlvbiA9IHVzZXJzLnBhZ2luYXRpb247XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJzLmNvbnRlbnQucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGN1cnIgYXMgVXNlckxpc3RJdGVtO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnJvbGVzID0gbmV3IFNldDxzdHJpbmc+KGN1cnIucHJvY2Vzc1JvbGVzLm1hcChwciA9PiBwci5zdHJpbmdJZCkpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2Nlc3NSb2xlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnRvZ2dsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLmFjYywgW2N1cnIuaWRdOiBpdGVtfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcChfID0+IHRoaXMuX2xvYWRpbmckLm9mZigpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB2YWx1ZSB0byBuZXh0UGFnZSBzdHJlYW0gYXMgbmV4dCBwYWdlIHVzZXJzIGxpc3QuXG4gICAgICogQHBhcmFtIGxhc3RSZW5kZXJlZCBMYXN0IHJlbmRlcmVkIHVzZXIgaW5kZXguXG4gICAgICogQHBhcmFtIHRvdGFsUmVuZGVyZWQgVG90YWwgbG9hZGVkIHNpemUgdXNlcnMuXG4gICAgICovXG4gICAgcHVibGljIG5leHRQYWdlKGxhc3RSZW5kZXJlZDogbnVtYmVyLCB0b3RhbFJlbmRlcmVkOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLl9lbmRPZkRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0UmVuZGVyZWQgPT09IHRvdGFsUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25leHRQYWdlJC5uZXh0KHRoaXMuX3BhZ2luYXRpb24ubnVtYmVyICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWQgcGFnZSB3aXRoIHVzZXJzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxvYWQobmV3U2VhcmNoUXVlcnkgPSAnJyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3VzZXJzJCB8fCAhdGhpcy5fcGFnaW5hdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlYXJjaFF1ZXJ5ID0gbmV3U2VhcmNoUXVlcnk7XG4gICAgICAgIHRoaXMuX2NsZWFyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5udW1iZXIgPSAtMTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoMCwgMCk7XG4gICAgICAgIHRpbWVyKDEwMCkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5udW1iZXIgPSAtMTtcbiAgICAgICAgICAgIHRoaXMubmV4dFBhZ2UoMCwgMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSb2xlcyhzZWxlY3RlZFVzZXJzOiBBcnJheTxVc2VyTGlzdEl0ZW0+LCBzZWxlY3RlZFJvbGVzOiBBcnJheTxzdHJpbmc+ID0gW10pOiBPYnNlcnZhYmxlPEFycmF5PE1lc3NhZ2VSZXNvdXJjZT4+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZFVzZXJzIHx8IHNlbGVjdGVkVXNlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzJC5vbigpO1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oc2VsZWN0ZWRVc2Vycy5tYXAodXNlciA9PiB0aGlzLl9yZXNvdXJjZXMuYXNzaWduUm9sZXModXNlci5pZCwgdXNlci5yZWFsbUlkLCBzZWxlY3RlZFJvbGVzKSkpLnBpcGUoXG4gICAgICAgICAgICB0YXAobWVzc2FnZXMgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKG1lc3NhZ2UuZXJyb3IsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbkVycm9yU25hY2tCYXIobWVzc2FnZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuaW5mbyhtZXNzYWdlLnN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRVc2Vyc1tpZHhdLnJvbGVzID0gbmV3IFNldDxzdHJpbmc+KHNlbGVjdGVkUm9sZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlblN1Y2Nlc3NTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIucm9sZXNTdWNjZXNzQXNzaWduJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvZ3Jlc3MkLm9mZigpO1xuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgSHR0cFBhcmFtcyB3aXRoIHBhZ2UgcGFyYW1zIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSBwYXJhbXMgRXhpc3RpbmcgSHR0cFBhcmFtcy5cbiAgICAgKiBAcGFyYW0gcGFnZSBQYWdlIG51bWJlciB0aGF0IGlzIHJlcXVlc3RlZC4gLyBOZXh0IHBhZ2UgdXNlcnMgbGlzdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZFBhZ2VQYXJhbXMocGFyYW1zOiBIdHRwUGFyYW1zLCBwYWdlPzogbnVtYmVyKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX1NJWkUsIGAke3RoaXMuX3BhZ2luYXRpb24uc2l6ZX1gKTtcbiAgICAgICAgcGFnZSA9IHBhZ2UgIT09IG51bGwgPyBwYWdlIDogdGhpcy5fcGFnaW5hdGlvbi5udW1iZXI7XG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX05VTUJFUiwgYCR7cGFnZX1gKTtcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbn1cbiJdfQ==