@asoftwareworld/form-builder-pro
Version:
ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b
190 lines • 66 kB
JavaScript
/**
* @license
* Copyright ASW (A Software World) All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file
*/
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { Constants } from '@asoftwareworld/form-builder-pro/common';
import { ObjectUtils } from '@asoftwareworld/form-builder-pro/utils';
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';
import { CSSFrameworkEnum } from '@asoftwareworld/form-builder-pro/api';
import * as i0 from "@angular/core";
import * as i1 from "@asoftwareworld/form-builder-pro/core";
import * as i2 from "@asoftwareworld/form-builder-pro/common";
import * as i3 from "@angular/common";
import * as i4 from "@asoftwareworld/form-builder-pro/form-control/autocomplete";
import * as i5 from "@asoftwareworld/form-builder-pro/form-control/button";
import * as i6 from "@asoftwareworld/form-builder-pro/form-control/checkbox";
import * as i7 from "@asoftwareworld/form-builder-pro/form-control/datepicker";
import * as i8 from "@asoftwareworld/form-builder-pro/form-control/divider";
import * as i9 from "@asoftwareworld/form-builder-pro/form-control/drawing";
import * as i10 from "@asoftwareworld/form-builder-pro/form-control/gps";
import * as i11 from "@asoftwareworld/form-builder-pro/form-control/header";
import * as i12 from "@asoftwareworld/form-builder-pro/form-control/image";
import * as i13 from "@asoftwareworld/form-builder-pro/form-control/multi-select";
import * as i14 from "@asoftwareworld/form-builder-pro/form-control/paragraph";
import * as i15 from "@asoftwareworld/form-builder-pro/form-control/select";
import * as i16 from "@asoftwareworld/form-builder-pro/form-control/signature";
import * as i17 from "@asoftwareworld/form-builder-pro/form-control/slide-toggle";
import * as i18 from "@asoftwareworld/form-builder-pro/form-control/textfield";
import * as i19 from "@asoftwareworld/form-builder-pro/form-control/radio-button";
import * as i20 from "@angular/material/card";
import * as i21 from "@asoftwareworld/form-builder-pro/form-control/qrcode";
import * as i22 from "@asoftwareworld/form-builder-pro/form-control/number";
import * as i23 from "@asoftwareworld/form-builder-pro/form-control/calculation";
import * as i24 from "@asoftwareworld/form-builder-pro/form-control/fileupload";
export class AswPreviewTemplate {
translate;
notificationService;
constants = Constants;
formContainer = [];
currentLanguage = 'en';
cssFramework = CSSFrameworkEnum.Material;
buttonClick = new EventEmitter();
aswModelChange = new EventEmitter();
printPdf;
constructor(translate, notificationService) {
this.translate = translate;
this.notificationService = notificationService;
}
ngOnInit() {
this.translate.use(this.currentLanguage);
}
updatedControl(control) {
this.updateControlFromContainer(control);
}
updateControlFromContainer(draggedItem) {
this.formContainer.filter((control, index) => {
if (control.guid === draggedItem.guid) {
this.formContainer.splice(index, 1, draggedItem);
}
else {
this.updateChildControl(control, draggedItem);
}
});
}
updateChildControl(control, draggedItem) {
control.columns?.forEach((column) => {
column.components.forEach((component, childIndex) => {
if (component.guid === draggedItem.guid) {
column.components.splice(childIndex, 1, draggedItem);
}
if (component.controlType === 'columns') {
this.updateChildControl(component, draggedItem);
}
});
});
}
buttonClicked(type) {
if (type === 'reset') {
this.formContainer = ObjectUtils.resetForm(this.formContainer);
}
else {
const data = ObjectUtils.validateForm(this.formContainer);
if (!data.isFormValid) {
this.notificationService.openNotification('Please fill in the following required fields.' + ' \n \n' + data.labels.join(', '), 'Close');
}
else {
this.buttonClick.emit(this.formContainer);
}
}
}
onSelectionChange(control) {
this.aswModelChange.emit(control);
}
async makePdf() {
const pdf = new jsPDF('p', 'mm', 'a4');
html2canvas(this.printPdf.nativeElement, { scale: 1 }).then((canvas) => {
const imgData = canvas.toDataURL('image/png');
const imgWidth = 210;
const pageHeight = 295;
const imgHeight = (canvas.height * imgWidth) / canvas.width;
let heightLeft = imgHeight;
let position = 0;
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;
while (heightLeft >= 0) {
position = heightLeft - imgHeight;
pdf.addPage();
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;
}
window.open(pdf.output('bloburl'));
});
// const htmlElement = this.printPdf.nativeElement;
// const width = htmlElement.clientWidth;
// const height = htmlElement.clientHeight;
// // debugger
// // const pdf = new jsPDF({ unit: 'in', format: 'a0', orientation: 'portrait' });
// // pdf.html(htmlElement, {
// // html2canvas: {
// // scale: 0.3, //this was my solution, you have to adjust to your size
// // width: 1000 //for some reason width does nothing
// // },
// // callback: (doc: any) => {
// // window.open(doc.output("bloburl"));
// // }
// // });
// html2canvas(htmlElement).then(canvas => {
// // Few necessary setting options
// const imgWidth = 208;
// const pageHeight = 295;
// const imgHeight = canvas.height * imgWidth / canvas.width;
// const heightLeft = imgHeight;
// const contentDataURL = canvas.toDataURL('image/png');
// const pdf = new jsPDF('p', 'mm', 'a4'); // A4 size page of PDF
// const position = 0;
// pdf.addImage(contentDataURL, 'PNG', 0, position, imgWidth, imgHeight);
// window.open(pdf.output('bloburl')) // Generated PDF
// });
// var ratio = width / height;
// html2canvas(htmlElement)
// .then((successRef: any) => {
// var doc = new jsPDF('p', 'pt', 'a4');
// var img = successRef.toDataURL('image/png');
// // Add image Canvas to PDF
// const bufferX = 5;
// const bufferY = 5;
// const imgProps = (<any>doc).getImageProperties(img);
// const pdfWidth = doc.internal.pageSize.getWidth() - 2 * bufferX;
// const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
// doc.addImage(
// img,
// 'PNG',
// bufferX,
// bufferY,
// pdfWidth,
// pdfHeight,
// undefined,
// 'FAST'
// );
// return doc;
// })
// .then((doc: any) => {
// window.open(doc.output('bloburl'));
// });
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswPreviewTemplate, deps: [{ token: i1.AswTranslateService }, { token: i2.NotificationService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswPreviewTemplate, selector: "asw-preview-template", inputs: { formContainer: "formContainer", currentLanguage: "currentLanguage", cssFramework: "cssFramework" }, outputs: { buttonClick: "buttonClick", aswModelChange: "aswModelChange" }, viewQueries: [{ propertyName: "printPdf", first: true, predicate: ["printPdf"], descendants: true }], ngImport: i0, template: "<!-- <div class=\"asw-row\">\r\n <div class=\"asw-col-md-12 text-right\">\r\n <button mat-raised-button \r\n type=\"button\"\r\n class=\"asw-button asw-button-secondary asw-button-sm float-end mb-2\" (click)=\"makePdf()\">Download Pdf\r\n </button> \r\n </div>\r\n</div> -->\r\n<div class=\"asw-row\" #printPdf>\r\n <div class=\"asw-col-md-12\">\r\n <mat-card>\r\n <mat-card-content>\r\n <ng-container *ngFor=\"let control of formContainer\">\r\n <ng-container *ngTemplateOutlet=\"childContainer, context:{control:control}\"></ng-container>\r\n </ng-container>\r\n <ng-template #childContainer let-control=\"control\">\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngIf=\"!control.columns; else layout\">\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <asw-autocomplete \r\n [control]=\"control\"\r\n [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-autocomplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'header'\">\r\n <asw-header [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-header>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'qr-code'\">\r\n <asw-qrcode [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-qrcode>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <asw-image [control]=\"control\"\r\n [CSSFramework]=\"cssFramework\"\r\n (imageUpdateEvent)=\"updatedControl($event)\">\r\n </asw-image>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textfield'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'url'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone-number'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <asw-number [control]=\"control\"\r\n [formControls]=\"formContainer\"\r\n [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-number>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <asw-textfield [control]=\"control\"\r\n [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <asw-number [control]=\"control\"\r\n [formControls]=\"formContainer\"\r\n [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-number>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'calculation'\">\r\n <asw-calculation [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-calculation>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <asw-select [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'multi-select'\">\r\n <asw-multi-select [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-multi-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radio'\">\r\n <asw-radio-button [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-radio-button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <asw-checkbox [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-checkbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datepicker'\">\r\n <asw-datepicker [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (dateChange)=\"onSelectionChange($event)\">\r\n </asw-datepicker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'daterange'\">\r\n <asw-datepicker [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (dateChange)=\"onSelectionChange($event)\">\r\n </asw-datepicker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <asw-button [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (buttonClickEvent)=\"buttonClicked($event)\">\r\n </asw-button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'paragraph'\">\r\n <asw-paragraph [control]=\"control\">\r\n </asw-paragraph>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'divider'\">\r\n <asw-divider [control]=\"control\">\r\n </asw-divider>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'slide-toggle'\">\r\n <asw-slide-toggle [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-slide-toggle>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'gps'\">\r\n <asw-gps [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (gpsAddressChange)=\"onSelectionChange($event)\">\r\n </asw-gps>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'signature'\">\r\n <asw-signature [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-signature>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'drawing'\">\r\n <asw-drawing [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-drawing>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileupload'\">\r\n <asw-fileupload [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-fileupload>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #layout>\r\n <ng-container *ngSwitchCase=\"'columns'\">\r\n <div class=\"asw-row\">\r\n <div class=\"asw-col-{{column.size}}-{{column.width}}\" *ngFor=\"let column of control.columns\">\r\n <ng-container *ngFor=\"let component of column.components\">\r\n <ng-container *ngTemplateOutlet=\"childContainer, context:{control:component}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.AswAutocomplete, selector: "asw-autocomplete", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization", "formControls"], outputs: ["autocompleteUpdateEvent", "autocompleteDeleteEvent", "selectionChange", "duplicateControl"] }, { kind: "component", type: i5.AswButton, selector: "asw-button", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["buttonClickEvent", "buttonUpdateEvent", "buttonDeleteEvent", "duplicateControl"] }, { kind: "component", type: i6.AswCheckbox, selector: "asw-checkbox", inputs: ["control", "propertyPersonalization", "isPreviewTemplate", "CSSFramework", "formControls"], outputs: ["checkboxUpdateEvent", "checkboxDeleteEvent", "selectionChange", "duplicateControl"] }, { kind: "component", type: i7.AswDatepicker, selector: "asw-datepicker", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["datepickerUpdateEvent", "datepickerDeleteEvent", "dateChange", "duplicateControl"] }, { kind: "component", type: i8.AswDivider, selector: "asw-divider", inputs: ["control", "isPreviewTemplate"], outputs: ["dividerDeleteEvent", "duplicateControl"] }, { kind: "component", type: i9.AswDrawing, selector: "asw-drawing", inputs: ["control", "CSSFramework", "isPreviewTemplate"], outputs: ["drawingUpdateEvent", "drawingDeleteEvent", "duplicateControl"] }, { kind: "component", type: i10.AswGps, selector: "asw-gps", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["gpsUpdateEvent", "gpsDeleteEvent", "gpsAddressChange", "duplicateControl"] }, { kind: "component", type: i11.AswHeader, selector: "asw-header", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["headerUpdateEvent", "headerDeleteEvent", "duplicateControl"] }, { kind: "component", type: i12.AswImage, selector: "asw-image", inputs: ["control", "isPreviewTemplate", "CSSFramework"], outputs: ["imageUpdateEvent", "imageDeleteEvent", "duplicateControl"] }, { kind: "component", type: i13.AswMultiSelect, selector: "asw-multi-select", inputs: ["control", "propertyPersonalization", "isPreviewTemplate", "CSSFramework", "formControls"], outputs: ["multiSelectUpdateEvent", "multiSelectDeleteEvent", "selectionChange", "duplicateControl"] }, { kind: "component", type: i14.AswParagraph, selector: "asw-paragraph", inputs: ["control", "isPreviewTemplate"], outputs: ["paragraphUpdateEvent", "paragraphDeleteEvent", "duplicateControl"] }, { kind: "component", type: i15.AswSelect, selector: "asw-select", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization", "formControls"], outputs: ["selectUpdateEvent", "selectDeleteEvent", "selectionChange", "duplicateControl"] }, { kind: "component", type: i16.AswSignature, selector: "asw-signature", inputs: ["control", "CSSFramework", "isPreviewTemplate"], outputs: ["signatureUpdateEvent", "signatureDeleteEvent", "duplicateControl"] }, { kind: "component", type: i17.AswSlideToggle, selector: "asw-slide-toggle", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["slidetoggleUpdateEvent", "slidetoggleDeleteEvent", "selectionChange", "duplicateControl"] }, { kind: "component", type: i18.AswTextField, selector: "asw-textfield", inputs: ["control", "propertyPersonalization", "isPreviewTemplate", "CSSFramework", "patterns"], outputs: ["textFieldUpdateEvent", "textFieldDeleteEvent", "aswModelChange", "duplicateControl"] }, { kind: "component", type: i19.AswRadioButton, selector: "asw-radio-button", inputs: ["control", "propertyPersonalization", "isPreviewTemplate", "CSSFramework", "formControls"], outputs: ["radioButtonUpdateEvent", "radioButtonDeleteEvent", "selectionChange", "duplicateControl"] }, { kind: "component", type: i20.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i20.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i21.AswQrCode, selector: "asw-qrcode", inputs: ["control", "CSSFramework", "isPreviewTemplate"], outputs: ["qrCodeUpdateEvent", "qrCodeDeleteEvent", "duplicateControl"] }, { kind: "component", type: i22.AswNumber, selector: "asw-number", inputs: ["control", "formControls", "CSSFramework", "isPreviewTemplate", "propertyPersonalization", "patterns"], outputs: ["numberUpdateEvent", "numberDeleteEvent", "aswModelChange", "duplicateControl"] }, { kind: "component", type: i23.AswCalculation, selector: "asw-calculation", inputs: ["control", "formControls", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["calculationUpdateEvent", "calculationDeleteEvent", "aswModelChange", "duplicateControl"] }, { kind: "component", type: i24.AswFileUpload, selector: "asw-fileupload", inputs: ["control", "CSSFramework", "isPreviewTemplate", "propertyPersonalization"], outputs: ["fileUploadUpdateEvent", "fileUploadDeleteEvent", "onfileUploadChange", "duplicateControl"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswPreviewTemplate, decorators: [{
type: Component,
args: [{ selector: 'asw-preview-template', template: "<!-- <div class=\"asw-row\">\r\n <div class=\"asw-col-md-12 text-right\">\r\n <button mat-raised-button \r\n type=\"button\"\r\n class=\"asw-button asw-button-secondary asw-button-sm float-end mb-2\" (click)=\"makePdf()\">Download Pdf\r\n </button> \r\n </div>\r\n</div> -->\r\n<div class=\"asw-row\" #printPdf>\r\n <div class=\"asw-col-md-12\">\r\n <mat-card>\r\n <mat-card-content>\r\n <ng-container *ngFor=\"let control of formContainer\">\r\n <ng-container *ngTemplateOutlet=\"childContainer, context:{control:control}\"></ng-container>\r\n </ng-container>\r\n <ng-template #childContainer let-control=\"control\">\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngIf=\"!control.columns; else layout\">\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <asw-autocomplete \r\n [control]=\"control\"\r\n [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-autocomplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'header'\">\r\n <asw-header [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-header>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'qr-code'\">\r\n <asw-qrcode [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-qrcode>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <asw-image [control]=\"control\"\r\n [CSSFramework]=\"cssFramework\"\r\n (imageUpdateEvent)=\"updatedControl($event)\">\r\n </asw-image>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textfield'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'url'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone-number'\">\r\n <asw-textfield [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <asw-number [control]=\"control\"\r\n [formControls]=\"formContainer\"\r\n [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-number>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <asw-textfield [control]=\"control\"\r\n [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-textfield>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <asw-number [control]=\"control\"\r\n [formControls]=\"formContainer\"\r\n [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-number>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'calculation'\">\r\n <asw-calculation [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (aswModelChange)=\"onSelectionChange($event)\">\r\n </asw-calculation>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <asw-select [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'multi-select'\">\r\n <asw-multi-select [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-multi-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radio'\">\r\n <asw-radio-button [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-radio-button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <asw-checkbox [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-checkbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datepicker'\">\r\n <asw-datepicker [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (dateChange)=\"onSelectionChange($event)\">\r\n </asw-datepicker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'daterange'\">\r\n <asw-datepicker [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (dateChange)=\"onSelectionChange($event)\">\r\n </asw-datepicker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <asw-button [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (buttonClickEvent)=\"buttonClicked($event)\">\r\n </asw-button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'paragraph'\">\r\n <asw-paragraph [control]=\"control\">\r\n </asw-paragraph>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'divider'\">\r\n <asw-divider [control]=\"control\">\r\n </asw-divider>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'slide-toggle'\">\r\n <asw-slide-toggle [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (selectionChange)=\"onSelectionChange($event)\">\r\n </asw-slide-toggle>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'gps'\">\r\n <asw-gps [control]=\"control\" [CSSFramework]=\"cssFramework\"\r\n (gpsAddressChange)=\"onSelectionChange($event)\">\r\n </asw-gps>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'signature'\">\r\n <asw-signature [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-signature>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'drawing'\">\r\n <asw-drawing [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-drawing>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileupload'\">\r\n <asw-fileupload [control]=\"control\" [CSSFramework]=\"cssFramework\">\r\n </asw-fileupload>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #layout>\r\n <ng-container *ngSwitchCase=\"'columns'\">\r\n <div class=\"asw-row\">\r\n <div class=\"asw-col-{{column.size}}-{{column.width}}\" *ngFor=\"let column of control.columns\">\r\n <ng-container *ngFor=\"let component of column.components\">\r\n <ng-container *ngTemplateOutlet=\"childContainer, context:{control:component}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n</div>" }]
}], ctorParameters: () => [{ type: i1.AswTranslateService }, { type: i2.NotificationService }], propDecorators: { formContainer: [{
type: Input
}], currentLanguage: [{
type: Input
}], cssFramework: [{
type: Input
}], buttonClick: [{
type: Output
}], aswModelChange: [{
type: Output
}], printPdf: [{
type: ViewChild,
args: ['printPdf']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ByZXZpZXctdGVtcGxhdGUvcHJldmlldy10ZW1wbGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ByZXZpZXctdGVtcGxhdGUvcHJldmlldy10ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQXVCLE1BQU0seUNBQXlDLENBQUM7QUFDekYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT3hFLE1BQU0sT0FBTyxrQkFBa0I7SUFVaEI7SUFDQztJQVZaLFNBQVMsR0FBUSxTQUFTLENBQUM7SUFDbEIsYUFBYSxHQUFVLEVBQUUsQ0FBQztJQUMxQixlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLFlBQVksR0FBcUIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQzFELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQ3hDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQzVCLFFBQVEsQ0FBYztJQUU3QyxZQUNXLFNBQThCLEVBQzdCLG1CQUF3QztRQUR6QyxjQUFTLEdBQVQsU0FBUyxDQUFxQjtRQUM3Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO0lBQ2pELENBQUM7SUFFSixRQUFRO1FBQ0osSUFBSSxDQUFDLFNB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REFBMEQ7UUFDMUQsTUFBTTtRQUNOLDhCQUE4QjtRQUM5QiwyQkFBMkI7UUFDM0IsbUNBQW1DO1FBQ25DLGdEQUFnRDtRQUNoRCx1REFBdUQ7UUFFdkQscUNBQXFDO1FBQ3JDLDZCQUE2QjtRQUM3Qiw2QkFBNkI7UUFDN0IsK0RBQStEO1FBQy9ELDJFQUEyRTtRQUMzRSwyRUFBMkU7UUFDM0Usd0JBQXdCO1FBQ3hCLG1CQUFtQjtRQUNuQixxQkFBcUI7UUFDckIsdUJBQXVCO1FBQ3ZCLHVCQUF1QjtRQUN2Qix3QkFBd0I7UUFDeEIseUJBQXlCO1FBQ3pCLHlCQUF5QjtRQUN6QixxQkFBcUI7UUFDckIsYUFBYTtRQUNiLHNCQUFzQjtRQUN0QixTQUFTO1FBQ1QsNEJBQTRCO1FBQzVCLDhDQUE4QztRQUM5QyxVQUFVO0lBQ2QsQ0FBQzt1R0E1SVEsa0JBQWtCOzJGQUFsQixrQkFBa0IsMlZDcEIvQixrMVZBc0tNOzsyRkRsSk8sa0JBQWtCO2tCQUo5QixTQUFTOytCQUNJLHNCQUFzQjswSEFLdkIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNnQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQVNXIChBIFNvZnR3YXJlIFdvcmxkKSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25zdGFudHMsIE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyLXByby9jb21tb24nO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyLXByby91dGlscyc7XG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCB7IENTU0ZyYW1ld29ya0VudW0gfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyLXByby9hcGknO1xuaW1wb3J0IHsgQXN3VHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0Bhc29mdHdhcmV3b3JsZC9mb3JtLWJ1aWxkZXItcHJvL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Fzdy1wcmV2aWV3LXRlbXBsYXRlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZW1wbGF0ZS5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBc3dQcmV2aWV3VGVtcGxhdGUgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIGNvbnN0YW50czogYW55ID0gQ29uc3RhbnRzO1xuICAgIEBJbnB1dCgpIGZvcm1Db250YWluZXI6IGFueVtdID0gW107XG4gICAgQElucHV0KCkgY3VycmVudExhbmd1YWdlID0gJ2VuJztcbiAgICBASW5wdXQoKSBjc3NGcmFtZXdvcms6IENTU0ZyYW1ld29ya0VudW0gPSBDU1NGcmFtZXdvcmtFbnVtLk1hdGVyaWFsO1xuICAgIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gICAgQE91dHB1dCgpIGFzd01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQFZpZXdDaGlsZCgncHJpbnRQZGYnKSBwcmludFBkZiE6IEVsZW1lbnRSZWY7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHRyYW5zbGF0ZTogQXN3VHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZSh0aGlzLmN1cnJlbnRMYW5ndWFnZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlZENvbnRyb2woY29udHJvbDogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29udHJvbEZyb21Db250YWluZXIoY29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDb250cm9sRnJvbUNvbnRhaW5lcihkcmFnZ2VkSXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRhaW5lci5maWx0ZXIoKGNvbnRyb2w6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuZ3VpZCA9PT0gZHJhZ2dlZEl0ZW0uZ3VpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRhaW5lci5zcGxpY2UoaW5kZXgsIDEsIGRyYWdnZWRJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZENvbnRyb2woY29udHJvbCwgZHJhZ2dlZEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNoaWxkQ29udHJvbChjb250cm9sOiBhbnksIGRyYWdnZWRJdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29udHJvbC5jb2x1bW5zPy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xuICAgICAgICAgICAgY29sdW1uLmNvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50OiBhbnksIGNoaWxkSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ3VpZCA9PT0gZHJhZ2dlZEl0ZW0uZ3VpZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uY29tcG9uZW50cy5zcGxpY2UoY2hpbGRJbmRleCwgMSwgZHJhZ2dlZEl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNvbnRyb2xUeXBlID09PSAnY29sdW1ucycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZENvbnRyb2woY29tcG9uZW50LCBkcmFnZ2VkSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGJ1dHRvbkNsaWNrZWQodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlID09PSAncmVzZXQnKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250YWluZXIgPSBPYmplY3RVdGlscy5yZXNldEZvcm0odGhpcy5mb3JtQ29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBPYmplY3RVdGlscy52YWxpZGF0ZUZvcm0odGhpcy5mb3JtQ29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmICghZGF0YS5pc0Zvcm1WYWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5vcGVuTm90aWZpY2F0aW9uKCdQbGVhc2UgZmlsbCBpbiB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIGZpZWxkcy4nICsgJyBcXG4gXFxuJyArIGRhdGEubGFiZWxzLmpvaW4oJywgJyksICdDbG9zZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQodGhpcy5mb3JtQ29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKGNvbnRyb2w6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmFzd01vZGVsQ2hhbmdlLmVtaXQoY29udHJvbCk7XG4gICAgfVxuICAgIGFzeW5jIG1ha2VQZGYoKSB7XG4gICAgICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERigncCcsICdtbScsICdhNCcpO1xuXG4gICAgICAgIGh0bWwyY2FudmFzKHRoaXMucHJpbnRQZGYubmF0aXZlRWxlbWVudCwgeyBzY2FsZTogMSB9KS50aGVuKChjYW52YXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1dpZHRoID0gMjEwO1xuICAgICAgICAgICAgY29uc3QgcGFnZUhlaWdodCA9IDI5NTtcbiAgICAgICAgICAgIGNvbnN0IGltZ0hlaWdodCA9IChjYW52YXMuaGVpZ2h0ICogaW1nV2lkdGgpIC8gY2FudmFzLndpZHRoO1xuICAgICAgICAgICAgbGV0IGhlaWdodExlZnQgPSBpbWdIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgcG9zaXRpb24gPSAwO1xuXG4gICAgICAgICAgICBwZGYuYWRkSW1hZ2UoaW1nRGF0YSwgJ1BORycsIDAsIHBvc2l0aW9uLCBpbWdXaWR0aCwgaW1nSGVpZ2h0KTtcbiAgICAgICAgICAgIGhlaWdodExlZnQgLT0gcGFnZUhlaWdodDtcblxuICAgICAgICAgICAgd2hpbGUgKGhlaWdodExlZnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gaGVpZ2h0TGVmdCAtIGltZ0hlaWdodDtcbiAgICAgICAgICAgICAgICBwZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIHBkZi5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMCwgcG9zaXRpb24sIGltZ1dpZHRoLCBpbWdIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGhlaWdodExlZnQgLT0gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2luZG93Lm9wZW4ocGRmLm91dHB1dCgnYmxvYnVybCcpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY29uc3QgaHRtbEVsZW1lbnQgPSB0aGlzLnByaW50UGRmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIGNvbnN0IHdpZHRoID0gaHRtbEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIC8vIGNvbnN0IGhlaWdodCA9IGh0bWxFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgLy8gLy8gZGVidWdnZXJcbiAgICAgICAgLy8gLy8gY29uc3QgcGRmID0gbmV3IGpzUERGKHsgdW5pdDogJ2luJywgZm9ybWF0OiAnYTAnLCBvcmllbnRhdGlvbjogJ3BvcnRyYWl0JyB9KTtcbiAgICAgICAgLy8gLy8gcGRmLmh0bWwoaHRtbEVsZW1lbnQsIHtcbiAgICAgICAgLy8gLy8gICAgIGh0bWwyY2FudmFzOiB7XG4gICAgICAgIC8vIC8vICAgICAgICAgc2NhbGU6IDAuMywgLy90aGlzIHdhcyBteSBzb2x1dGlvbiwgeW91IGhhdmUgdG8gYWRqdXN0IHRvIHlvdXIgc2l6ZVxuICAgICAgICAvLyAvLyAgICAgICAgIHdpZHRoOiAxMDAwIC8vZm9yIHNvbWUgcmVhc29uIHdpZHRoIGRvZXMgbm90aGluZ1xuICAgICAgICAvLyAvLyAgICAgfSxcbiAgICAgICAgLy8gLy8gICAgIGNhbGxiYWNrOiAoZG9jOiBhbnkpID0+IHtcbiAgICAgICAgLy8gLy8gICAgICAgICB3aW5kb3cub3Blbihkb2Mub3V0cHV0KFwiYmxvYnVybFwiKSk7XG4gICAgICAgIC8vIC8vICAgICB9XG4gICAgICAgIC8vIC8vIH0pO1xuXG4gICAgICAgIC8vIGh0bWwyY2FudmFzKGh0bWxFbGVtZW50KS50aGVuKGNhbnZhcyA9PiB7XG4gICAgICAgIC8vICAgICAvLyBGZXcgbmVjZXNzYXJ5IHNldHRpbmcgb3B0aW9uc1xuICAgICAgICAvLyAgICAgY29uc3QgaW1nV2lkdGggPSAyMDg7XG4gICAgICAgIC8vICAgICBjb25zdCBwYWdlSGVpZ2h0ID0gMjk1O1xuICAgICAgICAvLyAgICAgY29uc3QgaW1nSGVpZ2h0ID0gY2FudmFzLmhlaWdodCAqIGltZ1dpZHRoIC8gY2FudmFzLndpZHRoO1xuICAgICAgICAvLyAgICAgY29uc3QgaGVpZ2h0TGVmdCA9IGltZ0hlaWdodDtcblxuICAgICAgICAvLyAgICAgY29uc3QgY29udGVudERhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgLy8gICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERigncCcsICdtbScsICdhNCcpOyAvLyBBNCBzaXplIHBhZ2Ugb2YgUERGXG4gICAgICAgIC8vICAgICBjb25zdCBwb3NpdGlvbiA9IDA7XG4gICAgICAgIC8vICAgICBwZGYuYWRkSW1hZ2UoY29udGVudERhdGFVUkwsICdQTkcnLCAwLCBwb3NpdGlvbiwgaW1nV2lkdGgsIGltZ0hlaWdodCk7XG4gICAgICAgIC8vICAgICB3aW5kb3cub3BlbihwZGYub3V0cHV0KCdibG9idXJsJykpIC8vIEdlbmVyYXRlZCBQREZcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIHZhciByYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgICAvLyBodG1sMmNhbnZhcyhodG1sRWxlbWVudClcbiAgICAgICAgLy8gICAgIC50aGVuKChzdWNjZXNzUmVmOiBhbnkpID0+IHtcbiAgICAgICAgLy8gICAgICAgICB2YXIgZG9jID0gbmV3IGpzUERGKCdwJywgJ3B0JywgJ2E0Jyk7XG4gICAgICAgIC8vICAgICAgICAgdmFyIGltZyA9IHN1