@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
314 lines • 32.3 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { CollectionsUtil } from '../../../utils';
/**
* ** Route Segments Class.
*/
export class RouteSegments {
/**
* ** Constructor.
*/
constructor(routePath, data, params, queryParams, parent, configPath) {
this.routePath = routePath ?? '';
this.data = data || {};
this.params = params || {};
this.queryParams = queryParams || {};
this.parent = parent;
this.configPath = configPath;
}
/**
* ** Factory method.
*/
static of(routePath, data, params, queryParams, parent, configPath) {
return new RouteSegments(routePath, data, params, queryParams, parent, configPath);
}
/**
* ** Factory method for empty RouteSegments.
*/
static empty() {
return RouteSegments.of(null, null, null, null, null, null);
}
/**
* ** Get RoutePath Segments.
*/
get routePathSegments() {
if (this.parent) {
return [].concat(this.parent.routePathSegments, this.routePath).filter((path) => path);
}
return [this.routePath];
}
/**
* ** Get ConfigPath Segments.
*/
get configPathSegments() {
if (this.parent) {
return [].concat(this.parent.configPathSegments, this.configPath).filter((path) => path);
}
return [this.configPath];
}
/**
* ** Get Data from Route configuration by key.
*
* - Return first (closest) found key starting from the current one.
*/
getData(key) {
if (this.data[key]) {
return this.data[key];
}
if (this.parent) {
return this.parent.getData(key);
}
return undefined;
}
/**
* ** Get url param by key.
*
* - Return first (closest) found key starting from the current one.
*/
getParam(key) {
if (this.params[key]) {
return this.params[key];
}
if (this.parent) {
return this.parent.getParam(key);
}
return undefined;
}
/**
* ** Get query param by key.
*/
getQueryParam(key) {
if (this.queryParams[key]) {
return this.queryParams[key];
}
if (this.parent) {
return this.parent.getQueryParam(key);
}
return undefined;
}
}
/**
* ** Route State Class.
*/
export class RouteState {
/**
* ** Constructor.
*/
constructor(routeSegments, url) {
this.routeSegments = routeSegments ?? RouteSegments.empty();
this.url = url ?? '';
}
/**
* ** Factory method.
*/
static of(routeSegments, url) {
return new RouteState(routeSegments, url);
}
/**
* ** Factory method for empty State.
*/
static empty() {
return RouteState.of(null, null);
}
/**
* ** Get serialized queryString.
*/
static serializeQueryParams(queryParams) {
const paramsKeys = Object.keys(queryParams);
if (!paramsKeys.length) {
return '';
}
return paramsKeys.map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(queryParams[key])}`).join('&');
}
/**
* ** Returns current RoutePath.
*/
get routePath() {
return this.routeSegments.routePath;
}
/**
* ** Returns current Absolute RoutePath.
*/
get absoluteRoutePath() {
return RouteState._resolveAbsolutePath(this.routePathSegments);
}
/**
* ** Returns the route paths for each route segment starting from the root.
*/
get routePathSegments() {
return this.routeSegments.routePathSegments;
}
/**
* ** Returns current ConfigPath.
*/
get configPath() {
return this.routeSegments.configPath;
}
/**
* ** Returns current Absolute ConfigPath.
*/
get absoluteConfigPath() {
return RouteState._resolveAbsolutePath(this.configPathSegments);
}
/**
* ** Returns the config paths for each route segment starting from the root.
*/
get configPathSegments() {
return this.routeSegments.configPathSegments;
}
/**
* ** Get all query params.
*/
get queryParams() {
return this.routeSegments.queryParams;
}
/**
* ** Get serialized queryString.
*/
serializeQueryParams() {
return RouteState.serializeQueryParams(this.queryParams);
}
/**
* ** Get url including QueryParams.
*/
getUrl() {
return `${this.absoluteRoutePath}?${this.serializeQueryParams()}`;
}
/**
* ** Get Data from Route configuration by key.
*
* - Return first (closest) found key starting from first RouteSegment.
*/
getData(key) {
return this.routeSegments.getData(key);
}
/**
* ** Get url param by key.
*
* - Return first (closest) found key starting from first RouteSegment.
*/
getParam(key) {
return this.routeSegments.getParam(key);
}
/**
* ** Get query param by key.
*/
getQueryParam(key) {
return this.routeSegments.getQueryParam(key);
}
/**
* ** Get Absolute ConfigPath.
*/
getAbsoluteConfigPath() {
return this.absoluteConfigPath;
}
/**
* ** Get parent of current Absolute ConfigPath.
*/
getParentAbsoluteConfigPath() {
const configPathSegments = this.configPathSegments;
configPathSegments.pop();
return RouteState._resolveAbsolutePath(configPathSegments);
}
/**
* ** Get Absolute RoutePath.
*/
getAbsoluteRoutePath() {
return RouteState._resolveAbsolutePath(this.routePathSegments);
}
/**
* ** Get parent of current Absolute RoutePath.
*/
getParentAbsoluteRoutePath() {
const routePathSegments = this.routePathSegments;
routePathSegments.pop();
return RouteState._resolveAbsolutePath(routePathSegments);
}
/**
* @inheritDoc
*/
toJSON() {
return {
url: this.url,
routePath: this.routePath,
absoluteRoutePath: this.absoluteRoutePath,
routePathSegments: this.routePathSegments,
configPath: this.configPath,
absoluteConfigPath: this.absoluteConfigPath,
configPathSegments: this.configPathSegments,
queryParams: this.queryParams,
routeSegments: this.routeSegments
};
}
/**
* ** Resolve Absolute RoutePath from given routePathSegments.
*/
static _resolveAbsolutePath(routePathSegments) {
const path = routePathSegments.join('/').replace(/^\/+/, '');
if (path === '') {
return '/';
}
return `/${path}`;
}
}
/**
* ** Router state.
*/
export class RouterState {
/**
* ** Constructor.
*/
constructor(state, navigationId) {
this.state = state ?? RouteState.empty();
this.navigationId = navigationId ?? null;
this.previousStates = [];
}
/**
* ** Factory method.
*/
static of(state, navigationId) {
return new RouterState(state, navigationId);
}
/**
* ** Factory method for empty State.
*/
static empty() {
return RouterState.of(null, null);
}
/**
* ** Returns previous RouterState if exist otherwise null.
*
* - Optional parameter could be provided to instruct which previous RouterState to return, default one is 0.
* - 0 means the first before current.
* - 1 means the second before current.
* - 2 means the third before current.
* - 3 ... etc...
*/
getPrevious(index = 0) {
const lookupIndex = CollectionsUtil.isNumber(index) ? index : 0;
if (lookupIndex >= 0 && lookupIndex < this.previousStates.length) {
return this.previousStates[lookupIndex];
}
return null;
}
/**
* ** Append previous RouterState[] to current One.
*
* - Internal API used in reducer, not for public use.
*/
appendPrevious(routerState) {
const previousStoredStates = [...routerState.previousStates];
const cleanedPreviousState = RouterState.of(routerState.state, routerState.navigationId);
if (this.navigationId !== cleanedPreviousState.navigationId) {
if (previousStoredStates.length >= 10) {
previousStoredStates.pop();
}
previousStoredStates.unshift(cleanedPreviousState);
}
this.previousStates.length = 0;
this.previousStates.push(...previousStoredStates);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb3JlL3JvdXRlci9tb2RlbC9yb3V0ZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFRSCxPQUFPLEVBQUUsZUFBZSxFQUFpQixNQUFNLGdCQUFnQixDQUFDO0FBSWhFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFRdEI7O09BRUc7SUFDSCxZQUNJLFNBQWlCLEVBQ2pCLElBQXFCLEVBQ3JCLE1BQWMsRUFDZCxXQUFtQixFQUNuQixNQUFzQixFQUN0QixVQUFtQjtRQUVuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEVBQUUsQ0FDTCxTQUFrQixFQUNsQixJQUFzQixFQUN0QixNQUFlLEVBQ2YsV0FBb0IsRUFDcEIsTUFBc0IsRUFDdEIsVUFBbUI7UUFFbkIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLO1FBQ1IsT0FBTyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFF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QyxDQUFDO0lBQ3RELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQmFzZVJvdXRlclN0b3JlU3RhdGUsIFJvdXRlclJlZHVjZXJTdGF0ZSB9IGZyb20gJ0BuZ3J4L3JvdXRlci1zdG9yZSc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25zVXRpbCwgUHJpbWl0aXZlc05pbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgU2VyaWFsaXphYmxlLCBUYXVydXNSb3V0ZURhdGEgfSBmcm9tICcuLi8uLi8uLi9jb21tb24nO1xuXG4vKipcbiAqICoqIFJvdXRlIFNlZ21lbnRzIENsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgUm91dGVTZWdtZW50cyB7XG4gICAgcHVibGljIHJlYWRvbmx5IHJvdXRlUGF0aDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiBUYXVydXNSb3V0ZURhdGE7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmFtczogUGFyYW1zO1xuICAgIHB1YmxpYyByZWFkb25seSBxdWVyeVBhcmFtczogUGFyYW1zO1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJlbnQ/OiBSb3V0ZVNlZ21lbnRzO1xuICAgIHB1YmxpYyByZWFkb25seSBjb25maWdQYXRoPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogKiogQ29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgICAgICBkYXRhOiBUYXVydXNSb3V0ZURhdGEsXG4gICAgICAgIHBhcmFtczogUGFyYW1zLFxuICAgICAgICBxdWVyeVBhcmFtczogUGFyYW1zLFxuICAgICAgICBwYXJlbnQ/OiBSb3V0ZVNlZ21lbnRzLFxuICAgICAgICBjb25maWdQYXRoPzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIHRoaXMucm91dGVQYXRoID0gcm91dGVQYXRoID8/ICcnO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IHt9O1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zIHx8IHt9O1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5jb25maWdQYXRoID0gY29uZmlnUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBGYWN0b3J5IG1ldGhvZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb2YoXG4gICAgICAgIHJvdXRlUGF0aD86IHN0cmluZyxcbiAgICAgICAgZGF0YT86IFRhdXJ1c1JvdXRlRGF0YSxcbiAgICAgICAgcGFyYW1zPzogUGFyYW1zLFxuICAgICAgICBxdWVyeVBhcmFtcz86IFBhcmFtcyxcbiAgICAgICAgcGFyZW50PzogUm91dGVTZWdtZW50cyxcbiAgICAgICAgY29uZmlnUGF0aD86IHN0cmluZ1xuICAgICk6IFJvdXRlU2VnbWVudHMge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlU2VnbWVudHMocm91dGVQYXRoLCBkYXRhLCBwYXJhbXMsIHF1ZXJ5UGFyYW1zLCBwYXJlbnQsIGNvbmZpZ1BhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEZhY3RvcnkgbWV0aG9kIGZvciBlbXB0eSBSb3V0ZVNlZ21lbnRzLlxuICAgICAqL1xuICAgIHN0YXRpYyBlbXB0eSgpOiBSb3V0ZVNlZ21lbnRzIHtcbiAgICAgICAgcmV0dXJuIFJvdXRlU2VnbWVudHMub2YobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IFJvdXRlUGF0aCBTZWdtZW50cy5cbiAgICAgKi9cbiAgICBnZXQgcm91dGVQYXRoU2VnbWVudHMoKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCh0aGlzLnBhcmVudC5yb3V0ZVBhdGhTZWdtZW50cywgdGhpcy5yb3V0ZVBhdGgpLmZpbHRlcigocGF0aCkgPT4gcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3RoaXMucm91dGVQYXRoXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgQ29uZmlnUGF0aCBTZWdtZW50cy5cbiAgICAgKi9cbiAgICBnZXQgY29uZmlnUGF0aFNlZ21lbnRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQodGhpcy5wYXJlbnQuY29uZmlnUGF0aFNlZ21lbnRzLCB0aGlzLmNvbmZpZ1BhdGgpLmZpbHRlcigocGF0aCkgPT4gcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3RoaXMuY29uZmlnUGF0aF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IERhdGEgZnJvbSBSb3V0ZSBjb25maWd1cmF0aW9uIGJ5IGtleS5cbiAgICAgKlxuICAgICAqICAgICAgLSBSZXR1cm4gZmlyc3QgKGNsb3Nlc3QpIGZvdW5kIGtleSBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgKi9cbiAgICBnZXREYXRhPFQ+KGtleTogc3RyaW5nKTogVCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIGFzIFQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5nZXREYXRhPFQ+KGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCB1cmwgcGFyYW0gYnkga2V5LlxuICAgICAqXG4gICAgICogICAgICAtIFJldHVybiBmaXJzdCAoY2xvc2VzdCkgZm91bmQga2V5IHN0YXJ0aW5nIGZyb20gdGhlIGN1cnJlbnQgb25lLlxuICAgICAqL1xuICAgIGdldFBhcmFtKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtc1trZXldIGFzIHN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldFBhcmFtKGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCBxdWVyeSBwYXJhbSBieSBrZXkuXG4gICAgICovXG4gICAgZ2V0UXVlcnlQYXJhbShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UGFyYW1zW2tleV0gYXMgc3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlcnlQYXJhbShrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKlxuICogKiogUm91dGUgU3RhdGUgQ2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZVN0YXRlIGltcGxlbWVudHMgQmFzZVJvdXRlclN0b3JlU3RhdGUsIFNlcmlhbGl6YWJsZTxTZXJpYWxpemVkUm91dGVTdGF0ZT4ge1xuICAgIHB1YmxpYyByZWFkb25seSByb3V0ZVNlZ21lbnRzOiBSb3V0ZVNlZ21lbnRzO1xuICAgIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIENvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvdXRlU2VnbWVudHM6IFJvdXRlU2VnbWVudHMsIHVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucm91dGVTZWdtZW50cyA9IHJvdXRlU2VnbWVudHMgPz8gUm91dGVTZWdtZW50cy5lbXB0eSgpO1xuICAgICAgICB0aGlzLnVybCA9IHVybCA/PyAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBGYWN0b3J5IG1ldGhvZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb2Yocm91dGVTZWdtZW50czogUm91dGVTZWdtZW50cywgdXJsOiBzdHJpbmcpOiBSb3V0ZVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZVN0YXRlKHJvdXRlU2VnbWVudHMsIHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogRmFjdG9yeSBtZXRob2QgZm9yIGVtcHR5IFN0YXRlLlxuICAgICAqL1xuICAgIHN0YXRpYyBlbXB0eSgpOiBSb3V0ZVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIFJvdXRlU3RhdGUub2YobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IHNlcmlhbGl6ZWQgcXVlcnlTdHJpbmcuXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyYW1zS2V5cyA9IE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKTtcblxuICAgICAgICBpZiAoIXBhcmFtc0tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYW1zS2V5cy5tYXAoKGtleSkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1zW2tleV0gYXMgc3RyaW5nKX1gKS5qb2luKCcmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmV0dXJucyBjdXJyZW50IFJvdXRlUGF0aC5cbiAgICAgKi9cbiAgICBnZXQgcm91dGVQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlU2VnbWVudHMucm91dGVQYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgY3VycmVudCBBYnNvbHV0ZSBSb3V0ZVBhdGguXG4gICAgICovXG4gICAgZ2V0IGFic29sdXRlUm91dGVQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBSb3V0ZVN0YXRlLl9yZXNvbHZlQWJzb2x1dGVQYXRoKHRoaXMucm91dGVQYXRoU2VnbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgdGhlIHJvdXRlIHBhdGhzIGZvciBlYWNoIHJvdXRlIHNlZ21lbnQgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdC5cbiAgICAgKi9cbiAgICBnZXQgcm91dGVQYXRoU2VnbWVudHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZVNlZ21lbnRzLnJvdXRlUGF0aFNlZ21lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgY3VycmVudCBDb25maWdQYXRoLlxuICAgICAqL1xuICAgIGdldCBjb25maWdQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlU2VnbWVudHMuY29uZmlnUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXR1cm5zIGN1cnJlbnQgQWJzb2x1dGUgQ29uZmlnUGF0aC5cbiAgICAgKi9cbiAgICBnZXQgYWJzb2x1dGVDb25maWdQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBSb3V0ZVN0YXRlLl9yZXNvbHZlQWJzb2x1dGVQYXRoKHRoaXMuY29uZmlnUGF0aFNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXR1cm5zIHRoZSBjb25maWcgcGF0aHMgZm9yIGVhY2ggcm91dGUgc2VnbWVudCBzdGFydGluZyBmcm9tIHRoZSByb290LlxuICAgICAqL1xuICAgIGdldCBjb25maWdQYXRoU2VnbWVudHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZVNlZ21lbnRzLmNvbmZpZ1BhdGhTZWdtZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgYWxsIHF1ZXJ5IHBhcmFtcy5cbiAgICAgKi9cbiAgICBnZXQgcXVlcnlQYXJhbXMoKTogUGFyYW1zIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVTZWdtZW50cy5xdWVyeVBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgc2VyaWFsaXplZCBxdWVyeVN0cmluZy5cbiAgICAgKi9cbiAgICBzZXJpYWxpemVRdWVyeVBhcmFtcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gUm91dGVTdGF0ZS5zZXJpYWxpemVRdWVyeVBhcmFtcyh0aGlzLnF1ZXJ5UGFyYW1zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgdXJsIGluY2x1ZGluZyBRdWVyeVBhcmFtcy5cbiAgICAgKi9cbiAgICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYWJzb2x1dGVSb3V0ZVBhdGh9PyR7dGhpcy5zZXJpYWxpemVRdWVyeVBhcmFtcygpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IERhdGEgZnJvbSBSb3V0ZSBjb25maWd1cmF0aW9uIGJ5IGtleS5cbiAgICAgKlxuICAgICAqICAgICAgLSBSZXR1cm4gZmlyc3QgKGNsb3Nlc3QpIGZvdW5kIGtleSBzdGFydGluZyBmcm9tIGZpcnN0IFJvdXRlU2VnbWVudC5cbiAgICAgKi9cbiAgICBnZXREYXRhPFQ+KGtleTogc3RyaW5nKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlU2VnbWVudHMuZ2V0RGF0YTxUPihrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCB1cmwgcGFyYW0gYnkga2V5LlxuICAgICAqXG4gICAgICogICAgICAtIFJldHVybiBmaXJzdCAoY2xvc2VzdCkgZm91bmQga2V5IHN0YXJ0aW5nIGZyb20gZmlyc3QgUm91dGVTZWdtZW50LlxuICAgICAqL1xuICAgIGdldFBhcmFtKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVTZWdtZW50cy5nZXRQYXJhbShrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCBxdWVyeSBwYXJhbSBieSBrZXkuXG4gICAgICovXG4gICAgZ2V0UXVlcnlQYXJhbShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlU2VnbWVudHMuZ2V0UXVlcnlQYXJhbShrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCBBYnNvbHV0ZSBDb25maWdQYXRoLlxuICAgICAqL1xuICAgIGdldEFic29sdXRlQ29uZmlnUGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5hYnNvbHV0ZUNvbmZpZ1BhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IHBhcmVudCBvZiBjdXJyZW50IEFic29sdXRlIENvbmZpZ1BhdGguXG4gICAgICovXG4gICAgZ2V0UGFyZW50QWJzb2x1dGVDb25maWdQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGhTZWdtZW50cyA9IHRoaXMuY29uZmlnUGF0aFNlZ21lbnRzO1xuICAgICAgICBjb25maWdQYXRoU2VnbWVudHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIFJvdXRlU3RhdGUuX3Jlc29sdmVBYnNvbHV0ZVBhdGgoY29uZmlnUGF0aFNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgQWJzb2x1dGUgUm91dGVQYXRoLlxuICAgICAqL1xuICAgIGdldEFic29sdXRlUm91dGVQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBSb3V0ZVN0YXRlLl9yZXNvbHZlQWJzb2x1dGVQYXRoKHRoaXMucm91dGVQYXRoU2VnbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCBwYXJlbnQgb2YgY3VycmVudCBBYnNvbHV0ZSBSb3V0ZVBhdGguXG4gICAgICovXG4gICAgZ2V0UGFyZW50QWJzb2x1dGVSb3V0ZVBhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgcm91dGVQYXRoU2VnbWVudHMgPSB0aGlzLnJvdXRlUGF0aFNlZ21lbnRzO1xuICAgICAgICByb3V0ZVBhdGhTZWdtZW50cy5wb3AoKTtcblxuICAgICAgICByZXR1cm4gUm91dGVTdGF0ZS5fcmVzb2x2ZUFic29sdXRlUGF0aChyb3V0ZVBhdGhTZWdtZW50cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0b0pTT04oKTogU2VyaWFsaXplZFJvdXRlU3RhdGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHJvdXRlUGF0aDogdGhpcy5yb3V0ZVBhdGgsXG4gICAgICAgICAgICBhYnNvbHV0ZVJvdXRlUGF0aDogdGhpcy5hYnNvbHV0ZVJvdXRlUGF0aCxcbiAgICAgICAgICAgIHJvdXRlUGF0aFNlZ21lbnRzOiB0aGlzLnJvdXRlUGF0aFNlZ21lbnRzLFxuICAgICAgICAgICAgY29uZmlnUGF0aDogdGhpcy5jb25maWdQYXRoLFxuICAgICAgICAgICAgYWJzb2x1dGVDb25maWdQYXRoOiB0aGlzLmFic29sdXRlQ29uZmlnUGF0aCxcbiAgICAgICAgICAgIGNvbmZpZ1BhdGhTZWdtZW50czogdGhpcy5jb25maWdQYXRoU2VnbWVudHMsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIHJvdXRlU2VnbWVudHM6IHRoaXMucm91dGVTZWdtZW50c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJlc29sdmUgQWJzb2x1dGUgUm91dGVQYXRoIGZyb20gZ2l2ZW4gcm91dGVQYXRoU2VnbWVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3Jlc29sdmVBYnNvbHV0ZVBhdGgocm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHJvdXRlUGF0aFNlZ21lbnRzLmpvaW4oJy8nKS5yZXBsYWNlKC9eXFwvKy8sICcnKTtcblxuICAgICAgICBpZiAocGF0aCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYC8ke3BhdGh9YDtcbiAgICB9XG59XG5cbi8qKlxuICogKiogUm91dGVyIHN0YXRlLlxuICovXG5leHBvcnQgY2xhc3MgUm91dGVyU3RhdGUgaW1wbGVtZW50cyBSb3V0ZXJSZWR1Y2VyU3RhdGU8Um91dGVTdGF0ZT4ge1xuICAgIHJlYWRvbmx5IHN0YXRlOiBSb3V0ZVN0YXRlO1xuICAgIHJlYWRvbmx5IG5hdmlnYXRpb25JZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHByZXZpb3VzU3RhdGVzOiBSb3V0ZXJTdGF0ZVtdO1xuXG4gICAgLyoqXG4gICAgICogKiogQ29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RhdGU6IFJvdXRlU3RhdGUsIG5hdmlnYXRpb25JZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSA/PyBSb3V0ZVN0YXRlLmVtcHR5KCk7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbklkID0gbmF2aWdhdGlvbklkID8/IG51bGw7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdGF0ZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBGYWN0b3J5IG1ldGhvZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb2Yoc3RhdGU6IFJvdXRlU3RhdGUsIG5hdmlnYXRpb25JZDogbnVtYmVyKTogUm91dGVyU3RhdGUge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlclN0YXRlKHN0YXRlLCBuYXZpZ2F0aW9uSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEZhY3RvcnkgbWV0aG9kIGZvciBlbXB0eSBTdGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZW1wdHkoKTogUm91dGVyU3RhdGUge1xuICAgICAgICByZXR1cm4gUm91dGVyU3RhdGUub2YobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmV0dXJucyBwcmV2aW91cyBSb3V0ZXJTdGF0ZSBpZiBleGlzdCBvdGhlcndpc2UgbnVsbC5cbiAgICAgKlxuICAgICAqICAgICAgLSBPcHRpb25hbCBwYXJhbWV0ZXIgY291bGQgYmUgcHJvdmlkZWQgdG8gaW5zdHJ1Y3Qgd2hpY2ggcHJldmlvdXMgUm91dGVyU3RhdGUgdG8gcmV0dXJuLCBkZWZhdWx0IG9uZSBpcyAwLlxuICAgICAqICAgICAgICAgIC0gMCBtZWFucyB0aGUgZmlyc3QgYmVmb3JlIGN1cnJlbnQuXG4gICAgICogICAgICAgICAgLSAxIG1lYW5zIHRoZSBzZWNvbmQgYmVmb3JlIGN1cnJlbnQuXG4gICAgICogICAgICAgICAgLSAyIG1lYW5zIHRoZSB0aGlyZCBiZWZvcmUgY3VycmVudC5cbiAgICAgKiAgICAgICAgICAtIDMgLi4uIGV0Yy4uLlxuICAgICAqL1xuICAgIGdldFByZXZpb3VzKGluZGV4ID0gMCk6IFJvdXRlclN0YXRlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxvb2t1cEluZGV4ID0gQ29sbGVjdGlvbnNVdGlsLmlzTnVtYmVyKGluZGV4KSA/IGluZGV4IDogMDtcblxuICAgICAgICBpZiAobG9va3VwSW5kZXggPj0gMCAmJiBsb29rdXBJbmRleCA8IHRoaXMucHJldmlvdXNTdGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c1N0YXRlc1tsb29rdXBJbmRleF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBBcHBlbmQgcHJldmlvdXMgUm91dGVyU3RhdGVbXSB0byBjdXJyZW50IE9uZS5cbiAgICAgKlxuICAgICAqICAgICAgLSBJbnRlcm5hbCBBUEkgdXNlZCBpbiByZWR1Y2VyLCBub3QgZm9yIHB1YmxpYyB1c2UuXG4gICAgICovXG4gICAgYXBwZW5kUHJldmlvdXMocm91dGVyU3RhdGU6IFJvdXRlclN0YXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RvcmVkU3RhdGVzOiBSb3V0ZXJTdGF0ZVtdID0gWy4uLnJvdXRlclN0YXRlLnByZXZpb3VzU3RhdGVzXTtcbiAgICAgICAgY29uc3QgY2xlYW5lZFByZXZpb3VzU3RhdGUgPSBSb3V0ZXJTdGF0ZS5vZihyb3V0ZXJTdGF0ZS5zdGF0ZSwgcm91dGVyU3RhdGUubmF2aWdhdGlvbklkKTtcblxuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uSWQgIT09IGNsZWFuZWRQcmV2aW91c1N0YXRlLm5hdmlnYXRpb25JZCkge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcmVkU3RhdGVzLmxlbmd0aCA+PSAxMCkge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcmVkU3RhdGVzLnBvcCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmV2aW91c1N0b3JlZFN0YXRlcy51bnNoaWZ0KGNsZWFuZWRQcmV2aW91c1N0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmlvdXNTdGF0ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0YXRlcy5wdXNoKC4uLnByZXZpb3VzU3RvcmVkU3RhdGVzKTtcbiAgICB9XG59XG5cbi8qKlxuICogKiogUm91dGUgc3RhdGUgc2VyaWFsaXplZC5cbiAqL1xuaW50ZXJmYWNlIFNlcmlhbGl6ZWRSb3V0ZVN0YXRlIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICByb3V0ZVBhdGg6IHN0cmluZztcbiAgICBhYnNvbHV0ZVJvdXRlUGF0aDogc3RyaW5nO1xuICAgIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXTtcbiAgICBjb25maWdQYXRoOiBzdHJpbmc7XG4gICAgYWJzb2x1dGVDb25maWdQYXRoOiBzdHJpbmc7XG4gICAgY29uZmlnUGF0aFNlZ21lbnRzOiBzdHJpbmdbXTtcbiAgICBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmVzTmlsIH07XG4gICAgcm91dGVTZWdtZW50czogUm91dGVTZWdtZW50cztcbn1cbiJdfQ==