formioangular-colfuturo
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.
260 lines • 36.9 kB
JavaScript
import { GridFooterPositions } from "./types/grid-footer-positions";
import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, } from "@angular/core";
import { each } from "lodash";
import { FormioCore as Formio } from "formiojs-colfuturo";
import FormComponents from "./form/index";
import SubmissionComponents from "./submission/index";
import { FormioPromiseService } from "formioangular-colfuturo";
import { SortType } from "./types/grid-header";
import * as i0 from "@angular/core";
import * as i1 from "formioangular-colfuturo";
import * as i2 from "@angular/common";
export class FormioGridComponent {
alerts;
resolver;
ref;
footerPosition = GridFooterPositions.bottom;
src;
items;
onForm;
query;
refresh;
columns;
gridType;
size;
components;
formio;
label;
createText;
isActionAllowed;
select;
rowSelect;
rowAction;
createItem;
error;
headerElement;
bodyElement;
footerElement;
page = 0;
isLoading = false;
initialized = false;
header;
body;
footer;
footerPositions = GridFooterPositions;
constructor(alerts, resolver, ref) {
this.alerts = alerts;
this.resolver = resolver;
this.ref = ref;
this.select = this.rowSelect = new EventEmitter();
this.rowAction = new EventEmitter();
this.createItem = new EventEmitter();
this.error = new EventEmitter();
this.isLoading = true;
}
createComponent(property, component) {
const factory = this.resolver.resolveComponentFactory(component);
const componentRef = property.createComponent(factory);
return componentRef.instance;
}
loadGrid(src) {
// If no source is provided, then skip.
if (!src && !this.formio) {
return;
}
// Do not double load.
if (this.formio && this.src && src === this.src) {
return;
}
if (src) {
this.src = src;
this.formio = new FormioPromiseService(this.src, { formOnly: true });
}
// Load the header.
this.header
.load(this.formio, {}, this.columns)
.then(() => this.setPage(0))
.catch((error) => this.onError(error));
}
ngOnInit() {
// Create our components.
const comps = this.components ||
(this.gridType === "form" ? FormComponents : SubmissionComponents);
this.header = this.createComponent(this.headerElement, comps.header);
this.header.actionAllowed = this.actionAllowed.bind(this);
this.header.sort.subscribe((header) => this.sortColumn(header));
this.body = this.createComponent(this.bodyElement, comps.body);
this.body.header = this.header;
this.body.actionAllowed = this.actionAllowed.bind(this);
this.body.rowSelect.subscribe((row) => this.rowSelect.emit(row));
this.body.rowAction.subscribe((action) => this.rowAction.emit(action));
this.footer = this.createComponent(this.footerElement, comps.footer);
this.footer.header = this.header;
this.footer.body = this.body;
this.footer.actionAllowed = this.actionAllowed.bind(this);
this.footer.createText = this.createText;
this.footer.size = this.size;
this.footer.pageChanged.subscribe((page) => this.pageChanged(page));
this.footer.createItem.subscribe((item) => this.createItem.emit(item));
}
ngOnChanges(changes) {
if (this.initialized) {
if ((changes.src && changes.src.currentValue) ||
(changes.formio && changes.formio.currentValue)) {
this.loadGrid(changes.src.currentValue);
}
if (changes.items && changes.items.currentValue) {
this.refreshGrid();
}
}
if (this.footer && changes.createText && changes.createText.currentValue) {
this.footer.createText = changes.createText.currentValue;
}
}
ngAfterViewInit() {
this.alerts.setAlerts([]);
this.query = this.query || {};
if (this.refresh) {
this.refresh.subscribe((query) => this.refreshGrid(query));
}
this.loadGrid(this.src);
this.initialized = true;
this.ref.detectChanges();
}
actionAllowed(action) {
if (this.isActionAllowed) {
return this.isActionAllowed(action);
}
else {
return true;
}
}
onError(error) {
this.isLoading = false;
this.error.emit(error);
if (typeof error === "string" || error.message) {
this.alerts.setAlert({
type: "danger",
message: error.message || error,
});
}
}
refreshGrid(query) {
this.alerts.setAlerts([]);
this.query = query || this.query;
if (!this.query.hasOwnProperty("limit")) {
this.query.limit = 10;
}
if (!this.query.hasOwnProperty("skip")) {
this.query.skip = 0;
}
this.isLoading = true;
this.ref.detectChanges();
Formio.cache = {};
let loader = null;
if (this.items) {
loader = Promise.resolve(this.body.setRows(this.query, this.items));
}
else {
loader = this.body.load(this.formio, this.query);
}
return loader
.then((info) => {
this.isLoading = false;
this.initialized = true;
this.ref.detectChanges();
})
.catch((error) => this.onError(error));
}
setPage(num = -1) {
this.page = num !== -1 ? num : this.page;
if (!this.query.hasOwnProperty("limit")) {
this.query.limit = 10;
}
if (!this.query.hasOwnProperty("skip")) {
this.query.skip = 0;
}
this.query.skip = this.page * this.query.limit;
this.refreshGrid();
}
sortColumn(header) {
// Reset all other column sorts.
each(this.header.headers, (col) => {
if (col.key !== header.key) {
col.sort = "";
}
});
switch (header.sort) {
case "asc":
header.sort = SortType.DESC;
this.query.sort = "-" + header.key;
break;
case "desc":
header.sort = undefined;
delete this.query.sort;
break;
case undefined:
header.sort = SortType.ASC;
this.query.sort = header.key;
break;
}
this.refreshGrid();
}
pageChanged(page) {
this.setPage(page.page - 1);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioGridComponent, deps: [{ token: i1.FormioAlerts }, { token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormioGridComponent, selector: "formio-grid", inputs: { footerPosition: "footerPosition", src: "src", items: "items", onForm: "onForm", query: "query", refresh: "refresh", columns: "columns", gridType: "gridType", size: "size", components: "components", formio: "formio", label: "label", createText: "createText", isActionAllowed: "isActionAllowed" }, outputs: { select: "select", rowSelect: "rowSelect", rowAction: "rowAction", createItem: "createItem", error: "error" }, viewQueries: [{ propertyName: "headerElement", first: true, predicate: ["headerTemplate"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "bodyElement", first: true, predicate: ["bodyTemplate"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "footerElement", first: true, predicate: ["footerTemplate"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #headerTemplate></ng-template>\r\n<ng-template #bodyTemplate></ng-template>\r\n<ng-template #footerTemplate></ng-template>\r\n<div class=\"formio-grid\">\r\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\r\n <table class=\"table table-bordered table-striped table-hover\">\r\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\r\n </ng-container>\r\n <ng-container *ngIf=\"initialized\"\r\n [ngTemplateOutlet]=\"header.template\"></ng-container>\r\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\r\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\r\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\r\n </ng-container>\r\n </table>\r\n</div>\r\n", styles: [".formio-grid{position:relative;width:100%}.grid-refresh{height:400px;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.FormioLoaderComponent, selector: "formio-loader", inputs: ["isLoading"] }, { kind: "component", type: i1.FormioAlertsComponent, selector: "formio-alerts", inputs: ["alerts"], outputs: ["focusComponent"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioGridComponent, decorators: [{
type: Component,
args: [{ selector: "formio-grid", template: "<ng-template #headerTemplate></ng-template>\r\n<ng-template #bodyTemplate></ng-template>\r\n<ng-template #footerTemplate></ng-template>\r\n<div class=\"formio-grid\">\r\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\r\n <table class=\"table table-bordered table-striped table-hover\">\r\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\r\n </ng-container>\r\n <ng-container *ngIf=\"initialized\"\r\n [ngTemplateOutlet]=\"header.template\"></ng-container>\r\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\r\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\r\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\r\n </ng-container>\r\n </table>\r\n</div>\r\n", styles: [".formio-grid{position:relative;width:100%}.grid-refresh{height:400px;width:100%}\n"] }]
}], ctorParameters: () => [{ type: i1.FormioAlerts }, { type: i0.ComponentFactoryResolver }, { type: i0.ChangeDetectorRef }], propDecorators: { footerPosition: [{
type: Input
}], src: [{
type: Input
}], items: [{
type: Input
}], onForm: [{
type: Input
}], query: [{
type: Input
}], refresh: [{
type: Input
}], columns: [{
type: Input
}], gridType: [{
type: Input
}], size: [{
type: Input
}], components: [{
type: Input
}], formio: [{
type: Input
}], label: [{
type: Input
}], createText: [{
type: Input
}], isActionAllowed: [{
type: Input
}], select: [{
type: Output
}], rowSelect: [{
type: Output
}], rowAction: [{
type: Output
}], createItem: [{
type: Output
}], error: [{
type: Output
}], headerElement: [{
type: ViewChild,
args: ["headerTemplate", { read: ViewContainerRef, static: true }]
}], bodyElement: [{
type: ViewChild,
args: ["bodyTemplate", { read: ViewContainerRef, static: true }]
}], footerElement: [{
type: ViewChild,
args: ["footerTemplate", { read: ViewContainerRef, static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWZvcm1pby9ncmlkL3NyYy9ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZm9ybWlvL2dyaWQvc3JjL2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsSUFBSSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUkxRCxPQUFPLGNBQWMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxvQkFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFPM0QsTUFBTSxPQUFPLG1CQUFtQjtJQW9DckI7SUFDQztJQUNBO0lBckNELGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDNUMsR0FBRyxDQUFVO0lBQ2IsS0FBSyxDQUFjO0lBQ25CLE1BQU0sQ0FBZ0I7SUFDdEIsS0FBSyxDQUFPO0lBQ1osT0FBTyxDQUF3QjtJQUMvQixPQUFPLENBQXFCO0lBQzVCLFFBQVEsQ0FBVTtJQUNsQixJQUFJLENBQVU7SUFDZCxVQUFVLENBQU87SUFDakIsTUFBTSxDQUF3QjtJQUM5QixLQUFLLENBQVU7SUFDZixVQUFVLENBQVM7SUFDbkIsZUFBZSxDQUFNO0lB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S0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFFUCxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHckUsV0FBVztzQkFEVixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUduRSxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRGb290ZXJQb3NpdGlvbnMgfSBmcm9tIFwiLi90eXBlcy9ncmlkLWZvb3Rlci1wb3NpdGlvbnNcIjtcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1pb0FsZXJ0cyB9IGZyb20gXCJmb3JtaW9hbmd1bGFyLWNvbGZ1dHVyb1wiO1xyXG5pbXBvcnQgeyBlYWNoIH0gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBGb3JtaW9Db3JlIGFzIEZvcm1pbyB9IGZyb20gXCJmb3JtaW9qcy1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IHsgR3JpZEhlYWRlckNvbXBvbmVudCB9IGZyb20gXCIuL0dyaWRIZWFkZXJDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR3JpZEJvZHlDb21wb25lbnQgfSBmcm9tIFwiLi9HcmlkQm9keUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBHcmlkRm9vdGVyQ29tcG9uZW50IH0gZnJvbSBcIi4vR3JpZEZvb3RlckNvbXBvbmVudFwiO1xyXG5pbXBvcnQgRm9ybUNvbXBvbmVudHMgZnJvbSBcIi4vZm9ybS9pbmRleFwiO1xyXG5pbXBvcnQgU3VibWlzc2lvbkNvbXBvbmVudHMgZnJvbSBcIi4vc3VibWlzc2lvbi9pbmRleFwiO1xyXG5pbXBvcnQgeyBGb3JtaW9Qcm9taXNlU2VydmljZSB9IGZyb20gXCJmb3JtaW9hbmd1bGFyLWNvbGZ1dHVyb1wiO1xyXG5pbXBvcnQgeyBHcmlkQ29sdW1uIH0gZnJvbSBcIi4vdHlwZXMvZ3JpZC1jb2x1bW5cIjtcclxuaW1wb3J0IHsgR3JpZEhlYWRlciwgU29ydFR5cGUgfSBmcm9tIFwiLi90eXBlcy9ncmlkLWhlYWRlclwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiZm9ybWlvLWdyaWRcIixcclxuICBzdHlsZVVybHM6IFtcIi4vZ3JpZC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICB0ZW1wbGF0ZVVybDogXCIuL2dyaWQuY29tcG9uZW50Lmh0bWxcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1pb0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCkgZm9vdGVyUG9zaXRpb24gPSBHcmlkRm9vdGVyUG9zaXRpb25zLmJvdHRvbTtcclxuICBASW5wdXQoKSBzcmM/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaXRlbXM/OiBBcnJheTxhbnk+O1xyXG4gIEBJbnB1dCgpIG9uRm9ybT86IFByb21pc2U8YW55PjtcclxuICBASW5wdXQoKSBxdWVyeT86IGFueTtcclxuICBASW5wdXQoKSByZWZyZXNoPzogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgQElucHV0KCkgY29sdW1ucz86IEFycmF5PEdyaWRDb2x1bW4+O1xyXG4gIEBJbnB1dCgpIGdyaWRUeXBlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNpemU/OiBudW1iZXI7XHJcbiAgQElucHV0KCkgY29tcG9uZW50cz86IGFueTtcclxuICBASW5wdXQoKSBmb3JtaW8/OiBGb3JtaW9Qcm9taXNlU2VydmljZTtcclxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcclxuICBASW5wdXQoKSBjcmVhdGVUZXh0OiBTdHJpbmc7XHJcbiAgQElucHV0KCkgaXNBY3Rpb25BbGxvd2VkOiBhbnk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdDogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgQE91dHB1dCgpIHJvd1NlbGVjdDogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgQE91dHB1dCgpIHJvd0FjdGlvbjogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgQE91dHB1dCgpIGNyZWF0ZUl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoKSBlcnJvcjogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImhlYWRlclRlbXBsYXRlXCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXHJcbiAgaGVhZGVyRWxlbWVudDogVmlld0NvbnRhaW5lclJlZjtcclxuICBAVmlld0NoaWxkKFwiYm9keVRlbXBsYXRlXCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXHJcbiAgYm9keUVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgQFZpZXdDaGlsZChcImZvb3RlclRlbXBsYXRlXCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXHJcbiAgZm9vdGVyRWxlbWVudDogVmlld0NvbnRhaW5lclJlZjtcclxuXHJcbiAgcHVibGljIHBhZ2UgPSAwO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgaGVhZGVyOiBHcmlkSGVhZGVyQ29tcG9uZW50O1xyXG4gIHB1YmxpYyBib2R5OiBHcmlkQm9keUNvbXBvbmVudDtcclxuICBwdWJsaWMgZm9vdGVyOiBHcmlkRm9vdGVyQ29tcG9uZW50O1xyXG4gIHB1YmxpYyBmb290ZXJQb3NpdGlvbnMgPSBHcmlkRm9vdGVyUG9zaXRpb25zO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBhbGVydHM6IEZvcm1pb0FsZXJ0cyxcclxuICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5zZWxlY3QgPSB0aGlzLnJvd1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMucm93QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jcmVhdGVJdGVtID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5lcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0eSwgY29tcG9uZW50KSB7XHJcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gcHJvcGVydHkuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xyXG4gICAgcmV0dXJuIGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIGxvYWRHcmlkKHNyYz86IHN0cmluZykge1xyXG4gICAgLy8gSWYgbm8gc291cmNlIGlzIHByb3ZpZGVkLCB0aGVuIHNraXAuXHJcbiAgICBpZiAoIXNyYyAmJiAhdGhpcy5mb3JtaW8pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gRG8gbm90IGRvdWJsZSBsb2FkLlxyXG4gICAgaWYgKHRoaXMuZm9ybWlvICYmIHRoaXMuc3JjICYmIHNyYyA9PT0gdGhpcy5zcmMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzcmMpIHtcclxuICAgICAgdGhpcy5zcmMgPSBzcmM7XHJcbiAgICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pb1Byb21pc2VTZXJ2aWNlKHRoaXMuc3JjLCB7IGZvcm1Pbmx5OiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvYWQgdGhlIGhlYWRlci5cclxuICAgIHRoaXMuaGVhZGVyXHJcbiAgICAgIC5sb2FkKHRoaXMuZm9ybWlvLCB7fSwgdGhpcy5jb2x1bW5zKVxyXG4gICAgICAudGhlbigoKSA9PiB0aGlzLnNldFBhZ2UoMCkpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHRoaXMub25FcnJvcihlcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBDcmVhdGUgb3VyIGNvbXBvbmVudHMuXHJcbiAgICBjb25zdCBjb21wcyA9XHJcbiAgICAgIHRoaXMuY29tcG9uZW50cyB8fFxyXG4gICAgICAodGhpcy5ncmlkVHlwZSA9PT0gXCJmb3JtXCIgPyBGb3JtQ29tcG9uZW50cyA6IFN1Ym1pc3Npb25Db21wb25lbnRzKTtcclxuXHJcbiAgICB0aGlzLmhlYWRlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMuaGVhZGVyRWxlbWVudCwgY29tcHMuaGVhZGVyKTtcclxuICAgIHRoaXMuaGVhZGVyLmFjdGlvbkFsbG93ZWQgPSB0aGlzLmFjdGlvbkFsbG93ZWQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMuaGVhZGVyLnNvcnQuc3Vic2NyaWJlKChoZWFkZXIpID0+IHRoaXMuc29ydENvbHVtbihoZWFkZXIpKTtcclxuXHJcbiAgICB0aGlzLmJvZHkgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmJvZHlFbGVtZW50LCBjb21wcy5ib2R5KTtcclxuICAgIHRoaXMuYm9keS5oZWFkZXIgPSB0aGlzLmhlYWRlcjtcclxuICAgIHRoaXMuYm9keS5hY3Rpb25BbGxvd2VkID0gdGhpcy5hY3Rpb25BbGxvd2VkLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLmJvZHkucm93U2VsZWN0LnN1YnNjcmliZSgocm93KSA9PiB0aGlzLnJvd1NlbGVjdC5lbWl0KHJvdykpO1xyXG4gICAgdGhpcy5ib2R5LnJvd0FjdGlvbi5zdWJzY3JpYmUoKGFjdGlvbikgPT4gdGhpcy5yb3dBY3Rpb24uZW1pdChhY3Rpb24pKTtcclxuXHJcbiAgICB0aGlzLmZvb3RlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMuZm9vdGVyRWxlbWVudCwgY29tcHMuZm9vdGVyKTtcclxuICAgIHRoaXMuZm9vdGVyLmhlYWRlciA9IHRoaXMuaGVhZGVyO1xyXG4gICAgdGhpcy5mb290ZXIuYm9keSA9IHRoaXMuYm9keTtcclxuICAgIHRoaXMuZm9vdGVyLmFjdGlvbkFsbG93ZWQgPSB0aGlzLmFjdGlvbkFsbG93ZWQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZVRleHQgPSB0aGlzLmNyZWF0ZVRleHQ7XHJcbiAgICB0aGlzLmZvb3Rlci5zaXplID0gdGhpcy5zaXplO1xyXG4gICAgdGhpcy5mb290ZXIucGFnZUNoYW5nZWQuc3Vic2NyaWJlKChwYWdlKSA9PiB0aGlzLnBhZ2VDaGFuZ2VkKHBhZ2UpKTtcclxuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZUl0ZW0uc3Vic2NyaWJlKChpdGVtKSA9PiB0aGlzLmNyZWF0ZUl0ZW0uZW1pdChpdGVtKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoY2hhbmdlcy5zcmMgJiYgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKSB8fFxyXG4gICAgICAgIChjaGFuZ2VzLmZvcm1pbyAmJiBjaGFuZ2VzLmZvcm1pby5jdXJyZW50VmFsdWUpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMubG9hZEdyaWQoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZXMuaXRlbXMgJiYgY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2hHcmlkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mb290ZXIgJiYgY2hhbmdlcy5jcmVhdGVUZXh0ICYmIGNoYW5nZXMuY3JlYXRlVGV4dC5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5mb290ZXIuY3JlYXRlVGV4dCA9IGNoYW5nZXMuY3JlYXRlVGV4dC5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmFsZXJ0cy5zZXRBbGVydHMoW10pO1xyXG4gICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnkgfHwge307XHJcbiAgICBpZiAodGhpcy5yZWZyZXNoKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaC5zdWJzY3JpYmUoKHF1ZXJ5OiBvYmplY3QpID0+IHRoaXMucmVmcmVzaEdyaWQocXVlcnkpKTtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZEdyaWQodGhpcy5zcmMpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25BbGxvd2VkKGFjdGlvbikge1xyXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25BbGxvd2VkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzQWN0aW9uQWxsb3dlZChhY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xyXG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIiB8fCBlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0KHtcclxuICAgICAgICB0eXBlOiBcImRhbmdlclwiLFxyXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEdyaWQocXVlcnk/OiBhbnkpIHtcclxuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0cyhbXSk7XHJcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnkgfHwgdGhpcy5xdWVyeTtcclxuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eShcImxpbWl0XCIpKSB7XHJcbiAgICAgIHRoaXMucXVlcnkubGltaXQgPSAxMDtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eShcInNraXBcIikpIHtcclxuICAgICAgdGhpcy5xdWVyeS5za2lwID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIEZvcm1pby5jYWNoZSA9IHt9O1xyXG4gICAgbGV0IGxvYWRlciA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICBsb2FkZXIgPSBQcm9taXNlLnJlc29sdmUodGhpcy5ib2R5LnNldFJvd3ModGhpcy5xdWVyeSwgdGhpcy5pdGVtcykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9hZGVyID0gdGhpcy5ib2R5LmxvYWQodGhpcy5mb3JtaW8sIHRoaXMucXVlcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsb2FkZXJcclxuICAgICAgLnRoZW4oKGluZm8pID0+IHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnJvcikgPT4gdGhpcy5vbkVycm9yKGVycm9yKSk7XHJcbiAgfVxyXG5cclxuICBzZXRQYWdlKG51bSA9IC0xKSB7XHJcbiAgICB0aGlzLnBhZ2UgPSBudW0gIT09IC0xID8gbnVtIDogdGhpcy5wYWdlO1xyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5Lmhhc093blByb3BlcnR5KFwibGltaXRcIikpIHtcclxuICAgICAgdGhpcy5xdWVyeS5saW1pdCA9IDEwO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5Lmhhc093blByb3BlcnR5KFwic2tpcFwiKSkge1xyXG4gICAgICB0aGlzLnF1ZXJ5LnNraXAgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5xdWVyeS5za2lwID0gdGhpcy5wYWdlICogdGhpcy5xdWVyeS5saW1pdDtcclxuICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcclxuICB9XHJcblxyXG4gIHNvcnRDb2x1bW4oaGVhZGVyOiBHcmlkSGVhZGVyKSB7XHJcbiAgICAvLyBSZXNldCBhbGwgb3RoZXIgY29sdW1uIHNvcnRzLlxyXG4gICAgZWFjaCh0aGlzLmhlYWRlci5oZWFkZXJzLCAoY29sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbC5rZXkgIT09IGhlYWRlci5rZXkpIHtcclxuICAgICAgICBjb2wuc29ydCA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgc3dpdGNoIChoZWFkZXIuc29ydCkge1xyXG4gICAgICBjYXNlIFwiYXNjXCI6XHJcbiAgICAgICAgaGVhZGVyLnNvcnQgPSBTb3J0VHlwZS5ERVNDO1xyXG4gICAgICAgIHRoaXMucXVlcnkuc29ydCA9IFwiLVwiICsgaGVhZGVyLmtleTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRlc2NcIjpcclxuICAgICAgICBoZWFkZXIuc29ydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBkZWxldGUgdGhpcy5xdWVyeS5zb3J0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHVuZGVmaW5lZDpcclxuICAgICAgICBoZWFkZXIuc29ydCA9IFNvcnRUeXBlLkFTQztcclxuICAgICAgICB0aGlzLnF1ZXJ5LnNvcnQgPSBoZWFkZXIua2V5O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoR3JpZCgpO1xyXG4gIH1cclxuXHJcbiAgcGFnZUNoYW5nZWQocGFnZTogYW55KSB7XHJcbiAgICB0aGlzLnNldFBhZ2UocGFnZS5wYWdlIC0gMSk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGU+PC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNib2R5VGVtcGxhdGU+PC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmb290ZXJUZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxyXG48ZGl2IGNsYXNzPVwiZm9ybWlvLWdyaWRcIj5cclxuICA8Zm9ybWlvLWFsZXJ0cyBbYWxlcnRzXT1cImFsZXJ0c1wiPjwvZm9ybWlvLWFsZXJ0cz5cclxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWQgJiYgW2Zvb3RlclBvc2l0aW9ucy50b3AsIGZvb3RlclBvc2l0aW9ucy5ib3RoXS5pbmRleE9mKGZvb3RlclBvc2l0aW9uKSAhPT0gLTFcIlxyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJmb290ZXIudGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBwb3NpdGlvbjogZm9vdGVyUG9zaXRpb25zLnRvcCwgbGFiZWw6IGxhYmVsIH1cIj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRpYWxpemVkXCJcclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyLnRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8Zm9ybWlvLWxvYWRlciBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvZm9ybWlvLWxvYWRlcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbml0aWFsaXplZFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHkudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbml0aWFsaXplZCAmJiBbZm9vdGVyUG9zaXRpb25zLmJvdHRvbSwgZm9vdGVyUG9zaXRpb25zLmJvdGhdLmluZGV4T2YoZm9vdGVyUG9zaXRpb24pICE9PSAtMVwiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZvb3Rlci50ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHBvc2l0aW9uOiBmb290ZXJQb3NpdGlvbnMuYm90dG9tLCBsYWJlbDogbGFiZWwgfVwiPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC90YWJsZT5cclxuPC9kaXY+XHJcbiJdfQ==