stimulsoft-forms
Version:
Stimulsoft PDF Forms
291 lines • 33.5 kB
JavaScript
import { Component, Input, ViewChild } from "@angular/core";
import { StiDateTimeBoxValueChoise, StiDateTimeBoxType, StiHorizontalAlignment } from "../../system/enums";
import { StiInputTextItem } from "../../helper/StiInputTextItem";
import * as i0 from "@angular/core";
import * as i1 from "../../services/model.service";
import * as i2 from "../../services/sti-editable-content.service";
import * as i3 from "@angular/common";
import * as i4 from "../sti-component";
import * as i5 from "../sti-editable-content.component";
import * as i6 from "../svg.components/svg.checkbox.component";
import * as i7 from "../sti-tooltip/sti-tooltip.directive";
export class StiDateTimeBoxComponent {
get isCurrent() {
return this.element.initialState == StiDateTimeBoxValueChoise.Current;
}
get isReadOnly() {
return this.element.readOnly;
}
get needToFill() {
return (this.element.required &&
(this.element.allowNull ? !this.element.dateTimeValueIsNotNull : !this.element.value) &&
this.model.hasEmptyReuiredFields);
}
get align() {
return "start";
}
get isMozila() {
return this.model.getBrowserType() == "firefox" ? true : false;
}
get horizontalAlignment() {
if (this.element.contentAlignment == StiHorizontalAlignment.Left) {
return "start";
}
else if (this.element.contentAlignment == StiHorizontalAlignment.Right) {
return "flex-end";
}
else {
return "center";
}
}
get format() {
return this.element.valueType == StiDateTimeBoxType.Date
? this.element.dateFormat
: this.element.valueType == StiDateTimeBoxType.Time
? this.element.timeFormat
: this.element.dateTimeFormat;
}
getValue() {
return this.element.dateValueString;
}
parseDate(value) {
if (value.length > 0) {
this.element.dateValue = new Date(value);
this.model.formEvents.next({ name: "ValueChanged" });
}
}
formattingDate(dateFormat) {
let result = dateFormat
.replace(/M/g, "k")
.replace(/m/g, "r")
.replace(/tt/g, "a")
.replace(/k/g, "m")
.replace(/r/g, "M");
return result;
}
changeState() {
this.element.dateTimeValueIsNotNull = !this.element.dateTimeValueIsNotNull;
}
borderWidth() {
return `${this.element.borderWeight}px`;
}
inFocus() {
event.stopPropagation();
setTimeout(() => {
let editableContent = new StiInputTextItem("", this.element.font, this.element.textColor, this.element.backgroundColor, this.element.contentAlignment);
editableContent.element = this.element;
this.editableService.editableContent = editableContent;
this.editableService.usedElement = this.element;
}, 0);
}
constructor(model, editableService) {
this.model = model;
this.editableService = editableService;
this.isClone = false;
}
ngOnInit() { }
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiDateTimeBoxComponent, deps: [{ token: i1.StiModelService }, { token: i2.StiEditableContentService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StiDateTimeBoxComponent, selector: "sti-datetimebox-component", inputs: { element: "element", isClone: "isClone" }, viewQueries: [{ propertyName: "inputDate", first: true, predicate: ["inputDate"], descendants: true }], ngImport: i0, template: ` <sti-component [element]="element" [isClone]="isClone" class="sti-date-time-box">
<sti-editable-content-component
*ngIf="element?.label.value?.length > 0 && element?.isLabelTopAlignment()"
[]="element.label"
[]="align"
[]="element?.getContentAlign()"
[]="element.required"
[]="element.showLabelPlaceholder(model?.selectedComponent?.element == element)"
[]="element?.getLabelWidth()"
></sti-editable-content-component>
<table [style.width]="'100%'" [style.height]="'max-content'" [style.margin-top.px]="element?.getTopMargin()">
<tr>
<td
*ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()"
[]="'flex'"
[]="'100%'"
[]="element?.getLabelWidth()"
[]="element?.getVerticalAlignment()"
>
<sti-editable-content-component
*ngIf="element?.label.value?.length > 0"
[]="element?.label"
[]="element.required"
[]="element?.getContentAlign()"
[]="element?.getLabelWidth()"
[]="element?.showLabelPlaceholder(model?.selectedComponent?.element == element)"
></sti-editable-content-component>
</td>
<td [style.width]="'100%'" [style.position]="'relative'">
<div
class="date-time-box-container"
[]="align"
[]="element?.tooltip"
tooltipPosition="bottom"
showDelay="500"
[]="element?.htmlStyle()"
[]="horizontalAlignment"
[]="needToFill ? 'red' : element?.borderColor.toHtmlColor()"
[]="this.element.backgroundColor.toHtmlColor()"
[]="borderWidth()"
(click)="inFocus(); inputDate.click()"
>
<sti-svg-checkbox-component
*ngIf="element.allowNull && !model.previewMode"
[]="margin"
[]="align"
[]="'auto'"
[]="element"
[]="element?.name"
[]=""
[]="element?.dateTimeValueIsNotNull"
[]="true"
(buttonClick)="changeState()"
></sti-svg-checkbox-component>
<span
[]="'100%'"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''"
[]="this.element.textColor.toHtmlColor()"
(click)="inputDate.click()"
>{{getValue()}}</span
>
<div
class="date-picker"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1"
*ngIf="!isReadOnly"
>
<label [style.display]="'flex'" [style.align-items]="'center'" [style.justify-content]="'center'"
><i class="pi pi-chevron-down"></i
></label>
</div>
<input
[]="element.allowNull ? 20 : 0"
[]="isMozila ? 'date' : 'datetime-local'"
(input)="parseDate($event.target.value)"
[]="element['tabIndex']"
[]="element.readOnly && model.previewMode"
(select)="inputDate.click()"
/>
</div>
</td>
</tr>
<tr *ngIf="element?.description.value?.length > 0">
<td *ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()"></td>
<td [style.maxWidth.px]="element.maxWidth + 1">
<sti-editable-content-component
*ngIf="element?.description.value?.length > 0"
[]="element.description"
>
</sti-editable-content-component>
</td>
</tr>
</table>
</sti-component>`, isInline: true, styles: [".date-time-box-container{align-items:center;padding:3px 4px;display:flex;width:100%;border:1px solid transparent}.date-time-box-container:hover{border-color:#a3bde3!important}input{opacity:0;position:absolute;left:0;top:0;width:100%;height:100%}input::-webkit-datetime-edit{display:none}input::-webkit-calendar-picker-indicator{cursor:pointer;width:100%}.date-picker{background-color:transparent;width:16px;position:relative;height:16px;display:flex;align-items:center;justify-content:center;margin-left:4px;padding-right:1px}i{color:#d3d3d3}.pi-chevron-down{font-size:.575rem;font-weight:700;color:#c5c5c5;padding-top:1px}img{vertical-align:middle;margin-left:0;height:16px;width:16px}table{border-spacing:0}tr{height:max-content;padding:0;margin:0}td{height:100%;padding:0;margin:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.StiComponent, selector: "sti-component", inputs: ["element", "class", "isClone", "borderArea"] }, { kind: "component", type: i5.StiEditableContentComponent, selector: "sti-editable-content-component", inputs: ["editableContent", "displayContent", "required", "eParent", "hideEmpty", "active", "alignment", "isTableTotalHeader", "disablePadding", "fromButton", "parentCursor", "isTableHeader"] }, { kind: "component", type: i6.StiSvgCheckBoxComponent, selector: "sti-svg-checkbox-component", inputs: ["element", "id", "text", "state", "useCustomOption", "disablePlaceHolder", "tabIndex"], outputs: ["buttonClick"] }, { kind: "directive", type: i7.StiTooltipDirective, selector: "[stiTooltip]", inputs: ["tooltipPosition", "stiTooltip", "showDelay"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiDateTimeBoxComponent, decorators: [{
type: Component,
args: [{ selector: "sti-datetimebox-component", template: ` <sti-component [element]="element" [isClone]="isClone" class="sti-date-time-box">
<sti-editable-content-component
*ngIf="element?.label.value?.length > 0 && element?.isLabelTopAlignment()"
[]="element.label"
[]="align"
[]="element?.getContentAlign()"
[]="element.required"
[]="element.showLabelPlaceholder(model?.selectedComponent?.element == element)"
[]="element?.getLabelWidth()"
></sti-editable-content-component>
<table [style.width]="'100%'" [style.height]="'max-content'" [style.margin-top.px]="element?.getTopMargin()">
<tr>
<td
*ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()"
[]="'flex'"
[]="'100%'"
[]="element?.getLabelWidth()"
[]="element?.getVerticalAlignment()"
>
<sti-editable-content-component
*ngIf="element?.label.value?.length > 0"
[]="element?.label"
[]="element.required"
[]="element?.getContentAlign()"
[]="element?.getLabelWidth()"
[]="element?.showLabelPlaceholder(model?.selectedComponent?.element == element)"
></sti-editable-content-component>
</td>
<td [style.width]="'100%'" [style.position]="'relative'">
<div
class="date-time-box-container"
[]="align"
[]="element?.tooltip"
tooltipPosition="bottom"
showDelay="500"
[]="element?.htmlStyle()"
[]="horizontalAlignment"
[]="needToFill ? 'red' : element?.borderColor.toHtmlColor()"
[]="this.element.backgroundColor.toHtmlColor()"
[]="borderWidth()"
(click)="inFocus(); inputDate.click()"
>
<sti-svg-checkbox-component
*ngIf="element.allowNull && !model.previewMode"
[]="margin"
[]="align"
[]="'auto'"
[]="element"
[]="element?.name"
[]=""
[]="element?.dateTimeValueIsNotNull"
[]="true"
(buttonClick)="changeState()"
></sti-svg-checkbox-component>
<span
[]="'100%'"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''"
[]="this.element.textColor.toHtmlColor()"
(click)="inputDate.click()"
>{{getValue()}}</span
>
<div
class="date-picker"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 'none' : ''"
[]="!element.dateTimeValueIsNotNull && element.allowNull ? 0 : 1"
*ngIf="!isReadOnly"
>
<label [style.display]="'flex'" [style.align-items]="'center'" [style.justify-content]="'center'"
><i class="pi pi-chevron-down"></i
></label>
</div>
<input
[]="element.allowNull ? 20 : 0"
[]="isMozila ? 'date' : 'datetime-local'"
(input)="parseDate($event.target.value)"
[]="element['tabIndex']"
[]="element.readOnly && model.previewMode"
(select)="inputDate.click()"
/>
</div>
</td>
</tr>
<tr *ngIf="element?.description.value?.length > 0">
<td *ngIf="element?.label.value?.length > 0 && !element?.isLabelTopAlignment()"></td>
<td [style.maxWidth.px]="element.maxWidth + 1">
<sti-editable-content-component
*ngIf="element?.description.value?.length > 0"
[]="element.description"
>
</sti-editable-content-component>
</td>
</tr>
</table>
</sti-component>`, styles: [".date-time-box-container{align-items:center;padding:3px 4px;display:flex;width:100%;border:1px solid transparent}.date-time-box-container:hover{border-color:#a3bde3!important}input{opacity:0;position:absolute;left:0;top:0;width:100%;height:100%}input::-webkit-datetime-edit{display:none}input::-webkit-calendar-picker-indicator{cursor:pointer;width:100%}.date-picker{background-color:transparent;width:16px;position:relative;height:16px;display:flex;align-items:center;justify-content:center;margin-left:4px;padding-right:1px}i{color:#d3d3d3}.pi-chevron-down{font-size:.575rem;font-weight:700;color:#c5c5c5;padding-top:1px}img{vertical-align:middle;margin-left:0;height:16px;width:16px}table{border-spacing:0}tr{height:max-content;padding:0;margin:0}td{height:100%;padding:0;margin:0}\n"] }]
}], ctorParameters: () => [{ type: i1.StiModelService }, { type: i2.StiEditableContentService }], propDecorators: { inputDate: [{
type: ViewChild,
args: ["inputDate"]
}], element: [{
type: Input
}], isClone: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpLWRhdGUtdGltZS1ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RpbXVsc29mdC1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvc3RpLWRhdGUtdGltZS1ib3gvc3RpLWRhdGUtdGltZS1ib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUloRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7O0FBNEtqRSxNQUFNLE9BQU8sdUJBQXVCO0lBSWxDLElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLHlCQUF5QixDQUFDLE9BQU8sQ0FBQztJQUN4RSxDQUFDO0lBQ0QsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQVcsVUFBVTtRQUNuQixPQUFPLENBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ3JCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsS0FBSztRQUNkLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJ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LFlBQ1MsS0FBc0IsRUFDdEIsZUFBMEM7UUFEMUMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsb0JBQWUsR0FBZixlQUFlLENBQTJCO1FBaEYxQyxZQUFPLEdBQVksS0FBSyxDQUFDO0lBaUY5QixDQUFDO0lBRUwsUUFBUSxLQUFXLENBQUM7K0dBdEZULHVCQUF1QjttR0FBdkIsdUJBQXVCLDZOQXhLeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21CQStGTzs7NEZBeUVOLHVCQUF1QjtrQkExS25DLFNBQVM7K0JBQ0UsMkJBQTJCLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzttQkErRk87NEhBMEVPLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdGlNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbW9kZWwuc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHsgU3RpRGF0ZVRpbWVCb3hFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRzL1N0aURhdGVUaW1lQm94RWxlbWVudFwiO1xyXG5pbXBvcnQgeyBTdGlEYXRlVGltZUJveFZhbHVlQ2hvaXNlLCBTdGlEYXRlVGltZUJveFR5cGUsIFN0aUhvcml6b250YWxBbGlnbm1lbnQgfSBmcm9tIFwiLi4vLi4vc3lzdGVtL2VudW1zXCI7XHJcbmltcG9ydCB7IFN0aUVkaXRhYmxlQ29udGVudFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc3RpLWVkaXRhYmxlLWNvbnRlbnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdGlJbnB1dFRleHRJdGVtIH0gZnJvbSBcIi4uLy4uL2hlbHBlci9TdGlJbnB1dFRleHRJdGVtXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJzdGktZGF0ZXRpbWVib3gtY29tcG9uZW50XCIsXHJcbiAgdGVtcGxhdGU6IGAgPHN0aS1jb21wb25lbnQgW2VsZW1lbnRdPVwiZWxlbWVudFwiIFtpc0Nsb25lXT1cImlzQ2xvbmVcIiBjbGFzcz1cInN0aS1kYXRlLXRpbWUtYm94XCI+XHJcbiAgICA8c3RpLWVkaXRhYmxlLWNvbnRlbnQtY29tcG9uZW50XHJcbiAgICAgICpuZ0lmPVwiZWxlbWVudD8ubGFiZWwudmFsdWU/Lmxlbmd0aCA+IDAgJiYgZWxlbWVudD8uaXNMYWJlbFRvcEFsaWdubWVudCgpXCJcclxuICAgICAgW2VkaXRhYmxlQ29udGVudF09XCJlbGVtZW50LmxhYmVsXCJcclxuICAgICAgW3N0eWxlLmFsaWduLXNlbGZdPVwiYWxpZ25cIlxyXG4gICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJlbGVtZW50Py5nZXRDb250ZW50QWxpZ24oKVwiXHJcbiAgICAgIFtyZXF1aXJlZF09XCJlbGVtZW50LnJlcXVpcmVkXCJcclxuICAgICAgW2hpZGVFbXB0eV09XCJlbGVtZW50LnNob3dMYWJlbFBsYWNlaG9sZGVyKG1vZGVsPy5zZWxlY3RlZENvbXBvbmVudD8uZWxlbWVudCA9PSBlbGVtZW50KVwiXHJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJlbGVtZW50Py5nZXRMYWJlbFdpZHRoKClcIlxyXG4gICAgPjwvc3RpLWVkaXRhYmxlLWNvbnRlbnQtY29tcG9uZW50PlxyXG4gICAgPHRhYmxlIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIiBbc3R5bGUuaGVpZ2h0XT1cIidtYXgtY29udGVudCdcIiBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJlbGVtZW50Py5nZXRUb3BNYXJnaW4oKVwiPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRkXHJcbiAgICAgICAgICAqbmdJZj1cImVsZW1lbnQ/LmxhYmVsLnZhbHVlPy5sZW5ndGggPiAwICYmICFlbGVtZW50Py5pc0xhYmVsVG9wQWxpZ25tZW50KClcIlxyXG4gICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiJ2ZsZXgnXCJcclxuICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzEwMCUnXCJcclxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJlbGVtZW50Py5nZXRMYWJlbFdpZHRoKClcIlxyXG4gICAgICAgICAgW3N0eWxlLmFsaWduLWl0ZW1zXT1cImVsZW1lbnQ/LmdldFZlcnRpY2FsQWxpZ25tZW50KClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzdGktZWRpdGFibGUtY29udGVudC1jb21wb25lbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5sYWJlbC52YWx1ZT8ubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIFtlZGl0YWJsZUNvbnRlbnRdPVwiZWxlbWVudD8ubGFiZWxcIlxyXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZWxlbWVudC5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImVsZW1lbnQ/LmdldENvbnRlbnRBbGlnbigpXCJcclxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImVsZW1lbnQ/LmdldExhYmVsV2lkdGgoKVwiXHJcbiAgICAgICAgICAgIFtoaWRlRW1wdHldPVwiZWxlbWVudD8uc2hvd0xhYmVsUGxhY2Vob2xkZXIobW9kZWw/LnNlbGVjdGVkQ29tcG9uZW50Py5lbGVtZW50ID09IGVsZW1lbnQpXCJcclxuICAgICAgICAgID48L3N0aS1lZGl0YWJsZS1jb250ZW50LWNvbXBvbmVudD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBbc3R5bGUud2lkdGhdPVwiJzEwMCUnXCIgW3N0eWxlLnBvc2l0aW9uXT1cIidyZWxhdGl2ZSdcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXRpbWUtYm94LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5hbGlnbi1zZWxmXT1cImFsaWduXCJcclxuICAgICAgICAgICAgW3N0aVRvb2x0aXBdPVwiZWxlbWVudD8udG9vbHRpcFwiXHJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgIHNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgICAgICAgIFtzdHlsZV09XCJlbGVtZW50Py5odG1sU3R5bGUoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5qdXN0aWZ5LWNvbnRlbnRdPVwiaG9yaXpvbnRhbEFsaWdubWVudFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItY29sb3JdPVwibmVlZFRvRmlsbCA/ICdyZWQnIDogZWxlbWVudD8uYm9yZGVyQ29sb3IudG9IdG1sQ29sb3IoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInRoaXMuZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IudG9IdG1sQ29sb3IoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItd2lkdGhdPVwiYm9yZGVyV2lkdGgoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJpbkZvY3VzKCk7IGlucHV0RGF0ZS5jbGljaygpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHN0aS1zdmctY2hlY2tib3gtY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50LmFsbG93TnVsbCAmJiAhbW9kZWwucHJldmlld01vZGVcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tdG9wLnB4XT1cIm1hcmdpblwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmFsaWduLXNlbGZdPVwiYWxpZ25cIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tYmxvY2tdPVwiJ2F1dG8nXCJcclxuICAgICAgICAgICAgICBbZWxlbWVudF09XCJlbGVtZW50XCJcclxuICAgICAgICAgICAgICBbaWRdPVwiZWxlbWVudD8ubmFtZVwiXHJcbiAgICAgICAgICAgICAgW3RleHRdPVwiXCJcclxuICAgICAgICAgICAgICBbc3RhdGVdPVwiZWxlbWVudD8uZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVQbGFjZUhvbGRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwiY2hhbmdlU3RhdGUoKVwiXHJcbiAgICAgICAgICAgID48L3N0aS1zdmctY2hlY2tib3gtY29tcG9uZW50PlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cIiFlbGVtZW50LmRhdGVUaW1lVmFsdWVJc05vdE51bGwgJiYgZWxlbWVudC5hbGxvd051bGwgPyAwIDogMVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIiFlbGVtZW50LmRhdGVUaW1lVmFsdWVJc05vdE51bGwgJiYgZWxlbWVudC5hbGxvd051bGwgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInRoaXMuZWxlbWVudC50ZXh0Q29sb3IudG9IdG1sQ29sb3IoKVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0RGF0ZS5jbGljaygpXCJcclxuICAgICAgICAgICAgICA+e3tnZXRWYWx1ZSgpfX08L3NwYW5cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIiFlbGVtZW50LmRhdGVUaW1lVmFsdWVJc05vdE51bGwgJiYgZWxlbWVudC5hbGxvd051bGwgPyAnbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwiIWVsZW1lbnQuZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbCAmJiBlbGVtZW50LmFsbG93TnVsbCA/IDAgOiAxXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIiFpc1JlYWRPbmx5XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBbc3R5bGUuZGlzcGxheV09XCInZmxleCdcIiBbc3R5bGUuYWxpZ24taXRlbXNdPVwiJ2NlbnRlcidcIiBbc3R5bGUuanVzdGlmeS1jb250ZW50XT1cIidjZW50ZXInXCJcclxuICAgICAgICAgICAgICAgID48aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tZG93blwiPjwvaVxyXG4gICAgICAgICAgICAgID48L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgI2lucHV0RGF0ZVxyXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImVsZW1lbnQuYWxsb3dOdWxsID8gMjAgOiAwXCJcclxuICAgICAgICAgICAgICBbdHlwZV09XCJpc01vemlsYSA/ICdkYXRlJyA6ICdkYXRldGltZS1sb2NhbCdcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJwYXJzZURhdGUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgIFt0YWJJbmRleF09XCJlbGVtZW50Wyd0YWJJbmRleCddXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZWxlbWVudC5yZWFkT25seSAmJiBtb2RlbC5wcmV2aWV3TW9kZVwiXHJcbiAgICAgICAgICAgICAgKHNlbGVjdCk9XCJpbnB1dERhdGUuY2xpY2soKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICA8dHIgKm5nSWY9XCJlbGVtZW50Py5kZXNjcmlwdGlvbi52YWx1ZT8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cImVsZW1lbnQ/LmxhYmVsLnZhbHVlPy5sZW5ndGggPiAwICYmICFlbGVtZW50Py5pc0xhYmVsVG9wQWxpZ25tZW50KClcIj48L3RkPlxyXG4gICAgICAgIDx0ZCBbc3R5bGUubWF4V2lkdGgucHhdPVwiZWxlbWVudC5tYXhXaWR0aCArIDFcIj5cclxuICAgICAgICAgIDxzdGktZWRpdGFibGUtY29udGVudC1jb21wb25lbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5kZXNjcmlwdGlvbi52YWx1ZT8ubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIFtlZGl0YWJsZUNvbnRlbnRdPVwiZWxlbWVudC5kZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3N0aS1lZGl0YWJsZS1jb250ZW50LWNvbXBvbmVudD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICA8L3N0aS1jb21wb25lbnQ+YCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgICAgLmRhdGUtdGltZS1ib3gtY29udGFpbmVyIHtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIHBhZGRpbmc6IDNweCA0cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgICAgfVxyXG4gICAgICAuZGF0ZS10aW1lLWJveC1jb250YWluZXI6aG92ZXIge1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiKDE2MywgMTg5LCAyMjcpICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaW5wdXQge1xyXG4gICAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dDo6LXdlYmtpdC1kYXRldGltZS1lZGl0IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgICB9XHJcbiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3Ige1xyXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICAuZGF0ZS1waWNrZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gICAgICAgIHdpZHRoOiAxNnB4O1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICBoZWlnaHQ6IDE2cHg7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogMXB4O1xyXG4gICAgICB9XHJcbiAgICAgIC8qIC5kYXRlLXBpY2tlcjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE5MCwgMjMwLCAyNTMpO1xyXG4gICAgICB9ICovXHJcbiAgICAgIGkge1xyXG4gICAgICAgIGNvbG9yOiBsaWdodGdyZXk7XHJcbiAgICAgIH1cclxuICAgICAgLnBpLWNoZXZyb24tZG93biB7XHJcbiAgICAgICAgZm9udC1zaXplOiAwLjU3NXJlbTtcclxuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgICBjb2xvcjogcmdiKDE5NywgMTk3LCAxOTcpO1xyXG4gICAgICAgIHBhZGRpbmctdG9wOiAxcHg7XHJcbiAgICAgIH1cclxuICAgICAgaW1nIHtcclxuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAxNnB4O1xyXG4gICAgICAgIHdpZHRoOiAxNnB4O1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlIHtcclxuICAgICAgICBib3JkZXItc3BhY2luZzogMDtcclxuICAgICAgfVxyXG4gICAgICB0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBtYXgtY29udGVudDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgfVxyXG4gICAgICB0ZCB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICB9XHJcbiAgICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGlEYXRlVGltZUJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChcImlucHV0RGF0ZVwiKSBpbnB1dERhdGU6IEVsZW1lbnRSZWY7XHJcbiAgQElucHV0KCkgZWxlbWVudDogU3RpRGF0ZVRpbWVCb3hFbGVtZW50O1xyXG4gIEBJbnB1dCgpIGlzQ2xvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZ2V0IGlzQ3VycmVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaW5pdGlhbFN0YXRlID09IFN0aURhdGVUaW1lQm94VmFsdWVDaG9pc2UuQ3VycmVudDtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5yZWFkT25seTtcclxuICB9XHJcbiAgcHVibGljIGdldCBuZWVkVG9GaWxsKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5lbGVtZW50LnJlcXVpcmVkICYmXHJcbiAgICAgICh0aGlzLmVsZW1lbnQuYWxsb3dOdWxsID8gIXRoaXMuZWxlbWVudC5kYXRlVGltZVZhbHVlSXNOb3ROdWxsIDogIXRoaXMuZWxlbWVudC52YWx1ZSkgJiZcclxuICAgICAgdGhpcy5tb2RlbC5oYXNFbXB0eVJldWlyZWRGaWVsZHNcclxuICAgICk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgYWxpZ24oKSB7XHJcbiAgICByZXR1cm4gXCJzdGFydFwiO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzTW96aWxhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0QnJvd3NlclR5cGUoKSA9PSBcImZpcmVmb3hcIiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBob3Jpem9udGFsQWxpZ25tZW50KCkge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudC5jb250ZW50QWxpZ25tZW50ID09IFN0aUhvcml6b250YWxBbGlnbm1lbnQuTGVmdCkge1xyXG4gICAgICByZXR1cm4gXCJzdGFydFwiO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuY29udGVudEFsaWdubWVudCA9PSBTdGlIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0KSB7XHJcbiAgICAgIHJldHVybiBcImZsZXgtZW5kXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJjZW50ZXJcIjtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCBmb3JtYXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LnZhbHVlVHlwZSA9PSBTdGlEYXRlVGltZUJveFR5cGUuRGF0ZVxyXG4gICAgICA/IHRoaXMuZWxlbWVudC5kYXRlRm9ybWF0XHJcbiAgICAgIDogdGhpcy5lbGVtZW50LnZhbHVlVHlwZSA9PSBTdGlEYXRlVGltZUJveFR5cGUuVGltZVxyXG4gICAgICAgID8gdGhpcy5lbGVtZW50LnRpbWVGb3JtYXRcclxuICAgICAgICA6IHRoaXMuZWxlbWVudC5kYXRlVGltZUZvcm1hdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5kYXRlVmFsdWVTdHJpbmc7XHJcbiAgfVxyXG5cclxuICBwYXJzZURhdGUodmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudC5kYXRlVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMubW9kZWwuZm9ybUV2ZW50cy5uZXh0KHsgbmFtZTogXCJWYWx1ZUNoYW5nZWRcIiB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGZvcm1hdHRpbmdEYXRlKGRhdGVGb3JtYXQpIHtcclxuICAgIGxldCByZXN1bHQgPSBkYXRlRm9ybWF0XHJcbiAgICAgIC5yZXBsYWNlKC9NL2csIFwia1wiKVxyXG4gICAgICAucmVwbGFjZSgvbS9nLCBcInJcIilcclxuICAgICAgLnJlcGxhY2UoL3R0L2csIFwiYVwiKVxyXG4gICAgICAucmVwbGFjZSgvay9nLCBcIm1cIilcclxuICAgICAgLnJlcGxhY2UoL3IvZywgXCJNXCIpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbiAgY2hhbmdlU3RhdGUoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnQuZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbCA9ICF0aGlzLmVsZW1lbnQuZGF0ZVRpbWVWYWx1ZUlzTm90TnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBib3JkZXJXaWR0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuZWxlbWVudC5ib3JkZXJXZWlnaHR9cHhgO1xyXG4gIH1cclxuICBpbkZvY3VzKCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgbGV0IGVkaXRhYmxlQ29udGVudCA9IG5ldyBTdGlJbnB1dFRleHRJdGVtKFxyXG4gICAgICAgIFwiXCIsXHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmZvbnQsXHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnRleHRDb2xvcixcclxuICAgICAgICB0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5jb250ZW50QWxpZ25tZW50XHJcbiAgICAgICk7XHJcbiAgICAgIGVkaXRhYmxlQ29udGVudC5lbGVtZW50ID0gdGhpcy5lbGVtZW50O1xyXG4gICAgICB0aGlzLmVkaXRhYmxlU2VydmljZS5lZGl0YWJsZUNvbnRlbnQgPSBlZGl0YWJsZUNvbnRlbnQ7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVTZXJ2aWNlLnVzZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50O1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG1vZGVsOiBTdGlNb2RlbFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZWRpdGFibGVTZXJ2aWNlOiBTdGlFZGl0YWJsZUNvbnRlbnRTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7IH1cclxufVxyXG4iXX0=