ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
213 lines • 40.4 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, Injector, Optional, ViewChild, ViewEncapsulation } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
import moment from 'moment';
import { merge, Subscription } from 'rxjs';
import { BooleanInputConverter } from '../../../decorators/input-converter';
import { Util } from '../../../util/util';
import { OFormValue } from '../../form/o-form-value';
import { OFormComponent } from '../../form/o-form.component';
import { OFormDataComponent } from '../../o-form-data-component.class';
import { OValueChangeEvent } from '../../o-value-change-event.class';
import { ODateInputComponent } from '../date-input/o-date-input.component';
import { OHourInputComponent } from '../hour-input/o-hour-input.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../date-input/o-date-input.component";
import * as i3 from "../hour-input/o-hour-input.component";
import * as i4 from "@angular/flex-layout/flex";
import * as i5 from "@angular/forms";
import * as i6 from "@angular/material/button";
import * as i7 from "@angular/material/icon";
import * as i8 from "@angular/material/form-field";
import * as i9 from "@angular/material/tooltip";
import * as i10 from "../../../pipes/o-translate.pipe";
import * as i11 from "../../form/o-form.component";
export const DEFAULT_INPUTS_O_TIME_INPUT = [
'valueType: value-type',
'oformat: value-format',
'oDateFormat: date-format',
'oDateLocale: date-locale',
'oDateStartView: date-start-view',
'oDateMinDate: date-min',
'oDateMaxDate: date-max',
'oDateTouchUi: date-touch-ui',
'oDateStartAt: date-start-at',
'oDateFilterDate: date-filter-date',
'oDateTextInputEnabled: date-text-input-enabled',
'oHourFormat: hour-format',
'oHourMin: hour-min',
'oHourMax: hour-max',
'oHourTextInputEnabled: hour-text-input-enabled',
'oHourPlaceholder: hour-placeholder',
'oDatePlaceholder: date-placeholder'
];
export class OTimeInputComponent extends OFormDataComponent {
constructor(form, elRef, injector, cd) {
super(form, elRef, injector);
this.cd = cd;
this.oDateFormat = 'L';
this.oDateStartView = 'month';
this.oDateTextInputEnabled = true;
this.oHourFormat = 24;
this.oHourTextInputEnabled = true;
this.oHourPlaceholder = '';
this.oDatePlaceholder = '';
this.oformat = 'L';
this._valueType = 'timestamp';
this.formGroup = new UntypedFormGroup({});
this.subscription = new Subscription();
this.dateAttr = 'dateInput';
this.hourAttr = 'hourInput';
this._defaultSQLTypeKey = 'DATE';
}
ngOnInit() {
super.ngOnInit();
this.dateAttr += '_' + this.oattr;
this.hourAttr += '_' + this.oattr;
this.subscription.add(merge(this.dateInput.onValueChange, this.hourInput.onValueChange).subscribe((event) => {
if (event.isUserChange()) {
this.updateComponentValue();
const newValue = this._fControl.value;
this.emitOnValueChange(OValueChangeEvent.USER_CHANGE, newValue, this.oldValue);
this.oldValue = newValue;
}
}));
}
ngAfterViewInit() {
this.modifyFormControls();
super.ngAfterViewInit();
this.registerFormControls();
this.setInnerComponentsData();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
createFormControl(cfg, validators) {
this._fControl = super.createFormControl(cfg, validators);
this._fControl.fControlChildren = [this.dateInput, this.hourInput];
return this._fControl;
}
onFormControlChange(value) {
super.onFormControlChange(value);
this.setInnerComponentsData();
}
setValue(newValue, options) {
const changed = this.oldValue !== newValue;
super.setValue(newValue, options);
if (changed) {
this.setInnerComponentsData();
}
}
onClickClearValue(event) {
event.stopPropagation();
event.preventDefault();
this.blockGroupValueChanges = true;
this.clearValue();
this.blockGroupValueChanges = false;
}
setInnerComponentsData() {
let dateValue;
let hourValue;
if (Util.isDefined(this.value) && Util.isDefined(this.value.value)) {
const momentD = moment(this.value.value);
if (momentD.isValid()) {
dateValue = momentD.clone().startOf('day').valueOf();
hourValue = momentD.clone().valueOf() - dateValue;
}
}
if (this.dateInput) {
this.dateInput.setValue(dateValue);
}
if (this.hourInput) {
this.hourInput.setTimestampValue(hourValue);
}
this.cd.detectChanges();
}
updateComponentValue() {
if (!this.value) {
this.value = new OFormValue();
}
let timeValue;
const values = this.formGroup.getRawValue();
const mDate = (values[this.dateAttr] ? moment(values[this.dateAttr]) : moment()).startOf('day');
const mHour = moment(values[this.hourAttr], this.hourInput.formatString);
timeValue = mDate.clone()
.set('hour', mHour.get('hour'))
.set('minute', mHour.get('minutes'))
.valueOf();
this.setFormValue(timeValue);
}
modifyFormControls() {
if (this.dateInput) {
this.dateInput.getFormGroup = () => {
return this.formGroup;
};
}
if (this.hourInput) {
this.hourInput.getFormGroup = () => {
return this.formGroup;
};
}
if (this.form) {
this.form.formGroup.removeControl(this.dateAttr);
this.form.formGroup.removeControl(this.hourAttr);
}
}
registerFormControls() {
if (this.dateInput && this.dateInput.getFormControl()) {
this.formGroup.registerControl(this.dateAttr, this.dateInput.getFormControl());
}
if (this.hourInput) {
if (this.hourInput.getFormControl()) {
this.formGroup.registerControl(this.hourAttr, this.hourInput.getFormControl());
}
}
}
set valueType(val) {
this._valueType = Util.convertToODateValueType(val);
}
get valueType() {
return this._valueType;
}
ensureOFormValue(arg) {
let value = arg;
if (arg instanceof OFormValue) {
value = arg.value;
}
value = Util.parseByValueType(value, this.valueType, this.oformat);
super.ensureOFormValue(value);
}
}
OTimeInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTimeInputComponent, deps: [{ token: forwardRef(() => OFormComponent), optional: true }, { token: i0.ElementRef }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
OTimeInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTimeInputComponent, selector: "o-time-input", inputs: { valueType: ["value-type", "valueType"], oformat: ["value-format", "oformat"], oDateFormat: ["date-format", "oDateFormat"], oDateLocale: ["date-locale", "oDateLocale"], oDateStartView: ["date-start-view", "oDateStartView"], oDateMinDate: ["date-min", "oDateMinDate"], oDateMaxDate: ["date-max", "oDateMaxDate"], oDateTouchUi: ["date-touch-ui", "oDateTouchUi"], oDateStartAt: ["date-start-at", "oDateStartAt"], oDateFilterDate: ["date-filter-date", "oDateFilterDate"], oDateTextInputEnabled: ["date-text-input-enabled", "oDateTextInputEnabled"], oHourFormat: ["hour-format", "oHourFormat"], oHourMin: ["hour-min", "oHourMin"], oHourMax: ["hour-max", "oHourMax"], oHourTextInputEnabled: ["hour-text-input-enabled", "oHourTextInputEnabled"], oHourPlaceholder: ["hour-placeholder", "oHourPlaceholder"], oDatePlaceholder: ["date-placeholder", "oDatePlaceholder"] }, host: { properties: { "class.o-time-input": "true" } }, viewQueries: [{ propertyName: "dateInput", first: true, predicate: ["dateInput"], descendants: true, static: true }, { propertyName: "hourInput", first: true, predicate: ["hourInput"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\" [matTooltipPosition]=\"tooltipPosition\"\n [matTooltipShowDelay]=\"tooltipShowDelay\" [matTooltipHideDelay]=\"tooltipHideDelay\">\n <div class=\"mat-mdc-form-field\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"8px\">\n <div class=\"mat-mdc-form-field-flex\">\n <o-date-input #dateInput fxFlex [attr]=\"dateAttr\" [read-only]=\"readOnly\" [enabled]=\"enabled\" [required]=\"isRequired\" [label]=\"olabel\"\n clear-button=\"no\" automatic-registering=\"no\" automatic-binding=\"no\" (onFocus)=\"innerOnFocus($event)\" (onBlur)=\"innerOnBlur($event)\"\n [format]=\"oDateFormat\" [locale]=\"oDateLocale\" [start-view]=\"oDateStartView\" [min]=\"oDateMinDate\" [max]=\"oDateMaxDate\" [touch-ui]=\"oDateTouchUi\"\n [start-at]=\"oDateStartAt\" [filter-date]=\"oDateFilterDate\" [text-input-enabled]=\"oDateTextInputEnabled\" [placeholder]=\"oDatePlaceholder\"\n [label-visible]=\"labelVisible\" [hide-required-marker]=\"hideRequiredMarker\" [select-all-on-click]=\"selectAllOnClick\">\n </o-date-input>\n\n <span class=\"separator\">–</span>\n\n <o-hour-input #hourInput fxFlex [attr]=\"hourAttr\" [read-only]=\"readOnly\" [enabled]=\"enabled\" [required]=\"isRequired\" clear-button=\"no\"\n automatic-registering=\"no\" automatic-binding=\"no\" (onFocus)=\"innerOnFocus($event)\" (onBlur)=\"innerOnBlur($event)\" [format]=\"oHourFormat\"\n [text-input-enabled]=\"oHourTextInputEnabled\" [min]=\"oHourMin\" [max]=\"oHourMax\" hide-required-marker=\"yes\" label=\"\"\n [placeholder]=\"oHourPlaceholder\" [select-all-on-click]=\"selectAllOnClick\">\n </o-hour-input>\n <div class=\"mat-mdc-form-field-icon-suffix\">\n <button type=\"button\" *ngIf=\"showClearButton\" matIconSuffix mat-icon-button (click)=\"onClickClearValue($event)\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n</div>\n", styles: [".o-time-input .separator{cursor:default}.o-time-input .mat-mdc-form-field.icon-field:not(.custom-width).icon-field-1-suffix .mat-form-field-infix{width:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ODateInputComponent, selector: "o-date-input", inputs: ["value-type", "format", "locale", "start-view", "min", "max", "touch-ui", "start-at", "filter-date", "text-input-enabled", "date-class"] }, { kind: "component", type: i3.OHourInputComponent, selector: "o-hour-input", inputs: ["format", "text-input-enabled", "min", "max", "value-type"] }, { kind: "directive", type: i4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i4.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i4.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i10.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OTimeInputComponent.prototype, "oDateTouchUi", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OTimeInputComponent.prototype, "oDateTextInputEnabled", void 0);
__decorate([
BooleanInputConverter(),
__metadata("design:type", Boolean)
], OTimeInputComponent.prototype, "oHourTextInputEnabled", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTimeInputComponent, decorators: [{
type: Component,
args: [{ selector: 'o-time-input', inputs: DEFAULT_INPUTS_O_TIME_INPUT, encapsulation: ViewEncapsulation.None, host: {
'[class.o-time-input]': 'true'
}, template: "<div [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\" [matTooltipPosition]=\"tooltipPosition\"\n [matTooltipShowDelay]=\"tooltipShowDelay\" [matTooltipHideDelay]=\"tooltipHideDelay\">\n <div class=\"mat-mdc-form-field\" fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"8px\">\n <div class=\"mat-mdc-form-field-flex\">\n <o-date-input #dateInput fxFlex [attr]=\"dateAttr\" [read-only]=\"readOnly\" [enabled]=\"enabled\" [required]=\"isRequired\" [label]=\"olabel\"\n clear-button=\"no\" automatic-registering=\"no\" automatic-binding=\"no\" (onFocus)=\"innerOnFocus($event)\" (onBlur)=\"innerOnBlur($event)\"\n [format]=\"oDateFormat\" [locale]=\"oDateLocale\" [start-view]=\"oDateStartView\" [min]=\"oDateMinDate\" [max]=\"oDateMaxDate\" [touch-ui]=\"oDateTouchUi\"\n [start-at]=\"oDateStartAt\" [filter-date]=\"oDateFilterDate\" [text-input-enabled]=\"oDateTextInputEnabled\" [placeholder]=\"oDatePlaceholder\"\n [label-visible]=\"labelVisible\" [hide-required-marker]=\"hideRequiredMarker\" [select-all-on-click]=\"selectAllOnClick\">\n </o-date-input>\n\n <span class=\"separator\">–</span>\n\n <o-hour-input #hourInput fxFlex [attr]=\"hourAttr\" [read-only]=\"readOnly\" [enabled]=\"enabled\" [required]=\"isRequired\" clear-button=\"no\"\n automatic-registering=\"no\" automatic-binding=\"no\" (onFocus)=\"innerOnFocus($event)\" (onBlur)=\"innerOnBlur($event)\" [format]=\"oHourFormat\"\n [text-input-enabled]=\"oHourTextInputEnabled\" [min]=\"oHourMin\" [max]=\"oHourMax\" hide-required-marker=\"yes\" label=\"\"\n [placeholder]=\"oHourPlaceholder\" [select-all-on-click]=\"selectAllOnClick\">\n </o-hour-input>\n <div class=\"mat-mdc-form-field-icon-suffix\">\n <button type=\"button\" *ngIf=\"showClearButton\" matIconSuffix mat-icon-button (click)=\"onClickClearValue($event)\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n</div>\n", styles: [".o-time-input .separator{cursor:default}.o-time-input .mat-mdc-form-field.icon-field:not(.custom-width).icon-field-1-suffix .mat-form-field-infix{width:auto}\n"] }]
}], ctorParameters: function () { return [{ type: i11.OFormComponent, decorators: [{
type: Optional
}, {
type: Inject,
args: [forwardRef(() => OFormComponent)]
}] }, { type: i0.ElementRef }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { oDateTouchUi: [], oDateTextInputEnabled: [], oHourTextInputEnabled: [], dateInput: [{
type: ViewChild,
args: ['dateInput', { static: true }]
}], hourInput: [{
type: ViewChild,
args: ['hourInput', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10aW1lLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L3RpbWUtaW5wdXQvby10aW1lLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L3RpbWUtaW5wdXQvby10aW1lLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBR1IsUUFBUSxFQUNSLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBSTVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxtQkFB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NEhBOUIvQyxZQUFZLE1BSVoscUJBQXFCLE1BS3JCLHFCQUFxQixNQVVsQixTQUFTO3NCQURsQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTlCLFNBQVM7c0JBRGxCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBtZXJnZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGdW5jdGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2RhdGUtZmlsdGVyLWZ1bmN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2Zvcm0tdmFsdWUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9EYXRlVmFsdWVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvby1kYXRlLXZhbHVlLnR5cGUnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybVZhbHVlIH0gZnJvbSAnLi4vLi4vZm9ybS9vLWZvcm0tdmFsdWUnO1xuaW1wb3J0IHsgT0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9mb3JtL28tZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1EYXRhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vby1mb3JtLWRhdGEtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9WYWx1ZUNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vby12YWx1ZS1jaGFuZ2UtZXZlbnQuY2xhc3MnO1xuaW1wb3J0IHsgT0RhdGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtaW5wdXQvby1kYXRlLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPSG91cklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vaG91ci1pbnB1dC9vLWhvdXItaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29udHJvbCB9IGZyb20gJy4uL28tZm9ybS1jb250cm9sLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fVElNRV9JTlBVVCA9IFtcbiAgJ3ZhbHVlVHlwZTogdmFsdWUtdHlwZScsXG4gICdvZm9ybWF0OiB2YWx1ZS1mb3JtYXQnLFxuICAnb0RhdGVGb3JtYXQ6IGRhdGUtZm9ybWF0JyxcbiAgJ29EYXRlTG9jYWxlOiBkYXRlLWxvY2FsZScsXG4gICdvRGF0ZVN0YXJ0VmlldzogZGF0ZS1zdGFydC12aWV3JyxcbiAgJ29EYXRlTWluRGF0ZTogZGF0ZS1taW4nLFxuICAnb0RhdGVNYXhEYXRlOiBkYXRlLW1heCcsXG4gICdvRGF0ZVRvdWNoVWk6IGRhdGUtdG91Y2gtdWknLFxuICAnb0RhdGVTdGFydEF0OiBkYXRlLXN0YXJ0LWF0JyxcbiAgJ29EYXRlRmlsdGVyRGF0ZTogZGF0ZS1maWx0ZXItZGF0ZScsXG4gICdvRGF0ZVRleHRJbnB1dEVuYWJsZWQ6IGRhdGUtdGV4dC1pbnB1dC1lbmFibGVkJyxcbiAgJ29Ib3VyRm9ybWF0OiBob3VyLWZvcm1hdCcsXG4gICdvSG91ck1pbjogaG91ci1taW4nLFxuICAnb0hvdXJNYXg6IGhvdXItbWF4JyxcbiAgJ29Ib3VyVGV4dElucHV0RW5hYmxlZDogaG91ci10ZXh0LWlucHV0LWVuYWJsZWQnLFxuICAnb0hvdXJQbGFjZWhvbGRlcjogaG91ci1wbGFjZWhvbGRlcicsXG4gICdvRGF0ZVBsYWNlaG9sZGVyOiBkYXRlLXBsYWNlaG9sZGVyJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby10aW1lLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tdGltZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tdGltZS1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVElNRV9JTlBVVCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby10aW1lLWlucHV0XSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9UaW1lSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBPRm9ybURhdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIG9EYXRlRm9ybWF0OiBzdHJpbmcgPSAnTCc7XG4gIHB1YmxpYyBvRGF0ZUxvY2FsZTogYW55O1xuICBwdWJsaWMgb0RhdGVTdGFydFZpZXc6ICdtb250aCcgfCAneWVhcicgPSAnbW9udGgnO1xuICBwdWJsaWMgb0RhdGVNaW5EYXRlOiBhbnk7XG4gIHB1YmxpYyBvRGF0ZU1heERhdGU6IGFueTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBvRGF0ZVRvdWNoVWk6IGJvb2xlYW47XG4gIHB1YmxpYyBvRGF0ZVN0YXJ0QXQ6IGFueTtcbiAgcHVibGljIG9EYXRlRmlsdGVyRGF0ZTogRGF0ZUZpbHRlckZ1bmN0aW9uO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIG9EYXRlVGV4dElucHV0RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBvSG91ckZvcm1hdDogbnVtYmVyID0gMjQ7XG4gIHB1YmxpYyBvSG91ck1pbjogc3RyaW5nO1xuICBwdWJsaWMgb0hvdXJNYXg6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBvSG91clRleHRJbnB1dEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgb0hvdXJQbGFjZWhvbGRlciA9ICcnO1xuICBwdWJsaWMgb0RhdGVQbGFjZWhvbGRlciA9ICcnO1xuICBwcm90ZWN0ZWQgb2Zvcm1hdDogc3RyaW5nID0gJ0wnO1xuICBwcm90ZWN0ZWQgX3ZhbHVlVHlwZTogT0RhdGVWYWx1ZVR5cGUgPSAndGltZXN0YW1wJztcblxuICBwcm90ZWN0ZWQgYmxvY2tHcm91cFZhbHVlQ2hhbmdlczogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcblxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgZGF0ZUlucHV0OiBPRGF0ZUlucHV0Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ2hvdXJJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByb3RlY3RlZCBob3VySW5wdXQ6IE9Ib3VySW5wdXRDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBkYXRlQXR0ciA9ICdkYXRlSW5wdXQnO1xuICBwdWJsaWMgaG91ckF0dHIgPSAnaG91cklucHV0JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gT0Zvcm1Db21wb25lbnQpKSBmb3JtOiBPRm9ybUNvbXBvbmVudCxcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKGZvcm0sIGVsUmVmLCBpbmplY3Rvcik7XG4gICAgdGhpcy5fZGVmYXVsdFNRTFR5cGVLZXkgPSAnREFURSc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMuZGF0ZUF0dHIgKz0gJ18nICsgdGhpcy5vYXR0cjtcbiAgICB0aGlzLmhvdXJBdHRyICs9ICdfJyArIHRoaXMub2F0dHI7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBtZXJnZSh0aGlzLmRhdGVJbnB1dC5vblZhbHVlQ2hhbmdlLCB0aGlzLmhvdXJJbnB1dC5vblZhbHVlQ2hhbmdlKS5zdWJzY3JpYmUoKGV2ZW50OiBPVmFsdWVDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuaXNVc2VyQ2hhbmdlKCkpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudFZhbHVlKCk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLl9mQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICB0aGlzLmVtaXRPblZhbHVlQ2hhbmdlKE9WYWx1ZUNoYW5nZUV2ZW50LlVTRVJfQ0hBTkdFLCBuZXdWYWx1ZSwgdGhpcy5vbGRWYWx1ZSk7XG4gICAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kaWZ5Rm9ybUNvbnRyb2xzKCk7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5yZWdpc3RlckZvcm1Db250cm9scygpO1xuICAgIHRoaXMuc2V0SW5uZXJDb21wb25lbnRzRGF0YSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRm9ybUNvbnRyb2woY2ZnLCB2YWxpZGF0b3JzKTogT0Zvcm1Db250cm9sIHtcbiAgICB0aGlzLl9mQ29udHJvbCA9IHN1cGVyLmNyZWF0ZUZvcm1Db250cm9sKGNmZywgdmFsaWRhdG9ycyk7XG4gICAgdGhpcy5fZkNvbnRyb2wuZkNvbnRyb2xDaGlsZHJlbiA9IFt0aGlzLmRhdGVJbnB1dCwgdGhpcy5ob3VySW5wdXRdO1xuICAgIHJldHVybiB0aGlzLl9mQ29udHJvbDtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvcm1Db250cm9sQ2hhbmdlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBzdXBlci5vbkZvcm1Db250cm9sQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLnNldElubmVyQ29tcG9uZW50c0RhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWx1ZShuZXdWYWx1ZTogYW55LCBvcHRpb25zPzogRm9ybVZhbHVlT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLm9sZFZhbHVlICE9PSBuZXdWYWx1ZTtcbiAgICBzdXBlci5zZXRWYWx1ZShuZXdWYWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuc2V0SW5uZXJDb21wb25lbnRzRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQ2xlYXJWYWx1ZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuYmxvY2tHcm91cFZhbHVlQ2hhbmdlcyA9IHRydWU7XG4gICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgdGhpcy5ibG9ja0dyb3VwVmFsdWVDaGFuZ2VzID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SW5uZXJDb21wb25lbnRzRGF0YSgpOiB2b2lkIHtcbiAgICBsZXQgZGF0ZVZhbHVlOiBhbnk7XG4gICAgbGV0IGhvdXJWYWx1ZTogYW55O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnZhbHVlKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnZhbHVlLnZhbHVlKSkge1xuICAgICAgY29uc3QgbW9tZW50RCA9IG1vbWVudCh0aGlzLnZhbHVlLnZhbHVlKTtcbiAgICAgIGlmIChtb21lbnRELmlzVmFsaWQoKSkge1xuICAgICAgICBkYXRlVmFsdWUgPSBtb21lbnRELmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICAgICAgICBob3VyVmFsdWUgPSBtb21lbnRELmNsb25lKCkudmFsdWVPZigpIC0gZGF0ZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5kYXRlSW5wdXQpIHtcbiAgICAgIHRoaXMuZGF0ZUlucHV0LnNldFZhbHVlKGRhdGVWYWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhvdXJJbnB1dCkge1xuICAgICAgdGhpcy5ob3VySW5wdXQuc2V0VGltZXN0YW1wVmFsdWUoaG91clZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ29tcG9uZW50VmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3IE9Gb3JtVmFsdWUoKTtcbiAgICB9XG4gICAgbGV0IHRpbWVWYWx1ZTogbnVtYmVyO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgbURhdGUgPSAodmFsdWVzW3RoaXMuZGF0ZUF0dHJdID8gbW9tZW50KHZhbHVlc1t0aGlzLmRhdGVBdHRyXSkgOiBtb21lbnQoKSkuc3RhcnRPZignZGF5Jyk7XG4gICAgY29uc3QgbUhvdXIgPSBtb21lbnQodmFsdWVzW3RoaXMuaG91ckF0dHJdLCB0aGlzLmhvdXJJbnB1dC5mb3JtYXRTdHJpbmcpO1xuICAgIHRpbWVWYWx1ZSA9IG1EYXRlLmNsb25lKClcbiAgICAgIC5zZXQoJ2hvdXInLCBtSG91ci5nZXQoJ2hvdXInKSlcbiAgICAgIC5zZXQoJ21pbnV0ZScsIG1Ib3VyLmdldCgnbWludXRlcycpKVxuICAgICAgLnZhbHVlT2YoKTtcbiAgICB0aGlzLnNldEZvcm1WYWx1ZSh0aW1lVmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vZGlmeUZvcm1Db250cm9scygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlSW5wdXQpIHtcbiAgICAgIHRoaXMuZGF0ZUlucHV0LmdldEZvcm1Hcm91cCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3VySW5wdXQpIHtcbiAgICAgIHRoaXMuaG91cklucHV0LmdldEZvcm1Hcm91cCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLmZvcm0uZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2wodGhpcy5kYXRlQXR0cik7XG4gICAgICB0aGlzLmZvcm0uZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2wodGhpcy5ob3VyQXR0cik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyRm9ybUNvbnRyb2xzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVJbnB1dCAmJiB0aGlzLmRhdGVJbnB1dC5nZXRGb3JtQ29udHJvbCgpKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5yZWdpc3RlckNvbnRyb2wodGhpcy5kYXRlQXR0ciwgdGhpcy5kYXRlSW5wdXQuZ2V0Rm9ybUNvbnRyb2woKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhvdXJJbnB1dCkge1xuICAgICAgaWYgKHRoaXMuaG91cklucHV0LmdldEZvcm1Db250cm9sKCkpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucmVnaXN0ZXJDb250cm9sKHRoaXMuaG91ckF0dHIsIHRoaXMuaG91cklucHV0LmdldEZvcm1Db250cm9sKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldCB2YWx1ZVR5cGUodmFsOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZVR5cGUgPSBVdGlsLmNvbnZlcnRUb09EYXRlVmFsdWVUeXBlKHZhbCk7XG4gIH1cblxuICBnZXQgdmFsdWVUeXBlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBlbnN1cmVPRm9ybVZhbHVlKGFyZzogYW55KTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gYXJnO1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPRm9ybVZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IGFyZy52YWx1ZTtcbiAgICB9XG4gICAgdmFsdWUgPSBVdGlsLnBhcnNlQnlWYWx1ZVR5cGUodmFsdWUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLm9mb3JtYXQpO1xuICAgIHN1cGVyLmVuc3VyZU9Gb3JtVmFsdWUodmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwKClcIiBbbWF0VG9vbHRpcF09XCJ0b29sdGlwXCIgW21hdFRvb2x0aXBDbGFzc109XCJ0b29sdGlwQ2xhc3NcIiBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvblwiXG4gIFttYXRUb29sdGlwU2hvd0RlbGF5XT1cInRvb2x0aXBTaG93RGVsYXlcIiBbbWF0VG9vbHRpcEhpZGVEZWxheV09XCJ0b29sdGlwSGlkZURlbGF5XCI+XG4gIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGRcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiIGZ4TGF5b3V0R2FwPVwiOHB4XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1mbGV4XCI+XG4gICAgPG8tZGF0ZS1pbnB1dCAjZGF0ZUlucHV0IGZ4RmxleCBbYXR0cl09XCJkYXRlQXR0clwiIFtyZWFkLW9ubHldPVwicmVhZE9ubHlcIiBbZW5hYmxlZF09XCJlbmFibGVkXCIgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIiBbbGFiZWxdPVwib2xhYmVsXCJcbiAgICAgIGNsZWFyLWJ1dHRvbj1cIm5vXCIgYXV0b21hdGljLXJlZ2lzdGVyaW5nPVwibm9cIiBhdXRvbWF0aWMtYmluZGluZz1cIm5vXCIgKG9uRm9jdXMpPVwiaW5uZXJPbkZvY3VzKCRldmVudClcIiAob25CbHVyKT1cImlubmVyT25CbHVyKCRldmVudClcIlxuICAgICAgW2Zvcm1hdF09XCJvRGF0ZUZvcm1hdFwiIFtsb2NhbGVdPVwib0RhdGVMb2NhbGVcIiBbc3RhcnQtdmlld109XCJvRGF0ZVN0YXJ0Vmlld1wiIFttaW5dPVwib0RhdGVNaW5EYXRlXCIgW21heF09XCJvRGF0ZU1heERhdGVcIiBbdG91Y2gtdWldPVwib0RhdGVUb3VjaFVpXCJcbiAgICAgIFtzdGFydC1hdF09XCJvRGF0ZVN0YXJ0QXRcIiBbZmlsdGVyLWRhdGVdPVwib0RhdGVGaWx0ZXJEYXRlXCIgW3RleHQtaW5wdXQtZW5hYmxlZF09XCJvRGF0ZVRleHRJbnB1dEVuYWJsZWRcIiBbcGxhY2Vob2xkZXJdPVwib0RhdGVQbGFjZWhvbGRlclwiXG4gICAgICBbbGFiZWwtdmlzaWJsZV09XCJsYWJlbFZpc2libGVcIiBbaGlkZS1yZXF1aXJlZC1tYXJrZXJdPVwiaGlkZVJlcXVpcmVkTWFya2VyXCIgW3NlbGVjdC1hbGwtb24tY2xpY2tdPVwic2VsZWN0QWxsT25DbGlja1wiPlxuICAgIDwvby1kYXRlLWlucHV0PlxuXG4gICAgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj4mbmRhc2g7PC9zcGFuPlxuXG4gICAgPG8taG91ci1pbnB1dCAjaG91cklucHV0IGZ4RmxleCBbYXR0cl09XCJob3VyQXR0clwiIFtyZWFkLW9ubHldPVwicmVhZE9ubHlcIiBbZW5hYmxlZF09XCJlbmFibGVkXCIgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIiBjbGVhci1idXR0b249XCJub1wiXG4gICAgICBhdXRvbWF0aWMtcmVnaXN0ZXJpbmc9XCJub1wiIGF1dG9tYXRpYy1iaW5kaW5nPVwibm9cIiAob25Gb2N1cyk9XCJpbm5lck9uRm9jdXMoJGV2ZW50KVwiIChvbkJsdXIpPVwiaW5uZXJPbkJsdXIoJGV2ZW50KVwiIFtmb3JtYXRdPVwib0hvdXJGb3JtYXRcIlxuICAgICAgW3RleHQtaW5wdXQtZW5hYmxlZF09XCJvSG91clRleHRJbnB1dEVuYWJsZWRcIiBbbWluXT1cIm9Ib3VyTWluXCIgW21heF09XCJvSG91ck1heFwiIGhpZGUtcmVxdWlyZWQtbWFya2VyPVwieWVzXCIgbGFiZWw9XCJcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIm9Ib3VyUGxhY2Vob2xkZXJcIiBbc2VsZWN0LWFsbC1vbi1jbGlja109XCJzZWxlY3RBbGxPbkNsaWNrXCI+XG4gICAgPC9vLWhvdXItaW5wdXQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93Q2xlYXJCdXR0b25cIiBtYXRJY29uU3VmZml4IG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25DbGlja0NsZWFyVmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBvRXJyb3Igb2YgZ2V0QWN0aXZlT0Vycm9ycygpXCI+XG4gICAge3sgb0Vycm9yLnRleHQgfCBvVHJhbnNsYXRlIH19XG4gIDwvbWF0LWVycm9yPlxuPC9kaXY+XG4iXX0=