@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
561 lines • 84.5 kB
JavaScript
import { EventEmitter, Injectable } from '@angular/core';
import { BehaviorSubject, of } from 'rxjs';
import { LoadingEmitter } from "../../../utility/loading-emitter";
import { filter, map, take } from "rxjs/operators";
import { DoubleDrawerUtils } from "../util/double-drawer-utils";
import { HttpParams } from "@angular/common/http";
import { PaginationParams } from "../../../utility/pagination/pagination-params";
import { SimpleFilter } from "../../../filter/models/simple-filter";
import { MENU_IDENTIFIERS, MenuOrder, RIGHT_SIDE_INIT_PAGE_SIZE, RIGHT_SIDE_NEW_PAGE_SIZE, SETTINGS_TRANSITION_ID } from '../../model/navigation-configs';
import { GroupNavigationConstants } from "../../model/group-navigation-constants";
import { PathService } from "../../service/path.service";
import * as i0 from "@angular/core";
import * as i1 from "../../../logger/services/logger.service";
import * as i2 from "../../../configuration/configuration.service";
import * as i3 from "@angular/router";
import * as i4 from "../../../resources/engine-endpoint/case-resource.service";
import * as i5 from "../../../authorization/permission/access.service";
import * as i6 from "@ngx-translate/core";
import * as i7 from "../../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service";
import * as i8 from "../../../routing/redirect-service/redirect.service";
import * as i9 from "../../service/path.service";
import * as i10 from "../../../user/services/user.service";
/**
* Service for managing navigation in double-drawer
* */
export class DoubleDrawerNavigationService {
_log;
_config;
_activatedRoute;
_caseResourceService;
_accessService;
_translateService;
_dynamicRoutingService;
_redirectService;
_pathService;
_userService;
/**
* List of displayed items on the left side
* */
_leftItems$;
/**
* List of displayed items on the right side
* */
_rightItems$;
/**
* List of hidden items
* */
_moreItems$;
/**
* List of custom items in more menu
* */
_hiddenCustomItems$;
/**
* List of custom items
* */
_childCustomViews;
itemsOrder;
_leftLoading$;
_rightLoading$;
_nodeLoading$;
_currentPathSubscription;
/**
* Currently display uri
* Siblings of the node are on the left, children are on the right
*/
_currentPath;
_fromResolver;
/**
* Currently selected navigation item
*/
_currentNavigationItem;
defaultViewIcon = 'filter_alt';
customItemsInitialized;
hiddenCustomItemsInitialized;
itemClicked;
itemLoaded;
constructor(_log, _config, _activatedRoute, _caseResourceService, _accessService, _translateService, _dynamicRoutingService, _redirectService, _pathService, _userService) {
this._log = _log;
this._config = _config;
this._activatedRoute = _activatedRoute;
this._caseResourceService = _caseResourceService;
this._accessService = _accessService;
this._translateService = _translateService;
this._dynamicRoutingService = _dynamicRoutingService;
this._redirectService = _redirectService;
this._pathService = _pathService;
this._userService = _userService;
this._leftItems$ = new BehaviorSubject([]);
this._rightItems$ = new BehaviorSubject([]);
this._moreItems$ = new BehaviorSubject([]);
this._hiddenCustomItems$ = new BehaviorSubject([]);
this._childCustomViews = {};
this._leftLoading$ = new LoadingEmitter();
this._rightLoading$ = new LoadingEmitter();
this._nodeLoading$ = new LoadingEmitter();
this._currentNavigationItem = undefined;
this.itemsOrder = MenuOrder.Ascending;
this.customItemsInitialized = false;
this.hiddenCustomItemsInitialized = false;
this.itemClicked = new EventEmitter();
this.itemLoaded = new EventEmitter();
}
ngOnDestroy() {
this._currentPathSubscription?.unsubscribe();
this._leftLoading$.complete();
this._rightLoading$.complete();
this._nodeLoading$.complete();
this.itemClicked.complete();
this.itemLoaded.complete();
}
get canGoBackLoading$() {
return this._nodeLoading$;
}
get currentPath() {
return this._currentPath;
}
set currentPath(path) {
if (path === this._currentPath || this.leftLoading$.isActive || this.rightLoading$.isActive) {
return;
}
this._currentPath = path;
if (!path) {
return;
}
if (this.nodeLoading$.isActive) {
this.nodeLoading$.subscribe(() => {
this.resolveMenuItems(path);
});
}
else {
this.resolveMenuItems(path);
}
}
set currentNavigationItem(item) {
this._currentNavigationItem = item;
}
resolveMenuItems(path) {
if (path === PathService.SEPARATOR) {
this._leftItems$.next([]);
this.loadRightSide();
}
else {
if (!this.leftItems.find(item => item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value === path)) {
this.loadLeftSide();
}
this.loadRightSide();
}
}
get itemClicked$() {
return this.itemClicked;
}
get itemLoaded$() {
return this.itemLoaded;
}
get rightItems$() {
return this._rightItems$;
}
get leftItems$() {
return this._leftItems$;
}
get moreItems$() {
return this._moreItems$;
}
get hiddenCustomItems$() {
return this._hiddenCustomItems$;
}
get rightItems() {
return this._rightItems$.getValue();
}
get leftItems() {
return this._leftItems$.getValue();
}
get moreItems() {
return this._moreItems$.getValue();
}
get hiddenCustomItems() {
return this._hiddenCustomItems$.getValue();
}
get leftLoading$() {
return this._leftLoading$;
}
get rightLoading$() {
return this._rightLoading$;
}
get nodeLoading$() {
return this._nodeLoading$;
}
set fromResolver(value) {
this._fromResolver = value;
}
loadNavigationItems(node) {
if (this.currentPath === PathService.SEPARATOR) {
this._leftItems$.next([]);
this.loadRightSide();
}
else {
if (!this._leftItems$.getValue().find(item => DoubleDrawerUtils.isNodeCorrespondingToItem(node, item))) {
this.loadLeftSide();
}
this.loadRightSide();
}
}
/**
* On home click, the current level is set to 0, and current parent is
* set to root node.
* */
onHomeClick() {
if (this.leftLoading$.isActive || this.rightLoading$.isActive) {
return;
}
this._pathService.activePath = PathService.SEPARATOR;
}
/**
* On back click, the parent is set to parent of left nodes, that will solve
* the right side menu (elements that were in left side, after backward
* navigation will be on the right side).
* Current level is set to a lower number in order to set the left side menu.
* */
onBackClick() {
if (this.leftLoading$.isActive || this.rightLoading$.isActive || this.currentPath === PathService.SEPARATOR) {
return;
}
this._pathService.activePath = this.extractParentPath(this.currentPath);
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
/**
* On item click, the selected item's view is rendered (by routerLink). If the selected item has children items, the menu is updated
* and view, that is rendered is selected by the defined rule. The rule is: On first check for default view in children.
* On second check if the clicked item has a view. On third, pick any other children's view, else show nothing.
* */
onItemClick(item) {
this._currentNavigationItem = item;
if (item.resource === undefined) {
// custom view represented only in nae.json
if (item.processUri === this.currentPath) {
this._pathService.activePath = this.currentPath;
}
else {
this._pathService.activePath = this.extractParentPath(this.currentPath);
}
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
else {
const path = item.resource.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value;
if (DoubleDrawerUtils.hasItemChildren(item) && !this.leftLoading$.isActive && !this.rightLoading$.isActive) {
this._pathService.activePath = path;
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
this._rightLoading$.pipe(filter(isRightLoading => isRightLoading === false), take(1)).subscribe(() => {
this.openAvailableView();
});
}
else if (!path.includes(this.currentPath)) {
this._pathService.activePath = this.extractParentPath(this.currentPath);
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
else {
this._pathService.activePath = this.currentPath;
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
}
}
/**
* Opens a view of the current right items in the menu by defined rule. The rule is: First, it checks whether a navigation
* item was clicked. Second, check for default view in children.
* Third check if the clicked item has a view. Fourth, pick any other children's view, else
* show nothing.
* */
openAvailableView() {
let allItems = this.rightItems.concat(this.moreItems);
if (this._currentNavigationItem) {
let alreadyClickedItem = allItems.find(item => item.id === this._currentNavigationItem.id);
if (!!alreadyClickedItem) {
// when the folder has not changed and a menu item is clicked.
return;
}
}
if (this._fromResolver) {
this._fromResolver = false;
return;
}
let autoOpenItems = allItems.filter(item => DoubleDrawerUtils.hasItemAutoOpenView(item));
if (autoOpenItems.length > 0) {
this._redirectService.redirect(autoOpenItems[0].routing.path);
return;
}
if (DoubleDrawerUtils.hasItemView(this._currentNavigationItem)) {
// is routed by routerLink on item click
return;
}
let itemsWithView = allItems.filter(item => DoubleDrawerUtils.hasItemView(item));
if (itemsWithView.length > 0) {
this._redirectService.redirect(autoOpenItems[0].routing.path);
}
}
loadMoreItems() {
if (this.moreItems.length > RIGHT_SIDE_NEW_PAGE_SIZE) {
let currentRightItems = this.rightItems;
let currentMoreItems = this.moreItems;
currentRightItems.push(...currentMoreItems.splice(0, RIGHT_SIDE_NEW_PAGE_SIZE));
this.rightItems$.next(currentRightItems);
this.moreItems$.next(currentMoreItems);
}
else {
let currentRightItems = this.rightItems;
currentRightItems.push(...this.moreItems);
this.rightItems$.next(currentRightItems);
this.moreItems$.next([]);
}
}
initializeCustomViewsOfView(view, viewConfigPath) {
if (!view || this.customItemsInitialized || this.hiddenCustomItemsInitialized)
return;
Object.entries(view.children).forEach(([key, childView]) => {
const childViewConfigPath = viewConfigPath + '/' + key;
this.resolveUriForChildViews(childViewConfigPath, childView);
this.resolveHiddenMenuItemFromChildViews(childViewConfigPath, childView);
});
this.resolveCustomViewsInRightSide();
this.resolveCustomViewsInLeftSide();
this.customItemsInitialized = true;
this.hiddenCustomItemsInitialized = true;
}
switchOrder() {
this.itemsOrder = (this.itemsOrder + 1) % 2;
let multiplier = 1;
if (this.itemsOrder === MenuOrder.Descending) {
multiplier = -1;
}
let currentRightItems = this.rightItems;
let currentLeftItems = this.leftItems;
currentRightItems.sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title));
currentLeftItems.sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title));
this.rightItems$.next(currentRightItems);
this.leftItems$.next(currentLeftItems);
}
isAscending() {
return this.itemsOrder === MenuOrder.Ascending;
}
loadLeftSide() {
if (this.currentPath === PathService.SEPARATOR) {
this._leftItems$.next([]);
return;
}
this.leftLoading$.on();
this.getItemCaseByPath(this.extractParentPath(this.currentPath)).subscribe(page => {
let childCases$;
let targetItem;
let orderedChildCaseIds;
if (page?.pagination?.totalElements === 0) {
childCases$ = of([]);
}
else {
targetItem = page.content[0];
orderedChildCaseIds = DoubleDrawerUtils.extractChildCaseIds(targetItem);
if (orderedChildCaseIds == undefined || orderedChildCaseIds.length === 0) {
childCases$ = of([]);
}
else {
childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content));
}
}
childCases$.subscribe(result => {
result = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
this._leftItems$.next(result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId)));
this.resolveCustomViewsInLeftSide();
this._leftLoading$.off();
this.itemLoaded.emit({ menu: 'left', items: this.leftItems });
}, error => {
this._log.error(error);
this._leftItems$.next([]);
this.resolveCustomViewsInLeftSide();
this._leftLoading$.off();
});
}, error => {
this._log.error(error);
this._leftItems$.next([]);
this.resolveCustomViewsInLeftSide();
this._leftLoading$.off();
});
}
loadRightSide() {
this._rightLoading$.on();
this._moreItems$.next([]);
this.getItemCaseByPath(this.currentPath).subscribe(page => {
let childCases$;
let targetItem;
let orderedChildCaseIds;
if (page?.pagination?.totalElements === 0) {
childCases$ = of([]);
}
else {
targetItem = page?.content[0];
orderedChildCaseIds = DoubleDrawerUtils.extractChildCaseIds(targetItem);
if (orderedChildCaseIds === undefined || orderedChildCaseIds.length === 0) {
childCases$ = of([]);
}
else {
childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content));
}
}
childCases$.subscribe(result => {
result = result.sort((a, b) => orderedChildCaseIds.indexOf(a.stringId) - orderedChildCaseIds.indexOf(b.stringId));
if (result.length > RIGHT_SIDE_INIT_PAGE_SIZE) {
const rawRightItems = result.splice(0, RIGHT_SIDE_INIT_PAGE_SIZE);
this._rightItems$.next(rawRightItems.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i));
this._moreItems$.next(result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i));
}
else {
this._rightItems$.next(result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i));
}
this.resolveCustomViewsInRightSide();
this._rightLoading$.off();
this.itemLoaded.emit({ menu: 'right', items: this.rightItems });
this.openAvailableView();
}, error => {
this._log.error(error);
this._rightItems$.next([]);
this._moreItems$.next([]);
this.resolveCustomViewsInRightSide();
this._rightLoading$.off();
});
}, error => {
this._log.error(error);
this._rightItems$.next([]);
this._moreItems$.next([]);
this.resolveCustomViewsInRightSide();
this._rightLoading$.off();
});
}
getItemCasesByIdsInOnePage(caseIds) {
return this.getItemCasesByIds(caseIds, 0, caseIds.length);
}
getItemCasesByIds(caseIds, pageNumber, pageSize) {
const searchBody = {
id: caseIds,
process: MENU_IDENTIFIERS.map(id => ({ identifier: id })),
};
let httpParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, pageSize)
.set(PaginationParams.PAGE_NUMBER, pageNumber);
return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams);
}
resolveItemCaseToNavigationItem(itemCase) {
if (DoubleDrawerUtils.representsRootNode(itemCase)) {
return;
}
const item = {
access: {},
navigation: {
icon: itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_ICON)?.value || this.defaultViewIcon,
title: this.getTranslation(itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_NAME)?.value) || itemCase.title,
},
routing: {
path: this.getItemRoutingPath(itemCase),
},
id: itemCase.stringId,
resource: itemCase,
};
const resolvedRoles = DoubleDrawerUtils.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_ALLOWED_ROLES);
const resolvedBannedRoles = DoubleDrawerUtils.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_BANNED_ROLES);
if (!!resolvedRoles)
item.access['role'] = resolvedRoles;
if (!!resolvedBannedRoles)
item.access['bannedRole'] = resolvedBannedRoles;
if (!this._accessService.canAccessView(item, item.routing?.path))
return;
return item;
}
resolveCustomViewsInLeftSide() {
if (!!this.extractParentPath(this.currentPath) && !!this._childCustomViews[this.extractParentPath(this.currentPath)]) {
let currentLeftItems = this._leftItems$.getValue();
currentLeftItems.push(...Object.values(this._childCustomViews[this.extractParentPath(this.currentPath)]));
this._leftItems$.next(currentLeftItems);
}
}
resolveCustomViewsInRightSide() {
if (!!this._currentPath && !!this._childCustomViews[this._currentPath]) {
let currentRightItems = this._rightItems$.getValue();
currentRightItems.push(...Object.values(this._childCustomViews[this._currentPath]));
this._rightItems$.next(currentRightItems);
}
}
resolveUriForChildViews(configPath, childView) {
if (!childView.processUri)
return;
if (!this._accessService.canAccessView(childView, configPath))
return;
if (!this._childCustomViews[childView.processUri]) {
this._childCustomViews[childView.processUri] = {};
}
this._childCustomViews[childView.processUri][configPath] = {
id: configPath,
...childView,
};
}
resolveHiddenMenuItemFromChildViews(configPath, childView) {
if (!childView.navigation)
return;
if (!this._accessService.canAccessView(childView, configPath))
return;
if (!!(childView?.navigation?.hidden)) {
let currentHiddenCustomItems = this._hiddenCustomItems$.getValue();
currentHiddenCustomItems.push({
id: configPath,
...childView,
});
this._hiddenCustomItems$.next(currentHiddenCustomItems);
}
}
getTranslation(value) {
const locale = this._translateService.currentLang.split('-')[0];
return locale in value.translations ? value.translations[locale] : value.defaultValue;
}
getItemRoutingPath(itemCase) {
const taskId = DoubleDrawerUtils.findTaskIdInCase(itemCase, SETTINGS_TRANSITION_ID);
const url = this._dynamicRoutingService.route;
const prefix = url.startsWith('/') ? '' : '/';
return `${prefix}${url}/${taskId}`;
}
processLeftItems(cases, orderedChildCaseIds) {
const result = cases
.map(folder => this.resolveItemCaseToNavigationItem(folder))
.filter(i => !!i);
return result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId));
}
/**
* Retrieves a case item based on the given path.
* @param {string} [path] - The identifier path to locate the specific case item. If undefined, it defaults to searching without a specific path.
* @return {Observable<Page<Case>>} An observable stream containing the page of case items which match the provided path.
*/
getItemCaseByPath(path) {
const searchBody = {
data: {
[GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH]: path
},
process: { identifier: "menu_item" }
};
let httpParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, 1)
.set(PaginationParams.PAGE_NUMBER, 0);
return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams);
}
extractParentPath(path) {
if (path === '/') {
return path;
}
if (path?.lastIndexOf('/') === 0) {
return '/';
}
return path?.substring(0, path?.lastIndexOf('/'));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, deps: [{ token: i1.LoggerService }, { token: i2.ConfigurationService }, { token: i3.ActivatedRoute }, { token: i4.CaseResourceService }, { token: i5.AccessService }, { token: i6.TranslateService }, { token: i7.DynamicNavigationRouteProviderService }, { token: i8.RedirectService }, { token: i9.PathService }, { token: i10.UserService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.ConfigurationService }, { type: i3.ActivatedRoute }, { type: i4.CaseResourceService }, { type: i5.AccessService }, { type: i6.TranslateService }, { type: i7.DynamicNavigationRouteProviderService }, { type: i8.RedirectService }, { type: i9.PathService }, { type: i10.UserService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlLWRyYXdlci1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL25hdmlnYXRpb24vbmF2aWdhdGlvbi1kb3VibGUtZHJhd2VyL3NlcnZpY2UvZG91YmxlLWRyYXdlci1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFDLGVBQWUsRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUMvRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFZbEUsT0FBTyxFQUNILGdCQUFnQixFQUNoQixTQUFTLEVBRVQseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDekIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7OztBQUd2RDs7S0FFSztBQUlMLE1BQU0sT0FBTyw2QkFBNkI7SUE0Q3hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNB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QUcsS0FBSzthQUNmLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3hCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUN0RyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFhO1FBQzNCLE1BQU0sVUFBVSxHQUEwQjtZQUN0QyxJQUFJLEVBQUU7Z0JBQ0YsQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLElBQUk7YUFDM0Q7WUFDRCxPQUFPLEVBQUUsRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDO1NBQ3JDLENBQUM7UUFFRixJQUFJLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRTthQUM1QixHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUNsQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2pDLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO3dHQTFqQlEsNkJBQTZCOzRHQUE3Qiw2QkFBNkIsY0FGMUIsTUFBTTs7NEZBRVQsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSBcIi4uLy