@formio-tmt/angular
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.
197 lines • 25.4 kB
JavaScript
import { EventEmitter, Injectable } from '@angular/core';
import { get, each } from 'lodash';
import { Formio } from '@formio-tmt/js';
import * as i0 from "@angular/core";
import * as i1 from "@formio-tmt/angular";
import * as i2 from "./auth.config";
class FormioAuthService {
appConfig;
config;
user;
authenticated = false;
loginForm;
onLogin;
onLogout;
registerForm;
onRegister;
onUser;
onError;
resetPassForm;
onResetPass;
ready;
readyResolve;
readyReject;
projectReady;
accessReady;
userReady;
formAccess = {};
submissionAccess = {};
roles;
is = {};
constructor(appConfig, config) {
this.appConfig = appConfig;
this.config = config;
this.user = null;
if (this.appConfig && this.appConfig.appUrl) {
Formio.setBaseUrl(this.appConfig.apiUrl);
Formio.setProjectUrl(this.appConfig.appUrl);
Formio.formOnly = !!this.appConfig.formOnly;
}
else {
console.error('You must provide an AppConfig within your application!');
}
this.loginForm =
this.appConfig.appUrl +
'/' +
get(this.config, 'login.form', 'user/login');
this.registerForm =
this.appConfig.appUrl +
'/' +
get(this.config, 'register.form', 'user/register');
this.resetPassForm =
this.appConfig.appUrl +
'/' +
get(this.config, 'register.form', 'resetpass');
this.onLogin = new EventEmitter();
this.onLogout = new EventEmitter();
this.onRegister = new EventEmitter();
this.onUser = new EventEmitter();
this.onError = new EventEmitter();
this.ready = new Promise((resolve, reject) => {
this.readyResolve = resolve;
this.readyReject = reject;
});
// Register for the core events.
Formio.events.on('formio.badToken', () => this.logoutError());
Formio.events.on('formio.sessionExpired', () => this.logoutError());
if (!this.config.delayAuth) {
this.init();
}
}
onLoginSubmit(submission) {
this.setUser(submission);
this.onLogin.emit(submission);
}
onRegisterSubmit(submission) {
this.setUser(submission);
this.onRegister.emit(submission);
}
onResetPassSubmit(submission) {
this.onResetPass.emit(submission);
}
init() {
this.projectReady = Formio.makeStaticRequest(this.appConfig.appUrl).then((project) => {
each(project.access, (access) => {
this.formAccess[access.type] = access.roles;
});
}, () => {
this.formAccess = {};
return null;
});
// Get the access for this project.
this.accessReady = Formio.makeStaticRequest(this.appConfig.appUrl + '/access')
.then((access) => {
each(access.forms, (form) => {
this.submissionAccess[form.name] = {};
form.submissionAccess.forEach((subAccess) => {
this.submissionAccess[form.name][subAccess.type] = subAccess.roles;
});
});
this.roles = access.roles;
return access;
})
.catch((err) => {
if (err === 'Token Expired' || err === 'Bad Token') {
this.setUser(null);
}
this.roles = {};
return null;
});
let currentUserPromise;
if (this.config.oauth) {
// Make a fix to the hash to remove starting "/" that angular might put there.
if (window.location.hash && window.location.hash.match(/^#\/access_token/)) {
history.pushState(null, null, window.location.hash.replace(/^#\/access_token/, '#access_token'));
}
// Initiate the SSO if they provide oauth settings.
currentUserPromise = Formio.ssoInit(this.config.oauth.type, this.config.oauth.options);
}
else {
currentUserPromise = Formio.currentUser(null, {
ignoreCache: true
});
}
this.userReady = currentUserPromise.then((user) => {
this.setUser(user);
return user;
}).catch((err) => {
this.setUser(null);
throw err;
});
// Trigger we are redy when all promises have resolved.
if (this.accessReady) {
this.accessReady
.then(() => this.projectReady)
.then(() => this.userReady)
.then(() => this.readyResolve(true))
.catch((err) => this.readyReject(err));
}
}
setUser(user) {
const namespace = Formio.namespace || 'formio';
if (user) {
this.user = user;
localStorage.setItem(`${namespace}AppUser`, JSON.stringify(user));
this.setUserRoles();
Formio.setUser(user);
}
else {
this.user = null;
this.is = {};
localStorage.removeItem(`${namespace}AppUser`);
Formio.clearCache();
Formio.setUser(null);
}
this.authenticated = !!Formio.getToken();
this.onUser.emit(this.user);
}
setUserRoles() {
if (this.accessReady) {
this.accessReady.then(() => {
each(this.roles, (role, roleName) => {
if (this.user.roles.indexOf(role._id) !== -1) {
this.is[roleName] = true;
}
});
});
}
}
logoutError() {
this.setUser(null);
const namespace = Formio.namespace || 'formio';
localStorage.removeItem(`${namespace}Token`);
this.onError.emit();
}
logout() {
this.setUser(null);
const namespace = Formio.namespace || 'formio';
if (localStorage.getItem(`${namespace}LogoutAuthUrl`)) {
window.open(localStorage.getItem(`${namespace}LogoutAuthUrl`), null, 'width=1020,height=618');
localStorage.removeItem(`${namespace}LogoutAuthUrl`);
}
this.handleLogout(namespace);
}
handleLogout(namespace) {
localStorage.removeItem(`${namespace}Token`);
Formio.logout()
.then(() => this.onLogout.emit())
.catch(() => this.logoutError());
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioAuthService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormioAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioAuthService });
}
export { FormioAuthService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioAuthService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.FormioAppConfig }, { type: i2.FormioAuthConfig }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1mb3JtaW8vYXV0aC9zcmMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUV4QyxNQUNhLGlCQUFpQjtJQTZCbkI7SUFDQTtJQTdCRixJQUFJLENBQU07SUFDVixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFNBQVMsQ0FBUztJQUNsQixPQUFPLENBQXVCO0lBQzlCLFFBQVEsQ0FBdUI7SUFFL0IsWUFBWSxDQUFTO0lBQ3JCLFVBQVUsQ0FBdUI7SUFDakMsTUFBTSxDQUF1QjtJQUM3QixPQUFPLENBQW9CO0lBRTNCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQXVCO0lBRWxDLEtBQUssQ0FBbUI7SUFDeEIsWUFBWSxDQUFNO0lBQ2xCLFdBQVcsQ0FBTTtJQUVqQixZQUFZLENBQWdCO0lBQzVCLFdBQVcsQ0FBZ0I7SUFDM0IsU0FBUyxDQUFnQjtJQUN6QixVQUFVLEdBQVEsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixHQUFRLEVBQUUsQ0FBQztJQUMzQixLQUFLLENBQU07SUFDWCxFQUFFLEdBQVEsRUFBRSxDQUFDO0lBRXBCLFlBQ1MsU0FBMEIsRUFDMUIsTUFBd0I7UUFEeEIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFFL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzND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QUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFTO1FBQ3BCLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7YUFDWixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNoQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQzt1R0FoTlUsaUJBQWlCOzJHQUFqQixpQkFBaUI7O1NBQWpCLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybWlvQXV0aENvbmZpZyB9IGZyb20gJy4vYXV0aC5jb25maWcnO1xyXG5pbXBvcnQgeyBGb3JtaW9BcHBDb25maWcgfSBmcm9tICdAZm9ybWlvLXRtdC9hbmd1bGFyJztcclxuaW1wb3J0IHsgZ2V0LCBlYWNoIH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgRm9ybWlvIH0gZnJvbSAnQGZvcm1pby10bXQvanMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRm9ybWlvQXV0aFNlcnZpY2Uge1xyXG4gIHB1YmxpYyB1c2VyOiBhbnk7XHJcbiAgcHVibGljIGF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGxvZ2luRm9ybTogc3RyaW5nO1xyXG4gIHB1YmxpYyBvbkxvZ2luOiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuICBwdWJsaWMgb25Mb2dvdXQ6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJGb3JtOiBzdHJpbmc7XHJcbiAgcHVibGljIG9uUmVnaXN0ZXI6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIHB1YmxpYyBvblVzZXI6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIHB1YmxpYyBvbkVycm9yOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHVibGljIHJlc2V0UGFzc0Zvcm06IHN0cmluZztcclxuICBwdWJsaWMgb25SZXNldFBhc3M6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgcmVhZHk6IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgcHVibGljIHJlYWR5UmVzb2x2ZTogYW55O1xyXG4gIHB1YmxpYyByZWFkeVJlamVjdDogYW55O1xyXG5cclxuICBwdWJsaWMgcHJvamVjdFJlYWR5PzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBhY2Nlc3NSZWFkeT86IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgdXNlclJlYWR5PzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBmb3JtQWNjZXNzOiBhbnkgPSB7fTtcclxuICBwdWJsaWMgc3VibWlzc2lvbkFjY2VzczogYW55ID0ge307XHJcbiAgcHVibGljIHJvbGVzOiBhbnk7XHJcbiAgcHVibGljIGlzOiBhbnkgPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgYXBwQ29uZmlnOiBGb3JtaW9BcHBDb25maWcsXHJcbiAgICBwdWJsaWMgY29uZmlnOiBGb3JtaW9BdXRoQ29uZmlnXHJcbiAgKSB7XHJcbiAgICB0aGlzLnVzZXIgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLmFwcENvbmZpZyAmJiB0aGlzLmFwcENvbmZpZy5hcHBVcmwpIHtcclxuICAgICAgRm9ybWlvLnNldEJhc2VVcmwodGhpcy5hcHBDb25maWcuYXBpVXJsKTtcclxuICAgICAgRm9ybWlvLnNldFByb2plY3RVcmwodGhpcy5hcHBDb25maWcuYXBwVXJsKTtcclxuICAgICAgRm9ybWlvLmZvcm1Pbmx5ID0gISF0aGlzLmFwcENvbmZpZy5mb3JtT25seTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYW4gQXBwQ29uZmlnIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9naW5Gb3JtID1cclxuICAgICAgdGhpcy5hcHBDb25maWcuYXBwVXJsICtcclxuICAgICAgJy8nICtcclxuICAgICAgZ2V0KHRoaXMuY29uZmlnLCAnbG9naW4uZm9ybScsICd1c2VyL2xvZ2luJyk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRm9ybSA9XHJcbiAgICAgIHRoaXMuYXBwQ29uZmlnLmFwcFVybCArXHJcbiAgICAgICcvJyArXHJcbiAgICAgIGdldCh0aGlzLmNvbmZpZywgJ3JlZ2lzdGVyLmZvcm0nLCAndXNlci9yZWdpc3RlcicpO1xyXG4gICAgdGhpcy5yZXNldFBhc3NGb3JtID1cclxuICAgICAgdGhpcy5hcHBDb25maWcuYXBwVXJsICtcclxuICAgICAgJy8nICtcclxuICAgICAgZ2V0KHRoaXMuY29uZmlnLCAncmVnaXN0ZXIuZm9ybScsICdyZXNldHBhc3MnKTtcclxuICAgIHRoaXMub25Mb2dpbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMub25Mb2dvdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm9uUmVnaXN0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm9uVXNlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMub25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0aGlzLnJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWFkeVJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlYWR5UmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUmVnaXN0ZXIgZm9yIHRoZSBjb3JlIGV2ZW50cy5cclxuICAgIEZvcm1pby5ldmVudHMub24oJ2Zvcm1pby5iYWRUb2tlbicsICgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgICBGb3JtaW8uZXZlbnRzLm9uKCdmb3JtaW8uc2Vzc2lvbkV4cGlyZWQnLCAoKSA9PiB0aGlzLmxvZ291dEVycm9yKCkpO1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZWxheUF1dGgpIHtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkxvZ2luU3VibWl0KHN1Ym1pc3Npb246IG9iamVjdCkge1xyXG4gICAgdGhpcy5zZXRVc2VyKHN1Ym1pc3Npb24pO1xyXG4gICAgdGhpcy5vbkxvZ2luLmVtaXQoc3VibWlzc2lvbik7XHJcbiAgfVxyXG5cclxuICBvblJlZ2lzdGVyU3VibWl0KHN1Ym1pc3Npb246IG9iamVjdCkge1xyXG4gICAgdGhpcy5zZXRVc2VyKHN1Ym1pc3Npb24pO1xyXG4gICAgdGhpcy5vblJlZ2lzdGVyLmVtaXQoc3VibWlzc2lvbik7XHJcbiAgfVxyXG5cclxuICBvblJlc2V0UGFzc1N1Ym1pdChzdWJtaXNzaW9uOiBvYmplY3QpIHtcclxuICAgIHRoaXMub25SZXNldFBhc3MuZW1pdChzdWJtaXNzaW9uKTtcclxuICB9XHJcblxyXG4gIGluaXQoKSB7XHJcbiAgICB0aGlzLnByb2plY3RSZWFkeSA9IEZvcm1pby5tYWtlU3RhdGljUmVxdWVzdCh0aGlzLmFwcENvbmZpZy5hcHBVcmwpLnRoZW4oXHJcbiAgICAgIChwcm9qZWN0OiBhbnkpID0+IHtcclxuICAgICAgICBlYWNoKHByb2plY3QuYWNjZXNzLCAoYWNjZXNzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZm9ybUFjY2Vzc1thY2Nlc3MudHlwZV0gPSBhY2Nlc3Mucm9sZXM7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgICgpOiBhbnkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybUFjY2VzcyA9IHt9O1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8vIEdldCB0aGUgYWNjZXNzIGZvciB0aGlzIHByb2plY3QuXHJcbiAgICB0aGlzLmFjY2Vzc1JlYWR5ID0gRm9ybWlvLm1ha2VTdGF0aWNSZXF1ZXN0KFxyXG4gICAgICB0aGlzLmFwcENvbmZpZy5hcHBVcmwgKyAnL2FjY2VzcydcclxuICAgIClcclxuICAgICAgLnRoZW4oKGFjY2VzczogYW55KSA9PiB7XHJcbiAgICAgICAgZWFjaChhY2Nlc3MuZm9ybXMsIChmb3JtOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3VibWlzc2lvbkFjY2Vzc1tmb3JtLm5hbWVdID0ge307XHJcbiAgICAgICAgICBmb3JtLnN1Ym1pc3Npb25BY2Nlc3MuZm9yRWFjaCgoc3ViQWNjZXNzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdWJtaXNzaW9uQWNjZXNzW2Zvcm0ubmFtZV1bc3ViQWNjZXNzLnR5cGVdID0gc3ViQWNjZXNzLnJvbGVzO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yb2xlcyA9IGFjY2Vzcy5yb2xlcztcclxuICAgICAgICByZXR1cm4gYWNjZXNzO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycik6IGFueSA9PiB7XHJcbiAgICAgICAgaWYgKGVyciA9PT0gJ1Rva2VuIEV4cGlyZWQnIHx8IGVyciA9PT0gJ0JhZCBUb2tlbicpIHtcclxuICAgICAgICAgIHRoaXMuc2V0VXNlcihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yb2xlcyA9IHt9O1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9KVxyXG5cclxuICAgIGxldCBjdXJyZW50VXNlclByb21pc2U6IFByb21pc2U8YW55PjtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5vYXV0aCkge1xyXG4gICAgICAvLyBNYWtlIGEgZml4IHRvIHRoZSBoYXNoIHRvIHJlbW92ZSBzdGFydGluZyBcIi9cIiB0aGF0IGFuZ3VsYXIgbWlnaHQgcHV0IHRoZXJlLlxyXG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2gubWF0Y2goL14jXFwvYWNjZXNzX3Rva2VuLykpIHtcclxuICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCB3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKC9eI1xcL2FjY2Vzc190b2tlbi8sICcjYWNjZXNzX3Rva2VuJykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJbml0aWF0ZSB0aGUgU1NPIGlmIHRoZXkgcHJvdmlkZSBvYXV0aCBzZXR0aW5ncy5cclxuICAgICAgY3VycmVudFVzZXJQcm9taXNlID0gRm9ybWlvLnNzb0luaXQodGhpcy5jb25maWcub2F1dGgudHlwZSwgdGhpcy5jb25maWcub2F1dGgub3B0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdXJyZW50VXNlclByb21pc2UgPSBGb3JtaW8uY3VycmVudFVzZXIobnVsbCwge1xyXG4gICAgICAgIGlnbm9yZUNhY2hlOiB0cnVlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlclJlYWR5ID0gY3VycmVudFVzZXJQcm9taXNlLnRoZW4oKHVzZXI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNldFVzZXIodXNlcik7XHJcbiAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICB0aGlzLnNldFVzZXIobnVsbCk7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgd2UgYXJlIHJlZHkgd2hlbiBhbGwgcHJvbWlzZXMgaGF2ZSByZXNvbHZlZC5cclxuICAgIGlmICh0aGlzLmFjY2Vzc1JlYWR5KSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzUmVhZHlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb2plY3RSZWFkeSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnVzZXJSZWFkeSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0cnVlKSlcclxuICAgICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLnJlYWR5UmVqZWN0KGVycikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VXNlcih1c2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IEZvcm1pby5uYW1lc3BhY2UgfHwgJ2Zvcm1pbyc7XHJcbiAgICBpZiAodXNlcikge1xyXG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHtuYW1lc3BhY2V9QXBwVXNlcmAsIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgdGhpcy5zZXRVc2VyUm9sZXMoKTtcclxuICAgICAgRm9ybWlvLnNldFVzZXIodXNlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXIgPSBudWxsO1xyXG4gICAgICB0aGlzLmlzID0ge307XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke25hbWVzcGFjZX1BcHBVc2VyYCk7XHJcbiAgICAgIEZvcm1pby5jbGVhckNhY2hlKCk7XHJcbiAgICAgIEZvcm1pby5zZXRVc2VyKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9ICEhRm9ybWlvLmdldFRva2VuKCk7XHJcbiAgICB0aGlzLm9uVXNlci5lbWl0KHRoaXMudXNlcik7XHJcbiAgfVxyXG5cclxuICBzZXRVc2VyUm9sZXMoKSB7XHJcbiAgICBpZiAodGhpcy5hY2Nlc3NSZWFkeSkge1xyXG4gICAgICB0aGlzLmFjY2Vzc1JlYWR5LnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGVhY2godGhpcy5yb2xlcywgKHJvbGU6IGFueSwgcm9sZU5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMudXNlci5yb2xlcy5pbmRleE9mKHJvbGUuX2lkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1tyb2xlTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvZ291dEVycm9yKCkge1xyXG4gICAgdGhpcy5zZXRVc2VyKG51bGwpO1xyXG4gICAgY29uc3QgbmFtZXNwYWNlID0gRm9ybWlvLm5hbWVzcGFjZSB8fCAnZm9ybWlvJztcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke25hbWVzcGFjZX1Ub2tlbmApO1xyXG4gICAgdGhpcy5vbkVycm9yLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGxvZ291dCgpIHtcclxuICAgIHRoaXMuc2V0VXNlcihudWxsKTtcclxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IEZvcm1pby5uYW1lc3BhY2UgfHwgJ2Zvcm1pbyc7XHJcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7bmFtZXNwYWNlfUxvZ291dEF1dGhVcmxgKSkge1xyXG4gICAgICB3aW5kb3cub3Blbihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHtuYW1lc3BhY2V9TG9nb3V0QXV0aFVybGApLCBudWxsLCAnd2lkdGg9MTAyMCxoZWlnaHQ9NjE4Jyk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke25hbWVzcGFjZX1Mb2dvdXRBdXRoVXJsYClcclxuICAgIH1cclxuICAgIHRoaXMuaGFuZGxlTG9nb3V0KG5hbWVzcGFjZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVMb2dvdXQobmFtZXNwYWNlKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtuYW1lc3BhY2V9VG9rZW5gKTtcclxuICAgIEZvcm1pby5sb2dvdXQoKVxyXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm9uTG9nb3V0LmVtaXQoKSlcclxuICAgICAgLmNhdGNoKCgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==