@alfresco/adf-content-services
Version:
Alfresco ADF content services
197 lines • 49.6 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, DestroyRef, EventEmitter, inject, Inject, Input, Output, ViewEncapsulation } from '@angular/core';
import { endOfDay, isAfter, isBefore, isValid, parse } from 'date-fns';
import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core';
import { DateFnsAdapter, MAT_DATE_FNS_FORMATS } from '@angular/material-date-fns-adapter';
import { InLastDateType } from './in-last-date-type';
import { DateRangeType } from './date-range-type';
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
import { DateFnsUtils, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
import { CommonModule } from '@angular/common';
import { MatRadioModule } from '@angular/material/radio';
import { TranslateModule } from '@ngx-translate/core';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@alfresco/adf-core";
import * as i3 from "@angular/material/core";
import * as i4 from "@angular/common";
import * as i5 from "@angular/material/radio";
import * as i6 from "@ngx-translate/core";
import * as i7 from "@angular/material/form-field";
import * as i8 from "@angular/material/input";
import * as i9 from "@angular/material/select";
import * as i10 from "@angular/material/datepicker";
const DEFAULT_DATE_DISPLAY_FORMAT = 'dd-MMM-yy';
export class SearchDateRangeComponent {
set initialValue(value) {
if (value) {
this.form.patchValue(value);
}
}
constructor(formBuilder, userPreferencesService, dateAdapter, dateFormatConfig) {
this.formBuilder = formBuilder;
this.userPreferencesService = userPreferencesService;
this.dateAdapter = dateAdapter;
this.dateFormatConfig = dateFormatConfig;
this.dateFormat = DEFAULT_DATE_DISPLAY_FORMAT;
this.changed = new EventEmitter();
this.valid = new EventEmitter();
this.form = this.formBuilder.group({
dateRangeType: DateRangeType.ANY,
inLastValueType: InLastDateType.DAYS,
inLastValue: undefined,
betweenStartDate: undefined,
betweenEndDate: undefined
});
this.betweenStartDateFormControl = this.form.controls.betweenStartDate;
this.betweenEndDateFormControl = this.form.controls.betweenEndDate;
this.DateRangeType = DateRangeType;
this.InLastDateType = InLastDateType;
this.destroyRef = inject(DestroyRef);
this.endDateValidator = (formControl) => {
if (isBefore(formControl.value, this.betweenStartDateFormControl.value) || isAfter(formControl.value, this.convertedMaxDate)) {
return {
invalidDate: true
};
}
return {};
};
}
ngOnInit() {
this.dateFormatConfig.display.dateInput = this.dateFormat;
this.convertedMaxDate = endOfDay(this.maxDate && this.maxDate !== 'today' ? parse(this.maxDate, this.dateFormat, new Date()) : new Date());
this.userPreferencesService
.select(UserPreferenceValues.Locale)
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((locale) => this.dateAdapter.setLocale(DateFnsUtils.getLocaleFromString(locale)));
this.form.controls.dateRangeType.valueChanges
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((dateRangeType) => this.updateValidators(dateRangeType));
this.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.onChange());
}
updateValidators(dateRangeType) {
switch (dateRangeType) {
case DateRangeType.BETWEEN:
this.betweenStartDateFormControl.setValidators(Validators.required);
this.betweenEndDateFormControl.setValidators([Validators.required, this.endDateValidator]);
this.form.controls.inLastValue.clearValidators();
break;
case DateRangeType.IN_LAST:
this.form.controls.inLastValue.setValidators(Validators.required);
this.betweenStartDateFormControl.clearValidators();
this.betweenEndDateFormControl.clearValidators();
break;
default:
this.form.controls.inLastValue.clearValidators();
this.betweenStartDateFormControl.clearValidators();
this.betweenEndDateFormControl.clearValidators();
break;
}
this.betweenStartDateFormControl.updateValueAndValidity();
this.betweenEndDateFormControl.updateValueAndValidity();
this.form.controls.inLastValue.updateValueAndValidity();
}
onChange() {
if (this.form.valid) {
this.changed.emit(this.form.value);
}
this.valid.emit(this.form.valid);
}
dateChanged(event, formControl) {
if (event?.target['value']?.trim()) {
const date = parse(event.target['value'], this.dateFormat, new Date());
if (!isValid(date)) {
formControl.setErrors({
...formControl.errors,
required: false,
invalidDate: true
});
}
else {
formControl.setErrors({
...formControl.errors,
invalidDate: false
});
formControl.setValue(date);
}
}
}
narrowDownAllowedCharacters(event) {
if (parseInt(event.target.value, 10) === 0) {
event.target.value = '';
}
else {
event.target.value = event.target.value.replace(/\D/g, '');
}
}
preventIncorrectNumberCharacters(event) {
switch (event.key) {
case '.':
case '-':
case 'e':
case '+':
return false;
case '0':
return !!event.target.value;
default:
return true;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchDateRangeComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UserPreferencesService }, { token: i3.DateAdapter }, { token: MAT_DATE_FORMATS }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SearchDateRangeComponent, isStandalone: true, selector: "adf-search-date-range", inputs: { dateFormat: "dateFormat", maxDate: "maxDate", field: "field", initialValue: "initialValue" }, outputs: { changed: "changed", valid: "valid" }, host: { classAttribute: "adf-search-date-range" }, providers: [
{ provide: DateAdapter, useClass: DateFnsAdapter, deps: [MAT_DATE_LOCALE] },
{ provide: MAT_DATE_FORMATS, useValue: MAT_DATE_FNS_FORMATS }
], ngImport: i0, template: "<div class=\"adf-search-date-range-container\" [formGroup]=\"form\">\n <mat-radio-group formControlName=\"dateRangeType\">\n <span class=\"adf-search-date-range-container-row\">\n <mat-radio-button [value]=\"DateRangeType.ANY\" data-automation-id=\"date-range-anytime\">\n {{ 'SEARCH.DATE_RANGE_ADVANCED.OPTIONS.ANYTIME' | translate }}\n </mat-radio-button>\n </span>\n <span class=\"adf-search-date-range-container-row\">\n <mat-radio-button [value]=\"DateRangeType.IN_LAST\" data-automation-id=\"date-range-in-last\">\n {{ 'SEARCH.DATE_RANGE_ADVANCED.OPTIONS.IN_LAST' | translate }}\n </mat-radio-button>\n <mat-form-field class=\"adf-search-date-range-form-field adf-search-date-range-input-field\" subscriptSizing=\"dynamic\">\n <input matInput [attr.aria-label]=\"'SEARCH.DATE_RANGE_ADVANCED.ARIA_LABEL.NUMBER_INPUT' | translate\"\n type=\"number\" min=\"1\" formControlName=\"inLastValue\"\n data-automation-id=\"date-range-in-last-input\" (input)=\"narrowDownAllowedCharacters($event)\"\n (keydown)=\"preventIncorrectNumberCharacters($event)\">\n <mat-error *ngIf=\"form.controls.inLastValue.errors?.required\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.IN_LAST' | translate }}</mat-error>\n </mat-form-field>\n <mat-form-field class=\"adf-search-date-range-form-field adf-search-date-range-form-field-select\" subscriptSizing=\"dynamic\">\n <mat-select formControlName=\"inLastValueType\" data-automation-id=\"date-range-in-last-dropdown\">\n <mat-option data-automation-id=\"date-range-in-last-option-days\" [value]=\"InLastDateType.DAYS\">{{ 'SEARCH.DATE_RANGE_ADVANCED.IN_LAST_LABELS.DAYS' | translate }}</mat-option>\n <mat-option data-automation-id=\"date-range-in-last-option-weeks\" [value]=\"InLastDateType.WEEKS\">{{ 'SEARCH.DATE_RANGE_ADVANCED.IN_LAST_LABELS.WEEKS' | translate }}</mat-option>\n <mat-option data-automation-id=\"date-range-in-last-option-months\" [value]=\"InLastDateType.MONTHS\">{{ 'SEARCH.DATE_RANGE_ADVANCED.IN_LAST_LABELS.MONTHS' | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n </span>\n <span class=\"adf-search-date-range-container-row adf-search-date-range-container-row-date\">\n <mat-radio-button [value]=\"DateRangeType.BETWEEN\" data-automation-id=\"date-range-between\">\n {{ 'SEARCH.DATE_RANGE_ADVANCED.OPTIONS.BETWEEN' | translate }}\n </mat-radio-button>\n <mat-form-field class=\"adf-search-date-range-form-field\" subscriptSizing=\"dynamic\">\n <mat-date-range-input [rangePicker]=\"$any(picker)\" [max]=\"convertedMaxDate\">\n <input matStartDate placeholder=\"{{ 'SEARCH.DATE_RANGE_ADVANCED.BETWEEN_PLACEHOLDERS.START_DATE' | translate }}\"\n data-automation-id=\"date-range-between-start-input\" [formControl]=\"betweenStartDateFormControl\" (change)=\"dateChanged($event, betweenStartDateFormControl)\">\n <input matEndDate placeholder=\"{{ 'SEARCH.DATE_RANGE_ADVANCED.BETWEEN_PLACEHOLDERS.END_DATE' | translate }}\"\n data-automation-id=\"date-range-between-end-input\" [formControl]=\"betweenEndDateFormControl\" (change)=\"dateChanged($event, betweenEndDateFormControl)\">\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"picker\" data-automation-id=\"date-range-between-datepicker-toggle\" />\n <mat-date-range-picker #picker />\n\n <mat-error *ngIf=\"betweenStartDateFormControl.errors?.invalidDate\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.START_DATE.INVALID_FORMAT' | translate }}</mat-error>\n <mat-error *ngIf=\"betweenStartDateFormControl.errors?.required\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.START_DATE.REQUIRED' | translate }}</mat-error>\n <mat-error *ngIf=\"betweenEndDateFormControl.errors?.invalidDate\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.END_DATE.INVALID_FORMAT' | translate }}</mat-error>\n <mat-error *ngIf=\"betweenEndDateFormControl.errors?.required\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.END_DATE.REQUIRED' | translate }}</mat-error>\n </mat-form-field>\n </span>\n </mat-radio-group>\n</div>\n", styles: ["adf-search-date-range .adf-search-date-range-container{margin-top:20px;padding:10px}adf-search-date-range .adf-search-date-range-container .adf-search-date-range-form-field-select{width:180px;min-width:180px}adf-search-date-range .adf-search-date-range-container-row{display:flex;flex-direction:row;padding-bottom:21px;align-items:center}adf-search-date-range .adf-search-date-range-container-row-date{margin-top:8px}adf-search-date-range .adf-search-date-range-container-row .mat-mdc-select-arrow-wrapper{height:unset}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-input-field{width:75px}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-form-field{padding-left:10px;flex:1;margin-bottom:12px}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-form-field .mat-mdc-form-field-flex{align-items:center}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-form-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix{padding:.375em 0 4px}adf-search-date-range .adf-search-widget-extra-width{max-width:500px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i5.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i5.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i10.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i10.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i10.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i10.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i10.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchDateRangeComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-search-date-range', standalone: true, imports: [
CommonModule,
MatRadioModule,
ReactiveFormsModule,
TranslateModule,
MatFormFieldModule,
MatInputModule,
MatSelectModule,
MatDatepickerModule
], providers: [
{ provide: DateAdapter, useClass: DateFnsAdapter, deps: [MAT_DATE_LOCALE] },
{ provide: MAT_DATE_FORMATS, useValue: MAT_DATE_FNS_FORMATS }
], encapsulation: ViewEncapsulation.None, host: { class: 'adf-search-date-range' }, template: "<div class=\"adf-search-date-range-container\" [formGroup]=\"form\">\n <mat-radio-group formControlName=\"dateRangeType\">\n <span class=\"adf-search-date-range-container-row\">\n <mat-radio-button [value]=\"DateRangeType.ANY\" data-automation-id=\"date-range-anytime\">\n {{ 'SEARCH.DATE_RANGE_ADVANCED.OPTIONS.ANYTIME' | translate }}\n </mat-radio-button>\n </span>\n <span class=\"adf-search-date-range-container-row\">\n <mat-radio-button [value]=\"DateRangeType.IN_LAST\" data-automation-id=\"date-range-in-last\">\n {{ 'SEARCH.DATE_RANGE_ADVANCED.OPTIONS.IN_LAST' | translate }}\n </mat-radio-button>\n <mat-form-field class=\"adf-search-date-range-form-field adf-search-date-range-input-field\" subscriptSizing=\"dynamic\">\n <input matInput [attr.aria-label]=\"'SEARCH.DATE_RANGE_ADVANCED.ARIA_LABEL.NUMBER_INPUT' | translate\"\n type=\"number\" min=\"1\" formControlName=\"inLastValue\"\n data-automation-id=\"date-range-in-last-input\" (input)=\"narrowDownAllowedCharacters($event)\"\n (keydown)=\"preventIncorrectNumberCharacters($event)\">\n <mat-error *ngIf=\"form.controls.inLastValue.errors?.required\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.IN_LAST' | translate }}</mat-error>\n </mat-form-field>\n <mat-form-field class=\"adf-search-date-range-form-field adf-search-date-range-form-field-select\" subscriptSizing=\"dynamic\">\n <mat-select formControlName=\"inLastValueType\" data-automation-id=\"date-range-in-last-dropdown\">\n <mat-option data-automation-id=\"date-range-in-last-option-days\" [value]=\"InLastDateType.DAYS\">{{ 'SEARCH.DATE_RANGE_ADVANCED.IN_LAST_LABELS.DAYS' | translate }}</mat-option>\n <mat-option data-automation-id=\"date-range-in-last-option-weeks\" [value]=\"InLastDateType.WEEKS\">{{ 'SEARCH.DATE_RANGE_ADVANCED.IN_LAST_LABELS.WEEKS' | translate }}</mat-option>\n <mat-option data-automation-id=\"date-range-in-last-option-months\" [value]=\"InLastDateType.MONTHS\">{{ 'SEARCH.DATE_RANGE_ADVANCED.IN_LAST_LABELS.MONTHS' | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n </span>\n <span class=\"adf-search-date-range-container-row adf-search-date-range-container-row-date\">\n <mat-radio-button [value]=\"DateRangeType.BETWEEN\" data-automation-id=\"date-range-between\">\n {{ 'SEARCH.DATE_RANGE_ADVANCED.OPTIONS.BETWEEN' | translate }}\n </mat-radio-button>\n <mat-form-field class=\"adf-search-date-range-form-field\" subscriptSizing=\"dynamic\">\n <mat-date-range-input [rangePicker]=\"$any(picker)\" [max]=\"convertedMaxDate\">\n <input matStartDate placeholder=\"{{ 'SEARCH.DATE_RANGE_ADVANCED.BETWEEN_PLACEHOLDERS.START_DATE' | translate }}\"\n data-automation-id=\"date-range-between-start-input\" [formControl]=\"betweenStartDateFormControl\" (change)=\"dateChanged($event, betweenStartDateFormControl)\">\n <input matEndDate placeholder=\"{{ 'SEARCH.DATE_RANGE_ADVANCED.BETWEEN_PLACEHOLDERS.END_DATE' | translate }}\"\n data-automation-id=\"date-range-between-end-input\" [formControl]=\"betweenEndDateFormControl\" (change)=\"dateChanged($event, betweenEndDateFormControl)\">\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"picker\" data-automation-id=\"date-range-between-datepicker-toggle\" />\n <mat-date-range-picker #picker />\n\n <mat-error *ngIf=\"betweenStartDateFormControl.errors?.invalidDate\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.START_DATE.INVALID_FORMAT' | translate }}</mat-error>\n <mat-error *ngIf=\"betweenStartDateFormControl.errors?.required\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.START_DATE.REQUIRED' | translate }}</mat-error>\n <mat-error *ngIf=\"betweenEndDateFormControl.errors?.invalidDate\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.END_DATE.INVALID_FORMAT' | translate }}</mat-error>\n <mat-error *ngIf=\"betweenEndDateFormControl.errors?.required\">{{ 'SEARCH.DATE_RANGE_ADVANCED.ERROR.END_DATE.REQUIRED' | translate }}</mat-error>\n </mat-form-field>\n </span>\n </mat-radio-group>\n</div>\n", styles: ["adf-search-date-range .adf-search-date-range-container{margin-top:20px;padding:10px}adf-search-date-range .adf-search-date-range-container .adf-search-date-range-form-field-select{width:180px;min-width:180px}adf-search-date-range .adf-search-date-range-container-row{display:flex;flex-direction:row;padding-bottom:21px;align-items:center}adf-search-date-range .adf-search-date-range-container-row-date{margin-top:8px}adf-search-date-range .adf-search-date-range-container-row .mat-mdc-select-arrow-wrapper{height:unset}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-input-field{width:75px}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-form-field{padding-left:10px;flex:1;margin-bottom:12px}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-form-field .mat-mdc-form-field-flex{align-items:center}adf-search-date-range .adf-search-date-range-container-row .adf-search-date-range-form-field .mat-mdc-form-field-flex .mat-mdc-form-field-infix{padding:.375em 0 4px}adf-search-date-range .adf-search-widget-extra-width{max-width:500px}\n"] }]
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.UserPreferencesService }, { type: i3.DateAdapter }, { type: undefined, decorators: [{
type: Inject,
args: [MAT_DATE_FORMATS]
}] }], propDecorators: { dateFormat: [{
type: Input
}], maxDate: [{
type: Input
}], field: [{
type: Input
}], initialValue: [{
type: Input
}], changed: [{
type: Output
}], valid: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWRhdGUtcmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9zZWFyY2gvY29tcG9uZW50cy9zZWFyY2gtZGF0ZS1yYW5nZS10YWJiZWQvc2VhcmNoLWRhdGUtcmFuZ2Uvc2VhcmNoLWRhdGUtcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9zZWFyY2gvY29tcG9uZW50cy9zZWFyY2gtZGF0ZS1yYW5nZS10YWJiZWQvc2VhcmNoLWRhdGUtcmFuZ2Uvc2VhcmNoLWRhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBa0IsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFzQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNs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Z0JBUU4sT0FBTztzQkFETixNQUFNO2dCQUdQLEtBQUs7c0JBREosTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBlbmRPZkRheSwgaXNBZnRlciwgaXNCZWZvcmUsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0ZPUk1BVFMsIE1BVF9EQVRFX0xPQ0FMRSwgTWF0RGF0ZUZvcm1hdHMgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IERhdGVGbnNBZGFwdGVyLCBNQVRfREFURV9GTlNfRk9STUFUUyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLWRhdGUtZm5zLWFkYXB0ZXInO1xuaW1wb3J0IHsgSW5MYXN0RGF0ZVR5cGUgfSBmcm9tICcuL2luLWxhc3QtZGF0ZS10eXBlJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUgfSBmcm9tICcuL2RhdGUtcmFuZ2UtdHlwZSc7XG5pbXBvcnQgeyBTZWFyY2hEYXRlUmFuZ2UgfSBmcm9tICcuL3NlYXJjaC1kYXRlLXJhbmdlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlRm5zVXRpbHMsIFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsIFVzZXJQcmVmZXJlbmNlVmFsdWVzIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmNvbnN0IERFRkFVTFRfREFURV9ESVNQTEFZX0ZPUk1BVCA9ICdkZC1NTU0teXknO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1zZWFyY2gtZGF0ZS1yYW5nZScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0UmFkaW9Nb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgICAgICBNYXREYXRlcGlja2VyTW9kdWxlXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWRhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlYXJjaC1kYXRlLXJhbmdlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBEYXRlRm5zQWRhcHRlciwgZGVwczogW01BVF9EQVRFX0xPQ0FMRV0gfSxcbiAgICAgICAgeyBwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLCB1c2VWYWx1ZTogTUFUX0RBVEVfRk5TX0ZPUk1BVFMgfVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7IGNsYXNzOiAnYWRmLXNlYXJjaC1kYXRlLXJhbmdlJyB9XG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaERhdGVSYW5nZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KClcbiAgICBkYXRlRm9ybWF0ID0gREVGQVVMVF9EQVRFX0RJU1BMQVlfRk9STUFUO1xuICAgIEBJbnB1dCgpXG4gICAgbWF4RGF0ZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHNldCBpbml0aWFsVmFsdWUodmFsdWU6IFNlYXJjaERhdGVSYW5nZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBPdXRwdXQoKVxuICAgIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8U2VhcmNoRGF0ZVJhbmdlPj4oKTtcbiAgICBAT3V0cHV0KClcbiAgICB2YWxpZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIGZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwPFNlYXJjaERhdGVSYW5nZT4oe1xuICAgICAgICBkYXRlUmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlLkFOWSxcbiAgICAgICAgaW5MYXN0VmFsdWVUeXBlOiBJbkxhc3REYXRlVHlwZS5EQVlTLFxuICAgICAgICBpbkxhc3RWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBiZXR3ZWVuU3RhcnREYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIGJldHdlZW5FbmREYXRlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICBiZXR3ZWVuU3RhcnREYXRlRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHMuYmV0d2VlblN0YXJ0RGF0ZTtcbiAgICBiZXR3ZWVuRW5kRGF0ZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzLmJldHdlZW5FbmREYXRlO1xuICAgIGNvbnZlcnRlZE1heERhdGU6IERhdGU7XG5cbiAgICByZWFkb25seSBEYXRlUmFuZ2VUeXBlID0gRGF0ZVJhbmdlVHlwZTtcbiAgICByZWFkb25seSBJbkxhc3REYXRlVHlwZSA9IEluTGFzdERhdGVUeXBlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGVGbnNBZGFwdGVyPixcbiAgICAgICAgQEluamVjdChNQVRfREFURV9GT1JNQVRTKSBwcml2YXRlIGRhdGVGb3JtYXRDb25maWc6IE1hdERhdGVGb3JtYXRzXG4gICAgKSB7fVxuXG4gICAgcmVhZG9ubHkgZW5kRGF0ZVZhbGlkYXRvciA9IChmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfCBudWxsID0+IHtcbiAgICAgICAgaWYgKGlzQmVmb3JlKGZvcm1Db250cm9sLnZhbHVlLCB0aGlzLmJldHdlZW5TdGFydERhdGVGb3JtQ29udHJvbC52YWx1ZSkgfHwgaXNBZnRlcihmb3JtQ29udHJvbC52YWx1ZSwgdGhpcy5jb252ZXJ0ZWRNYXhEYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbnZhbGlkRGF0ZTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgfTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGVGb3JtYXRDb25maWcuZGlzcGxheS5kYXRlSW5wdXQgPSB0aGlzLmRhdGVGb3JtYXQ7XG4gICAgICAgIHRoaXMuY29udmVydGVkTWF4RGF0ZSA9IGVuZE9mRGF5KHRoaXMubWF4RGF0ZSAmJiB0aGlzLm1heERhdGUgIT09ICd0b2RheScgPyBwYXJzZSh0aGlzLm1heERhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgbmV3IERhdGUoKSkgOiBuZXcgRGF0ZSgpKTtcbiAgICAgICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlXG4gICAgICAgICAgICAuc2VsZWN0KFVzZXJQcmVmZXJlbmNlVmFsdWVzLkxvY2FsZSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobG9jYWxlKSA9PiB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShEYXRlRm5zVXRpbHMuZ2V0TG9jYWxlRnJvbVN0cmluZyhsb2NhbGUpKSk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5kYXRlUmFuZ2VUeXBlLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRlUmFuZ2VUeXBlKSA9PiB0aGlzLnVwZGF0ZVZhbGlkYXRvcnMoZGF0ZVJhbmdlVHlwZSkpO1xuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uQ2hhbmdlKCkpO1xuICAgIH1cbiAgICBwcml2YXRlIHVwZGF0ZVZhbGlkYXRvcnMoZGF0ZVJhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSkge1xuICAgICAgICBzd2l0Y2ggKGRhdGVSYW5nZVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGF0ZVJhbmdlVHlwZS5CRVRXRUVOOlxuICAgICAgICAgICAgICAgIHRoaXMuYmV0d2VlblN0YXJ0RGF0ZUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iZXR3ZWVuRW5kRGF0ZUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuZW5kRGF0ZVZhbGlkYXRvcl0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5pbkxhc3RWYWx1ZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVJhbmdlVHlwZS5JTl9MQVNUOlxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5pbkxhc3RWYWx1ZS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmV0d2VlblN0YXJ0RGF0ZUZvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmV0d2VlbkVuZERhdGVGb3JtQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmluTGFzdFZhbHVlLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmV0d2VlblN0YXJ0RGF0ZUZvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmV0d2VlbkVuZERhdGVGb3JtQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJldHdlZW5TdGFydERhdGVGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuYmV0d2VlbkVuZERhdGVGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5pbkxhc3RWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkLmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkLmVtaXQodGhpcy5mb3JtLnZhbGlkKTtcbiAgICB9XG5cbiAgICBkYXRlQ2hhbmdlZChldmVudDogRXZlbnQsIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgaWYgKGV2ZW50Py50YXJnZXRbJ3ZhbHVlJ10/LnRyaW0oKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlKGV2ZW50LnRhcmdldFsndmFsdWUnXSwgdGhpcy5kYXRlRm9ybWF0LCBuZXcgRGF0ZSgpKTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZChkYXRlKSkge1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmZvcm1Db250cm9sLmVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkRGF0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtQ29udHJvbC5lcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIGludmFsaWREYXRlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmFycm93RG93bkFsbG93ZWRDaGFyYWN0ZXJzKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBpZiAocGFyc2VJbnQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSwgMTApID09PSAwKSB7XG4gICAgICAgICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJldmVudEluY29ycmVjdE51bWJlckNoYXJhY3RlcnMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJy4nOlxuICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgJzAnOlxuICAgICAgICAgICAgICAgIHJldHVybiAhIShldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkZi1zZWFyY2gtZGF0ZS1yYW5nZS1jb250YWluZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgPG1hdC1yYWRpby1ncm91cCBmb3JtQ29udHJvbE5hbWU9XCJkYXRlUmFuZ2VUeXBlXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJhZGYtc2VhcmNoLWRhdGUtcmFuZ2UtY29udGFpbmVyLXJvd1wiPlxuICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cIkRhdGVSYW5nZVR5cGUuQU5ZXCIgZGF0YS1hdXRvbWF0aW9uLWlkPVwiZGF0ZS1yYW5nZS1hbnl0aW1lXCI+XG4gICAgICAgIHt7ICdTRUFSQ0guREFURV9SQU5HRV9BRFZBTkNFRC5PUFRJT05TLkFOWVRJTUUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiYWRmLXNlYXJjaC1kYXRlLXJhbmdlLWNvbnRhaW5lci1yb3dcIj5cbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJEYXRlUmFuZ2VUeXBlLklOX0xBU1RcIiBkYXRhLWF1dG9tYXRpb24taWQ9XCJkYXRlLXJhbmdlLWluLWxhc3RcIj5cbiAgICAgICAge3sgJ1NFQVJDSC5EQVRFX1JBTkdFX0FEVkFOQ0VELk9QVElPTlMuSU5fTEFTVCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImFkZi1zZWFyY2gtZGF0ZS1yYW5nZS1mb3JtLWZpZWxkIGFkZi1zZWFyY2gtZGF0ZS1yYW5nZS1pbnB1dC1maWVsZFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NFQVJDSC5EQVRFX1JBTkdFX0FEVkFOQ0VELkFSSUFfTEFCRUwuTlVNQkVSX0lOUFVUJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIGZvcm1Db250cm9sTmFtZT1cImluTGFzdFZhbHVlXCJcbiAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImRhdGUtcmFuZ2UtaW4tbGFzdC1pbnB1dFwiIChpbnB1dCk9XCJuYXJyb3dEb3duQWxsb3dlZENoYXJhY3RlcnMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJwcmV2ZW50SW5jb3JyZWN0TnVtYmVyQ2hhcmFjdGVycygkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLmluTGFzdFZhbHVlLmVycm9ycz8ucmVxdWlyZWRcIj57eyAnU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuRVJST1IuSU5fTEFTVCcgfCB0cmFuc2xhdGUgfX08L21hdC1lcnJvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJhZGYtc2VhcmNoLWRhdGUtcmFuZ2UtZm9ybS1maWVsZCBhZGYtc2VhcmNoLWRhdGUtcmFuZ2UtZm9ybS1maWVsZC1zZWxlY3RcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImluTGFzdFZhbHVlVHlwZVwiIGRhdGEtYXV0b21hdGlvbi1pZD1cImRhdGUtcmFuZ2UtaW4tbGFzdC1kcm9wZG93blwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIGRhdGEtYXV0b21hdGlvbi1pZD1cImRhdGUtcmFuZ2UtaW4tbGFzdC1vcHRpb24tZGF5c1wiIFt2YWx1ZV09XCJJbkxhc3REYXRlVHlwZS5EQVlTXCI+e3sgJ1NFQVJDSC5EQVRFX1JBTkdFX0FEVkFOQ0VELklOX0xBU1RfTEFCRUxTLkRBWVMnIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIGRhdGEtYXV0b21hdGlvbi1pZD1cImRhdGUtcmFuZ2UtaW4tbGFzdC1vcHRpb24td2Vla3NcIiBbdmFsdWVdPVwiSW5MYXN0RGF0ZVR5cGUuV0VFS1NcIj57eyAnU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuSU5fTEFTVF9MQUJFTFMuV0VFS1MnIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIGRhdGEtYXV0b21hdGlvbi1pZD1cImRhdGUtcmFuZ2UtaW4tbGFzdC1vcHRpb24tbW9udGhzXCIgW3ZhbHVlXT1cIkluTGFzdERhdGVUeXBlLk1PTlRIU1wiPnt7ICdTRUFSQ0guREFURV9SQU5HRV9BRFZBTkNFRC5JTl9MQVNUX0xBQkVMUy5NT05USFMnIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImFkZi1zZWFyY2gtZGF0ZS1yYW5nZS1jb250YWluZXItcm93IGFkZi1zZWFyY2gtZGF0ZS1yYW5nZS1jb250YWluZXItcm93LWRhdGVcIj5cbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJEYXRlUmFuZ2VUeXBlLkJFVFdFRU5cIiBkYXRhLWF1dG9tYXRpb24taWQ9XCJkYXRlLXJhbmdlLWJldHdlZW5cIj5cbiAgICAgICAge3sgJ1NFQVJDSC5EQVRFX1JBTkdFX0FEVkFOQ0VELk9QVElPTlMuQkVUV0VFTicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImFkZi1zZWFyY2gtZGF0ZS1yYW5nZS1mb3JtLWZpZWxkXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXQgW3JhbmdlUGlja2VyXT1cIiRhbnkocGlja2VyKVwiIFttYXhdPVwiY29udmVydGVkTWF4RGF0ZVwiPlxuICAgICAgICAgIDxpbnB1dCBtYXRTdGFydERhdGUgcGxhY2Vob2xkZXI9XCJ7eyAnU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuQkVUV0VFTl9QTEFDRUhPTERFUlMuU1RBUlRfREFURScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJkYXRlLXJhbmdlLWJldHdlZW4tc3RhcnQtaW5wdXRcIiBbZm9ybUNvbnRyb2xdPVwiYmV0d2VlblN0YXJ0RGF0ZUZvcm1Db250cm9sXCIgKGNoYW5nZSk9XCJkYXRlQ2hhbmdlZCgkZXZlbnQsIGJldHdlZW5TdGFydERhdGVGb3JtQ29udHJvbClcIj5cbiAgICAgICAgICA8aW5wdXQgbWF0RW5kRGF0ZSBwbGFjZWhvbGRlcj1cInt7ICdTRUFSQ0guREFURV9SQU5HRV9BRFZBTkNFRC5CRVRXRUVOX1BMQUNFSE9MREVSUy5FTkRfREFURScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJkYXRlLXJhbmdlLWJldHdlZW4tZW5kLWlucHV0XCIgW2Zvcm1Db250cm9sXT1cImJldHdlZW5FbmREYXRlRm9ybUNvbnRyb2xcIiAoY2hhbmdlKT1cImRhdGVDaGFuZ2VkKCRldmVudCwgYmV0d2VlbkVuZERhdGVGb3JtQ29udHJvbClcIj5cbiAgICAgICAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIiBkYXRhLWF1dG9tYXRpb24taWQ9XCJkYXRlLXJhbmdlLWJldHdlZW4tZGF0ZXBpY2tlci10b2dnbGVcIiAvPlxuICAgICAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyICNwaWNrZXIgLz5cblxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYmV0d2VlblN0YXJ0RGF0ZUZvcm1Db250cm9sLmVycm9ycz8uaW52YWxpZERhdGVcIj57eyAnU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuRVJST1IuU1RBUlRfREFURS5JTlZBTElEX0ZPUk1BVCcgfCB0cmFuc2xhdGUgfX08L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImJldHdlZW5TdGFydERhdGVGb3JtQ29udHJvbC5lcnJvcnM/LnJlcXVpcmVkXCI+e3sgJ1NFQVJDSC5EQVRFX1JBTkdFX0FEVkFOQ0VELkVSUk9SLlNUQVJUX0RBVEUuUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19PC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJiZXR3ZWVuRW5kRGF0ZUZvcm1Db250cm9sLmVycm9ycz8uaW52YWxpZERhdGVcIj57eyAnU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuRVJST1IuRU5EX0RBVEUuSU5WQUxJRF9GT1JNQVQnIHwgdHJhbnNsYXRlIH19PC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJiZXR3ZWVuRW5kRGF0ZUZvcm1Db250cm9sLmVycm9ycz8ucmVxdWlyZWRcIj57eyAnU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuRVJST1IuRU5EX0RBVEUuUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19PC9tYXQtZXJyb3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvc3Bhbj5cbiAgPC9tYXQtcmFkaW8tZ3JvdXA+XG48L2Rpdj5cbiJdfQ==