ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
178 lines • 26.3 kB
JavaScript
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { HostListener, Injectable, Injector, Directive } from '@angular/core';
import { Observable, timer } from 'rxjs';
import { AppConfig } from '../config/app-config';
import { Codes } from '../util/codes';
import { Util } from '../util/util';
import { AuthService } from './auth.service';
import { LocalStorageService } from './local-storage.service';
import * as i0 from "@angular/core";
export class ORemoteConfigurationService {
beforeunloadHandler() {
this.finalize().subscribe(() => {
});
}
constructor(injector) {
this.injector = injector;
this._columns = {
user: ORemoteConfigurationService.DEFAULT_COLUMN_USER,
appId: ORemoteConfigurationService.DEFAULT_COLUMN_APPID,
configuration: ORemoteConfigurationService.DEFAULT_COLUMN_CONFIG
};
this.httpClient = this.injector.get(HttpClient);
this._appConfig = this.injector.get(AppConfig);
this.authService = this.injector.get(AuthService);
this.localStorageService = this.injector.get(LocalStorageService);
this.httpClient = this.injector.get(HttpClient);
this._uuid = this._appConfig.getConfiguration().uuid;
if (this._appConfig.useRemoteConfiguration()) {
this._url = this._appConfig.getRemoteConfigurationEndpoint();
const remoteConfig = this._appConfig.getRemoteConfigurationConfig();
this._columns = (remoteConfig && remoteConfig.columns) ? Object.assign(this._columns, remoteConfig.columns) : this._columns;
this._timeout = (remoteConfig && remoteConfig.timeout) ? remoteConfig.timeout : ORemoteConfigurationService.DEFAULT_STORAGE_TIMEOUT;
const self = this;
this.localStorageService.onSetLocalStorage.subscribe(() => {
if (self.storeSubscription) {
self.storeSubscription.unsubscribe();
}
});
}
}
getUserConfiguration() {
const self = this;
const observable = new Observable((observer) => {
const sessionInfo = self.authService.getSessionInfo();
if (!self.hasSession(sessionInfo)) {
observer.error();
return;
}
const url = self._url + '/search';
const body = {};
body[self._columns.user] = sessionInfo.user;
body[self._columns.appId] = self._uuid;
const options = {
headers: self.buildHeaders()
};
self.httpClient.post(url, body, options).subscribe((resp) => {
if (resp && resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE && Util.isDefined(resp.data)) {
observer.next(resp);
}
else {
observer.error();
}
}, (error) => observer.error(error), () => observer.complete());
});
return observable;
}
storeUserConfiguration() {
const self = this;
if (self.storeSubscription) {
self.storeSubscription.unsubscribe();
}
const observable = new Observable((observer) => {
const sessionInfo = self.authService.getSessionInfo();
if (!self._appConfig.useRemoteConfiguration() || !self.hasSession(sessionInfo)) {
observer.next();
observer.complete();
return;
}
const url = self._url;
const body = { filter: {}, data: {} };
body.filter[self._columns.user] = sessionInfo.user;
body.filter[self._columns.appId] = self._uuid;
let userData = self.localStorageService.getSessionUserComponentsData() || '';
try {
userData = btoa(JSON.stringify(userData));
}
catch (e) {
userData = '';
}
body.data[self._columns.configuration] = userData;
const options = {
headers: self.buildHeaders()
};
self.httpClient.put(url, body, options).subscribe((resp) => {
if (resp && resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE) {
observer.next(resp);
}
else {
observer.error();
}
}, (error) => observer.error(error), () => observer.complete());
});
return observable;
}
initialize() {
const self = this;
return new Observable(observer => {
if (self._appConfig.useRemoteConfiguration()) {
self.timerSubscription = timer(self._timeout, self._timeout).subscribe(() => {
self.storeSubscription = self.storeUserConfiguration().subscribe(() => {
});
});
self.getUserConfiguration().subscribe((resp) => {
let storedConf;
if (Util.isArray(resp.data)) {
storedConf = resp.data[0][self._columns.configuration];
}
else {
storedConf = resp.data;
}
if (Util.isDefined(storedConf)) {
let componentsData;
try {
const decoded = atob(storedConf);
componentsData = JSON.parse(decoded);
}
catch (e) {
componentsData = {};
}
self.localStorageService.storeSessionUserComponentsData(componentsData);
}
observer.next();
}, () => {
observer.next();
});
}
else {
observer.next();
}
});
}
finalize() {
if (this.timerSubscription) {
this.timerSubscription.unsubscribe();
}
return this.storeUserConfiguration();
}
hasSession(sessionInfo) {
return Util.isDefined(sessionInfo) && Util.isDefined(sessionInfo.user) && Util.isDefined(sessionInfo.id);
}
buildHeaders() {
const sessionInfo = this.authService.getSessionInfo();
return new HttpHeaders({
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json;charset=UTF-8',
Authorization: 'Bearer ' + sessionInfo.id
});
}
}
ORemoteConfigurationService.DEFAULT_COLUMN_USER = 'USER_';
ORemoteConfigurationService.DEFAULT_COLUMN_APPID = 'APP_UUID';
ORemoteConfigurationService.DEFAULT_COLUMN_CONFIG = 'CONFIGURATION';
ORemoteConfigurationService.DEFAULT_STORAGE_TIMEOUT = 60000;
ORemoteConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORemoteConfigurationService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive });
ORemoteConfigurationService.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ORemoteConfigurationService, host: { listeners: { "window:beforeunload": "beforeunloadHandler()" } }, ngImport: i0 });
ORemoteConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORemoteConfigurationService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ORemoteConfigurationService, decorators: [{
type: Directive
}, {
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { beforeunloadHandler: [{
type: HostListener,
args: ['window:beforeunload', []]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWNvbmZpZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3NlcnZpY2VzL3JlbW90ZS1jb25maWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBUSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBNEIsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUlqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU05RCxNQUFNLE9BQU8sMkJBQTJCO0lBd0J0QyxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFFL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBc0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWI5QixhQUFRLEdBQWdDO1lBQ2hELElBQUksRUFBRSwyQkFBMkIsQ0FBQyxtQkFBbUI7WUFDckQsS0FBSyxFQUFFLDJCQUEyQixDQUFDLG9CQUFvQjtZQUN2RCxhQUFhLEVBQUUsMkJBQTJCLENBQUMscUJBQXFCO1NBQ2pFLENBQUM7UUFVQSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxR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QUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjsrRkF5QkMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEhvc3RMaXN0ZW5lciwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFR5cGUsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tICcuLi9jb25maWcvYXBwLWNvbmZpZyc7XG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9SZW1vdGVDb25maWd1cmF0aW9uLCBPUmVtb3RlQ29uZmlndXJhdGlvbkNvbHVtbnMgfSBmcm9tICcuLi90eXBlcy9yZW1vdGUtY29uZmlndXJhdGlvbi50eXBlJztcbmltcG9ydCB7IFNlc3Npb25JbmZvIH0gZnJvbSAnLi4vdHlwZXMvc2Vzc2lvbi1pbmZvLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKClcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE9SZW1vdGVDb25maWd1cmF0aW9uU2VydmljZSB7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0NPTFVNTl9VU0VSID0gJ1VTRVJfJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0NPTFVNTl9BUFBJRCA9ICdBUFBfVVVJRCc7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9DT0xVTU5fQ09ORklHID0gJ0NPTkZJR1VSQVRJT04nO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfU1RPUkFHRV9USU1FT1VUID0gNjAwMDA7XG5cbiAgcHJvdGVjdGVkIGxvY2FsU3RvcmFnZVNlcnZpY2U6IExvY2FsU3RvcmFnZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBhdXRoU2VydmljZTogQXV0aFNlcnZpY2U7XG4gIHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50O1xuICBwcm90ZWN0ZWQgX2FwcENvbmZpZzogQXBwQ29uZmlnO1xuICBwcm90ZWN0ZWQgX3VybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3V1aWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIF90aW1lb3V0OiBudW1iZXI7XG4gIHByb3RlY3RlZCB0aW1lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgc3RvcmVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgX2NvbHVtbnM6IE9SZW1vdGVDb25maWd1cmF0aW9uQ29sdW1ucyA9IHtcbiAgICB1c2VyOiBPUmVtb3RlQ29uZmlndXJhdGlvblNlcnZpY2UuREVGQVVMVF9DT0xVTU5fVVNFUixcbiAgICBhcHBJZDogT1JlbW90ZUNvbmZpZ3VyYXRpb25TZXJ2aWNlLkRFRkFVTFRfQ09MVU1OX0FQUElELFxuICAgIGNvbmZpZ3VyYXRpb246IE9SZW1vdGVDb25maWd1cmF0aW9uU2VydmljZS5ERUZBVUxUX0NPTFVNTl9DT05GSUdcbiAgfTtcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgW10pXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvL1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHRoaXMuaHR0cENsaWVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0PEh0dHBDbGllbnQ+KEh0dHBDbGllbnQgYXMgVHlwZTxIdHRwQ2xpZW50Pik7XG4gICAgdGhpcy5fYXBwQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQ8QXBwQ29uZmlnPihBcHBDb25maWcgYXMgVHlwZTxBcHBDb25maWc+KTtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8QXV0aFNlcnZpY2U+KEF1dGhTZXJ2aWNlIGFzIFR5cGU8QXV0aFNlcnZpY2U+KTtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxMb2NhbFN0b3JhZ2VTZXJ2aWNlPihMb2NhbFN0b3JhZ2VTZXJ2aWNlIGFzIFR5cGU8TG9jYWxTdG9yYWdlU2VydmljZT4pO1xuXG4gICAgdGhpcy5odHRwQ2xpZW50ID0gdGhpcy5pbmplY3Rvci5nZXQ8SHR0cENsaWVudD4oSHR0cENsaWVudCBhcyBUeXBlPEh0dHBDbGllbnQ+KTtcbiAgICB0aGlzLl91dWlkID0gdGhpcy5fYXBwQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS51dWlkO1xuXG4gICAgaWYgKHRoaXMuX2FwcENvbmZpZy51c2VSZW1vdGVDb25maWd1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX3VybCA9IHRoaXMuX2FwcENvbmZpZy5nZXRSZW1vdGVDb25maWd1cmF0aW9uRW5kcG9pbnQoKTtcblxuICAgICAgY29uc3QgcmVtb3RlQ29uZmlnOiBPUmVtb3RlQ29uZmlndXJhdGlvbiA9IHRoaXMuX2FwcENvbmZpZy5nZXRSZW1vdGVDb25maWd1cmF0aW9uQ29uZmlnKCk7XG4gICAgICB0aGlzLl9jb2x1bW5zID0gKHJlbW90ZUNvbmZpZyAmJiByZW1vdGVDb25maWcuY29sdW1ucykgPyBPYmplY3QuYXNzaWduKHRoaXMuX2NvbHVtbnMsIHJlbW90ZUNvbmZpZy5jb2x1bW5zKSA6IHRoaXMuX2NvbHVtbnM7XG5cbiAgICAgIHRoaXMuX3RpbWVvdXQgPSAocmVtb3RlQ29uZmlnICYmIHJlbW90ZUNvbmZpZy50aW1lb3V0KSA/IHJlbW90ZUNvbmZpZy50aW1lb3V0IDogT1JlbW90ZUNvbmZpZ3VyYXRpb25TZXJ2aWNlLkRFRkFVTFRfU1RPUkFHRV9USU1FT1VUO1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uub25TZXRMb2NhbFN0b3JhZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHNlbGYuc3RvcmVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBzZWxmLnN0b3JlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRVc2VyQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPFNlcnZpY2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IFN1YnNjcmliZXI8U2VydmljZVJlc3BvbnNlPikgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbkluZm8gPSBzZWxmLmF1dGhTZXJ2aWNlLmdldFNlc3Npb25JbmZvKCk7XG4gICAgICBpZiAoIXNlbGYuaGFzU2Vzc2lvbihzZXNzaW9uSW5mbykpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsID0gc2VsZi5fdXJsICsgJy9zZWFyY2gnO1xuICAgICAgY29uc3QgYm9keTogYW55ID0ge307XG4gICAgICBib2R5W3NlbGYuX2NvbHVtbnMudXNlcl0gPSBzZXNzaW9uSW5mby51c2VyO1xuICAgICAgYm9keVtzZWxmLl9jb2x1bW5zLmFwcElkXSA9IHNlbGYuX3V1aWQ7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiBzZWxmLmJ1aWxkSGVhZGVycygpXG4gICAgICB9O1xuICAgICAgc2VsZi5odHRwQ2xpZW50LnBvc3QodXJsLCBib2R5LCBvcHRpb25zKS5zdWJzY3JpYmUoKHJlc3A6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmNvZGUgPT09IENvZGVzLk9OVElNSVpFX1NVQ0NFU1NGVUxfQ09ERSAmJiBVdGlsLmlzRGVmaW5lZChyZXNwLmRhdGEpKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IG9ic2VydmVyLmVycm9yKGVycm9yKSxcbiAgICAgICAgKCkgPT4gb2JzZXJ2ZXIuY29tcGxldGUoKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH1cblxuICBwdWJsaWMgc3RvcmVVc2VyQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLnN0b3JlU3Vic2NyaXB0aW9uKSB7XG4gICAgICBzZWxmLnN0b3JlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IFN1YnNjcmliZXI8U2VydmljZVJlc3BvbnNlPikgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbkluZm8gPSBzZWxmLmF1dGhTZXJ2aWNlLmdldFNlc3Npb25JbmZvKCk7XG4gICAgICBpZiAoIXNlbGYuX2FwcENvbmZpZy51c2VSZW1vdGVDb25maWd1cmF0aW9uKCkgfHwgIXNlbGYuaGFzU2Vzc2lvbihzZXNzaW9uSW5mbykpIHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCgpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSBzZWxmLl91cmw7XG4gICAgICBjb25zdCBib2R5OiBhbnkgPSB7IGZpbHRlcjoge30sIGRhdGE6IHt9IH07XG4gICAgICBib2R5LmZpbHRlcltzZWxmLl9jb2x1bW5zLnVzZXJdID0gc2Vzc2lvbkluZm8udXNlcjtcbiAgICAgIGJvZHkuZmlsdGVyW3NlbGYuX2NvbHVtbnMuYXBwSWRdID0gc2VsZi5fdXVpZDtcbiAgICAgIGxldCB1c2VyRGF0YSA9IHNlbGYubG9jYWxTdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uVXNlckNvbXBvbmVudHNEYXRhKCkgfHwgJyc7XG4gICAgICB0cnkge1xuICAgICAgICB1c2VyRGF0YSA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkodXNlckRhdGEpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdXNlckRhdGEgPSAnJztcbiAgICAgIH1cbiAgICAgIGJvZHkuZGF0YVtzZWxmLl9jb2x1bW5zLmNvbmZpZ3VyYXRpb25dID0gdXNlckRhdGE7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBoZWFkZXJzOiBzZWxmLmJ1aWxkSGVhZGVycygpXG4gICAgICB9O1xuICAgICAgc2VsZi5odHRwQ2xpZW50LnB1dCh1cmwsIGJvZHksIG9wdGlvbnMpLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwICYmIHJlc3AuY29kZSA9PT0gQ29kZXMuT05USU1JWkVfU1VDQ0VTU0ZVTF9DT0RFKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyb3IpID0+IG9ic2VydmVyLmVycm9yKGVycm9yKSxcbiAgICAgICAgKCkgPT4gb2JzZXJ2ZXIuY29tcGxldGUoKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBpZiAoc2VsZi5fYXBwQ29uZmlnLnVzZVJlbW90ZUNvbmZpZ3VyYXRpb24oKSkge1xuICAgICAgICBzZWxmLnRpbWVyU3Vic2NyaXB0aW9uID0gdGltZXIoc2VsZi5fdGltZW91dCwgc2VsZi5fdGltZW91dCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBzZWxmLnN0b3JlU3Vic2NyaXB0aW9uID0gc2VsZi5zdG9yZVVzZXJDb25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLmdldFVzZXJDb25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKChyZXNwOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBsZXQgc3RvcmVkQ29uZjtcbiAgICAgICAgICBpZiAoVXRpbC5pc0FycmF5KHJlc3AuZGF0YSkpIHtcbiAgICAgICAgICAgIHN0b3JlZENvbmYgPSByZXNwLmRhdGFbMF1bc2VsZi5fY29sdW1ucy5jb25maWd1cmF0aW9uXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RvcmVkQ29uZiA9IHJlc3AuZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHN0b3JlZENvbmYpKSB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50c0RhdGE7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihzdG9yZWRDb25mKTtcbiAgICAgICAgICAgICAgY29tcG9uZW50c0RhdGEgPSBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb21wb25lbnRzRGF0YSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnN0b3JlU2Vzc2lvblVzZXJDb21wb25lbnRzRGF0YShjb21wb25lbnRzRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnNlcnZlci5uZXh0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluYWxpemUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdG9yZVVzZXJDb25maWd1cmF0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzU2Vzc2lvbihzZXNzaW9uSW5mbzogU2Vzc2lvbkluZm8pOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQoc2Vzc2lvbkluZm8pICYmIFV0aWwuaXNEZWZpbmVkKHNlc3Npb25JbmZvLnVzZXIpICYmIFV0aWwuaXNEZWZpbmVkKHNlc3Npb25JbmZvLmlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEhlYWRlcnMoKTogSHR0cEhlYWRlcnMge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdGhpcy5hdXRoU2VydmljZS5nZXRTZXNzaW9uSW5mbygpO1xuICAgIHJldHVybiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICcqJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcbiAgICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgJyArIHNlc3Npb25JbmZvLmlkXG4gICAgfSk7XG4gIH1cblxufVxuIl19