@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
193 lines • 33.4 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable @typescript-eslint/unified-signatures,ngrx/avoid-mapping-selectors */
import { Injectable } from '@angular/core';
import { filter, map, switchMap, take, withLatestFrom } from 'rxjs/operators';
import { CollectionsUtil } from '../../../utils';
import { GenericAction, STORE_COMPONENTS } from '../../ngrx';
import { ComponentIdle, ComponentInit, ComponentLoading, ComponentUpdate } from '../state';
import { ComponentModel, ComponentsStateHelper, ComponentStateImpl, FAILED, IDLE, INITIALIZED, LOADED, LOADING } from '../model';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "../../router";
/**
* ** Service that manage Components State.
*/
export class ComponentService {
}
/**
* @inheritDoc
*/
export class ComponentServiceImpl extends ComponentService {
/**
* ** Constructor.
*/
constructor(store$, routerService) {
super();
this.store$ = store$;
this.routerService = routerService;
this.componentsStateHelper = new ComponentsStateHelper();
}
/**
* @inheritDoc
*/
init(id, routeState) {
this.store$
.select((store) => store)
.pipe(take(1), map((store) => this._getComponentState(id, routeState.routePathSegments, store.router, store.components)))
.subscribe((componentState) => {
if (componentState.status === INITIALIZED) {
this.store$.dispatch(ComponentInit.of(componentState));
}
});
return this.onInit(id, routeState.routePathSegments);
}
/**
* @inheritDoc
*/
idle(componentState) {
this.store$.dispatch(ComponentIdle.of(componentState));
}
/**
* @inheritDoc
*/
load(componentState) {
this.routerService
.get()
.pipe(take(1))
.subscribe((routerState) => {
if (componentState.status === INITIALIZED) {
this.store$.dispatch(ComponentIdle.of(componentState.copy({
status: IDLE,
navigationId: routerState.navigationId
})));
}
this.store$.dispatch(ComponentLoading.of(componentState.copy({
status: LOADING,
navigationId: routerState.navigationId
})));
});
return this.onLoaded(componentState.id, componentState.routePathSegments);
}
/**
* @inheritDoc
*/
update(componentState) {
this.routerService
.get()
.pipe(take(1))
.subscribe((routerState) => {
this.store$.dispatch(ComponentUpdate.of(componentState.copy({
navigationId: routerState.navigationId
})));
});
}
/**
* @inheritDoc
*/
hasInSegment(id, routePathSegments) {
return this.store$.select(STORE_COMPONENTS).pipe(withLatestFrom(this.routerService.getState()), map(([literalComponentsState, routeState]) => this._isComponentInStatus(id, routePathSegments, literalComponentsState, routeState, ['*'])), take(1));
}
/**
* @inheritDoc
*/
onInit(id, routePathSegments) {
return this.store$.select(STORE_COMPONENTS).pipe(withLatestFrom(this.routerService.getState()), map(([literalComponentsState, routeState]) => this._isComponentInStatus(id, routePathSegments, literalComponentsState, routeState, ['*'])), filter((isInitialized) => isInitialized), switchMap(() => this.getModel(id, routePathSegments, ['*'])), take(1));
}
/**
* @inheritDoc
*/
onLoaded(id, routePathSegments) {
return this.store$.select(STORE_COMPONENTS).pipe(withLatestFrom(this.routerService.getState()), map(([literalComponentsState, routeState]) => this._isComponentInStatus(id, routePathSegments, literalComponentsState, routeState, [LOADED, FAILED])), filter((isLoaded) => isLoaded), switchMap(() => this.getModel(id, routePathSegments)), take(1));
}
/**
* @inheritDoc
*/
getModel(id, routePathSegments, statusWatch) {
const _statusWatch = statusWatch ?? [LOADED, FAILED];
return this.store$.select(STORE_COMPONENTS).pipe(switchMap((literalComponentsState) => this.routerService.get().pipe(map((routerState) => [literalComponentsState, routerState]))), filter(([literalComponentsState, routerState]) => this._isComponentInStatus(id, routePathSegments, literalComponentsState, routerState.state, _statusWatch)), map(([literalComponentsState, routerState]) => this._createModel(id, routePathSegments, literalComponentsState, routerState)));
}
/**
* @inheritDoc
*/
dispatchAction(type, componentState, task) {
this.getModel(componentState.id, componentState.routePathSegments, ['*'])
.pipe(take(1))
.subscribe((model) => this.store$.dispatch(GenericAction.of(type, model.getComponentState(), task)));
}
/**
* @inheritDoc
*/
initialize() {
// No-op.
}
// Get Component State from Store if exist, otherwise create new State.
_getComponentState(id, routePathSegments, routerState, literalComponentsState) {
let _navigationId = null;
let _routePath = null;
let _routePathSegments = [];
if (routerState) {
_navigationId = routerState.navigationId;
if (routerState.state && !routePathSegments) {
_routePath = routerState.state.routePath;
_routePathSegments = routerState.state.routePathSegments;
}
}
if (routePathSegments) {
_routePath = routePathSegments.slice().pop();
_routePathSegments = routePathSegments;
}
let componentState = this.componentsStateHelper.setState(literalComponentsState).getComponentState(id, _routePathSegments);
if (componentState) {
return componentState;
}
componentState = ComponentStateImpl.of({
id,
status: INITIALIZED,
routePath: _routePath,
routePathSegments: _routePathSegments,
navigationId: _navigationId
});
return componentState;
}
// Utility method that filter if provided state is in desired status.
_isComponentInStatus(id, routePathSegments, literalComponentsState, routeState, statusWatch) {
let _routePathSegments = [];
if (CollectionsUtil.isArray(routePathSegments)) {
_routePathSegments = routePathSegments;
}
else if (routeState) {
_routePathSegments = routeState.routePathSegments;
}
const componentLiteralState = this.componentsStateHelper
.setState(literalComponentsState)
.getLiteralComponentState(id, _routePathSegments);
if (!componentLiteralState) {
return false;
}
if (statusWatch.indexOf('*') !== -1) {
return true;
}
return statusWatch.indexOf(componentLiteralState.status) !== -1;
}
// Creates Model from provided data.
_createModel(id, routePathSegments, literalComponentsState, routerState) {
let _routePathSegments = [];
if (CollectionsUtil.isArray(routePathSegments)) {
_routePathSegments = routePathSegments;
}
else if (routerState && routerState.state) {
_routePathSegments = routerState.state.routePathSegments;
}
const componentState = this.componentsStateHelper.setState(literalComponentsState).getComponentState(id, _routePathSegments);
return ComponentModel.of(componentState, CollectionsUtil.cloneDeep(routerState));
}
}
ComponentServiceImpl.ɵfac = function ComponentServiceImpl_Factory(t) { return new (t || ComponentServiceImpl)(i0.ɵɵinject(i1.Store), i0.ɵɵinject(i2.RouterService)); };
ComponentServiceImpl.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ComponentServiceImpl, factory: ComponentServiceImpl.ɵfac });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentServiceImpl, [{
type: Injectable
}], function () { return [{ type: i1.Store }, { type: i2.RouterService }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb3JlL2NvbXBvbmVudC9zZXJ2aWNlcy9jb21wb25lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCx1RkFBdUY7QUFFdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFjLE1BQU0sWUFBWSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzRixPQUFPLEVBQ0gsY0FBYyxFQUNkLHFCQUFxQixFQUVyQixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLElBQUksRUFDSixXQUFXLEVBRVgsTUFBTSxFQUNOLE9BQU8sRUFFVixNQUFNLFVBQVUsQ0FBQzs7OztBQUVsQjs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZ0JBQWdCO0NBdURyQztBQUVEOztHQUVHO0FBRUgsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUFnQjtJQUd0RDs7T0FFRztJQUNILFlBQ3FCLE1BQXlCLEVBQ3pCLGFBQTRCO1FBRTdDLEtBQUssRUFBRSxDQUFDO1FBSFMsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDekIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFJN0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFD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Q0FBQztJQUNwRSxDQUFDO0lBRUQsb0NBQW9DO0lBQzVCLFlBQVksQ0FDaEIsRUFBVSxFQUNWLGlCQUEyQixFQUMzQixzQkFBOEMsRUFDOUMsV0FBd0I7UUFFeEIsSUFBSSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7UUFFdEMsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDNUMsa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7U0FDMUM7YUFBTSxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQ3pDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7U0FDNUQ7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFN0gsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQzs7d0ZBbFFRLG9CQUFvQjswRUFBcEIsb0JBQW9CLFdBQXBCLG9CQUFvQjt1RkFBcEIsb0JBQW9CO2NBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzLG5ncngvYXZvaWQtbWFwcGluZy1zZWxlY3RvcnMgKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25zVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgUm91dGVyU2VydmljZSwgUm91dGVyU3RhdGUsIFJvdXRlU3RhdGUgfSBmcm9tICcuLi8uLi9yb3V0ZXInO1xuaW1wb3J0IHsgR2VuZXJpY0FjdGlvbiwgU1RPUkVfQ09NUE9ORU5UUywgU3RvcmVTdGF0ZSB9IGZyb20gJy4uLy4uL25ncngnO1xuXG5pbXBvcnQgeyBDb21wb25lbnRJZGxlLCBDb21wb25lbnRJbml0LCBDb21wb25lbnRMb2FkaW5nLCBDb21wb25lbnRVcGRhdGUgfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudE1vZGVsLFxuICAgIENvbXBvbmVudHNTdGF0ZUhlbHBlcixcbiAgICBDb21wb25lbnRTdGF0ZSxcbiAgICBDb21wb25lbnRTdGF0ZUltcGwsXG4gICAgRkFJTEVELFxuICAgIElETEUsXG4gICAgSU5JVElBTElaRUQsXG4gICAgTGl0ZXJhbENvbXBvbmVudHNTdGF0ZSxcbiAgICBMT0FERUQsXG4gICAgTE9BRElORyxcbiAgICBTdGF0dXNUeXBlXG59IGZyb20gJy4uL21vZGVsJztcblxuLyoqXG4gKiAqKiBTZXJ2aWNlIHRoYXQgbWFuYWdlIENvbXBvbmVudHMgU3RhdGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiAqKiBJbml0aWFsaXplIENvbXBvbmVudCBTdGF0ZSBhbmQgcmV0dXJuIE1vZGVsLlxuICAgICAqL1xuICAgIGFic3RyYWN0IGluaXQoaWQ6IHN0cmluZywgcm91dGVTdGF0ZTogUm91dGVTdGF0ZSk6IE9ic2VydmFibGU8Q29tcG9uZW50TW9kZWw+O1xuXG4gICAgLyoqXG4gICAgICogKiogU2V0IENvbXBvbmVudCBzdGF0dXMgdG8gSURMRS5cbiAgICAgKi9cbiAgICBhYnN0cmFjdCBpZGxlKGNvbXBvbmVudFN0YXRlOiBDb21wb25lbnRTdGF0ZSk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiAqKiBMb2FkIENvbXBvbmVudCBTdGF0ZSBhbmQgcmV0dXJuIE1vZGVsLlxuICAgICAqL1xuICAgIGFic3RyYWN0IGxvYWQoY29tcG9uZW50U3RhdGU6IENvbXBvbmVudFN0YXRlKTogT2JzZXJ2YWJsZTxDb21wb25lbnRNb2RlbD47XG5cbiAgICAvKipcbiAgICAgKiAqKiBVcGRhdGUgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIGFic3RyYWN0IHVwZGF0ZShjb21wb25lbnRTdGF0ZTogQ29tcG9uZW50U3RhdGUpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogKiogQWNrbm93bGVkZ2UgaWYgaGFzIENvbXBvbmVudFN0YXRlIGluIHNlZ21lbnQuXG4gICAgICpcbiAgICAgKiAgICAgIC0gdHJ1ZSAtIGhhcyBDb21wb25lbnRTdGF0ZS5cbiAgICAgKiAgICAgIC0gZmFsc2UgLSBkb2Vzbid0IGhhdmUgQ29tcG9uZW50U3RhdGUuXG4gICAgICovXG4gICAgYWJzdHJhY3QgaGFzSW5TZWdtZW50KGlkOiBzdHJpbmcsIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAvKipcbiAgICAgKiAqKiBMaXN0ZW5lciB0aGF0IGZpcmVzIG9uY2UgYWZ0ZXIgc3VjY2Vzc2Z1bCBDb21wb25lbnQgU3RhdGUgaW5pdGlhbGl6YXRpb24gYW5kIHJldHVybnMgTW9kZWwuXG4gICAgICovXG4gICAgYWJzdHJhY3Qgb25Jbml0KGlkOiBzdHJpbmcsIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Q29tcG9uZW50TW9kZWw+O1xuXG4gICAgLyoqXG4gICAgICogKiogTGlzdGVuZXIgdGhhdCBmaXJlcyBvbmNlIGFmdGVyIHN1Y2Nlc3NmdWwgQ29tcG9uZW50IFN0YXRlIGxvYWQgYW5kIHJldHVybnMgTW9kZWwuXG4gICAgICovXG4gICAgYWJzdHJhY3Qgb25Mb2FkZWQoaWQ6IHN0cmluZywgcm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxDb21wb25lbnRNb2RlbD47XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXR1cm5zIHN0cmVhbSB3aXRoIHZhbHVlIENvbXBvbmVudCBNb2RlbCBhbmQgZmlyZXMgd2hlbmV2ZXIgQ29tcG9uZW50IFN0YXRlIGNoYW5nZXMgaW4gU3RvcmUuXG4gICAgICpcbiAgICAgKiAgICAgIC0gSWYgbm8gc3RhdHVzV2F0Y2ggcHJvdmlkZWQgYnkgZGVmYXVsdCB3aWxsIGxpc3RlbiBmb3Igc3RhdHVzZXMge0BsaW5rIExPQURFRH0gYW5kIHtAbGluayBGQUlMRUR9LlxuICAgICAqL1xuICAgIGFic3RyYWN0IGdldE1vZGVsKGlkOiBzdHJpbmcsIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSwgc3RhdHVzV2F0Y2g/OiBBcnJheTxTdGF0dXNUeXBlIHwgJyonPik6IE9ic2VydmFibGU8Q29tcG9uZW50TW9kZWw+O1xuXG4gICAgLyoqXG4gICAgICogKiogRGlzcGF0Y2ggR2VuZXJpY0FjdGlvbiB3aXRoIHByb3ZpZGVkIFR5cGUsIENvbXBvbmVudFN0YXRlIGFuZCBvcHRpb25hbGx5IHRhc2suXG4gICAgICovXG4gICAgYWJzdHJhY3QgZGlzcGF0Y2hBY3Rpb24odHlwZTogc3RyaW5nLCBjb21wb25lbnRTdGF0ZTogQ29tcG9uZW50U3RhdGUsIHRhc2s/OiBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogKiogSW5pdGlhbGl6ZSBTZXJ2aWNlLlxuICAgICAqL1xuICAgIGFic3RyYWN0IGluaXRpYWxpemUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBAaW5oZXJpdERvY1xuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50U2VydmljZUltcGwgZXh0ZW5kcyBDb21wb25lbnRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudHNTdGF0ZUhlbHBlcjogQ29tcG9uZW50c1N0YXRlSGVscGVyO1xuXG4gICAgLyoqXG4gICAgICogKiogQ29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUkOiBTdG9yZTxTdG9yZVN0YXRlPixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXJTZXJ2aWNlOiBSb3V0ZXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzU3RhdGVIZWxwZXIgPSBuZXcgQ29tcG9uZW50c1N0YXRlSGVscGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBpbml0KGlkOiBzdHJpbmcsIHJvdXRlU3RhdGU6IFJvdXRlU3RhdGUpOiBPYnNlcnZhYmxlPENvbXBvbmVudE1vZGVsPiB7XG4gICAgICAgIHRoaXMuc3RvcmUkXG4gICAgICAgICAgICAuc2VsZWN0KChzdG9yZSkgPT4gc3RvcmUpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgIG1hcCgoc3RvcmUpID0+IHRoaXMuX2dldENvbXBvbmVudFN0YXRlKGlkLCByb3V0ZVN0YXRlLnJvdXRlUGF0aFNlZ21lbnRzLCBzdG9yZS5yb3V0ZXIsIHN0b3JlLmNvbXBvbmVudHMpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY29tcG9uZW50U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50U3RhdGUuc3RhdHVzID09PSBJTklUSUFMSVpFRCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlJC5kaXNwYXRjaChDb21wb25lbnRJbml0Lm9mKGNvbXBvbmVudFN0YXRlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub25Jbml0KGlkLCByb3V0ZVN0YXRlLnJvdXRlUGF0aFNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGlkbGUoY29tcG9uZW50U3RhdGU6IENvbXBvbmVudFN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RvcmUkLmRpc3BhdGNoKENvbXBvbmVudElkbGUub2YoY29tcG9uZW50U3RhdGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGxvYWQoY29tcG9uZW50U3RhdGU6IENvbXBvbmVudFN0YXRlKTogT2JzZXJ2YWJsZTxDb21wb25lbnRNb2RlbD4ge1xuICAgICAgICB0aGlzLnJvdXRlclNlcnZpY2VcbiAgICAgICAgICAgIC5nZXQoKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJvdXRlclN0YXRlOiBSb3V0ZXJTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRTdGF0ZS5zdGF0dXMgPT09IElOSVRJQUxJWkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUkLmRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50SWRsZS5vZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZS5jb3B5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBJRExFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uSWQ6IHJvdXRlclN0YXRlLm5hdmlnYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZSQuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudExvYWRpbmcub2YoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZS5jb3B5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IExPQURJTkcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbklkOiByb3V0ZXJTdGF0ZS5uYXZpZ2F0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub25Mb2FkZWQoY29tcG9uZW50U3RhdGUuaWQsIGNvbXBvbmVudFN0YXRlLnJvdXRlUGF0aFNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHVwZGF0ZShjb21wb25lbnRTdGF0ZTogQ29tcG9uZW50U3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3V0ZXJTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyb3V0ZXJTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUkLmRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRVcGRhdGUub2YoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZS5jb3B5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uSWQ6IHJvdXRlclN0YXRlLm5hdmlnYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGhhc0luU2VnbWVudChpZDogc3RyaW5nLCByb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUkLnNlbGVjdChTVE9SRV9DT01QT05FTlRTKS5waXBlKFxuICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5yb3V0ZXJTZXJ2aWNlLmdldFN0YXRlKCkpLFxuICAgICAgICAgICAgbWFwKChbbGl0ZXJhbENvbXBvbmVudHNTdGF0ZSwgcm91dGVTdGF0ZV0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5faXNDb21wb25lbnRJblN0YXR1cyhpZCwgcm91dGVQYXRoU2VnbWVudHMsIGxpdGVyYWxDb21wb25lbnRzU3RhdGUsIHJvdXRlU3RhdGUsIFsnKiddKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIG9uSW5pdChpZDogc3RyaW5nLCByb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPENvbXBvbmVudE1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlJC5zZWxlY3QoU1RPUkVfQ09NUE9ORU5UUykucGlwZShcbiAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMucm91dGVyU2VydmljZS5nZXRTdGF0ZSgpKSxcbiAgICAgICAgICAgIG1hcCgoW2xpdGVyYWxDb21wb25lbnRzU3RhdGUsIHJvdXRlU3RhdGVdKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29tcG9uZW50SW5TdGF0dXMoaWQsIHJvdXRlUGF0aFNlZ21lbnRzLCBsaXRlcmFsQ29tcG9uZW50c1N0YXRlLCByb3V0ZVN0YXRlLCBbJyonXSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIoKGlzSW5pdGlhbGl6ZWQpID0+IGlzSW5pdGlhbGl6ZWQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0TW9kZWwoaWQsIHJvdXRlUGF0aFNlZ21lbnRzLCBbJyonXSkpLFxuICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgb25Mb2FkZWQoaWQ6IHN0cmluZywgcm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxDb21wb25lbnRNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZSQuc2VsZWN0KFNUT1JFX0NPTVBPTkVOVFMpLnBpcGUoXG4gICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnJvdXRlclNlcnZpY2UuZ2V0U3RhdGUoKSksXG4gICAgICAgICAgICBtYXAoKFtsaXRlcmFsQ29tcG9uZW50c1N0YXRlLCByb3V0ZVN0YXRlXSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9pc0NvbXBvbmVudEluU3RhdHVzKGlkLCByb3V0ZVBhdGhTZWdtZW50cywgbGl0ZXJhbENvbXBvbmVudHNTdGF0ZSwgcm91dGVTdGF0ZSwgW0xPQURFRCwgRkFJTEVEXSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIoKGlzTG9hZGVkKSA9PiBpc0xvYWRlZCksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5nZXRNb2RlbChpZCwgcm91dGVQYXRoU2VnbWVudHMpKSxcbiAgICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGdldE1vZGVsKGlkOiBzdHJpbmcsIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSwgc3RhdHVzV2F0Y2g/OiBBcnJheTxTdGF0dXNUeXBlIHwgJyonPik6IE9ic2VydmFibGU8Q29tcG9uZW50TW9kZWw+IHtcbiAgICAgICAgY29uc3QgX3N0YXR1c1dhdGNoID0gc3RhdHVzV2F0Y2ggPz8gW0xPQURFRCwgRkFJTEVEXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZSQuc2VsZWN0KFNUT1JFX0NPTVBPTkVOVFMpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGxpdGVyYWxDb21wb25lbnRzU3RhdGUpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJTZXJ2aWNlLmdldCgpLnBpcGUobWFwKChyb3V0ZXJTdGF0ZSkgPT4gW2xpdGVyYWxDb21wb25lbnRzU3RhdGUsIHJvdXRlclN0YXRlXSkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZmlsdGVyKChbbGl0ZXJhbENvbXBvbmVudHNTdGF0ZSwgcm91dGVyU3RhdGVdOiBbTGl0ZXJhbENvbXBvbmVudHNTdGF0ZSwgUm91dGVyU3RhdGVdKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29tcG9uZW50SW5TdGF0dXMoaWQsIHJvdXRlUGF0aFNlZ21lbnRzLCBsaXRlcmFsQ29tcG9uZW50c1N0YXRlLCByb3V0ZXJTdGF0ZS5zdGF0ZSwgX3N0YXR1c1dhdGNoKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcCgoW2xpdGVyYWxDb21wb25lbnRzU3RhdGUsIHJvdXRlclN0YXRlXSkgPT4gdGhpcy5fY3JlYXRlTW9kZWwoaWQsIHJvdXRlUGF0aFNlZ21lbnRzLCBsaXRlcmFsQ29tcG9uZW50c1N0YXRlLCByb3V0ZXJTdGF0ZSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBkaXNwYXRjaEFjdGlvbih0eXBlOiBzdHJpbmcsIGNvbXBvbmVudFN0YXRlOiBDb21wb25lbnRTdGF0ZSwgdGFzaz86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldE1vZGVsKGNvbXBvbmVudFN0YXRlLmlkLCBjb21wb25lbnRTdGF0ZS5yb3V0ZVBhdGhTZWdtZW50cywgWycqJ10pXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobW9kZWwpID0+IHRoaXMuc3RvcmUkLmRpc3BhdGNoKEdlbmVyaWNBY3Rpb24ub2YodHlwZSwgbW9kZWwuZ2V0Q29tcG9uZW50U3RhdGUoKSwgdGFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIC8vIE5vLW9wLlxuICAgIH1cblxuICAgIC8vIEdldCBDb21wb25lbnQgU3RhdGUgZnJvbSBTdG9yZSBpZiBleGlzdCwgb3RoZXJ3aXNlIGNyZWF0ZSBuZXcgU3RhdGUuXG4gICAgcHJpdmF0ZSBfZ2V0Q29tcG9uZW50U3RhdGUoXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSxcbiAgICAgICAgcm91dGVyU3RhdGU6IFJvdXRlclN0YXRlLFxuICAgICAgICBsaXRlcmFsQ29tcG9uZW50c1N0YXRlOiBMaXRlcmFsQ29tcG9uZW50c1N0YXRlXG4gICAgKTogQ29tcG9uZW50U3RhdGUge1xuICAgICAgICBsZXQgX25hdmlnYXRpb25JZDogbnVtYmVyID0gbnVsbDtcbiAgICAgICAgbGV0IF9yb3V0ZVBhdGg6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGxldCBfcm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKHJvdXRlclN0YXRlKSB7XG4gICAgICAgICAgICBfbmF2aWdhdGlvbklkID0gcm91dGVyU3RhdGUubmF2aWdhdGlvbklkO1xuXG4gICAgICAgICAgICBpZiAocm91dGVyU3RhdGUuc3RhdGUgJiYgIXJvdXRlUGF0aFNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgX3JvdXRlUGF0aCA9IHJvdXRlclN0YXRlLnN0YXRlLnJvdXRlUGF0aDtcbiAgICAgICAgICAgICAgICBfcm91dGVQYXRoU2VnbWVudHMgPSByb3V0ZXJTdGF0ZS5zdGF0ZS5yb3V0ZVBhdGhTZWdtZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZVBhdGhTZWdtZW50cykge1xuICAgICAgICAgICAgX3JvdXRlUGF0aCA9IHJvdXRlUGF0aFNlZ21lbnRzLnNsaWNlKCkucG9wKCk7XG4gICAgICAgICAgICBfcm91dGVQYXRoU2VnbWVudHMgPSByb3V0ZVBhdGhTZWdtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb21wb25lbnRTdGF0ZSA9IHRoaXMuY29tcG9uZW50c1N0YXRlSGVscGVyLnNldFN0YXRlKGxpdGVyYWxDb21wb25lbnRzU3RhdGUpLmdldENvbXBvbmVudFN0YXRlKGlkLCBfcm91dGVQYXRoU2VnbWVudHMpO1xuXG4gICAgICAgIGlmIChjb21wb25lbnRTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFN0YXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcG9uZW50U3RhdGUgPSBDb21wb25lbnRTdGF0ZUltcGwub2Yoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBzdGF0dXM6IElOSVRJQUxJWkVELFxuICAgICAgICAgICAgcm91dGVQYXRoOiBfcm91dGVQYXRoLFxuICAgICAgICAgICAgcm91dGVQYXRoU2VnbWVudHM6IF9yb3V0ZVBhdGhTZWdtZW50cyxcbiAgICAgICAgICAgIG5hdmlnYXRpb25JZDogX25hdmlnYXRpb25JZFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50U3RhdGU7XG4gICAgfVxuXG4gICAgLy8gVXRpbGl0eSBtZXRob2QgdGhhdCBmaWx0ZXIgaWYgcHJvdmlkZWQgc3RhdGUgaXMgaW4gZGVzaXJlZCBzdGF0dXMuXG4gICAgcHJpdmF0ZSBfaXNDb21wb25lbnRJblN0YXR1cyhcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgcm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdLFxuICAgICAgICBsaXRlcmFsQ29tcG9uZW50c1N0YXRlOiBMaXRlcmFsQ29tcG9uZW50c1N0YXRlLFxuICAgICAgICByb3V0ZVN0YXRlOiBSb3V0ZVN0YXRlLFxuICAgICAgICBzdGF0dXNXYXRjaDogQXJyYXk8U3RhdHVzVHlwZSB8ICcqJz5cbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgbGV0IF9yb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzQXJyYXkocm91dGVQYXRoU2VnbWVudHMpKSB7XG4gICAgICAgICAgICBfcm91dGVQYXRoU2VnbWVudHMgPSByb3V0ZVBhdGhTZWdtZW50cztcbiAgICAgICAgfSBlbHNlIGlmIChyb3V0ZVN0YXRlKSB7XG4gICAgICAgICAgICBfcm91dGVQYXRoU2VnbWVudHMgPSByb3V0ZVN0YXRlLnJvdXRlUGF0aFNlZ21lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50TGl0ZXJhbFN0YXRlID0gdGhpcy5jb21wb25lbnRzU3RhdGVIZWxwZXJcbiAgICAgICAgICAgIC5zZXRTdGF0ZShsaXRlcmFsQ29tcG9uZW50c1N0YXRlKVxuICAgICAgICAgICAgLmdldExpdGVyYWxDb21wb25lbnRTdGF0ZShpZCwgX3JvdXRlUGF0aFNlZ21lbnRzKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExpdGVyYWxTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1c1dhdGNoLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXR1c1dhdGNoLmluZGV4T2YoY29tcG9uZW50TGl0ZXJhbFN0YXRlLnN0YXR1cykgIT09IC0xO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZXMgTW9kZWwgZnJvbSBwcm92aWRlZCBkYXRhLlxuICAgIHByaXZhdGUgX2NyZWF0ZU1vZGVsKFxuICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICByb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10sXG4gICAgICAgIGxpdGVyYWxDb21wb25lbnRzU3RhdGU6IExpdGVyYWxDb21wb25lbnRzU3RhdGUsXG4gICAgICAgIHJvdXRlclN0YXRlOiBSb3V0ZXJTdGF0ZVxuICAgICk6IENvbXBvbmVudE1vZGVsIHtcbiAgICAgICAgbGV0IF9yb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzQXJyYXkocm91dGVQYXRoU2VnbWVudHMpKSB7XG4gICAgICAgICAgICBfcm91dGVQYXRoU2VnbWVudHMgPSByb3V0ZVBhdGhTZWdtZW50cztcbiAgICAgICAgfSBlbHNlIGlmIChyb3V0ZXJTdGF0ZSAmJiByb3V0ZXJTdGF0ZS5zdGF0ZSkge1xuICAgICAgICAgICAgX3JvdXRlUGF0aFNlZ21lbnRzID0gcm91dGVyU3RhdGUuc3RhdGUucm91dGVQYXRoU2VnbWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnRTdGF0ZSA9IHRoaXMuY29tcG9uZW50c1N0YXRlSGVscGVyLnNldFN0YXRlKGxpdGVyYWxDb21wb25lbnRzU3RhdGUpLmdldENvbXBvbmVudFN0YXRlKGlkLCBfcm91dGVQYXRoU2VnbWVudHMpO1xuXG4gICAgICAgIHJldHVybiBDb21wb25lbnRNb2RlbC5vZihjb21wb25lbnRTdGF0ZSwgQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChyb3V0ZXJTdGF0ZSkpO1xuICAgIH1cbn1cbiJdfQ==