UNPKG

@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
/* * 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==