UNPKG

@experteam-mx/ngx-services

Version:

Angular common services for Experteam apps

245 lines 31.4 kB
import { Inject, Injectable } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; import { map, tap } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "ngx-cookie-service"; import * as i2 from "@angular/common/http"; export class ApiSecurityService { environments; cookie; http; constructor(environments, cookie, http) { this.environments = environments; this.cookie = cookie; this.http = http; } /** * Retrieves the API security URL from the environments configuration. * * @return {string} The API security URL. */ get url() { return this.environments.apiSecurityUrl ?? ''; } /** * Handles the login authentication request by sending the login data to the authentication endpoint. * * @param {AuthLoginIn} body The payload containing login credentials. * @return {Observable<AuthLoginOut>} An observable emitting the authentication response data. */ postAuthLogin(body) { return this.http.post(`${this.url}/auth/login`, body) .pipe(map(({ data }) => data), tap(({ access_token }) => this.cookie.set(this.environments.authCookie, access_token, { path: '/' }))); } /** * Handles the user login process by sending user credentials to the authentication endpoint. * * @param {AuthUserLoginIn} body - The request payload containing user login details such as username and password. * @return {Observable<AuthLoginOut>} An observable that emits the authenticated user's login data upon successful login. */ postAuthUserLogin(body) { return this.http.post(`${this.url}/auth/user-login`, body) .pipe(map(({ data }) => data)); } /** * Logs out the current user by making a POST request to the logout endpoint. * * This method deletes all cookies after a successful logout. * * @return {Observable<{}>} An observable that emits the server's response to the logout request. */ postAuthLogout() { return this.http.post(`${this.url}/auth/logout`, null) .pipe(map(({ data }) => data), tap(() => this.cookie.delete(this.environments.authCookie, '/'))); } /** * Creates a new session for a specified model. * * @param {Object} params - The parameters for creating the session. * @param {string} params.modelType - The type of the model. * @param {string} params.modelId - The ID of the model. * @param {string} [params.token] - Optional authorization token. * * @return {Observable<SessionOut>} An observable containing the created session details. */ postSession({ modelType, modelId, token, }) { let headers = new HttpHeaders({}); if (token) { headers = headers.set('Authorization', `Bearer ${token}`); } return this.http.post(`${this.url}/sessions`, { model_type: modelType, model_id: modelId, }, { headers }).pipe(map(({ data }) => data)); } /** * Fetches the authenticated user's information. * Sends a GET request to the endpoint '/auth/me' to retrieve information * about the currently authenticated user. * * @return {Observable<AuthMeOut>} An observable that emits the authenticated user's data. */ getAuthMe() { return this.http.get(`${this.url}/auth/me`) .pipe(map(({ data }) => data)); } /** * Fetches the authenticated user's details from the server. * * @param token The JWT token used for authorization. * @return An Observable that emits the user's details encapsulated in a MeOut object. */ getOtherMe(token) { return this.http.get(`${this.url}/auth/me`, { headers: { Authorization: `Bearer ${token}` } }).pipe(map(({ data }) => data)); } /** * Fetches a user by their unique ID. * * @param {number} id - The unique identifier of the user to be fetched. * @return {Observable<GetUserOut>} An observable containing the user information. */ getUser(id) { return this.http.get(`${this.url}/users/${id}`) .pipe(map(({ data }) => data)); } /** * Fetches a list of users from the server based on the specified query parameters. * * @param {QueryParams} params - The query parameters to filter the list of users. * @return {Observable<GetUsersOut>} An observable that emits the list of users retrieved from the server. */ getUsers(params) { return this.http.get(`${this.url}/users`, { params }) .pipe(map(({ data }) => data)); } /** * Updates the information of a specified user on the server. * * @param {Object} params - The parameter object. * @param {Object} params.user - The user object containing updated data. * @param {string} params.user.id - The unique identifier of the user to be updated. * * @return {void} This method does not return a value. */ putUsers({ user }) { return this.http.put(`${this.url}/users/${user.id}`, user) .pipe(map(({ data }) => data)); } /** * Changes the language for the authenticated user. * * @param {Object} params - The input parameters for changing the language. * @param {string} params.languageId - The ID of the new language to be set. * @return {Observable<ApiSuccess<AuthMeOut>>} An observable that emits the result of the language change request. */ putChangeLanguage({ languageId }) { return this.http.put(`${this.url}/auth/me`, { language_id: languageId }).pipe(map(({ data }) => data)); } /** * Retrieves a list of roles with their permissions. * * @param {QueryParams} params - The query parameters to filter the roles. * @returns {Observable<RoleIn[]>} An observable that emits an array of role permissions. */ getRoles(params) { return this.http.get(`${this.url}/roles`, { params }) .pipe(map(({ data }) => data)); } /** * Retrieves the role types from the API. * * @param {QueryParams} params - The query parameters to be sent with the request. * @returns {Observable<RoleTypesOut>} An observable containing the role types output. */ getRoleTypes(params) { return this.http.get(`${this.url}/role-types`, { params }) .pipe(map(({ data }) => data)); } /** * Retrieves roles by the specified ID. * * @param id - The ID of the role to retrieve. * @returns An Observable that emits the role data. */ getRole(id) { return this.http.get(`${this.url}/roles/${id}`) .pipe(map(({ data }) => data)); } /** * Creates a new role with the specified permissions. * * @param {RoleIn} body - The permissions and details for the new role. * @returns {Observable<RoleOut>} An observable containing the created role's permissions. */ postRole(body) { return this.http.post(`${this.url}/roles`, body) .pipe(map(({ data }) => data)); } /** * Updates the permissions of a specific role. * * @param id - The unique identifier of the role to update. * @param body - The new permissions to assign to the role. * @returns An Observable that emits the updated module permissions. */ putRole(id, body) { return this.http.put(`${this.url}/roles/${id}`, body) .pipe(map(({ data }) => data)); } /** * Deletes the permissions associated with a specific role. * * @param {number} id - The unique identifier of the role whose permissions are to be deleted. * @returns {Observable<{}>} An observable that emits the result of the delete operation. */ deleteRole(id) { return this.http.delete(`${this.url}/roles/${id}`) .pipe(map(({ data }) => data)); } /** * Retrieves a list of modules and permissions * * @param queryParams - The query parameters to filter the modules. * @returns Observable<ModulesOut[]> - An observable that emits an array of modules and permissions. */ getModules(queryParams) { return this.http.get(`${this.url}/modules`, { params: queryParams }).pipe(map(({ data }) => data)); } /** * Retrieves a list of modules and permissions * * @param params.token - Custom token for authorization. * @param params.queryParams - The query parameters to filter the modules. * @returns Observable<ModulesOut[]> - An observable that emits an array of modules and permissions. */ getModulesByToken(params) { return this.http.get(`${this.url}/modules`, { params: params.queryParams, headers: { Authorization: `Bearer ${params.token}` } }).pipe(map(({ data }) => data)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiSecurityService, deps: [{ token: 'env' }, { token: i1.CookieService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiSecurityService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiSecurityService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: ['env'] }] }, { type: i1.CookieService }, { type: i2.HttpClient }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXNlY3VyaXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHBlcnRlYW0tbXgvbmd4LXNlcnZpY2VzL3NyYy9saWIvYXBpcy9hcGktc2VjdXJpdHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQW9CbEQsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRTlELE9BQU8sRUFBRSxHQUFHLEVBQWMsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFBOzs7O0FBTTNDLE1BQU0sT0FBTyxrQkFBa0I7SUFFSjtJQUNmO0lBQ0E7SUFIVixZQUN5QixZQUF5QixFQUN4QyxNQUFxQixFQUNyQixJQUFnQjtRQUZELGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN2QixDQUFDO0lBRUo7Ozs7T0FJRztJQUNILElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFBO0lBQy9DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBRSxJQUFpQjtRQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUEyQixHQUFHLElBQUksQ0FBQyxHQUFHLGFBQWEsRUFBRSxJQUFJLENBQUM7YUFDNUUsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUN2QixHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVB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SUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFFLFdBQXdCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFO1lBQ2xFLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQUUsTUFHbEI7UUFDQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF5QixHQUFHLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRTtZQUNsRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDMUIsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLE1BQU0sQ0FBQyxLQUFLLEVBQUU7YUFDeEM7U0FDRixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbEMsQ0FBQzt3R0FqUVUsa0JBQWtCLGtCQUVuQixLQUFLOzRHQUZKLGtCQUFrQixjQUZqQixNQUFNOzs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFHSSxNQUFNOzJCQUFDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBBcGlTdWNjZXNzLCBRdWVyeVBhcmFtcyB9IGZyb20gJy4vbW9kZWxzL2FwaS5tb2RlbHMnXHJcbmltcG9ydCB7XHJcbiAgQXV0aExvZ2luSW4sXHJcbiAgQXV0aExvZ2luT3V0LFxyXG4gIEF1dGhNZU91dCxcclxuICBBdXRoVXNlckxvZ2luSW4sXHJcbiAgQ2hhbmdlTGFuZ3VhZ2VJbixcclxuICBHZXRVc2VyT3V0LFxyXG4gIEdldFVzZXJzT3V0LFxyXG4gIE1vZHVsZXNPdXQsXHJcbiAgUHV0VXNlcnNJbixcclxuICBQdXRVc2Vyc091dCxcclxuICBSb2xlSW4sXHJcbiAgUm9sZU91dCxcclxuICBSb2xlc091dCxcclxuICBSb2xlVHlwZXNPdXQsXHJcbiAgU2Vzc2lvbkluLFxyXG4gIFNlc3Npb25PdXRcclxufSBmcm9tICcuL21vZGVscy9hcGktc2VjdXJpdHkudHlwZXMnXHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vbmd4LXNlcnZpY2VzLm1vZGVscydcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZS1zZXJ2aWNlJ1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpU2VjdXJpdHlTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvciAoXHJcbiAgICBASW5qZWN0KCdlbnYnKSBwcml2YXRlIGVudmlyb25tZW50czogRW52aXJvbm1lbnQsXHJcbiAgICBwcml2YXRlIGNvb2tpZTogQ29va2llU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBBUEkgc2VjdXJpdHkgVVJMIGZyb20gdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgQVBJIHNlY3VyaXR5IFVSTC5cclxuICAgKi9cclxuICBnZXQgdXJsICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRzLmFwaVNlY3VyaXR5VXJsID8/ICcnXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIHRoZSBsb2dpbiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGJ5IHNlbmRpbmcgdGhlIGxvZ2luIGRhdGEgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdXRoTG9naW5Jbn0gYm9keSBUaGUgcGF5bG9hZCBjb250YWluaW5nIGxvZ2luIGNyZWRlbnRpYWxzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QXV0aExvZ2luT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgZGF0YS5cclxuICAgKi9cclxuICBwb3N0QXV0aExvZ2luIChib2R5OiBBdXRoTG9naW5Jbik6IE9ic2VydmFibGU8QXV0aExvZ2luT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxBdXRoTG9naW5PdXQ+PihgJHt0aGlzLnVybH0vYXV0aC9sb2dpbmAsIGJvZHkpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxyXG4gICAgICAgIHRhcCgoeyBhY2Nlc3NfdG9rZW4gfSkgPT4gdGhpcy5jb29raWUuc2V0KHRoaXMuZW52aXJvbm1lbnRzLmF1dGhDb29raWUsIGFjY2Vzc190b2tlbiwgeyBwYXRoOiAnLycgfSkpXHJcbiAgICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdGhlIHVzZXIgbG9naW4gcHJvY2VzcyBieSBzZW5kaW5nIHVzZXIgY3JlZGVudGlhbHMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGVuZHBvaW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdXRoVXNlckxvZ2luSW59IGJvZHkgLSBUaGUgcmVxdWVzdCBwYXlsb2FkIGNvbnRhaW5pbmcgdXNlciBsb2dpbiBkZXRhaWxzIHN1Y2ggYXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QXV0aExvZ2luT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIncyBsb2dpbiBkYXRhIHVwb24gc3VjY2Vzc2Z1bCBsb2dpbi5cclxuICAgKi9cclxuICBwb3N0QXV0aFVzZXJMb2dpbiAoYm9keTogQXV0aFVzZXJMb2dpbkluKTogT2JzZXJ2YWJsZTxBdXRoTG9naW5PdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPEF1dGhMb2dpbk91dD4+KGAke3RoaXMudXJsfS9hdXRoL3VzZXItbG9naW5gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvZ3Mgb3V0IHRoZSBjdXJyZW50IHVzZXIgYnkgbWFraW5nIGEgUE9TVCByZXF1ZXN0IHRvIHRoZSBsb2dvdXQgZW5kcG9pbnQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkZWxldGVzIGFsbCBjb29raWVzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsb2dvdXQuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPHt9Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBzZXJ2ZXIncyByZXNwb25zZSB0byB0aGUgbG9nb3V0IHJlcXVlc3QuXHJcbiAgICovXHJcbiAgcG9zdEF1dGhMb2dvdXQgKCk6IE9ic2VydmFibGU8e30+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPHt9Pj4oYCR7dGhpcy51cmx9L2F1dGgvbG9nb3V0YCwgbnVsbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXHJcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuY29va2llLmRlbGV0ZSh0aGlzLmVudmlyb25tZW50cy5hdXRoQ29va2llLCAnLycpKVxyXG4gICAgICApXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IHNlc3Npb24gZm9yIGEgc3BlY2lmaWVkIG1vZGVsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjcmVhdGluZyB0aGUgc2Vzc2lvbi5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1vZGVsVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBtb2RlbC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1vZGVsSWQgLSBUaGUgSUQgb2YgdGhlIG1vZGVsLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnRva2VuXSAtIE9wdGlvbmFsIGF1dGhvcml6YXRpb24gdG9rZW4uXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFNlc3Npb25PdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGNyZWF0ZWQgc2Vzc2lvbiBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHBvc3RTZXNzaW9uICh7XHJcbiAgICBtb2RlbFR5cGUsXHJcbiAgICBtb2RlbElkLFxyXG4gICAgdG9rZW4sXHJcbiAgfTogU2Vzc2lvbkluKTogT2JzZXJ2YWJsZTxTZXNzaW9uT3V0PiB7XHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7fSlcclxuXHJcbiAgICBpZiAodG9rZW4pIHsgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke3Rva2VufWApIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxTZXNzaW9uT3V0Pj4oXHJcbiAgICAgIGAke3RoaXMudXJsfS9zZXNzaW9uc2AsIHtcclxuICAgICAgICBtb2RlbF90eXBlOiBtb2RlbFR5cGUsXHJcbiAgICAgICAgbW9kZWxfaWQ6IG1vZGVsSWQsXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBoZWFkZXJzXHJcbiAgICAgIH0pLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIncyBpbmZvcm1hdGlvbi5cclxuICAgKiBTZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBlbmRwb2ludCAnL2F1dGgvbWUnIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uXHJcbiAgICogYWJvdXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEF1dGhNZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgYXV0aGVudGljYXRlZCB1c2VyJ3MgZGF0YS5cclxuICAgKi9cclxuICBnZXRBdXRoTWUgKCk6IE9ic2VydmFibGU8QXV0aE1lT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEF1dGhNZU91dD4+KGAke3RoaXMudXJsfS9hdXRoL21lYClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIncyBkZXRhaWxzIGZyb20gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgSldUIHRva2VuIHVzZWQgZm9yIGF1dGhvcml6YXRpb24uXHJcbiAgICogQHJldHVybiBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVzZXIncyBkZXRhaWxzIGVuY2Fwc3VsYXRlZCBpbiBhIE1lT3V0IG9iamVjdC5cclxuICAgKi9cclxuICBnZXRPdGhlck1lICh0b2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxBdXRoTWVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8QXV0aE1lT3V0Pj4oYCR7dGhpcy51cmx9L2F1dGgvbWVgLCB7XHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YFxyXG4gICAgICB9XHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBhIHVzZXIgYnkgdGhlaXIgdW5pcXVlIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHRvIGJlIGZldGNoZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxHZXRVc2VyT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB1c2VyIGluZm9ybWF0aW9uLlxyXG4gICAqL1xyXG4gIGdldFVzZXIgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPEdldFVzZXJPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8R2V0VXNlck91dD4+KGAke3RoaXMudXJsfS91c2Vycy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBhIGxpc3Qgb2YgdXNlcnMgZnJvbSB0aGUgc2VydmVyIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciB0aGUgbGlzdCBvZiB1c2Vycy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldFVzZXJzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBsaXN0IG9mIHVzZXJzIHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICovXHJcbiAgZ2V0VXNlcnMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEdldFVzZXJzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEdldFVzZXJzT3V0Pj4oYCR7dGhpcy51cmx9L3VzZXJzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBpbmZvcm1hdGlvbiBvZiBhIHNwZWNpZmllZCB1c2VyIG9uIHRoZSBzZXJ2ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlciBvYmplY3QuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy51c2VyIC0gVGhlIHVzZXIgb2JqZWN0IGNvbnRhaW5pbmcgdXBkYXRlZCBkYXRhLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMudXNlci5pZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdXNlciB0byBiZSB1cGRhdGVkLlxyXG4gICAqXHJcbiAgICogQHJldHVybiB7dm9pZH0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuXHJcbiAgICovXHJcbiAgcHV0VXNlcnMgKHsgdXNlciB9OiBQdXRVc2Vyc0luKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPFB1dFVzZXJzT3V0Pj4oYCR7dGhpcy51cmx9L3VzZXJzLyR7dXNlci5pZH1gLCB1c2VyKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZXMgdGhlIGxhbmd1YWdlIGZvciB0aGUgYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBjaGFuZ2luZyB0aGUgbGFuZ3VhZ2UuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5sYW5ndWFnZUlkIC0gVGhlIElEIG9mIHRoZSBuZXcgbGFuZ3VhZ2UgdG8gYmUgc2V0LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QXBpU3VjY2VzczxBdXRoTWVPdXQ+Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGxhbmd1YWdlIGNoYW5nZSByZXF1ZXN0LlxyXG4gICAqL1xyXG4gIHB1dENoYW5nZUxhbmd1YWdlICh7XHJcbiAgICBsYW5ndWFnZUlkXHJcbiAgfTogQ2hhbmdlTGFuZ3VhZ2VJbik6IE9ic2VydmFibGU8QXV0aE1lT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPEF1dGhNZU91dD4+KGAke3RoaXMudXJsfS9hdXRoL21lYCwge1xyXG4gICAgICBsYW5ndWFnZV9pZDogbGFuZ3VhZ2VJZFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2Ygcm9sZXMgd2l0aCB0aGVpciBwZXJtaXNzaW9ucy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciB0aGUgcm9sZXMuXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Um9sZUluW10+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gYXJyYXkgb2Ygcm9sZSBwZXJtaXNzaW9ucy5cclxuICAgKi9cclxuICBnZXRSb2xlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8Um9sZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8Um9sZXNPdXQ+PihgJHt0aGlzLnVybH0vcm9sZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgcm9sZSB0eXBlcyBmcm9tIHRoZSBBUEkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBiZSBzZW50IHdpdGggdGhlIHJlcXVlc3QuXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Um9sZVR5cGVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSByb2xlIHR5cGVzIG91dHB1dC5cclxuICAgKi9cclxuICBnZXRSb2xlVHlwZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFJvbGVUeXBlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxSb2xlVHlwZXNPdXQ+PihgJHt0aGlzLnVybH0vcm9sZS10eXBlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHJvbGVzIGJ5IHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHJvbGUgdG8gcmV0cmlldmUuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByb2xlIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0Um9sZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8Um9sZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxSb2xlT3V0Pj4oYCR7dGhpcy51cmx9L3JvbGVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IHJvbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb25zLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtSb2xlSW59IGJvZHkgLSBUaGUgcGVybWlzc2lvbnMgYW5kIGRldGFpbHMgZm9yIHRoZSBuZXcgcm9sZS5cclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxSb2xlT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBjcmVhdGVkIHJvbGUncyBwZXJtaXNzaW9ucy5cclxuICAgKi9cclxuICBwb3N0Um9sZSAoYm9keTogUm9sZUluKTogT2JzZXJ2YWJsZTxSb2xlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxSb2xlT3V0Pj4oYCR7dGhpcy51cmx9L3JvbGVzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBwZXJtaXNzaW9ucyBvZiBhIHNwZWNpZmljIHJvbGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJvbGUgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSBib2R5IC0gVGhlIG5ldyBwZXJtaXNzaW9ucyB0byBhc3NpZ24gdG8gdGhlIHJvbGUuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIG1vZHVsZSBwZXJtaXNzaW9ucy5cclxuICAgKi9cclxuICBwdXRSb2xlIChpZDogbnVtYmVyLCBib2R5OiBSb2xlSW4pOiBPYnNlcnZhYmxlPFJvbGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8Um9sZU91dD4+KGAke3RoaXMudXJsfS9yb2xlcy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyB0aGUgcGVybWlzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgcm9sZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcm9sZSB3aG9zZSBwZXJtaXNzaW9ucyBhcmUgdG8gYmUgZGVsZXRlZC5cclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTx7fT59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZVJvbGUgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxBcGlTdWNjZXNzPHt9Pj4oYCR7dGhpcy51cmx9L3JvbGVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZHVsZXMgYW5kIHBlcm1pc3Npb25zXHJcbiAgICpcclxuICAgKiBAcGFyYW0gcXVlcnlQYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgdGhlIG1vZHVsZXMuXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxNb2R1bGVzT3V0W10+IC0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGFycmF5IG9mIG1vZHVsZXMgYW5kIHBlcm1pc3Npb25zLlxyXG4gICAqL1xyXG4gIGdldE1vZHVsZXMgKHF1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8TW9kdWxlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxNb2R1bGVzT3V0Pj4oYCR7dGhpcy51cmx9L21vZHVsZXNgLCB7XHJcbiAgICAgIHBhcmFtczogcXVlcnlQYXJhbXNcclxuICAgIH0pLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZHVsZXMgYW5kIHBlcm1pc3Npb25zXHJcbiAgICpcclxuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuIC0gQ3VzdG9tIHRva2VuIGZvciBhdXRob3JpemF0aW9uLlxyXG4gICAqIEBwYXJhbSBwYXJhbXMucXVlcnlQYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgdGhlIG1vZHVsZXMuXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxNb2R1bGVzT3V0W10+IC0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGFycmF5IG9mIG1vZHVsZXMgYW5kIHBlcm1pc3Npb25zLlxyXG4gICAqL1xyXG4gIGdldE1vZHVsZXNCeVRva2VuIChwYXJhbXM6IHtcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBxdWVyeVBhcmFtczogUXVlcnlQYXJhbXNcclxuICB9KTogT2JzZXJ2YWJsZTxNb2R1bGVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPE1vZHVsZXNPdXQ+PihgJHt0aGlzLnVybH0vbW9kdWxlc2AsIHtcclxuICAgICAgcGFyYW1zOiBwYXJhbXMucXVlcnlQYXJhbXMsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cGFyYW1zLnRva2VufWBcclxuICAgICAgfVxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcbn1cclxuIl19