formioangular-colfuturo
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.
260 lines • 36.1 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>\n<ng-template #bodyTemplate></ng-template>\n<ng-template #footerTemplate></ng-template>\n<div class=\"formio-grid\">\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\n <table class=\"table table-bordered table-striped table-hover\">\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\n </ng-container>\n <ng-container *ngIf=\"initialized\"\n [ngTemplateOutlet]=\"header.template\"></ng-container>\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\n </ng-container>\n </table>\n</div>\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>\n<ng-template #bodyTemplate></ng-template>\n<ng-template #footerTemplate></ng-template>\n<div class=\"formio-grid\">\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\n <table class=\"table table-bordered table-striped table-hover\">\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\n </ng-container>\n <ng-container *ngIf=\"initialized\"\n [ngTemplateOutlet]=\"header.template\"></ng-container>\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\n </ng-container>\n </table>\n</div>\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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S0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFFUCxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHckUsV0FBVztzQkFEVixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUduRSxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRGb290ZXJQb3NpdGlvbnMgfSBmcm9tIFwiLi90eXBlcy9ncmlkLWZvb3Rlci1wb3NpdGlvbnNcIjtcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybWlvQWxlcnRzIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBlYWNoIH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgRm9ybWlvQ29yZSBhcyBGb3JtaW8gfSBmcm9tIFwiZm9ybWlvanMtY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4vR3JpZEhlYWRlckNvbXBvbmVudFwiO1xuaW1wb3J0IHsgR3JpZEJvZHlDb21wb25lbnQgfSBmcm9tIFwiLi9HcmlkQm9keUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgR3JpZEZvb3RlckNvbXBvbmVudCB9IGZyb20gXCIuL0dyaWRGb290ZXJDb21wb25lbnRcIjtcbmltcG9ydCBGb3JtQ29tcG9uZW50cyBmcm9tIFwiLi9mb3JtL2luZGV4XCI7XG5pbXBvcnQgU3VibWlzc2lvbkNvbXBvbmVudHMgZnJvbSBcIi4vc3VibWlzc2lvbi9pbmRleFwiO1xuaW1wb3J0IHsgRm9ybWlvUHJvbWlzZVNlcnZpY2UgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcbmltcG9ydCB7IEdyaWRDb2x1bW4gfSBmcm9tIFwiLi90eXBlcy9ncmlkLWNvbHVtblwiO1xuaW1wb3J0IHsgR3JpZEhlYWRlciwgU29ydFR5cGUgfSBmcm9tIFwiLi90eXBlcy9ncmlkLWhlYWRlclwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiZm9ybWlvLWdyaWRcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2dyaWQuY29tcG9uZW50LnNjc3NcIl0sXG4gIHRlbXBsYXRlVXJsOiBcIi4vZ3JpZC5jb21wb25lbnQuaHRtbFwiLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtaW9HcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBmb290ZXJQb3NpdGlvbiA9IEdyaWRGb290ZXJQb3NpdGlvbnMuYm90dG9tO1xuICBASW5wdXQoKSBzcmM/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGl0ZW1zPzogQXJyYXk8YW55PjtcbiAgQElucHV0KCkgb25Gb3JtPzogUHJvbWlzZTxhbnk+O1xuICBASW5wdXQoKSBxdWVyeT86IGFueTtcbiAgQElucHV0KCkgcmVmcmVzaD86IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xuICBASW5wdXQoKSBjb2x1bW5zPzogQXJyYXk8R3JpZENvbHVtbj47XG4gIEBJbnB1dCgpIGdyaWRUeXBlPzogc3RyaW5nO1xuICBASW5wdXQoKSBzaXplPzogbnVtYmVyO1xuICBASW5wdXQoKSBjb21wb25lbnRzPzogYW55O1xuICBASW5wdXQoKSBmb3JtaW8/OiBGb3JtaW9Qcm9taXNlU2VydmljZTtcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNyZWF0ZVRleHQ6IFN0cmluZztcbiAgQElucHV0KCkgaXNBY3Rpb25BbGxvd2VkOiBhbnk7XG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xuICBAT3V0cHV0KCkgcm93U2VsZWN0OiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcbiAgQE91dHB1dCgpIHJvd0FjdGlvbjogRXZlbnRFbWl0dGVyPG9iamVjdD47XG4gIEBPdXRwdXQoKSBjcmVhdGVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIGVycm9yOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQFZpZXdDaGlsZChcImhlYWRlclRlbXBsYXRlXCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGhlYWRlckVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoXCJib2R5VGVtcGxhdGVcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgYm9keUVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoXCJmb290ZXJUZW1wbGF0ZVwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBmb290ZXJFbGVtZW50OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIHB1YmxpYyBwYWdlID0gMDtcbiAgcHVibGljIGlzTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHVibGljIGhlYWRlcjogR3JpZEhlYWRlckNvbXBvbmVudDtcbiAgcHVibGljIGJvZHk6IEdyaWRCb2R5Q29tcG9uZW50O1xuICBwdWJsaWMgZm9vdGVyOiBHcmlkRm9vdGVyQ29tcG9uZW50O1xuICBwdWJsaWMgZm9vdGVyUG9zaXRpb25zID0gR3JpZEZvb3RlclBvc2l0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWxlcnRzOiBGb3JtaW9BbGVydHMsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLnNlbGVjdCA9IHRoaXMucm93U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMucm93QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuY3JlYXRlSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVycm9yID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0eSwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBwcm9wZXJ0eS5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgfVxuXG4gIGxvYWRHcmlkKHNyYz86IHN0cmluZykge1xuICAgIC8vIElmIG5vIHNvdXJjZSBpcyBwcm92aWRlZCwgdGhlbiBza2lwLlxuICAgIGlmICghc3JjICYmICF0aGlzLmZvcm1pbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBEbyBub3QgZG91YmxlIGxvYWQuXG4gICAgaWYgKHRoaXMuZm9ybWlvICYmIHRoaXMuc3JjICYmIHNyYyA9PT0gdGhpcy5zcmMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3JjKSB7XG4gICAgICB0aGlzLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pb1Byb21pc2VTZXJ2aWNlKHRoaXMuc3JjLCB7IGZvcm1Pbmx5OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIGhlYWRlci5cbiAgICB0aGlzLmhlYWRlclxuICAgICAgLmxvYWQodGhpcy5mb3JtaW8sIHt9LCB0aGlzLmNvbHVtbnMpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLnNldFBhZ2UoMCkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm9uRXJyb3IoZXJyb3IpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIENyZWF0ZSBvdXIgY29tcG9uZW50cy5cbiAgICBjb25zdCBjb21wcyA9XG4gICAgICB0aGlzLmNvbXBvbmVudHMgfHxcbiAgICAgICh0aGlzLmdyaWRUeXBlID09PSBcImZvcm1cIiA/IEZvcm1Db21wb25lbnRzIDogU3VibWlzc2lvbkNvbXBvbmVudHMpO1xuXG4gICAgdGhpcy5oZWFkZXIgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmhlYWRlckVsZW1lbnQsIGNvbXBzLmhlYWRlcik7XG4gICAgdGhpcy5oZWFkZXIuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGVhZGVyLnNvcnQuc3Vic2NyaWJlKChoZWFkZXIpID0+IHRoaXMuc29ydENvbHVtbihoZWFkZXIpKTtcblxuICAgIHRoaXMuYm9keSA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMuYm9keUVsZW1lbnQsIGNvbXBzLmJvZHkpO1xuICAgIHRoaXMuYm9keS5oZWFkZXIgPSB0aGlzLmhlYWRlcjtcbiAgICB0aGlzLmJvZHkuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYm9keS5yb3dTZWxlY3Quc3Vic2NyaWJlKChyb3cpID0+IHRoaXMucm93U2VsZWN0LmVtaXQocm93KSk7XG4gICAgdGhpcy5ib2R5LnJvd0FjdGlvbi5zdWJzY3JpYmUoKGFjdGlvbikgPT4gdGhpcy5yb3dBY3Rpb24uZW1pdChhY3Rpb24pKTtcblxuICAgIHRoaXMuZm9vdGVyID0gdGhpcy5jcmVhdGVDb21wb25lbnQodGhpcy5mb290ZXJFbGVtZW50LCBjb21wcy5mb290ZXIpO1xuICAgIHRoaXMuZm9vdGVyLmhlYWRlciA9IHRoaXMuaGVhZGVyO1xuICAgIHRoaXMuZm9vdGVyLmJvZHkgPSB0aGlzLmJvZHk7XG4gICAgdGhpcy5mb290ZXIuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZVRleHQgPSB0aGlzLmNyZWF0ZVRleHQ7XG4gICAgdGhpcy5mb290ZXIuc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICB0aGlzLmZvb3Rlci5wYWdlQ2hhbmdlZC5zdWJzY3JpYmUoKHBhZ2UpID0+IHRoaXMucGFnZUNoYW5nZWQocGFnZSkpO1xuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZUl0ZW0uc3Vic2NyaWJlKChpdGVtKSA9PiB0aGlzLmNyZWF0ZUl0ZW0uZW1pdChpdGVtKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgaWYgKFxuICAgICAgICAoY2hhbmdlcy5zcmMgJiYgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKSB8fFxuICAgICAgICAoY2hhbmdlcy5mb3JtaW8gJiYgY2hhbmdlcy5mb3JtaW8uY3VycmVudFZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubG9hZEdyaWQoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZXMuaXRlbXMgJiYgY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZvb3RlciAmJiBjaGFuZ2VzLmNyZWF0ZVRleHQgJiYgY2hhbmdlcy5jcmVhdGVUZXh0LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5mb290ZXIuY3JlYXRlVGV4dCA9IGNoYW5nZXMuY3JlYXRlVGV4dC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0cyhbXSk7XG4gICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gICAgaWYgKHRoaXMucmVmcmVzaCkge1xuICAgICAgdGhpcy5yZWZyZXNoLnN1YnNjcmliZSgocXVlcnk6IG9iamVjdCkgPT4gdGhpcy5yZWZyZXNoR3JpZChxdWVyeSkpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRHcmlkKHRoaXMuc3JjKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBhY3Rpb25BbGxvd2VkKGFjdGlvbikge1xuICAgIGlmICh0aGlzLmlzQWN0aW9uQWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNBY3Rpb25BbGxvd2VkKGFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IoZXJyb3I6IGFueSkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiIHx8IGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0KHtcbiAgICAgICAgdHlwZTogXCJkYW5nZXJcIixcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hHcmlkKHF1ZXJ5PzogYW55KSB7XG4gICAgdGhpcy5hbGVydHMuc2V0QWxlcnRzKFtdKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnkgfHwgdGhpcy5xdWVyeTtcbiAgICBpZiAoIXRoaXMucXVlcnkuaGFzT3duUHJvcGVydHkoXCJsaW1pdFwiKSkge1xuICAgICAgdGhpcy5xdWVyeS5saW1pdCA9IDEwO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucXVlcnkuaGFzT3duUHJvcGVydHkoXCJza2lwXCIpKSB7XG4gICAgICB0aGlzLnF1ZXJ5LnNraXAgPSAwO1xuICAgIH1cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIEZvcm1pby5jYWNoZSA9IHt9O1xuICAgIGxldCBsb2FkZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICBsb2FkZXIgPSBQcm9taXNlLnJlc29sdmUodGhpcy5ib2R5LnNldFJvd3ModGhpcy5xdWVyeSwgdGhpcy5pdGVtcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkZXIgPSB0aGlzLmJvZHkubG9hZCh0aGlzLmZvcm1pbywgdGhpcy5xdWVyeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvYWRlclxuICAgICAgLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm9uRXJyb3IoZXJyb3IpKTtcbiAgfVxuXG4gIHNldFBhZ2UobnVtID0gLTEpIHtcbiAgICB0aGlzLnBhZ2UgPSBudW0gIT09IC0xID8gbnVtIDogdGhpcy5wYWdlO1xuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eShcImxpbWl0XCIpKSB7XG4gICAgICB0aGlzLnF1ZXJ5LmxpbWl0ID0gMTA7XG4gICAgfVxuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eShcInNraXBcIikpIHtcbiAgICAgIHRoaXMucXVlcnkuc2tpcCA9IDA7XG4gICAgfVxuICAgIHRoaXMucXVlcnkuc2tpcCA9IHRoaXMucGFnZSAqIHRoaXMucXVlcnkubGltaXQ7XG4gICAgdGhpcy5yZWZyZXNoR3JpZCgpO1xuICB9XG5cbiAgc29ydENvbHVtbihoZWFkZXI6IEdyaWRIZWFkZXIpIHtcbiAgICAvLyBSZXNldCBhbGwgb3RoZXIgY29sdW1uIHNvcnRzLlxuICAgIGVhY2godGhpcy5oZWFkZXIuaGVhZGVycywgKGNvbDogYW55KSA9PiB7XG4gICAgICBpZiAoY29sLmtleSAhPT0gaGVhZGVyLmtleSkge1xuICAgICAgICBjb2wuc29ydCA9IFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc3dpdGNoIChoZWFkZXIuc29ydCkge1xuICAgICAgY2FzZSBcImFzY1wiOlxuICAgICAgICBoZWFkZXIuc29ydCA9IFNvcnRUeXBlLkRFU0M7XG4gICAgICAgIHRoaXMucXVlcnkuc29ydCA9IFwiLVwiICsgaGVhZGVyLmtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVzY1wiOlxuICAgICAgICBoZWFkZXIuc29ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVsZXRlIHRoaXMucXVlcnkuc29ydDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgaGVhZGVyLnNvcnQgPSBTb3J0VHlwZS5BU0M7XG4gICAgICAgIHRoaXMucXVlcnkuc29ydCA9IGhlYWRlci5rZXk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hHcmlkKCk7XG4gIH1cblxuICBwYWdlQ2hhbmdlZChwYWdlOiBhbnkpIHtcbiAgICB0aGlzLnNldFBhZ2UocGFnZS5wYWdlIC0gMSk7XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGU+PC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Zvb3RlclRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XG48ZGl2IGNsYXNzPVwiZm9ybWlvLWdyaWRcIj5cbiAgPGZvcm1pby1hbGVydHMgW2FsZXJ0c109XCJhbGVydHNcIj48L2Zvcm1pby1hbGVydHM+XG4gIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWQgJiYgW2Zvb3RlclBvc2l0aW9ucy50b3AsIGZvb3RlclBvc2l0aW9ucy5ib3RoXS5pbmRleE9mKGZvb3RlclBvc2l0aW9uKSAhPT0gLTFcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyLnRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcG9zaXRpb246IGZvb3RlclBvc2l0aW9ucy50b3AsIGxhYmVsOiBsYWJlbCB9XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRpYWxpemVkXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlci50ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxmb3JtaW8tbG9hZGVyIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCI+PC9mb3JtaW8tbG9hZGVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbml0aWFsaXplZFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHkudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWQgJiYgW2Zvb3RlclBvc2l0aW9ucy5ib3R0b20sIGZvb3RlclBvc2l0aW9ucy5ib3RoXS5pbmRleE9mKGZvb3RlclBvc2l0aW9uKSAhPT0gLTFcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyLnRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcG9zaXRpb246IGZvb3RlclBvc2l0aW9ucy5ib3R0b20sIGxhYmVsOiBsYWJlbCB9XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGFibGU+XG48L2Rpdj5cbiJdfQ==