formioangular-colfuturo
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.
236 lines • 31.3 kB
JavaScript
import { EventEmitter, Injectable, Optional } from "@angular/core";
import { FormioPromiseService } from "formioangular-colfuturo";
import { FormioAlerts } from "formioangular-colfuturo";
import { Formio, Utils } from "formiojs-colfuturo";
import _ from "lodash";
import * as i0 from "@angular/core";
import * as i1 from "formioangular-colfuturo";
import * as i2 from "./resource.config";
import * as i3 from "./resources.service";
export class FormioResourceService {
appConfig;
config;
resourcesService;
initialized = false;
form;
alerts;
resource;
resourceUrl;
formUrl;
formFormio;
formio;
refresh;
resourceResolve;
resourceReject;
resourceLoaded;
resourceLoading;
resourceId;
resources;
ready;
readyResolve;
readyReject;
formLoading;
formLoaded;
formResolve;
formReject;
isLoading;
constructor(appConfig, config, resourcesService) {
this.appConfig = appConfig;
this.config = config;
this.resourcesService = resourcesService;
this.isLoading = true;
this.alerts = new FormioAlerts();
this.refresh = new EventEmitter();
}
initialize() {
console.warn("FormioResourceService.initialize() has been deprecated.");
}
setResource(resourceId) {
this.resourceLoading = null;
this.formLoading = null;
this.ready = new Promise((resolve, reject) => {
this.readyResolve = resolve;
this.readyReject = reject;
});
this.formLoaded = new Promise((resolve, reject) => {
this.formResolve = resolve;
this.formReject = reject;
});
this.resourceLoaded = new Promise((resolve, reject) => {
this.resourceResolve = resolve;
this.resourceReject = reject;
});
this.resourceId = resourceId;
this.resourceUrl = this.appConfig.appUrl + "/" + this.config.form;
if (this.resourceId) {
this.resourceUrl += "/submission/" + this.resourceId;
}
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.formio = new FormioPromiseService(this.resourceUrl);
this.resource = { data: {} };
}
init(route) {
const snapshot = route.snapshot;
const reset = snapshot.queryParams?.hasOwnProperty("reset")
? snapshot.queryParams.reset
: false;
const resourceId = snapshot.params["id"];
if (resourceId && resourceId === this.resourceId && !reset) {
return this.ready;
}
// Set the resource.
this.setResource(resourceId);
// Add this resource service to the list of all resources in context.
if (this.resourcesService) {
this.resources = this.resourcesService.resources;
this.resources[this.config.name] = this;
}
if (this.resourceId) {
return this.loadForm()
.then(() => this.loadResource())
.then(() => this.readyResolve(this.form))
.catch((err) => this.readyReject(err));
}
return this.loadForm()
.then(() => this.readyResolve(this.form))
.catch((err) => this.readyReject(err));
}
onError(error) {
this.alerts.setAlert({
type: "danger",
message: error.message || error,
});
if (this.resourcesService) {
this.resourcesService.error.emit(error);
}
throw error;
}
onFormError(err) {
this.formReject(err);
this.onError(err);
}
loadForm() {
if (this.formLoading) {
return this.formLoading;
}
this.formUrl = this.appConfig.appUrl + "/" + this.config.form;
this.formFormio = new FormioPromiseService(this.formUrl);
this.isLoading = true;
this.formLoading = this.formFormio
.loadForm()
.then((form) => {
this.form = form;
this.formResolve(form);
this.isLoading = false;
this.loadParents();
return form;
}, (err) => this.onFormError(err))
.catch((err) => this.onFormError(err));
return this.formLoading;
}
loadParents() {
if (!this.config.parents || !this.config.parents.length) {
return Promise.resolve([]);
}
if (!this.resourcesService) {
console.warn("You must provide the FormioResources within your application to use nested resources.");
return Promise.resolve([]);
}
return this.formLoading.then((form) => {
// Iterate through the list of parents.
const _parentsLoaded = [];
this.config.parents.forEach((parent) => {
const resourceName = parent.resource || parent;
const resourceField = parent.field || parent;
const filterResource = parent.hasOwnProperty("filter")
? parent.filter
: true;
if (this.resources.hasOwnProperty(resourceName) &&
this.resources[resourceName].resourceLoaded) {
_parentsLoaded.push(this.resources[resourceName].resourceLoaded.then((resource) => {
let parentPath = "";
Utils.eachComponent(form.components, (component, path) => {
if (component.key === resourceField) {
component.hidden = true;
component.clearOnHide = false;
_.set(this.resource.data, path, resource);
parentPath = path;
return true;
}
});
return {
name: parentPath,
filter: filterResource,
resource,
};
}));
}
});
// When all the parents have loaded, emit that to the onParents emitter.
return Promise.all(_parentsLoaded).then((parents) => {
this.refresh.emit({
form: form,
submission: this.resource,
});
return parents;
});
});
}
onSubmissionError(err) {
this.onError(err);
this.resourceReject(err);
}
loadResource() {
if (this.resourceLoading) {
return this.resourceLoading;
}
this.isLoading = true;
this.resourceLoading = this.formio
.loadSubmission(null, { ignoreCache: true })
.then((resource) => {
this.resource = resource;
this.isLoading = false;
this.refresh.emit({
property: "submission",
value: this.resource,
});
this.resourceResolve(resource);
return resource;
}, (err) => this.onSubmissionError(err))
.catch((err) => this.onSubmissionError(err));
return this.resourceLoading;
}
save(resource) {
const formio = resource._id ? this.formio : this.formFormio;
return formio
.saveSubmission(resource)
.then((saved) => {
this.resource = saved;
return saved;
}, (err) => this.onError(err))
.catch((err) => this.onError(err));
}
remove() {
return this.formio
.deleteSubmission()
.then(() => {
this.resource = null;
}, (err) => this.onError(err))
.catch((err) => this.onError(err));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioResourceService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormioResourceConfig }, { token: i3.FormioResources, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioResourceService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioResourceService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.FormioAppConfig }, { type: i2.FormioResourceConfig }, { type: i3.FormioResources, decorators: [{
type: Optional
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZm9ybWlvL3Jlc291cmNlL3NyYy9yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUluRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7O0FBR3ZCLE1BQU0sT0FBTyxxQkFBcUI7SUE4QnZCO0lBQ0E7SUFDWTtJQS9CZCxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksQ0FBTTtJQUNWLE1BQU0sQ0FBZTtJQUNyQixRQUFRLENBQU07SUFDZCxXQUFXLENBQVU7SUFDckIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBdUI7SUFDakMsTUFBTSxDQUF1QjtJQUM3QixPQUFPLENBQW1DO0lBRTFDLGVBQWUsQ0FBTTtJQUNyQixjQUFjLENBQU07SUFDcEIsY0FBYyxDQUFnQjtJQUU5QixlQUFlLENBQWdCO0lBQy9CLFVBQVUsQ0FBVTtJQUNwQixTQUFTLENBQU07SUFFZixLQUFLLENBQWdCO0lBQ3JCLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsV0FBVyxDQUFnQjtJQUMzQixVQUFVLENBQWU7SUFDekIsV0FBVyxDQUFNO0lBQ2pCLFVBQVUsQ0FBTTtJQUNoQixTQUFTLENBQVU7SUFFMUIsWUFDUyxTQUEwQixFQUMxQixNQUE0QixFQUNoQixnQkFBaUM7UUFGN0MsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsV0FB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RyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVELE9BQU8sTUFBTTthQUNWLGNBQWMsQ0FBQyxRQUFRLENBQUM7YUFDeEIsSUFBSSxDQUNILENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRCxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FDaEM7YUFDQSxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU07YUFDZixnQkFBZ0IsRUFBRTthQUNsQixJQUFJLENBQ0gsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQyxFQUNELENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUNoQzthQUNBLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBL1BVLHFCQUFxQjs0R0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQURqQyxVQUFVOzswQkFpQ04sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgRm9ybWlvUmVzb3VyY2VDb25maWcgfSBmcm9tIFwiLi9yZXNvdXJjZS5jb25maWdcIjtcclxuaW1wb3J0IHsgRm9ybWlvUmVzb3VyY2VzIH0gZnJvbSBcIi4vcmVzb3VyY2VzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRm9ybWlvUHJvbWlzZVNlcnZpY2UgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IHsgRm9ybWlvQWxlcnRzIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XHJcbmltcG9ydCB7IEZvcm1pb0FwcENvbmZpZyB9IGZyb20gXCJmb3JtaW9hbmd1bGFyLWNvbGZ1dHVyb1wiO1xyXG5pbXBvcnQgeyBGb3JtaW9SZWZyZXNoVmFsdWUgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IHsgRm9ybWlvLCBVdGlscyB9IGZyb20gXCJmb3JtaW9qcy1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRm9ybWlvUmVzb3VyY2VTZXJ2aWNlIHtcclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZm9ybTogYW55O1xyXG4gIHB1YmxpYyBhbGVydHM6IEZvcm1pb0FsZXJ0cztcclxuICBwdWJsaWMgcmVzb3VyY2U6IGFueTtcclxuICBwdWJsaWMgcmVzb3VyY2VVcmw/OiBzdHJpbmc7XHJcbiAgcHVibGljIGZvcm1Vcmw6IHN0cmluZztcclxuICBwdWJsaWMgZm9ybUZvcm1pbzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgcHVibGljIGZvcm1pbzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgcHVibGljIHJlZnJlc2g6IEV2ZW50RW1pdHRlcjxGb3JtaW9SZWZyZXNoVmFsdWU+O1xyXG5cclxuICBwdWJsaWMgcmVzb3VyY2VSZXNvbHZlOiBhbnk7XHJcbiAgcHVibGljIHJlc291cmNlUmVqZWN0OiBhbnk7XHJcbiAgcHVibGljIHJlc291cmNlTG9hZGVkPzogUHJvbWlzZTxhbnk+O1xyXG5cclxuICBwdWJsaWMgcmVzb3VyY2VMb2FkaW5nPzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyByZXNvdXJjZUlkPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZXNvdXJjZXM6IGFueTtcclxuXHJcbiAgcHVibGljIHJlYWR5PzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyByZWFkeVJlc29sdmU6IGFueTtcclxuICBwdWJsaWMgcmVhZHlSZWplY3Q6IGFueTtcclxuXHJcbiAgcHVibGljIGZvcm1Mb2FkaW5nPzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBmb3JtTG9hZGVkOiBQcm9taXNlPGFueT47XHJcbiAgcHVibGljIGZvcm1SZXNvbHZlOiBhbnk7XHJcbiAgcHVibGljIGZvcm1SZWplY3Q6IGFueTtcclxuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBhcHBDb25maWc6IEZvcm1pb0FwcENvbmZpZyxcclxuICAgIHB1YmxpYyBjb25maWc6IEZvcm1pb1Jlc291cmNlQ29uZmlnLFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlc291cmNlc1NlcnZpY2U6IEZvcm1pb1Jlc291cmNlc1xyXG4gICkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hbGVydHMgPSBuZXcgRm9ybWlvQWxlcnRzKCk7XHJcbiAgICB0aGlzLnJlZnJlc2ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgY29uc29sZS53YXJuKFwiRm9ybWlvUmVzb3VyY2VTZXJ2aWNlLmluaXRpYWxpemUoKSBoYXMgYmVlbiBkZXByZWNhdGVkLlwiKTtcclxuICB9XHJcblxyXG4gIHNldFJlc291cmNlKHJlc291cmNlSWQ6IGFueSkge1xyXG4gICAgdGhpcy5yZXNvdXJjZUxvYWRpbmcgPSBudWxsO1xyXG4gICAgdGhpcy5mb3JtTG9hZGluZyA9IG51bGw7XHJcbiAgICB0aGlzLnJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWFkeVJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlYWR5UmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1Mb2FkZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmZvcm1SZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgdGhpcy5mb3JtUmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc291cmNlTG9hZGVkID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlc291cmNlUmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc291cmNlSWQgPSByZXNvdXJjZUlkO1xyXG4gICAgdGhpcy5yZXNvdXJjZVVybCA9IHRoaXMuYXBwQ29uZmlnLmFwcFVybCArIFwiL1wiICsgdGhpcy5jb25maWcuZm9ybTtcclxuICAgIGlmICh0aGlzLnJlc291cmNlSWQpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVVybCArPSBcIi9zdWJtaXNzaW9uL1wiICsgdGhpcy5yZXNvdXJjZUlkO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBwQ29uZmlnICYmIHRoaXMuYXBwQ29uZmlnLmFwcFVybCkge1xyXG4gICAgICBGb3JtaW8uc2V0QmFzZVVybCh0aGlzLmFwcENvbmZpZy5hcGlVcmwpO1xyXG4gICAgICBGb3JtaW8uc2V0UHJvamVjdFVybCh0aGlzLmFwcENvbmZpZy5hcHBVcmwpO1xyXG4gICAgICBGb3JtaW8uZm9ybU9ubHkgPSB0aGlzLmFwcENvbmZpZy5mb3JtT25seTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGFuIEFwcENvbmZpZyB3aXRoaW4geW91ciBhcHBsaWNhdGlvbiFcIik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1pbyA9IG5ldyBGb3JtaW9Qcm9taXNlU2VydmljZSh0aGlzLnJlc291cmNlVXJsKTtcclxuICAgIHRoaXMucmVzb3VyY2UgPSB7IGRhdGE6IHt9IH07XHJcbiAgfVxyXG5cclxuICBpbml0KHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgY29uc3Qgc25hcHNob3QgPSByb3V0ZS5zbmFwc2hvdDtcclxuICAgIGNvbnN0IHJlc2V0ID0gc25hcHNob3QucXVlcnlQYXJhbXM/Lmhhc093blByb3BlcnR5KFwicmVzZXRcIilcclxuICAgICAgPyBzbmFwc2hvdC5xdWVyeVBhcmFtcy5yZXNldFxyXG4gICAgICA6IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHNuYXBzaG90LnBhcmFtc1tcImlkXCJdO1xyXG4gICAgaWYgKHJlc291cmNlSWQgJiYgcmVzb3VyY2VJZCA9PT0gdGhpcy5yZXNvdXJjZUlkICYmICFyZXNldCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZWFkeTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgdGhlIHJlc291cmNlLlxyXG4gICAgdGhpcy5zZXRSZXNvdXJjZShyZXNvdXJjZUlkKTtcclxuXHJcbiAgICAvLyBBZGQgdGhpcyByZXNvdXJjZSBzZXJ2aWNlIHRvIHRoZSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgaW4gY29udGV4dC5cclxuICAgIGlmICh0aGlzLnJlc291cmNlc1NlcnZpY2UpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlc1NlcnZpY2UucmVzb3VyY2VzO1xyXG4gICAgICB0aGlzLnJlc291cmNlc1t0aGlzLmNvbmZpZy5uYW1lXSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVzb3VyY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkRm9ybSgpXHJcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkUmVzb3VyY2UoKSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0aGlzLmZvcm0pKVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLnJlYWR5UmVqZWN0KGVycikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxvYWRGb3JtKClcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFkeVJlc29sdmUodGhpcy5mb3JtKSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMucmVhZHlSZWplY3QoZXJyKSk7XHJcbiAgfVxyXG5cclxuICBvbkVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0KHtcclxuICAgICAgdHlwZTogXCJkYW5nZXJcIixcclxuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBlcnJvcixcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMucmVzb3VyY2VzU2VydmljZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZXJyb3IuZW1pdChlcnJvcik7XHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJvcjtcclxuICB9XHJcblxyXG4gIG9uRm9ybUVycm9yKGVycjogYW55KSB7XHJcbiAgICB0aGlzLmZvcm1SZWplY3QoZXJyKTtcclxuICAgIHRoaXMub25FcnJvcihlcnIpO1xyXG4gIH1cclxuXHJcbiAgbG9hZEZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtTG9hZGluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtTG9hZGluZztcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybVVybCA9IHRoaXMuYXBwQ29uZmlnLmFwcFVybCArIFwiL1wiICsgdGhpcy5jb25maWcuZm9ybTtcclxuICAgIHRoaXMuZm9ybUZvcm1pbyA9IG5ldyBGb3JtaW9Qcm9taXNlU2VydmljZSh0aGlzLmZvcm1VcmwpO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtTG9hZGluZyA9IHRoaXMuZm9ybUZvcm1pb1xyXG4gICAgICAubG9hZEZvcm0oKVxyXG4gICAgICAudGhlbihcclxuICAgICAgICAoZm9ybTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xyXG4gICAgICAgICAgdGhpcy5mb3JtUmVzb2x2ZShmb3JtKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYXJlbnRzKCk7XHJcbiAgICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpKTtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Mb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgbG9hZFBhcmVudHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLnBhcmVudHMgfHwgIXRoaXMuY29uZmlnLnBhcmVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnJlc291cmNlc1NlcnZpY2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiWW91IG11c3QgcHJvdmlkZSB0aGUgRm9ybWlvUmVzb3VyY2VzIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHRvIHVzZSBuZXN0ZWQgcmVzb3VyY2VzLlwiXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUxvYWRpbmcudGhlbigoZm9ybSkgPT4ge1xyXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgcGFyZW50cy5cclxuICAgICAgY29uc3QgX3BhcmVudHNMb2FkZWQ6IEFycmF5PFByb21pc2U8YW55Pj4gPSBbXTtcclxuICAgICAgdGhpcy5jb25maWcucGFyZW50cy5mb3JFYWNoKChwYXJlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHBhcmVudC5yZXNvdXJjZSB8fCBwYXJlbnQ7XHJcbiAgICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZCA9IHBhcmVudC5maWVsZCB8fCBwYXJlbnQ7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzb3VyY2UgPSBwYXJlbnQuaGFzT3duUHJvcGVydHkoXCJmaWx0ZXJcIilcclxuICAgICAgICAgID8gcGFyZW50LmZpbHRlclxyXG4gICAgICAgICAgOiB0cnVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzLmhhc093blByb3BlcnR5KHJlc291cmNlTmFtZSkgJiZcclxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIF9wYXJlbnRzTG9hZGVkLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWQudGhlbihcclxuICAgICAgICAgICAgICAocmVzb3VyY2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudFBhdGggPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZWFjaENvbXBvbmVudChmb3JtLmNvbXBvbmVudHMsIChjb21wb25lbnQsIHBhdGgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5rZXkgPT09IHJlc291cmNlRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2xlYXJPbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBfLnNldCh0aGlzLnJlc291cmNlLmRhdGEsIHBhdGgsIHJlc291cmNlKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gcGF0aDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBwYXJlbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlclJlc291cmNlLFxyXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBXaGVuIGFsbCB0aGUgcGFyZW50cyBoYXZlIGxvYWRlZCwgZW1pdCB0aGF0IHRvIHRoZSBvblBhcmVudHMgZW1pdHRlci5cclxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKF9wYXJlbnRzTG9hZGVkKS50aGVuKChwYXJlbnRzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnJlZnJlc2guZW1pdCh7XHJcbiAgICAgICAgICBmb3JtOiBmb3JtLFxyXG4gICAgICAgICAgc3VibWlzc2lvbjogdGhpcy5yZXNvdXJjZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3VibWlzc2lvbkVycm9yKGVycjogYW55KSB7XHJcbiAgICB0aGlzLm9uRXJyb3IoZXJyKTtcclxuICAgIHRoaXMucmVzb3VyY2VSZWplY3QoZXJyKTtcclxuICB9XHJcblxyXG4gIGxvYWRSZXNvdXJjZSgpIHtcclxuICAgIGlmICh0aGlzLnJlc291cmNlTG9hZGluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUxvYWRpbmc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnJlc291cmNlTG9hZGluZyA9IHRoaXMuZm9ybWlvXHJcbiAgICAgIC5sb2FkU3VibWlzc2lvbihudWxsLCB7IGlnbm9yZUNhY2hlOiB0cnVlIH0pXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgIChyZXNvdXJjZTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoLmVtaXQoe1xyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJzdWJtaXNzaW9uXCIsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlc291cmNlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlUmVzb2x2ZShyZXNvdXJjZSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25TdWJtaXNzaW9uRXJyb3IoZXJyKVxyXG4gICAgICApXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMub25TdWJtaXNzaW9uRXJyb3IoZXJyKSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUxvYWRpbmc7XHJcbiAgfVxyXG5cclxuICBzYXZlKHJlc291cmNlOiBhbnkpIHtcclxuICAgIGNvbnN0IGZvcm1pbyA9IHJlc291cmNlLl9pZCA/IHRoaXMuZm9ybWlvIDogdGhpcy5mb3JtRm9ybWlvO1xyXG4gICAgcmV0dXJuIGZvcm1pb1xyXG4gICAgICAuc2F2ZVN1Ym1pc3Npb24ocmVzb3VyY2UpXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgIChzYXZlZDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlID0gc2F2ZWQ7XHJcbiAgICAgICAgICByZXR1cm4gc2F2ZWQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkVycm9yKGVycikpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWlvXHJcbiAgICAgIC5kZWxldGVTdWJtaXNzaW9uKClcclxuICAgICAgLnRoZW4oXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkVycm9yKGVycikpO1xyXG4gIH1cclxufVxyXG4iXX0=