UNPKG

vix-ui

Version:

A set of essential UI modules for your Angular application in ViSenze

274 lines (273 loc) 24.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { OAuthService } from 'angular-oauth2-oidc'; import { Injectable } from '@angular/core'; import * as OktaAuth from '@okta/okta-auth-js'; import { AuthConfigService } from './auth-config.service'; import { OktaService } from './okta.service'; import { UserInfo } from '../modules/user-info'; import { UserGroups } from '../modules/user-groups'; /** * VixAuthService is the interface exported to users. It wraps all API and methods. */ export class VixAuthService { /** * @param {?} oauth * @param {?} authConfig * @param {?} okta */ constructor(oauth, authConfig, okta) { this.oauth = oauth; this.authConfig = authConfig; this.okta = okta; this.oktaAuth = new OktaAuth({ url: this.authConfig.getUrl(), issuer: this.authConfig.getIssuer() }); } /** * Check permissions by userGroups and requireGroups * * @param {?} userGroups groups users are in * @param {?} requireGroups groups application requires user to have * @return {?} true/false */ static hasPermission(userGroups, requireGroups) { return userGroups.hasPermission(requireGroups); } /** * Use tokenManager to store userId * TODO: actually I have problems in create a cache object to hold all these cache variables, so I use tokenManager to do these works. * TODO: need to create a share service to provide cache service * * @param {?} userId * @return {?} */ setUserId(userId) { const /** @type {?} */ obj = { accessToken: 'userId', expiresAt: Math.round((new Date()).getTime() / 1000 + 3600), scopes: [userId] }; this.oktaAuth.tokenManager.add('userId', obj); } /** * Get userId from tokenManager * @return {?} */ getUserId() { const /** @type {?} */ userIdObj = this.oktaAuth.tokenManager.get('userId'); if (userIdObj) { return this.oktaAuth.tokenManager.get('userId').scopes[0]; } else { return null; } } /** * Store userGroup and shared among browsers by TokenManager with key 'userGroup' * * @param {?} userGroups * @return {?} */ setCurrentUserGroups(userGroups) { const /** @type {?} */ obj = { accessToken: 'userGroups', expiresAt: Math.round((new Date()).getTime() / 1000 + 3600), scopes: userGroups.groups }; this.oktaAuth.tokenManager.add('userGroups', obj); } /** * Get stored userGroups and refresh if expires * * @return {?} */ getLoginUserGroups() { return tslib_1.__awaiter(this, void 0, void 0, function* () { const /** @type {?} */ userGroupsTokenObj = this.oktaAuth.tokenManager.get('userGroups'); const /** @type {?} */ nowSecond = (new Date()).getTime() / 1000; if (!userGroupsTokenObj || nowSecond > userGroupsTokenObj.expireAt) { const /** @type {?} */ tmpUserGroups = yield this.getUserGroups(this.getUserId()); this.setCurrentUserGroups(tmpUserGroups); } const /** @type {?} */ userGroups = new UserGroups(null); userGroups.groups = this.oktaAuth.tokenManager.get('userGroups').scopes; return userGroups; }); } /** * Get current login userInfo * TODO: we can cache user info includes groups information when finished login * * @return {?} */ getUserInfo() { return tslib_1.__awaiter(this, void 0, void 0, function* () { if (this.isLogin()) { const /** @type {?} */ oktaUserInfo = yield this.okta.getUserInfo(this.getUserId()); return yield new UserInfo(oktaUserInfo); } else { return Promise.reject('not login'); } }); } /** * get userGroup by given userId * * @param {?} userId * @return {?} */ getUserGroups(userId) { return tslib_1.__awaiter(this, void 0, void 0, function* () { if (this.isLogin()) { try { const /** @type {?} */ oktaUserGroups = yield this.okta.getUserGroups(userId); return yield new UserGroups(oktaUserGroups); } catch (/** @type {?} */ err) { console.log('getUserGroups err', err); // return new UserGroups(null); } } else { return null; } }); } /** * Return if already login by check the existence of accessToken * * @return {?} */ isLogin() { return !!this.getUserId(); } /** * Redirect to url for Google login * @param {?} redirectUrl * @return {?} */ loginWithGoogle(redirectUrl) { window.location.href = `${this.authConfig.getUrl()}/oauth2/v1/authorize?` + `idp=0oadulhuz78SMW8cD0h7&client_id=${this.authConfig.getClientId()}&response_type=id_token&` + `response_mode=fragment&scope=openid&scope=email&scope=picture&scope=name&` + `state=WM6D&nonce=YsG76jo&redirect_uri=${redirectUrl}`; } /** * Login by username and password * * @param {?} username * @param {?} password * @return {?} */ loginWithPassword(username, password) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const /** @type {?} */ nonce = yield this.oauth.createAndSaveNonce(); const /** @type {?} */ signInResponse = yield this.oktaAuth.signIn({ username: username, password: password }); if (signInResponse.status === 'SUCCESS') { yield this.oktaAuth.token.getWithoutPrompt({ clientId: this.authConfig.getClientId(), responseType: ['id_token', 'token'], scopes: ['openid', 'profile', 'email'], sessionToken: signInResponse.sessionToken, nonce: nonce, redirectUri: window.location.origin }); const /** @type {?} */ session = yield this.getSession(); if (session.status === 'ACTIVE') { console.log('session ACTIVE'); this.setUserId(session.userId); } return Promise.resolve('login successfully'); } else { return Promise.reject('username or password error'); } }); } /** * List all groups * * @return {?} */ listGroups() { return tslib_1.__awaiter(this, void 0, void 0, function* () { return yield this.okta.listGroups(); }); } /** * Get session * * @return {?} */ getSession() { return tslib_1.__awaiter(this, void 0, void 0, function* () { return yield this.oktaAuth.session.get(); }); } /** * Navigate browser to login page * @return {?} */ navigateToLoginPage() { console.log('navigateToLoginPage:', this.authConfig.getLoginUrl()); document.location.href = this.authConfig.getLoginUrl(); } /** * Navigate browser to redirect page * @return {?} */ navigateToRedirectPage() { console.log('navigateToRedirectPage:', this.authConfig.getRedirectUrl()); document.location.href = this.authConfig.getRedirectUrl(); } /** * Logout current user and clear token * * @return {?} */ logout() { if (this.isLogin()) { this.oktaAuth.tokenManager.clear(); console.log('start to logout'); this.oktaAuth.signOut().then(() => { console.log('logout done, to navigate', this.authConfig.getLoginUrl()); this.navigateToLoginPage(); }); } else { } } } VixAuthService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ VixAuthService.ctorParameters = () => [ { type: OAuthService, }, { type: AuthConfigService, }, { type: OktaService, }, ]; function VixAuthService_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ VixAuthService.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ VixAuthService.ctorParameters; /** @type {?} */ VixAuthService.prototype.oktaAuth; /** @type {?} */ VixAuthService.prototype.oauth; /** @type {?} */ VixAuthService.prototype.authConfig; /** @type {?} */ VixAuthService.prototype.okta; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdml4LXVpLyIsInNvdXJjZXMiOlsidml4LXNlcnZpY2VzL2F1dGgvc2VydmljZXMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQU1wRCxNQUFNOzs7Ozs7SUFHSixZQUFvQixLQUFtQixFQUNuQixZQUNBO1FBRkEsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixlQUFVLEdBQVYsVUFBVTtRQUNWLFNBQUksR0FBSixJQUFJO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUM7WUFDM0IsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtTQUNwQyxDQUFDLENBQUM7S0FDSjs7Ozs7Ozs7SUFVRCxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQXNCLEVBQUUsYUFBdUI7UUFDbEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDaEQ7Ozs7Ozs7OztJQVNELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLHVCQUFNLEdBQUcsR0FBRztZQUNWLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFNBQVMs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O1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7S0FDM0Q7Ozs7OztJQU9ELE1BQU07UUFDSixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUM1QixDQUFDLENBQUM7U0FDSjtRQUFDLElBQUksQ0FBQyxDQUFDO1NBQ1A7S0FDRjs7O1lBMU5GLFVBQVU7Ozs7WUFYRixZQUFZO1lBR1osaUJBQWlCO1lBQ2pCLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIE9rdGFBdXRoIGZyb20gJ0Bva3RhL29rdGEtYXV0aC1qcyc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4vYXV0aC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBPa3RhU2VydmljZSB9IGZyb20gJy4vb2t0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJJbmZvIH0gZnJvbSAnLi4vbW9kdWxlcy91c2VyLWluZm8nO1xuaW1wb3J0IHsgVXNlckdyb3VwcyB9IGZyb20gJy4uL21vZHVsZXMvdXNlci1ncm91cHMnO1xuXG4vKipcbiAqIFZpeEF1dGhTZXJ2aWNlIGlzIHRoZSBpbnRlcmZhY2UgZXhwb3J0ZWQgdG8gdXNlcnMuIEl0IHdyYXBzIGFsbCBBUEkgYW5kIG1ldGhvZHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWaXhBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgb2t0YUF1dGg6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9hdXRoOiBPQXV0aFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgYXV0aENvbmZpZzogQXV0aENvbmZpZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgb2t0YTogT2t0YVNlcnZpY2UpIHtcbiAgICB0aGlzLm9rdGFBdXRoID0gbmV3IE9rdGFBdXRoKHtcbiAgICAgIHVybDogdGhpcy5hdXRoQ29uZmlnLmdldFVybCgpLFxuICAgICAgaXNzdWVyOiB0aGlzLmF1dGhDb25maWcuZ2V0SXNzdWVyKClcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENoZWNrIHBlcm1pc3Npb25zIGJ5IHVzZXJHcm91cHMgYW5kIHJlcXVpcmVHcm91cHNcbiAgICpcbiAgICogQHBhcmFtIHVzZXJHcm91cHMgZ3JvdXBzIHVzZXJzIGFyZSBpblxuICAgKiBAcGFyYW0gcmVxdWlyZUdyb3VwcyBncm91cHMgYXBwbGljYXRpb24gcmVxdWlyZXMgdXNlciB0byBoYXZlXG4gICAqIEByZXR1cm5zIHRydWUvZmFsc2VcbiAgICovXG4gIHN0YXRpYyBoYXNQZXJtaXNzaW9uKHVzZXJHcm91cHM6IFVzZXJHcm91cHMsIHJlcXVpcmVHcm91cHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHVzZXJHcm91cHMuaGFzUGVybWlzc2lvbihyZXF1aXJlR3JvdXBzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG9rZW5NYW5hZ2VyIHRvIHN0b3JlIHVzZXJJZFxuICAgKiBUT0RPOiBhY3R1YWxseSBJIGhhdmUgcHJvYmxlbXMgaW4gY3JlYXRlIGEgY2FjaGUgb2JqZWN0IHRvIGhvbGQgYWxsIHRoZXNlIGNhY2hlIHZhcmlhYmxlcywgc28gSSB1c2UgdG9rZW5NYW5hZ2VyIHRvIGRvIHRoZXNlIHdvcmtzLlxuICAgKiBUT0RPOiBuZWVkIHRvIGNyZWF0ZSBhIHNoYXJlIHNlcnZpY2UgdG8gcHJvdmlkZSBjYWNoZSBzZXJ2aWNlXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWRcbiAgICovXG4gIHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiAndXNlcklkJyxcbiAgICAgIGV4cGlyZXNBdDogTWF0aC5yb3VuZCgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMCArIDM2MDApLFxuICAgICAgc2NvcGVzOiBbdXNlcklkXVxuICAgIH07XG4gICAgdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuYWRkKCd1c2VySWQnLCBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VySWQgZnJvbSB0b2tlbk1hbmFnZXJcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFVzZXJJZCgpIHtcbiAgICBjb25zdCB1c2VySWRPYmogPSB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJJZCcpO1xuICAgIGlmICh1c2VySWRPYmopIHtcbiAgICAgIHJldHVybiB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJJZCcpLnNjb3Blc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIHVzZXJHcm91cCBhbmQgc2hhcmVkIGFtb25nIGJyb3dzZXJzIGJ5IFRva2VuTWFuYWdlciB3aXRoIGtleSAndXNlckdyb3VwJ1xuICAgKlxuICAgKiBAcGFyYW0gdXNlckdyb3Vwc1xuICAgKi9cbiAgc2V0Q3VycmVudFVzZXJHcm91cHModXNlckdyb3VwczogVXNlckdyb3Vwcykge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiAndXNlckdyb3VwcycsXG4gICAgICBleHBpcmVzQXQ6IE1hdGgucm91bmQoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDAgKyAzNjAwKSxcbiAgICAgIHNjb3BlczogdXNlckdyb3Vwcy5ncm91cHNcbiAgICB9O1xuICAgIHRoaXMub2t0YUF1dGgudG9rZW5NYW5hZ2VyLmFkZCgndXNlckdyb3VwcycsIG9iaik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0b3JlZCB1c2VyR3JvdXBzIGFuZCByZWZyZXNoIGlmIGV4cGlyZXNcbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGdldExvZ2luVXNlckdyb3VwcygpOiBQcm9taXNlPFVzZXJHcm91cHM+IHtcbiAgICBjb25zdCB1c2VyR3JvdXBzVG9rZW5PYmogPSB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJHcm91cHMnKTtcbiAgICBjb25zdCBub3dTZWNvbmQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICBpZiAoIXVzZXJHcm91cHNUb2tlbk9iaiB8fCBub3dTZWNvbmQgPiB1c2VyR3JvdXBzVG9rZW5PYmouZXhwaXJlQXQpIHtcbiAgICAgIGNvbnN0IHRtcFVzZXJHcm91cHMgPSBhd2FpdCB0aGlzLmdldFVzZXJHcm91cHModGhpcy5nZXRVc2VySWQoKSk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRVc2VyR3JvdXBzKHRtcFVzZXJHcm91cHMpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyR3JvdXBzID0gbmV3IFVzZXJHcm91cHMobnVsbCk7XG4gICAgdXNlckdyb3Vwcy5ncm91cHMgPSB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJHcm91cHMnKS5zY29wZXM7XG4gICAgcmV0dXJuIHVzZXJHcm91cHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgbG9naW4gdXNlckluZm9cbiAgICogVE9ETzogd2UgY2FuIGNhY2hlIHVzZXIgaW5mbyBpbmNsdWRlcyBncm91cHMgaW5mb3JtYXRpb24gd2hlbiBmaW5pc2hlZCBsb2dpblxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZ2V0VXNlckluZm8oKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGlmICh0aGlzLmlzTG9naW4oKSkge1xuICAgICAgY29uc3Qgb2t0YVVzZXJJbmZvID0gYXdhaXQgdGhpcy5va3RhLmdldFVzZXJJbmZvKHRoaXMuZ2V0VXNlcklkKCkpO1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBVc2VySW5mbyhva3RhVXNlckluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ25vdCBsb2dpbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdXNlckdyb3VwIGJ5IGdpdmVuIHVzZXJJZFxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBnZXRVc2VyR3JvdXBzKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyR3JvdXBzPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dpbigpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBva3RhVXNlckdyb3VwcyA9IGF3YWl0IHRoaXMub2t0YS5nZXRVc2VyR3JvdXBzKHVzZXJJZCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgVXNlckdyb3Vwcyhva3RhVXNlckdyb3Vwcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFVzZXJHcm91cHMgZXJyJywgZXJyKTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBVc2VyR3JvdXBzKG51bGwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGlmIGFscmVhZHkgbG9naW4gYnkgY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhY2Nlc3NUb2tlblxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgaXNMb2dpbigpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0VXNlcklkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVkaXJlY3QgdG8gdXJsIGZvciBHb29nbGUgbG9naW5cbiAgICovXG4gIGxvZ2luV2l0aEdvb2dsZShyZWRpcmVjdFVybDogc3RyaW5nKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgJHt0aGlzLmF1dGhDb25maWcuZ2V0VXJsKCl9L29hdXRoMi92MS9hdXRob3JpemU/YCArXG4gICAgICBgaWRwPTBvYWR1bGh1ejc4U01XOGNEMGg3JmNsaWVudF9pZD0ke3RoaXMuYXV0aENvbmZpZy5nZXRDbGllbnRJZCgpfSZyZXNwb25zZV90eXBlPWlkX3Rva2VuJmAgK1xuICAgICAgYHJlc3BvbnNlX21vZGU9ZnJhZ21lbnQmc2NvcGU9b3BlbmlkJnNjb3BlPWVtYWlsJnNjb3BlPXBpY3R1cmUmc2NvcGU9bmFtZSZgICtcbiAgICAgIGBzdGF0ZT1XTTZEJm5vbmNlPVlzRzc2am8mcmVkaXJlY3RfdXJpPSR7cmVkaXJlY3RVcmx9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiBieSB1c2VybmFtZSBhbmQgcGFzc3dvcmRcbiAgICpcbiAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBhd2FpdCB0aGlzLm9hdXRoLmNyZWF0ZUFuZFNhdmVOb25jZSgpO1xuICAgIGNvbnN0IHNpZ25JblJlc3BvbnNlID0gYXdhaXQgdGhpcy5va3RhQXV0aC5zaWduSW4oe3VzZXJuYW1lOiB1c2VybmFtZSwgcGFzc3dvcmQ6IHBhc3N3b3JkfSk7XG4gICAgaWYgKHNpZ25JblJlc3BvbnNlLnN0YXR1cyA9PT0gJ1NVQ0NFU1MnKSB7XG4gICAgICBhd2FpdCB0aGlzLm9rdGFBdXRoLnRva2VuLmdldFdpdGhvdXRQcm9tcHQoe1xuICAgICAgICBjbGllbnRJZDogdGhpcy5hdXRoQ29uZmlnLmdldENsaWVudElkKCksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogWydpZF90b2tlbicsICd0b2tlbiddLFxuICAgICAgICBzY29wZXM6IFsnb3BlbmlkJywgJ3Byb2ZpbGUnLCAnZW1haWwnXSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBzaWduSW5SZXNwb25zZS5zZXNzaW9uVG9rZW4sXG4gICAgICAgIG5vbmNlOiBub25jZSxcbiAgICAgICAgcmVkaXJlY3RVcmk6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpO1xuICAgICAgaWYgKHNlc3Npb24uc3RhdHVzID09PSAnQUNUSVZFJykge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Vzc2lvbiBBQ1RJVkUnKTtcbiAgICAgICAgdGhpcy5zZXRVc2VySWQoc2Vzc2lvbi51c2VySWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnbG9naW4gc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgndXNlcm5hbWUgb3IgcGFzc3dvcmQgZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgZ3JvdXBzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEdyb3VwcygpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5va3RhLmxpc3RHcm91cHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2Vzc2lvblxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub2t0YUF1dGguc2Vzc2lvbi5nZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSBicm93c2VyIHRvIGxvZ2luIHBhZ2VcbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvTG9naW5QYWdlKCkge1xuICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0ZVRvTG9naW5QYWdlOicsIHRoaXMuYXV0aENvbmZpZy5nZXRMb2dpblVybCgpKTtcbiAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gdGhpcy5hdXRoQ29uZmlnLmdldExvZ2luVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgYnJvd3NlciB0byByZWRpcmVjdCBwYWdlXG4gICAqL1xuICBuYXZpZ2F0ZVRvUmVkaXJlY3RQYWdlKCkge1xuICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0ZVRvUmVkaXJlY3RQYWdlOicsIHRoaXMuYXV0aENvbmZpZy5nZXRSZWRpcmVjdFVybCgpKTtcbiAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gdGhpcy5hdXRoQ29uZmlnLmdldFJlZGlyZWN0VXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGN1cnJlbnQgdXNlciBhbmQgY2xlYXIgdG9rZW5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGxvZ291dCgpIHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIHRoaXMub2t0YUF1dGgudG9rZW5NYW5hZ2VyLmNsZWFyKCk7XG4gICAgICBjb25zb2xlLmxvZygnc3RhcnQgdG8gbG9nb3V0Jyk7XG4gICAgICB0aGlzLm9rdGFBdXRoLnNpZ25PdXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2xvZ291dCBkb25lLCB0byBuYXZpZ2F0ZScsIHRoaXMuYXV0aENvbmZpZy5nZXRMb2dpblVybCgpKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTG9naW5QYWdlKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgIH1cbiAgfVxufVxuIl19