formioangular-colfuturo
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.
202 lines • 26.4 kB
JavaScript
import { Injectable } from "@angular/core";
import { Formio } from "formiojs-colfuturo";
import _intersection from "lodash/intersection";
import * as i0 from "@angular/core";
import * as i1 from "formioangular-colfuturo";
import * as i2 from "./form-manager.config";
import * as i3 from "formioangular-colfuturo/auth";
export class FormManagerService {
appConfig;
config;
auth;
formio;
access;
allAccessMap;
ownAccessMap;
ready;
formReady;
actionAllowed;
form = null;
formSrc = "";
perms = { delete: false, edit: false };
constructor(appConfig, config, auth) {
this.appConfig = appConfig;
this.config = config;
this.auth = auth;
if (this.appConfig && this.appConfig.appUrl) {
Formio.setBaseUrl(this.appConfig.apiUrl);
Formio.setProjectUrl(this.appConfig.appUrl);
}
else {
console.error("You must provide an AppConfig within your application!");
}
this.allAccessMap = {
update_all: "formEdit",
delete_all: "formDelete",
};
this.ownAccessMap = {
update_own: "formEdit",
delete_own: "formDelete",
};
this.actionAllowed = (action) => this.isActionAllowed(action);
this.reset();
}
isActionAllowed(action) {
return this.access[action];
}
setAccess() {
this.access = {
formCreate: true,
formView: true,
formSubmission: true,
formEdit: true,
formPermission: true,
formDelete: true,
projectSettings: true,
userManagement: true,
};
if (this.auth) {
this.access = {
formCreate: false,
formView: false,
formSubmission: false,
formEdit: false,
formPermission: false,
formDelete: false,
projectSettings: false,
userManagement: false,
};
this.ready = this.auth.ready.then(() => {
let administrator = this.auth.roles["administrator"];
let formbuilder = this.auth.roles["formbuilder"];
let formadmin = this.auth.roles["formadmin"];
if (this.auth.user && this.auth.user.roles) {
this.auth.user.roles.forEach((roleId) => {
if (administrator._id === roleId) {
this.access.formCreate = true;
this.access.formView = true;
this.access.formSubmission = true;
this.access.formEdit = true;
this.access.formPermission = true;
this.access.formDelete = true;
this.access.projectSettings = true;
this.access.userManagement = true;
}
else {
if (formadmin && formadmin._id === roleId) {
this.access.formCreate =
this.auth.formAccess.create_all.includes(roleId);
this.access.formEdit =
this.auth.formAccess.update_all.includes(roleId);
this.access.formPermission =
this.auth.formAccess.update_all.includes(roleId);
this.access.formDelete =
this.auth.formAccess.delete_all.includes(roleId);
this.access.formView =
this.auth.formAccess.read_all.includes(roleId);
this.access.formSubmission =
this.auth.formAccess.read_all.includes(roleId);
}
if (formbuilder && formbuilder._id === roleId) {
this.access.formCreate =
this.auth.formAccess.create_all.includes(roleId);
this.access.formEdit =
this.auth.formAccess.update_all.includes(roleId);
this.access.formPermission =
this.auth.formAccess.update_all.includes(roleId);
this.access.formDelete =
this.auth.formAccess.delete_all.includes(roleId);
this.access.formView =
this.auth.formAccess.read_all.includes(roleId);
}
}
});
}
});
}
else {
this.ready = Promise.resolve(false);
}
}
reset(route) {
if (route) {
route.params.subscribe((params) => {
if (params.id) {
this.formio = new Formio(`${this.formio.formsUrl}/${params.id}`);
}
else {
this.reset();
}
});
}
else {
this.formio = new Formio(this.appConfig.appUrl);
this.setAccess();
}
}
hasAccess(roles) {
if (!this.auth.user) {
return false;
}
return !!_intersection(roles, this.auth.user.roles).length;
}
setForm(form) {
this.form = form;
this.formSrc = this.appConfig.appUrl + "/" + form.path;
if (form.access) {
// Check if they have access here.
form.access.forEach((access) => {
// Check for all access.
if (this.allAccessMap[access.type] &&
!this.access[this.allAccessMap[access.type]]) {
this.access[this.allAccessMap[access.type]] = this.hasAccess(access.roles);
}
// Check for own access.
if (this.auth &&
this.auth.user &&
form._id === this.auth.user._id &&
this.ownAccessMap[access.type] &&
!this.access[this.ownAccessMap[access.type]]) {
this.access[this.ownAccessMap[access.type]] = this.hasAccess(access.roles);
}
});
}
return form;
}
loadForm() {
this.form = null;
this.formReady = this.formio.loadForm().then((form) => this.setForm(form));
return this.formReady;
}
setSubmission(route) {
return new Promise((resolve) => {
route.params.subscribe((params) => {
this.formio = new Formio(`${this.formio.submissionsUrl}/${params.id}`);
resolve(this.formio);
});
});
}
submissionLoaded(submission) {
this.auth.ready.then(() => {
this.formio
.userPermissions(this.auth.user, this.form, submission)
.then((perms) => {
this.perms.delete = perms.delete;
this.perms.edit = perms.edit;
});
});
}
loadForms() {
return this.formio.loadForms({
params: {
tags: this.config.tag,
},
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormManagerService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormManagerConfig }, { token: i3.FormioAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormManagerService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormManagerService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.FormioAppConfig }, { type: i2.FormManagerConfig }, { type: i3.FormioAuthService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWZvcm1pby9tYW5hZ2VyL3NyYy9mb3JtLW1hbmFnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFHaEQsTUFBTSxPQUFPLGtCQUFrQjtJQWFwQjtJQUNBO0lBQ0E7SUFkRixNQUFNLENBQVM7SUFDZixNQUFNLENBQU07SUFDWixZQUFZLENBQU07SUFDbEIsWUFBWSxDQUFNO0lBQ2xCLEtBQUssQ0FBZTtJQUNwQixTQUFTLENBQWU7SUFDeEIsYUFBYSxDQUFNO0lBQ25CLElBQUksR0FBRyxJQUFJLENBQUM7SUFDWixPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2IsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFOUMsWUFDUyxTQUEwQixFQUMxQixNQUF5QixFQUN6QixJQUF1QjtRQUZ2QixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN6QixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUU5QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFD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LENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFlO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU07aUJBQ1IsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO2lCQUN0RCxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDM0IsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7YUFDdEI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXpNVSxrQkFBa0I7NEdBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybWlvQXBwQ29uZmlnIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBGb3JtTWFuYWdlckNvbmZpZyB9IGZyb20gXCIuL2Zvcm0tbWFuYWdlci5jb25maWdcIjtcbmltcG9ydCB7IEZvcm1pbyB9IGZyb20gXCJmb3JtaW9qcy1jb2xmdXR1cm9cIjtcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgRm9ybWlvQXV0aFNlcnZpY2UgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm8vYXV0aFwiO1xuaW1wb3J0IF9pbnRlcnNlY3Rpb24gZnJvbSBcImxvZGFzaC9pbnRlcnNlY3Rpb25cIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1NYW5hZ2VyU2VydmljZSB7XG4gIHB1YmxpYyBmb3JtaW86IEZvcm1pbztcbiAgcHVibGljIGFjY2VzczogYW55O1xuICBwdWJsaWMgYWxsQWNjZXNzTWFwOiBhbnk7XG4gIHB1YmxpYyBvd25BY2Nlc3NNYXA6IGFueTtcbiAgcHVibGljIHJlYWR5OiBQcm9taXNlPGFueT47XG4gIHB1YmxpYyBmb3JtUmVhZHk6IFByb21pc2U8YW55PjtcbiAgcHVibGljIGFjdGlvbkFsbG93ZWQ6IGFueTtcbiAgcHVibGljIGZvcm0gPSBudWxsO1xuICBwdWJsaWMgZm9ybVNyYyA9IFwiXCI7XG4gIHB1YmxpYyBwZXJtcyA9IHsgZGVsZXRlOiBmYWxzZSwgZWRpdDogZmFsc2UgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYXBwQ29uZmlnOiBGb3JtaW9BcHBDb25maWcsXG4gICAgcHVibGljIGNvbmZpZzogRm9ybU1hbmFnZXJDb25maWcsXG4gICAgcHVibGljIGF1dGg6IEZvcm1pb0F1dGhTZXJ2aWNlXG4gICkge1xuICAgIGlmICh0aGlzLmFwcENvbmZpZyAmJiB0aGlzLmFwcENvbmZpZy5hcHBVcmwpIHtcbiAgICAgIEZvcm1pby5zZXRCYXNlVXJsKHRoaXMuYXBwQ29uZmlnLmFwaVVybCk7XG4gICAgICBGb3JtaW8uc2V0UHJvamVjdFVybCh0aGlzLmFwcENvbmZpZy5hcHBVcmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiWW91IG11c3QgcHJvdmlkZSBhbiBBcHBDb25maWcgd2l0aGluIHlvdXIgYXBwbGljYXRpb24hXCIpO1xuICAgIH1cblxuICAgIHRoaXMuYWxsQWNjZXNzTWFwID0ge1xuICAgICAgdXBkYXRlX2FsbDogXCJmb3JtRWRpdFwiLFxuICAgICAgZGVsZXRlX2FsbDogXCJmb3JtRGVsZXRlXCIsXG4gICAgfTtcbiAgICB0aGlzLm93bkFjY2Vzc01hcCA9IHtcbiAgICAgIHVwZGF0ZV9vd246IFwiZm9ybUVkaXRcIixcbiAgICAgIGRlbGV0ZV9vd246IFwiZm9ybURlbGV0ZVwiLFxuICAgIH07XG4gICAgdGhpcy5hY3Rpb25BbGxvd2VkID0gKGFjdGlvbikgPT4gdGhpcy5pc0FjdGlvbkFsbG93ZWQoYWN0aW9uKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBpc0FjdGlvbkFsbG93ZWQoYWN0aW9uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hY2Nlc3NbYWN0aW9uXTtcbiAgfVxuXG4gIHNldEFjY2VzcygpIHtcbiAgICB0aGlzLmFjY2VzcyA9IHtcbiAgICAgIGZvcm1DcmVhdGU6IHRydWUsXG4gICAgICBmb3JtVmlldzogdHJ1ZSxcbiAgICAgIGZvcm1TdWJtaXNzaW9uOiB0cnVlLFxuICAgICAgZm9ybUVkaXQ6IHRydWUsXG4gICAgICBmb3JtUGVybWlzc2lvbjogdHJ1ZSxcbiAgICAgIGZvcm1EZWxldGU6IHRydWUsXG4gICAgICBwcm9qZWN0U2V0dGluZ3M6IHRydWUsXG4gICAgICB1c2VyTWFuYWdlbWVudDogdHJ1ZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmF1dGgpIHtcbiAgICAgIHRoaXMuYWNjZXNzID0ge1xuICAgICAgICBmb3JtQ3JlYXRlOiBmYWxzZSxcbiAgICAgICAgZm9ybVZpZXc6IGZhbHNlLFxuICAgICAgICBmb3JtU3VibWlzc2lvbjogZmFsc2UsXG4gICAgICAgIGZvcm1FZGl0OiBmYWxzZSxcbiAgICAgICAgZm9ybVBlcm1pc3Npb246IGZhbHNlLFxuICAgICAgICBmb3JtRGVsZXRlOiBmYWxzZSxcbiAgICAgICAgcHJvamVjdFNldHRpbmdzOiBmYWxzZSxcbiAgICAgICAgdXNlck1hbmFnZW1lbnQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMucmVhZHkgPSB0aGlzLmF1dGgucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgIGxldCBhZG1pbmlzdHJhdG9yID0gdGhpcy5hdXRoLnJvbGVzW1wiYWRtaW5pc3RyYXRvclwiXTtcbiAgICAgICAgbGV0IGZvcm1idWlsZGVyID0gdGhpcy5hdXRoLnJvbGVzW1wiZm9ybWJ1aWxkZXJcIl07XG4gICAgICAgIGxldCBmb3JtYWRtaW4gPSB0aGlzLmF1dGgucm9sZXNbXCJmb3JtYWRtaW5cIl07XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0aC51c2VyICYmIHRoaXMuYXV0aC51c2VyLnJvbGVzKSB7XG4gICAgICAgICAgdGhpcy5hdXRoLnVzZXIucm9sZXMuZm9yRWFjaCgocm9sZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChhZG1pbmlzdHJhdG9yLl9pZCA9PT0gcm9sZUlkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1DcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtVmlldyA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1TdWJtaXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybUVkaXQgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtUGVybWlzc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1EZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5wcm9qZWN0U2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy51c2VyTWFuYWdlbWVudCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoZm9ybWFkbWluICYmIGZvcm1hZG1pbi5faWQgPT09IHJvbGVJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1DcmVhdGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoLmZvcm1BY2Nlc3MuY3JlYXRlX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1FZGl0ID1cbiAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aC5mb3JtQWNjZXNzLnVwZGF0ZV9hbGwuaW5jbHVkZXMocm9sZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtUGVybWlzc2lvbiA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmF1dGguZm9ybUFjY2Vzcy51cGRhdGVfYWxsLmluY2x1ZGVzKHJvbGVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybURlbGV0ZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmF1dGguZm9ybUFjY2Vzcy5kZWxldGVfYWxsLmluY2x1ZGVzKHJvbGVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybVZpZXcgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoLmZvcm1BY2Nlc3MucmVhZF9hbGwuaW5jbHVkZXMocm9sZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtU3VibWlzc2lvbiA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmF1dGguZm9ybUFjY2Vzcy5yZWFkX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChmb3JtYnVpbGRlciAmJiBmb3JtYnVpbGRlci5faWQgPT09IHJvbGVJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1DcmVhdGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoLmZvcm1BY2Nlc3MuY3JlYXRlX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1FZGl0ID1cbiAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aC5mb3JtQWNjZXNzLnVwZGF0ZV9hbGwuaW5jbHVkZXMocm9sZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtUGVybWlzc2lvbiA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmF1dGguZm9ybUFjY2Vzcy51cGRhdGVfYWxsLmluY2x1ZGVzKHJvbGVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybURlbGV0ZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmF1dGguZm9ybUFjY2Vzcy5kZWxldGVfYWxsLmluY2x1ZGVzKHJvbGVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybVZpZXcgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoLmZvcm1BY2Nlc3MucmVhZF9hbGwuaW5jbHVkZXMocm9sZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWFkeSA9IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXQocm91dGU/OiBBY3RpdmF0ZWRSb3V0ZSkge1xuICAgIGlmIChyb3V0ZSkge1xuICAgICAgcm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1pbyA9IG5ldyBGb3JtaW8oYCR7dGhpcy5mb3JtaW8uZm9ybXNVcmx9LyR7cGFyYW1zLmlkfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pbyh0aGlzLmFwcENvbmZpZy5hcHBVcmwpO1xuICAgICAgdGhpcy5zZXRBY2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBoYXNBY2Nlc3Mocm9sZXMpIHtcbiAgICBpZiAoIXRoaXMuYXV0aC51c2VyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIV9pbnRlcnNlY3Rpb24ocm9sZXMsIHRoaXMuYXV0aC51c2VyLnJvbGVzKS5sZW5ndGg7XG4gIH1cblxuICBzZXRGb3JtKGZvcm06IGFueSkge1xuICAgIHRoaXMuZm9ybSA9IGZvcm07XG4gICAgdGhpcy5mb3JtU3JjID0gdGhpcy5hcHBDb25maWcuYXBwVXJsICsgXCIvXCIgKyBmb3JtLnBhdGg7XG4gICAgaWYgKGZvcm0uYWNjZXNzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGV5IGhhdmUgYWNjZXNzIGhlcmUuXG4gICAgICBmb3JtLmFjY2Vzcy5mb3JFYWNoKChhY2Nlc3MpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGFsbCBhY2Nlc3MuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFsbEFjY2Vzc01hcFthY2Nlc3MudHlwZV0gJiZcbiAgICAgICAgICAhdGhpcy5hY2Nlc3NbdGhpcy5hbGxBY2Nlc3NNYXBbYWNjZXNzLnR5cGVdXVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmFjY2Vzc1t0aGlzLmFsbEFjY2Vzc01hcFthY2Nlc3MudHlwZV1dID0gdGhpcy5oYXNBY2Nlc3MoXG4gICAgICAgICAgICBhY2Nlc3Mucm9sZXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIG93biBhY2Nlc3MuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmF1dGggJiZcbiAgICAgICAgICB0aGlzLmF1dGgudXNlciAmJlxuICAgICAgICAgIGZvcm0uX2lkID09PSB0aGlzLmF1dGgudXNlci5faWQgJiZcbiAgICAgICAgICB0aGlzLm93bkFjY2Vzc01hcFthY2Nlc3MudHlwZV0gJiZcbiAgICAgICAgICAhdGhpcy5hY2Nlc3NbdGhpcy5vd25BY2Nlc3NNYXBbYWNjZXNzLnR5cGVdXVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmFjY2Vzc1t0aGlzLm93bkFjY2Vzc01hcFthY2Nlc3MudHlwZV1dID0gdGhpcy5oYXNBY2Nlc3MoXG4gICAgICAgICAgICBhY2Nlc3Mucm9sZXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm07XG4gIH1cblxuICBsb2FkRm9ybSgpIHtcbiAgICB0aGlzLmZvcm0gPSBudWxsO1xuICAgIHRoaXMuZm9ybVJlYWR5ID0gdGhpcy5mb3JtaW8ubG9hZEZvcm0oKS50aGVuKChmb3JtKSA9PiB0aGlzLnNldEZvcm0oZm9ybSkpO1xuICAgIHJldHVybiB0aGlzLmZvcm1SZWFkeTtcbiAgfVxuXG4gIHNldFN1Ym1pc3Npb24ocm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICByb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtaW8gPSBuZXcgRm9ybWlvKGAke3RoaXMuZm9ybWlvLnN1Ym1pc3Npb25zVXJsfS8ke3BhcmFtcy5pZH1gKTtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLmZvcm1pbyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pc3Npb25Mb2FkZWQoc3VibWlzc2lvbjogYW55KSB7XG4gICAgdGhpcy5hdXRoLnJlYWR5LnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5mb3JtaW9cbiAgICAgICAgLnVzZXJQZXJtaXNzaW9ucyh0aGlzLmF1dGgudXNlciwgdGhpcy5mb3JtLCBzdWJtaXNzaW9uKVxuICAgICAgICAudGhlbigocGVybXMpID0+IHtcbiAgICAgICAgICB0aGlzLnBlcm1zLmRlbGV0ZSA9IHBlcm1zLmRlbGV0ZTtcbiAgICAgICAgICB0aGlzLnBlcm1zLmVkaXQgPSBwZXJtcy5lZGl0O1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRGb3JtcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtaW8ubG9hZEZvcm1zKHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB0YWdzOiB0aGlzLmNvbmZpZy50YWcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=