@knora/core
Version:
Knora ui module: core
165 lines • 21.8 kB
JavaScript
import * as tslib_1 from "tslib";
import { Inject, Injectable } from '@angular/core';
import { ApiResponseData, ApiResponseError, CredentialsResponse, KnoraApiConfig, KnoraApiConnection, UserResponse, Constants } from '@knora/api';
import * as momentImported from 'moment';
import { KnoraApiConfigToken, KnoraApiConnectionToken } from './core.module';
import * as i0 from "@angular/core";
import * as i1 from "./core.module";
const moment = momentImported;
let SessionService = class SessionService {
constructor(knoraApiConnection, knoraApiConfig) {
this.knoraApiConnection = knoraApiConnection;
this.knoraApiConfig = knoraApiConfig;
/**
* max session time in milliseconds
* default value (24h): 86400000
*
*/
this.MAX_SESSION_TIME = 86400000; // 1d = 24 * 60 * 60 * 1000
}
/**
* set the session by using the json web token (jwt) and the user object;
* it will be used in the login process
*
* @param jwt
* @param username
*/
setSession(jwt, identifier, identifierType) {
let session;
this.updateKnoraApiConnection(jwt);
// get user information
this.knoraApiConnection.admin.usersEndpoint.getUser(identifierType, identifier).subscribe((response) => {
let sysAdmin = false;
const projectAdmin = [];
// get permission inforamation: a) is user sysadmin? b) get list of project iris where user is project admin
const groupsPerProjectKeys = Object.keys(response.body.user.permissions.groupsPerProject);
for (const key of groupsPerProjectKeys) {
if (key === Constants.SystemProjectIRI) {
sysAdmin = response.body.user.permissions.groupsPerProject[key].indexOf(Constants.SystemAdminGroupIRI) > -1;
}
if (response.body.user.permissions.groupsPerProject[key].indexOf(Constants.ProjectAdminGroupIRI) > -1) {
projectAdmin.push(key);
}
}
// store session information in browser's localstorage
session = {
id: this.setTimestamp(),
user: {
name: response.body.user.username,
jwt: jwt,
lang: response.body.user.lang,
sysAdmin: sysAdmin,
projectAdmin: projectAdmin
}
};
// update localStorage
localStorage.setItem('session', JSON.stringify(session));
}, (error) => {
localStorage.removeItem('session');
console.error(error);
});
}
/**
* Validate intern session and check knora api credentials if necessary.
* If a json web token exists, it doesn't mean, that the knora api credentials are still valid.
*
* @returns boolean
*/
validateSession() {
// mix of checks with session.validation and this.authenticate
const session = JSON.parse(localStorage.getItem('session'));
const tsNow = this.setTimestamp();
if (session) {
this.updateKnoraApiConnection(session.user.jwt);
// check if the session is still valid:
if (session.id + this.MAX_SESSION_TIME <= tsNow) {
// the internal (knora-ui) session has expired
// check if the api credentails are still valid
// console.error('session is not valid; check knora api credentials');
this.knoraApiConnection.v2.auth.checkCredentials().subscribe((response) => {
// the knora api credentials are still valid
// console.log('knora api credentials', response);
// refresh the jwt in @knora/api
this.updateKnoraApiConnection(session.user.jwt);
// update the session.id
session.id = tsNow;
localStorage.setItem('session', JSON.stringify(session));
// console.log('knora api credentials are valid; return', true);
return true;
}, (error) => {
// a user is not authenticated anymore!
// console.error('session.service -- validateSession -- authenticate: the session expired on API side');
this.destroySession();
// console.warn('knora api credentials are not valid; return', false);
return false;
});
}
else {
// the internal (knora-ui) session is still valid
// console.log('session is valid; return', true);
return true;
}
}
else {
// no session found; update knora api connection with empty jwt
this.updateKnoraApiConnection();
// console.warn('session is not valid; return', false);
return false;
}
}
/**
* update the session storage
* @param jwt
* @param username
*
* @returns boolean
*/
updateSession(jwt, username) {
if (jwt && username) {
this.setSession(jwt, username, 'username');
return true;
}
else {
return false;
}
}
/**
* Destroy session by removing the session from local storage
*
*/
destroySession() {
localStorage.removeItem('session');
}
/**
* Update the knora-api-config and knora-api-connection of @knora/api
*
* @param {string} jwt?
*/
updateKnoraApiConnection(jwt) {
this.knoraApiConfig.jsonWebToken = (jwt ? jwt : '');
this.knoraApiConnection = new KnoraApiConnection(this.knoraApiConfig);
}
/**
* Convert a timestamp in a number
* @returns number
*/
setTimestamp() {
return (moment().add(0, 'second')).valueOf();
}
};
SessionService.ctorParameters = () => [
{ type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] },
{ type: KnoraApiConfig, decorators: [{ type: Inject, args: [KnoraApiConfigToken,] }] }
];
SessionService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function SessionService_Factory() { return new SessionService(i0.ɵɵinject(i1.KnoraApiConnectionToken), i0.ɵɵinject(i1.KnoraApiConfigToken)); }, token: SessionService, providedIn: "root" });
SessionService = tslib_1.__decorate([
Injectable({
providedIn: 'root'
}),
tslib_1.__param(0, Inject(KnoraApiConnectionToken)),
tslib_1.__param(1, Inject(KnoraApiConfigToken)),
tslib_1.__metadata("design:paramtypes", [KnoraApiConnection,
KnoraApiConfig])
], SessionService);
export { SessionService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc2Vzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pKLE9BQU8sS0FBSyxjQUFjLE1BQU0sUUFBUSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBK0I3RSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFLOUIsSUFBYSxjQUFjLEdBQTNCLE1BQWEsY0FBYztJQVV2QixZQUM2QyxrQkFBc0MsRUFDMUMsY0FBOEI7UUFEMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUMxQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFWdkU7Ozs7VUFJRTtRQUNPLHFCQUFnQixHQUFXLFFBQVEsQ0FBQyxDQUFDLDJCQUEyQjtJQU1yRSxDQUFDO0lBSUw7Ozs7OztTQU1LO0lBQ0wsVUFBVSxDQUFDLEdBQVcsRUFBRSxVQUFrQixFQUFFLGNBQW9DO1FBRTVFLElBQUksT0FBZ0IsQ0FBQztRQUVyQixJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkMsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUNyRixDQUFDLFFBQXVDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7WUFDOUIsTUFBTSxZQUFZ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Q2pELENBQUM7Q0FHSixDQUFBOztZQXZLb0Usa0JBQWtCLHVCQUE5RSxNQUFNLFNBQUMsdUJBQXVCO1lBQ3NCLGNBQWMsdUJBQWxFLE1BQU0sU0FBQyxtQkFBbUI7OztBQVp0QixjQUFjO0lBSDFCLFVBQVUsQ0FBQztRQUNSLFVBQVUsRUFBRSxNQUFNO0tBQ3JCLENBQUM7SUFZTyxtQkFBQSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtJQUMvQixtQkFBQSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTs2Q0FEaUMsa0JBQWtCO1FBQzFCLGNBQWM7R0FaOUQsY0FBYyxDQWtMMUI7U0FsTFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VEYXRhLCBBcGlSZXNwb25zZUVycm9yLCBDcmVkZW50aWFsc1Jlc3BvbnNlLCBLbm9yYUFwaUNvbmZpZywgS25vcmFBcGlDb25uZWN0aW9uLCBVc2VyUmVzcG9uc2UsIENvbnN0YW50cyB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgS25vcmFBcGlDb25maWdUb2tlbiwgS25vcmFBcGlDb25uZWN0aW9uVG9rZW4gfSBmcm9tICcuL2NvcmUubW9kdWxlJztcbmltcG9ydCB7IEtub3JhQ29uc3RhbnRzIH0gZnJvbSAnLi9kZWNsYXJhdGlvbnMnO1xuXG4vKipcbiAqIEN1cnJlbnRseSBsb2dnZWQtaW4gdXNlciBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRVc2VyIHtcbiAgICAvLyB1c2VybmFtZVxuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8vIGpzb24gd2ViIHRva2VuXG4gICAgand0OiBzdHJpbmc7XG5cbiAgICAvLyBkZWZhdWx0IGxhbmd1YWdlIGZvciB1aVxuICAgIGxhbmc6IHN0cmluZztcblxuICAgIC8vIGlzIHN5c3RlbSBhZG1pbj9cbiAgICBzeXNBZG1pbjogYm9vbGVhbjtcblxuICAgIC8vIGxpc3Qgb2YgcHJvamVjdCBzaG9ydGNvZGVzIHdoZXJlIHRoZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICBwcm9qZWN0QWRtaW46IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlc3Npb24gd2l0aCBpZCAoPSBsb2dpbiB0aW1lc3RhbXApIGFuZCBpbmZvcmFtdGlvbiBhYm91dCBsb2dnZWQtaW4gdXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcjogQ3VycmVudFVzZXI7XG59XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlc3Npb25TZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICogbWF4IHNlc3Npb24gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAqIGRlZmF1bHQgdmFsdWUgKDI0aCk6IDg2NDAwMDAwXG4gICAgKlxuICAgICovXG4gICAgcmVhZG9ubHkgTUFYX1NFU1NJT05fVElNRTogbnVtYmVyID0gODY0MDAwMDA7IC8vIDFkID0gMjQgKiA2MCAqIDYwICogMTAwMFxuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbm5lY3Rpb25Ub2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbm5lY3Rpb246IEtub3JhQXBpQ29ubmVjdGlvbixcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbmZpZ1Rva2VuKSBwcml2YXRlIGtub3JhQXBpQ29uZmlnOiBLbm9yYUFwaUNvbmZpZ1xuICAgICkgeyB9XG5cblxuXG4gICAgLyoqXG4gICAgICAgKiBzZXQgdGhlIHNlc3Npb24gYnkgdXNpbmcgdGhlIGpzb24gd2ViIHRva2VuIChqd3QpIGFuZCB0aGUgdXNlciBvYmplY3Q7XG4gICAgICAgKiBpdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGxvZ2luIHByb2Nlc3NcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gand0XG4gICAgICAgKiBAcGFyYW0gdXNlcm5hbWVcbiAgICAgICAqL1xuICAgIHNldFNlc3Npb24oand0OiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgaWRlbnRpZmllclR5cGU6ICdlbWFpbCcgfCAndXNlcm5hbWUnKSB7XG5cbiAgICAgICAgbGV0IHNlc3Npb246IFNlc3Npb247XG5cbiAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0KTtcblxuICAgICAgICAvLyBnZXQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi5hZG1pbi51c2Vyc0VuZHBvaW50LmdldFVzZXIoaWRlbnRpZmllclR5cGUsIGlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPFVzZXJSZXNwb25zZT4pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3lzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0QWRtaW46IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgcGVybWlzc2lvbiBpbmZvcmFtYXRpb246IGEpIGlzIHVzZXIgc3lzYWRtaW4/IGIpIGdldCBsaXN0IG9mIHByb2plY3QgaXJpcyB3aGVyZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cHNQZXJQcm9qZWN0S2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBncm91cHNQZXJQcm9qZWN0S2V5cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBDb25zdGFudHMuU3lzdGVtUHJvamVjdElSSSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW4gPSByZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdFtrZXldLmluZGV4T2YoQ29uc3RhbnRzLlN5c3RlbUFkbWluR3JvdXBJUkkpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS51c2VyLnBlcm1pc3Npb25zLmdyb3Vwc1BlclByb2plY3Rba2V5XS5pbmRleE9mKENvbnN0YW50cy5Qcm9qZWN0QWRtaW5Hcm91cElSSSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIHNlc3Npb24gaW5mb3JtYXRpb24gaW4gYnJvd3NlcidzIGxvY2Fsc3RvcmFnZVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldFRpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXNwb25zZS5ib2R5LnVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBqd3Q6IGp3dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHJlc3BvbnNlLmJvZHkudXNlci5sYW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW46IHN5c0FkbWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluOiBwcm9qZWN0QWRtaW5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZXNzaW9uJywgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzZXNzaW9uJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW50ZXJuIHNlc3Npb24gYW5kIGNoZWNrIGtub3JhIGFwaSBjcmVkZW50aWFscyBpZiBuZWNlc3NhcnkuXG4gICAgICogSWYgYSBqc29uIHdlYiB0b2tlbiBleGlzdHMsIGl0IGRvZXNuJ3QgbWVhbiwgdGhhdCB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZVNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIG1peCBvZiBjaGVja3Mgd2l0aCBzZXNzaW9uLnZhbGlkYXRpb24gYW5kIHRoaXMuYXV0aGVudGljYXRlXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykpO1xuXG4gICAgICAgIGNvbnN0IHRzTm93OiBudW1iZXIgPSB0aGlzLnNldFRpbWVzdGFtcCgpO1xuXG4gICAgICAgIGlmIChzZXNzaW9uKSB7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB2YWxpZDpcbiAgICAgICAgICAgIGlmIChzZXNzaW9uLmlkICsgdGhpcy5NQVhfU0VTU0lPTl9USU1FIDw9IHRzTm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGludGVybmFsIChrbm9yYS11aSkgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBhcGkgY3JlZGVudGFpbHMgYXJlIHN0aWxsIHZhbGlkXG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgY2hlY2sga25vcmEgYXBpIGNyZWRlbnRpYWxzJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmNoZWNrQ3JlZGVudGlhbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPENyZWRlbnRpYWxzUmVzcG9uc2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2tub3JhIGFwaSBjcmVkZW50aWFscycsIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgand0IGluIEBrbm9yYS9hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlc3Npb24uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uaWQgPSB0c05vdztcblxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nlc3Npb24nLCBKU09OLnN0cmluZ2lmeShzZXNzaW9uKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdrbm9yYSBhcGkgY3JlZGVudGlhbHMgYXJlIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCBhbnltb3JlIVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignc2Vzc2lvbi5zZXJ2aWNlIC0tIHZhbGlkYXRlU2Vzc2lvbiAtLSBhdXRoZW50aWNhdGU6IHRoZSBzZXNzaW9uIGV4cGlyZWQgb24gQVBJIHNpZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95U2Vzc2lvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ2tub3JhIGFwaSBjcmVkZW50aWFscyBhcmUgbm90IHZhbGlkOyByZXR1cm4nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcm5hbCAoa25vcmEtdWkpIHNlc3Npb24gaXMgc3RpbGwgdmFsaWRcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXNzaW9uIGlzIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIHNlc3Npb24gZm91bmQ7IHVwZGF0ZSBrbm9yYSBhcGkgY29ubmVjdGlvbiB3aXRoIGVtcHR5IGp3dFxuICAgICAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgcmV0dXJuJywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gand0XG4gICAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAgICovXG4gICAgdXBkYXRlU2Vzc2lvbihqd3Q6IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoand0ICYmIHVzZXJuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oand0LCB1c2VybmFtZSwgJ3VzZXJuYW1lJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgc2Vzc2lvbiBieSByZW1vdmluZyB0aGUgc2Vzc2lvbiBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgICAgKlxuICAgICAqL1xuICAgIGRlc3Ryb3lTZXNzaW9uKCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUga25vcmEtYXBpLWNvbmZpZyBhbmQga25vcmEtYXBpLWNvbm5lY3Rpb24gb2YgQGtub3JhL2FwaVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBqd3Q/XG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua25vcmFBcGlDb25maWcuanNvbldlYlRva2VuID0gKGp3dCA/IGp3dCA6ICcnKTtcbiAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24gPSBuZXcgS25vcmFBcGlDb25uZWN0aW9uKHRoaXMua25vcmFBcGlDb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSB0aW1lc3RhbXAgaW4gYSBudW1iZXJcbiAgICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFRpbWVzdGFtcCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKG1vbWVudCgpLmFkZCgwLCAnc2Vjb25kJykpLnZhbHVlT2YoKTtcbiAgICB9XG5cblxufVxuIl19