ontimize-web-ngx 15.3.4 → 15.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/grid/o-grid.component.mjs +2 -1
- package/esm2020/lib/components/input/date-range/o-daterange-input.component.mjs +240 -218
- package/esm2020/lib/components/input/date-range/o-daterange-input.module.mjs +3 -5
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.component.mjs +353 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.directive.mjs +381 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.module.mjs +21 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +1009 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.config.mjs +2 -0
- package/esm2020/lib/components/input/index.mjs +7 -5
- package/esm2020/lib/components/list/o-list.component.mjs +2 -1
- package/esm2020/lib/components/o-service-base-component.class.mjs +24 -9
- package/esm2020/lib/components/o-service-component.class.mjs +2 -1
- package/esm2020/lib/components/table/o-table.component.mjs +17 -7
- package/esm2020/lib/config/o-modules.mjs +5 -3
- package/esm2020/lib/i18n/i18n.mjs +9 -3
- package/esm2020/lib/interfaces/form-layout-manager.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +3 -1
- package/esm2020/lib/interfaces/pagination-context.interface.mjs +2 -0
- package/esm2020/lib/layouts/form-layout/o-form-layout-manager-base.class.mjs +1 -1
- package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +1 -1
- package/esm2020/lib/ontimize-web-ngx.module.mjs +7 -6
- package/esm2020/lib/services/base-service.class.mjs +12 -1
- package/esm2020/lib/services/index.mjs +2 -1
- package/esm2020/lib/services/pagination-context.service.mjs +25 -0
- package/fesm2015/ontimize-web-ngx.mjs +477 -43
- package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
- package/fesm2020/ontimize-web-ngx.mjs +466 -43
- package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
- package/lib/components/input/date-range/o-daterange-input.component.d.ts +47 -33
- package/lib/components/input/date-range/o-daterange-input.module.d.ts +4 -6
- package/lib/components/input/date-range-legacy/o-daterange-input.component.d.ts +70 -0
- package/lib/components/input/date-range-legacy/o-daterange-input.module.d.ts +11 -0
- package/lib/components/input/index.d.ts +6 -4
- package/lib/components/o-service-base-component.class.d.ts +1 -0
- package/lib/components/table/extensions/header/o-table-header-components.d.ts +2 -2
- package/lib/components/table/o-table.component.d.ts +2 -0
- package/lib/i18n/i18n.d.ts +6 -0
- package/lib/interfaces/form-layout-manager.interface.d.ts +43 -0
- package/lib/interfaces/index.d.ts +2 -0
- package/lib/interfaces/pagination-context.interface.d.ts +6 -0
- package/lib/layouts/form-layout/o-form-layout-manager-base.class.d.ts +30 -12
- package/lib/layouts/form-layout/o-form-layout-manager.component.d.ts +2 -1
- package/lib/ontimize-web-ngx.module.d.ts +5 -4
- package/lib/services/base-service.class.d.ts +6 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/pagination-context.service.d.ts +11 -0
- package/package.json +1 -1
- package/theme.scss +2 -2
- package/esm2020/lib/components/input/date-range/o-daterange-input.directive.mjs +0 -381
- package/esm2020/lib/components/input/date-range/o-daterange-picker.component.mjs +0 -1009
- package/esm2020/lib/components/input/date-range/o-daterange-picker.config.mjs +0 -2
- /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-input.directive.d.ts +0 -0
- /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-picker.component.d.ts +0 -0
- /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-picker.config.d.ts +0 -0
|
@@ -2,20 +2,18 @@ import { CommonModule } from '@angular/common';
|
|
|
2
2
|
import { NgModule } from '@angular/core';
|
|
3
3
|
import { OSharedModule } from '../../../shared/shared.module';
|
|
4
4
|
import { ODateRangeInputComponent } from './o-daterange-input.component';
|
|
5
|
-
import { ODaterangepickerDirective } from './o-daterange-input.directive';
|
|
6
|
-
import { DaterangepickerComponent } from './o-daterange-picker.component';
|
|
7
5
|
import * as i0 from "@angular/core";
|
|
8
6
|
export class ODateRangeInputModule {
|
|
9
7
|
}
|
|
10
8
|
ODateRangeInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
11
|
-
ODateRangeInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputModule, declarations: [
|
|
9
|
+
ODateRangeInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputModule, declarations: [ODateRangeInputComponent], imports: [CommonModule, OSharedModule], exports: [ODateRangeInputComponent] });
|
|
12
10
|
ODateRangeInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputModule, imports: [CommonModule, OSharedModule] });
|
|
13
11
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeInputModule, decorators: [{
|
|
14
12
|
type: NgModule,
|
|
15
13
|
args: [{
|
|
16
|
-
declarations: [
|
|
14
|
+
declarations: [ODateRangeInputComponent],
|
|
17
15
|
imports: [CommonModule, OSharedModule],
|
|
18
16
|
exports: [ODateRangeInputComponent]
|
|
19
17
|
}]
|
|
20
18
|
}] });
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kYXRlcmFuZ2UtaW5wdXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS1yYW5nZS9vLWRhdGVyYW5nZS1pbnB1dC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQU96RSxNQUFNLE9BQU8scUJBQXFCOzttSEFBckIscUJBQXFCO29IQUFyQixxQkFBcUIsaUJBSmpCLHdCQUF3QixhQUM3QixZQUFZLEVBQUUsYUFBYSxhQUMzQix3QkFBd0I7b0hBRXZCLHFCQUFxQixZQUh0QixZQUFZLEVBQUUsYUFBYTs0RkFHMUIscUJBQXFCO2tCQUxqQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUN4QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO29CQUN0QyxPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztpQkFDcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT1NoYXJlZE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zaGFyZWQubW9kdWxlJztcbmltcG9ydCB7IE9EYXRlUmFuZ2VJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vby1kYXRlcmFuZ2UtaW5wdXQuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbT0RhdGVSYW5nZUlucHV0Q29tcG9uZW50XSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgT1NoYXJlZE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtPRGF0ZVJhbmdlSW5wdXRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE9EYXRlUmFuZ2VJbnB1dE1vZHVsZSB7IH1cbiJdfQ==
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
|
|
3
|
+
import { Component, ElementRef, forwardRef, Inject, Injector, Optional, ViewChild } from '@angular/core';
|
|
4
|
+
import moment from 'moment';
|
|
5
|
+
import { BooleanInputConverter } from '../../../decorators/input-converter';
|
|
6
|
+
import { MomentService } from '../../../services/moment.service';
|
|
7
|
+
import { OTranslateService } from '../../../services/translate/o-translate.service';
|
|
8
|
+
import { Util } from '../../../util/util';
|
|
9
|
+
import { OFormComponent } from '../../form/o-form.component';
|
|
10
|
+
import { DEFAULT_OUTPUTS_O_FORM_DATA_COMPONENT, OFormDataComponent } from '../../o-form-data-component.class';
|
|
11
|
+
import { OValueChangeEvent } from '../../o-value-change-event.class';
|
|
12
|
+
import { DEFAULT_INPUTS_O_DATE_INPUT } from '../date-input/o-date-input.component';
|
|
13
|
+
import { ODaterangepickerDirective } from './o-daterange-input.directive';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/cdk/layout";
|
|
16
|
+
import * as i2 from "@angular/common";
|
|
17
|
+
import * as i3 from "@angular/flex-layout/flex";
|
|
18
|
+
import * as i4 from "@angular/forms";
|
|
19
|
+
import * as i5 from "../../../directives/o-mat-error.directive";
|
|
20
|
+
import * as i6 from "@angular/material/button";
|
|
21
|
+
import * as i7 from "@angular/material/icon";
|
|
22
|
+
import * as i8 from "@angular/material/input";
|
|
23
|
+
import * as i9 from "@angular/material/form-field";
|
|
24
|
+
import * as i10 from "@angular/material/tooltip";
|
|
25
|
+
import * as i11 from "./o-daterange-input.directive";
|
|
26
|
+
import * as i12 from "../../../pipes/o-translate.pipe";
|
|
27
|
+
import * as i13 from "../../form/o-form.component";
|
|
28
|
+
export const DEFAULT_OUTPUTS_O_DATERANGE_LEGACY_INPUT = [
|
|
29
|
+
...DEFAULT_OUTPUTS_O_FORM_DATA_COMPONENT
|
|
30
|
+
];
|
|
31
|
+
export const DEFAULT_INPUTS_O_DATERANGE_LEGACY_INPUT = [
|
|
32
|
+
'separator',
|
|
33
|
+
'showWeekNumbers:show-week-numbers',
|
|
34
|
+
'showRanges:show-ranges',
|
|
35
|
+
'olocale:locale',
|
|
36
|
+
'startKey',
|
|
37
|
+
'endKey',
|
|
38
|
+
'valueType: value-type',
|
|
39
|
+
'mode',
|
|
40
|
+
...DEFAULT_INPUTS_O_DATE_INPUT
|
|
41
|
+
];
|
|
42
|
+
export class ODateRangeLegacyInputComponent extends OFormDataComponent {
|
|
43
|
+
get oMinDate() {
|
|
44
|
+
return this._oMinDate;
|
|
45
|
+
}
|
|
46
|
+
set oMinDate(value) {
|
|
47
|
+
this._oMinDate = moment(value, this.oformat);
|
|
48
|
+
}
|
|
49
|
+
get oMaxDate() {
|
|
50
|
+
return this._oMaxDate;
|
|
51
|
+
}
|
|
52
|
+
set oMaxDate(value) {
|
|
53
|
+
this._oMaxDate = moment(value, this.oformat);
|
|
54
|
+
}
|
|
55
|
+
get startKey() {
|
|
56
|
+
return this._startKey;
|
|
57
|
+
}
|
|
58
|
+
set startKey(value) {
|
|
59
|
+
this._startKey = value;
|
|
60
|
+
}
|
|
61
|
+
get endKey() {
|
|
62
|
+
return this._endKey;
|
|
63
|
+
}
|
|
64
|
+
set endKey(value) {
|
|
65
|
+
this._endKey = value;
|
|
66
|
+
}
|
|
67
|
+
get separator() {
|
|
68
|
+
return this._separator;
|
|
69
|
+
}
|
|
70
|
+
set separator(value) {
|
|
71
|
+
this._separator = value;
|
|
72
|
+
if (this.getFormControl()?.value) {
|
|
73
|
+
this.updateElement();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
get showClearButton() {
|
|
77
|
+
return this.clearButton && !this.isReadOnly && this.enabled && this.matInputRef.nativeElement.value;
|
|
78
|
+
}
|
|
79
|
+
get localeOptions() {
|
|
80
|
+
return this._localeOptions;
|
|
81
|
+
}
|
|
82
|
+
isMobileMode() {
|
|
83
|
+
return this.mode === 'mobile' || (this.mode === 'auto' && this.breakpointObserver.isMatched(Breakpoints.Handset));
|
|
84
|
+
}
|
|
85
|
+
isDesktopMode() {
|
|
86
|
+
return this.mode === 'desktop' || (this.mode === 'auto' && !this.breakpointObserver.isMatched(Breakpoints.Handset));
|
|
87
|
+
}
|
|
88
|
+
constructor(form, elRef, injector, breakpointObserver) {
|
|
89
|
+
super(form, elRef, injector);
|
|
90
|
+
this.breakpointObserver = breakpointObserver;
|
|
91
|
+
this.textInputEnabled = true;
|
|
92
|
+
this.showWeekNumbers = false;
|
|
93
|
+
this.oTouchUi = false;
|
|
94
|
+
this.showRanges = false;
|
|
95
|
+
this.mode = 'auto';
|
|
96
|
+
this._startKey = 'startDate';
|
|
97
|
+
this._endKey = 'endDate';
|
|
98
|
+
this._valueType = 'timestamp';
|
|
99
|
+
this._separator = ' - ';
|
|
100
|
+
this.oformat = 'L';
|
|
101
|
+
this.oTranslate = this.injector.get(OTranslateService);
|
|
102
|
+
this.momentSrv = this.injector.get(MomentService);
|
|
103
|
+
if (!this.olocale) {
|
|
104
|
+
this.olocale = this.momentSrv.getLocale();
|
|
105
|
+
moment.locale(this.olocale);
|
|
106
|
+
}
|
|
107
|
+
this._localeOptions = {
|
|
108
|
+
direction: 'ltr',
|
|
109
|
+
separator: ' - ',
|
|
110
|
+
weekLabel: this.oTranslate.get('DATERANGE.W'),
|
|
111
|
+
applyLabel: this.oTranslate.get('DATERANGE.APPLYLABEL'),
|
|
112
|
+
cancelLabel: this.oTranslate.get('CANCEL'),
|
|
113
|
+
customRangeLabel: 'Custom range',
|
|
114
|
+
daysOfWeek: moment.localeData().weekdaysMin(),
|
|
115
|
+
monthNames: moment.localeData().monthsShort(),
|
|
116
|
+
firstDay: moment.localeData().firstDayOfWeek(),
|
|
117
|
+
format: 'L'
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
ngOnInit() {
|
|
121
|
+
super.ngOnInit();
|
|
122
|
+
if (this.oformat) {
|
|
123
|
+
this._localeOptions.format = this.oformat;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
openPicker() {
|
|
127
|
+
this.pickerDirective.open();
|
|
128
|
+
}
|
|
129
|
+
onChangeEvent(event) {
|
|
130
|
+
let objectValue;
|
|
131
|
+
if (event instanceof Event) {
|
|
132
|
+
const value = event.target.value;
|
|
133
|
+
if (value !== '') {
|
|
134
|
+
objectValue = this.getDateRangeToString(value);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
objectValue = event;
|
|
139
|
+
}
|
|
140
|
+
this.setValue(objectValue, {
|
|
141
|
+
changeType: OValueChangeEvent.USER_CHANGE,
|
|
142
|
+
emitEvent: false,
|
|
143
|
+
emitModelToViewChange: false
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
setValue(val, options = {}, setDirty = false) {
|
|
147
|
+
super.setValue(val, options, setDirty);
|
|
148
|
+
this.updateElement();
|
|
149
|
+
}
|
|
150
|
+
onClickClearValue(e) {
|
|
151
|
+
super.onClickClearValue(e);
|
|
152
|
+
this.pickerDirective.value = undefined;
|
|
153
|
+
this.pickerDirective.datesUpdated.emit();
|
|
154
|
+
}
|
|
155
|
+
datesUpdated(range) {
|
|
156
|
+
this.pickerDirective.close();
|
|
157
|
+
this.setValue(range, {
|
|
158
|
+
changeType: OValueChangeEvent.USER_CHANGE,
|
|
159
|
+
emitEvent: false,
|
|
160
|
+
emitModelToViewChange: false
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
setData(newValue) {
|
|
164
|
+
super.setData(newValue);
|
|
165
|
+
this.pickerDirective.datesUpdated.emit(newValue);
|
|
166
|
+
this.updateElement();
|
|
167
|
+
}
|
|
168
|
+
updateElement() {
|
|
169
|
+
let chosenLabel;
|
|
170
|
+
if (Util.isDefined(this.value) && Util.isDefined(this.value.value) && !this.isObjectDataRangeNull(this.value)) {
|
|
171
|
+
if (this.value.value[this.pickerDirective.startKey] && this.value.value[this.pickerDirective.endKey]) {
|
|
172
|
+
this.value.value[this.pickerDirective.startKey] = this.ensureDateRangeValue(this.value.value[this.pickerDirective.startKey], this._valueType);
|
|
173
|
+
this.value.value[this.pickerDirective.endKey] = this.ensureDateRangeValue(this.value.value[this.pickerDirective.endKey], this._valueType);
|
|
174
|
+
chosenLabel = this.value.value[this.pickerDirective.startKey].format(this.oformat) +
|
|
175
|
+
this.separator + this.value.value[this.pickerDirective.endKey].format(this.oformat);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
chosenLabel = null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
chosenLabel = null;
|
|
183
|
+
this.pickerDirective.value = undefined;
|
|
184
|
+
}
|
|
185
|
+
this.pickerDirective._el.nativeElement.value = chosenLabel;
|
|
186
|
+
}
|
|
187
|
+
getDateRangeToString(valueToString) {
|
|
188
|
+
const value = {};
|
|
189
|
+
const range = valueToString.split(this.separator);
|
|
190
|
+
value[this._startKey] = moment(range[0].trim(), this.oformat);
|
|
191
|
+
value[this._endKey] = moment(range[1].trim(), this.oformat);
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
resolveValidators() {
|
|
195
|
+
const validators = super.resolveValidators();
|
|
196
|
+
validators.push(this.rangeDateValidator.bind(this));
|
|
197
|
+
if (Util.isDefined(this._oMinDate)) {
|
|
198
|
+
validators.push(this.minDateValidator.bind(this));
|
|
199
|
+
}
|
|
200
|
+
if (Util.isDefined(this._oMaxDate)) {
|
|
201
|
+
validators.push(this.maxDateValidator.bind(this));
|
|
202
|
+
}
|
|
203
|
+
validators.push(this.parseDateValidator.bind(this));
|
|
204
|
+
return validators;
|
|
205
|
+
}
|
|
206
|
+
isObjectDataRangeNull(objectValue) {
|
|
207
|
+
return objectValue !== null && objectValue.value !== null &&
|
|
208
|
+
!Util.isDefined(objectValue.value[this.pickerDirective.startKey]) &&
|
|
209
|
+
!Util.isDefined(objectValue.value[this.pickerDirective.endKey]);
|
|
210
|
+
}
|
|
211
|
+
rangeDateValidator(control) {
|
|
212
|
+
if ((control.value instanceof Object)
|
|
213
|
+
&& !this.isObjectDataRangeNull(control) && control.value[this._endKey].isSameOrBefore(control.value[this._startKey])) {
|
|
214
|
+
return {
|
|
215
|
+
dateRange: true
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {};
|
|
219
|
+
}
|
|
220
|
+
minDateValidator(control) {
|
|
221
|
+
const mindate = moment(this._oMinDate);
|
|
222
|
+
if ((control.value instanceof Object)
|
|
223
|
+
&& !this.isObjectDataRangeNull(control) && control.value[this._startKey].isBefore(mindate)) {
|
|
224
|
+
return {
|
|
225
|
+
dateRangeMin: {
|
|
226
|
+
dateMin: mindate.format(this.oformat)
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return {};
|
|
231
|
+
}
|
|
232
|
+
maxDateValidator(control) {
|
|
233
|
+
const maxdate = moment(this._oMaxDate);
|
|
234
|
+
if ((control.value instanceof Object)
|
|
235
|
+
&& !this.isObjectDataRangeNull(control) && control.value[this._endKey].isAfter(maxdate)) {
|
|
236
|
+
return {
|
|
237
|
+
dateRangeMax: {
|
|
238
|
+
dateMax: maxdate.format(this.oformat)
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return {};
|
|
243
|
+
}
|
|
244
|
+
parseDateValidator(control) {
|
|
245
|
+
if ((control.value instanceof Object)
|
|
246
|
+
&& !this.isObjectDataRangeNull(control)
|
|
247
|
+
&& ((control.value[this._startKey] && !control.value[this._startKey].isValid())
|
|
248
|
+
|| (control.value[this._endKey] && !control.value[this._endKey].isValid()))) {
|
|
249
|
+
return {
|
|
250
|
+
dateRangeParse: {
|
|
251
|
+
format: this.oformat + this._localeOptions.separator + this.oformat
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
return {};
|
|
256
|
+
}
|
|
257
|
+
ensureDateRangeValue(val, valueType) {
|
|
258
|
+
if (!Util.isDefined(val)) {
|
|
259
|
+
return val;
|
|
260
|
+
}
|
|
261
|
+
let result = val;
|
|
262
|
+
if (!moment.isMoment(val)) {
|
|
263
|
+
switch (valueType) {
|
|
264
|
+
case 'string':
|
|
265
|
+
case 'date':
|
|
266
|
+
if ((val instanceof Date) || typeof val === 'string') {
|
|
267
|
+
const dateString = moment(val).format('YYYY-MM-DDThh:mm') + 'Z';
|
|
268
|
+
const q = moment(dateString);
|
|
269
|
+
if (q.isValid()) {
|
|
270
|
+
result = q;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
result = undefined;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
result = undefined;
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
case 'timestamp':
|
|
281
|
+
if (typeof val === 'number') {
|
|
282
|
+
const dateString = moment.unix(val).format('YYYY-MM-DDThh:mm') + 'Z';
|
|
283
|
+
const t = moment(dateString);
|
|
284
|
+
if (t.isValid()) {
|
|
285
|
+
result = t;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
result = undefined;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
result = val;
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
case 'iso-8601':
|
|
296
|
+
const m = moment(val);
|
|
297
|
+
if (m.isValid()) {
|
|
298
|
+
result = m;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
result = undefined;
|
|
302
|
+
}
|
|
303
|
+
break;
|
|
304
|
+
default:
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (!Util.isDefined(result)) {
|
|
309
|
+
console.warn(`ODateRangeInputComponent value (${val}) is not consistent with value-type (${valueType})`);
|
|
310
|
+
}
|
|
311
|
+
return result;
|
|
312
|
+
}
|
|
313
|
+
set valueType(val) {
|
|
314
|
+
this._valueType = Util.convertToODateValueType(val);
|
|
315
|
+
}
|
|
316
|
+
get valueType() {
|
|
317
|
+
return this._valueType;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
ODateRangeLegacyInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeLegacyInputComponent, deps: [{ token: forwardRef(() => OFormComponent), optional: true }, { token: i0.ElementRef }, { token: i0.Injector }, { token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
|
|
321
|
+
ODateRangeLegacyInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ODateRangeLegacyInputComponent, selector: "o-daterange-legacy-input", inputs: { separator: "separator", showWeekNumbers: ["show-week-numbers", "showWeekNumbers"], showRanges: ["show-ranges", "showRanges"], olocale: ["locale", "olocale"], startKey: "startKey", endKey: "endKey", valueType: ["value-type", "valueType"], mode: "mode", oformat: ["format", "oformat"], oStartView: ["start-view", "oStartView"], oMinDate: ["min", "oMinDate"], oMaxDate: ["max", "oMaxDate"], oTouchUi: ["touch-ui", "oTouchUi"], oStartAt: ["start-at", "oStartAt"], filterDate: ["filter-date", "filterDate"], textInputEnabled: ["text-input-enabled", "textInputEnabled"], dateClass: ["date-class", "dateClass"] }, outputs: { onChange: "onChange", onValueChange: "onValueChange", onFocus: "onFocus", onBlur: "onBlur" }, viewQueries: [{ propertyName: "pickerDirective", first: true, predicate: ODaterangepickerDirective, descendants: true, static: true }, { propertyName: "matInputRef", first: true, predicate: ["matInputRef"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\" [matTooltipShowDelay]=\"tooltipShowDelay\" [matTooltipHideDelay]=\"tooltipHideDelay\">\n\n <mat-form-field [appearance]=\"appearance\" [floatLabel]=\"floatLabel\" [hideRequiredMarker]=\"hideRequiredMarker\" [class.custom-width]=\"hasCustomWidth\"\n class=\"icon-field\" fxFlexFill [subscriptSizing]=\"subscriptSizing\">\n <mat-label *ngIf=\"labelVisible\">{{ olabel | oTranslate }}</mat-label>\n <input #matInputRef matInput type=\"text\" o-daterange-input [id]=\"getAttribute()\" [formControlName]=\"getAttribute()\" [required]=\"isRequired\"\n [placeholder]=\"placeHolder\" [readonly]=\"isReadOnly || !textInputEnabled\" showDropdowns=\"true\" showCancel=\"true\" [showRanges]=\"showRanges\"\n (datesUpdated)=\"datesUpdated($event)\" [oTouchUi]=\"oTouchUi\" [minDate]=\"oMinDate\" [maxDate]=\"oMaxDate\" (focus)=\"innerOnFocus($event)\"\n (blur)=\"innerOnBlur($event)\" (change)=\"onChangeEvent($event)\" [locale]=\"localeOptions\" [separator]=\"separator\" [startKey]=\"startKey\"\n [endKey]=\"endKey\" [showWeekNumbers]=\"showWeekNumbers\" [singleDatePicker]=\"isMobileMode()\">\n <button type=\"button\" matSuffix mat-icon-button (click)=\"openPicker()\" [disabled]=\"isReadOnly || !enabled\">\n <mat-icon>today</mat-icon>\n </button>\n\n <button type=\"button\" *ngIf=\"showClearButton\" matSuffix mat-icon-button (click)=\"onClickClearValue($event)\" [disabled]=\"isReadOnly || !enabled\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRange')\">\n {{ 'FORM_VALIDATION.DATERANGE_INVALID' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeParse')\">\n {{ 'FORM_VALIDATION.DATE_PARSE' | oTranslate }} : {{ getErrorValue('dateRangeParse', 'format') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMin')\">\n {{ 'FORM_VALIDATION.DATERANGE_MIN' | oTranslate }} : {{ getErrorValue('dateRangeMin', 'dateMin') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMax')\">\n {{ 'FORM_VALIDATION.DATERANGE_MAX' | oTranslate }} : {{ getErrorValue('dateRangeMax', 'dateMax') }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n </mat-form-field>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.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: i3.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { 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.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: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i11.ODaterangepickerDirective, selector: "input[o-daterange-input]", inputs: ["minDate", "maxDate", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "opens", "drops", "lastMonthDayClass", "emptyWeekRowClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "timePicker", "showRanges", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "separator", "locale", "_endKey", "oTouchUi", "startKey", "endKey"], outputs: ["onChange", "rangeClicked", "datesUpdated"] }, { kind: "pipe", type: i12.OTranslatePipe, name: "oTranslate" }] });
|
|
322
|
+
__decorate([
|
|
323
|
+
BooleanInputConverter(),
|
|
324
|
+
__metadata("design:type", Boolean)
|
|
325
|
+
], ODateRangeLegacyInputComponent.prototype, "textInputEnabled", void 0);
|
|
326
|
+
__decorate([
|
|
327
|
+
BooleanInputConverter(),
|
|
328
|
+
__metadata("design:type", Boolean)
|
|
329
|
+
], ODateRangeLegacyInputComponent.prototype, "showWeekNumbers", void 0);
|
|
330
|
+
__decorate([
|
|
331
|
+
BooleanInputConverter(),
|
|
332
|
+
__metadata("design:type", Boolean)
|
|
333
|
+
], ODateRangeLegacyInputComponent.prototype, "oTouchUi", void 0);
|
|
334
|
+
__decorate([
|
|
335
|
+
BooleanInputConverter(),
|
|
336
|
+
__metadata("design:type", Boolean)
|
|
337
|
+
], ODateRangeLegacyInputComponent.prototype, "showRanges", void 0);
|
|
338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODateRangeLegacyInputComponent, decorators: [{
|
|
339
|
+
type: Component,
|
|
340
|
+
args: [{ selector: 'o-daterange-legacy-input', outputs: DEFAULT_OUTPUTS_O_DATERANGE_LEGACY_INPUT, inputs: DEFAULT_INPUTS_O_DATERANGE_LEGACY_INPUT, template: "<div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" [formGroup]=\"getFormGroup()\" [matTooltip]=\"tooltip\" [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\" [matTooltipShowDelay]=\"tooltipShowDelay\" [matTooltipHideDelay]=\"tooltipHideDelay\">\n\n <mat-form-field [appearance]=\"appearance\" [floatLabel]=\"floatLabel\" [hideRequiredMarker]=\"hideRequiredMarker\" [class.custom-width]=\"hasCustomWidth\"\n class=\"icon-field\" fxFlexFill [subscriptSizing]=\"subscriptSizing\">\n <mat-label *ngIf=\"labelVisible\">{{ olabel | oTranslate }}</mat-label>\n <input #matInputRef matInput type=\"text\" o-daterange-input [id]=\"getAttribute()\" [formControlName]=\"getAttribute()\" [required]=\"isRequired\"\n [placeholder]=\"placeHolder\" [readonly]=\"isReadOnly || !textInputEnabled\" showDropdowns=\"true\" showCancel=\"true\" [showRanges]=\"showRanges\"\n (datesUpdated)=\"datesUpdated($event)\" [oTouchUi]=\"oTouchUi\" [minDate]=\"oMinDate\" [maxDate]=\"oMaxDate\" (focus)=\"innerOnFocus($event)\"\n (blur)=\"innerOnBlur($event)\" (change)=\"onChangeEvent($event)\" [locale]=\"localeOptions\" [separator]=\"separator\" [startKey]=\"startKey\"\n [endKey]=\"endKey\" [showWeekNumbers]=\"showWeekNumbers\" [singleDatePicker]=\"isMobileMode()\">\n <button type=\"button\" matSuffix mat-icon-button (click)=\"openPicker()\" [disabled]=\"isReadOnly || !enabled\">\n <mat-icon>today</mat-icon>\n </button>\n\n <button type=\"button\" *ngIf=\"showClearButton\" matSuffix mat-icon-button (click)=\"onClickClearValue($event)\" [disabled]=\"isReadOnly || !enabled\">\n <mat-icon svgIcon=\"ontimize:close\"></mat-icon>\n </button>\n\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRange')\">\n {{ 'FORM_VALIDATION.DATERANGE_INVALID' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeParse')\">\n {{ 'FORM_VALIDATION.DATE_PARSE' | oTranslate }} : {{ getErrorValue('dateRangeParse', 'format') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMin')\">\n {{ 'FORM_VALIDATION.DATERANGE_MIN' | oTranslate }} : {{ getErrorValue('dateRangeMin', 'dateMin') }}\n </mat-error>\n <mat-error *oMatError=\"hasError('dateRangeMax')\">\n {{ 'FORM_VALIDATION.DATERANGE_MAX' | oTranslate }} : {{ getErrorValue('dateRangeMax', 'dateMax') }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ oError.text | oTranslate }}\n </mat-error>\n </mat-form-field>\n</div>\n" }]
|
|
341
|
+
}], ctorParameters: function () { return [{ type: i13.OFormComponent, decorators: [{
|
|
342
|
+
type: Optional
|
|
343
|
+
}, {
|
|
344
|
+
type: Inject,
|
|
345
|
+
args: [forwardRef(() => OFormComponent)]
|
|
346
|
+
}] }, { type: i0.ElementRef }, { type: i0.Injector }, { type: i1.BreakpointObserver }]; }, propDecorators: { pickerDirective: [{
|
|
347
|
+
type: ViewChild,
|
|
348
|
+
args: [ODaterangepickerDirective, { static: true }]
|
|
349
|
+
}], matInputRef: [{
|
|
350
|
+
type: ViewChild,
|
|
351
|
+
args: ['matInputRef', { read: ElementRef, static: true }]
|
|
352
|
+
}], textInputEnabled: [], showWeekNumbers: [], oTouchUi: [], showRanges: [] } });
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kYXRlcmFuZ2UtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS1yYW5nZS1sZWdhY3kvby1kYXRlcmFuZ2UtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS1yYW5nZS1sZWdhY3kvby1kYXRlcmFuZ2UtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBcUIsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1SCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBR3BGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDOUcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7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V0FBVztzQkFEbEIsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXJELGdCQUFnQixNQUdoQixlQUFlLE1BR2YsUUFBUSxNQUdSLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBNb21lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGUvby10cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvZm9ybS12YWx1ZS1vcHRpb25zLnR5cGUnO1xuaW1wb3J0IHsgT0RhdGVWYWx1ZVR5cGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9vLWRhdGUtdmFsdWUudHlwZSc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZm9ybS9vLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IERFRkFVTFRfT1VUUFVUU19PX0ZPUk1fREFUQV9DT01QT05FTlQsIE9Gb3JtRGF0YUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL28tZm9ybS1kYXRhLWNvbXBvbmVudC5jbGFzcyc7XG5pbXBvcnQgeyBPVmFsdWVDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL28tdmFsdWUtY2hhbmdlLWV2ZW50LmNsYXNzJztcbmltcG9ydCB7IERFRkFVTFRfSU5QVVRTX09fREFURV9JTlBVVCB9IGZyb20gJy4uL2RhdGUtaW5wdXQvby1kYXRlLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRGF0ZXJhbmdlcGlja2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9vLWRhdGVyYW5nZS1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0ZXJhbmdlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9vLWRhdGVyYW5nZS1waWNrZXIuY29tcG9uZW50JztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX0RBVEVSQU5HRV9MRUdBQ1lfSU5QVVQgPSBbXG4gIC4uLkRFRkFVTFRfT1VUUFVUU19PX0ZPUk1fREFUQV9DT01QT05FTlRcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX0RBVEVSQU5HRV9MRUdBQ1lfSU5QVVQgPSBbXG4gICdzZXBhcmF0b3InLFxuICAnc2hvd1dlZWtOdW1iZXJzOnNob3ctd2Vlay1udW1iZXJzJyxcbiAgJ3Nob3dSYW5nZXM6c2hvdy1yYW5nZXMnLFxuICAnb2xvY2FsZTpsb2NhbGUnLFxuICAnc3RhcnRLZXknLFxuICAnZW5kS2V5JyxcbiAgJ3ZhbHVlVHlwZTogdmFsdWUtdHlwZScsXG4gICdtb2RlJyxcbiAgLi4uREVGQVVMVF9JTlBVVFNfT19EQVRFX0lOUFVUXG5dO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYE9EYXRlUmFuZ2VJbnB1dENvbXBvbmVudGAgaW5zdGVhZC4gVGhpcyBjb21wb25lbnQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tZGF0ZXJhbmdlLWxlZ2FjeS1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLWRhdGVyYW5nZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX0RBVEVSQU5HRV9MRUdBQ1lfSU5QVVQsXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19EQVRFUkFOR0VfTEVHQUNZX0lOUFVUXG59KVxuZXhwb3J0IGNsYXNzIE9EYXRlUmFuZ2VMZWdhY3lJbnB1dENvbXBvbmVudCBleHRlbmRzIE9Gb3JtRGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0IHtcblxuICBAVmlld0NoaWxkKE9EYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHBpY2tlckRpcmVjdGl2ZTogT0RhdGVyYW5nZXBpY2tlckRpcmVjdGl2ZTtcbiAgcGlja2VyITogRGF0ZXJhbmdlcGlja2VyQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ21hdElucHV0UmVmJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBtYXRJbnB1dFJlZiE6IEVsZW1lbnRSZWY7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyB0ZXh0SW5wdXRFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHNob3dXZWVrTnVtYmVyczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwdWJsaWMgb1RvdWNoVWk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHNob3dSYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX29NaW5EYXRlOiBtb21lbnQuTW9tZW50O1xuXG4gIHB1YmxpYyBtb2RlOiAnbW9iaWxlJyB8ICdkZXNrdG9wJyB8ICdhdXRvJyA9ICdhdXRvJztcblxuICBnZXQgb01pbkRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29NaW5EYXRlO1xuICB9XG4gIHNldCBvTWluRGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMuX29NaW5EYXRlID0gbW9tZW50KHZhbHVlLCB0aGlzLm9mb3JtYXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vTWF4RGF0ZTogbW9tZW50Lk1vbWVudDtcbiAgZ2V0IG9NYXhEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9vTWF4RGF0ZTtcbiAgfVxuICBzZXQgb01heERhdGUodmFsdWUpIHtcbiAgICB0aGlzLl9vTWF4RGF0ZSA9IG1vbWVudCh2YWx1ZSwgdGhpcy5vZm9ybWF0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc3RhcnRLZXk6IHN0cmluZyA9ICdzdGFydERhdGUnO1xuICBnZXQgc3RhcnRLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0S2V5O1xuICB9XG4gIHNldCBzdGFydEtleSh2YWx1ZSkge1xuICAgIHRoaXMuX3N0YXJ0S2V5ID0gdmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2VuZEtleTogc3RyaW5nID0gJ2VuZERhdGUnO1xuICBnZXQgZW5kS2V5KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmRLZXk7XG4gIH1cbiAgc2V0IGVuZEtleSh2YWx1ZSkge1xuICAgIHRoaXMuX2VuZEtleSA9IHZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF92YWx1ZVR5cGU6IE9EYXRlVmFsdWVUeXBlID0gJ3RpbWVzdGFtcCc7XG5cbiAgcHJvdGVjdGVkIF9zZXBhcmF0b3IgPSAnIC0gJztcbiAgZ2V0IHNlcGFyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VwYXJhdG9yO1xuICB9XG5cbiAgc2V0IHNlcGFyYXRvcih2YWx1ZSkge1xuICAgIHRoaXMuX3NlcGFyYXRvciA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmdldEZvcm1Db250cm9sKCk/LnZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsZWFyQnV0dG9uICYmICF0aGlzLmlzUmVhZE9ubHkgJiYgdGhpcy5lbmFibGVkICYmIHRoaXMubWF0SW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgfVxuXG4gIGdldCBsb2NhbGVPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGVPcHRpb25zO1xuICB9XG5cbiAgaXNNb2JpbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdtb2JpbGUnIHx8ICh0aGlzLm1vZGUgPT09ICdhdXRvJyAmJiB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5pc01hdGNoZWQoQnJlYWtwb2ludHMuSGFuZHNldCkpXG4gIH1cblxuICBpc0Rlc2t0b3BNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdkZXNrdG9wJyB8fCAodGhpcy5tb2RlID09PSAnYXV0bycgJiYgIXRoaXMuYnJlYWtwb2ludE9ic2VydmVyLmlzTWF0Y2hlZChCcmVha3BvaW50cy5IYW5kc2V0KSlcbiAgfVxuXG5cbiAgcHVibGljIG9mb3JtYXQ6IHN0cmluZyA9ICdMJztcbiAgcHJvdGVjdGVkIF9sb2NhbGVPcHRpb25zOiBhbnk7XG4gIHByb3RlY3RlZCBvbG9jYWxlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb21lbnRTcnY6IE1vbWVudFNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb1RyYW5zbGF0ZTogT1RyYW5zbGF0ZVNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSkgZm9ybTogT0Zvcm1Db21wb25lbnQsXG4gICAgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlclxuICApIHtcbiAgICBzdXBlcihmb3JtLCBlbFJlZiwgaW5qZWN0b3IpO1xuICAgIHRoaXMub1RyYW5zbGF0ZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICB0aGlzLm1vbWVudFNydiA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1vbWVudFNlcnZpY2UpO1xuICAgIGlmICghdGhpcy5vbG9jYWxlKSB7XG4gICAgICB0aGlzLm9sb2NhbGUgPSB0aGlzLm1vbWVudFNydi5nZXRMb2NhbGUoKTtcbiAgICAgIG1vbWVudC5sb2NhbGUodGhpcy5vbG9jYWxlKTtcbiAgICB9XG4gICAgdGhpcy5fbG9jYWxlT3B0aW9ucyA9IHtcbiAgICAgIGRpcmVjdGlvbjogJ2x0cicsXG4gICAgICBzZXBhcmF0b3I6ICcgLSAnLFxuICAgICAgd2Vla0xhYmVsOiB0aGlzLm9UcmFuc2xhdGUuZ2V0KCdEQVRFUkFOR0UuVycpLFxuICAgICAgYXBwbHlMYWJlbDogdGhpcy5vVHJhbnNsYXRlLmdldCgnREFURVJBTkdFLkFQUExZTEFCRUwnKSxcbiAgICAgIGNhbmNlbExhYmVsOiB0aGlzLm9UcmFuc2xhdGUuZ2V0KCdDQU5DRUwnKSxcbiAgICAgIGN1c3RvbVJhbmdlTGFiZWw6ICdDdXN0b20gcmFuZ2UnLFxuICAgICAgZGF5c09mV2VlazogbW9tZW50LmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbigpLFxuICAgICAgbW9udGhOYW1lczogbW9tZW50LmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCgpLFxuICAgICAgZmlyc3REYXk6IG1vbWVudC5sb2NhbGVEYXRhKCkuZmlyc3REYXlPZldlZWsoKSxcbiAgICAgIGZvcm1hdDogJ0wnXG4gICAgfTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgaWYgKHRoaXMub2Zvcm1hdCkge1xuICAgICAgdGhpcy5fbG9jYWxlT3B0aW9ucy5mb3JtYXQgPSB0aGlzLm9mb3JtYXQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5QaWNrZXIoKSB7XG4gICAgdGhpcy5waWNrZXJEaXJlY3RpdmUub3BlbigpO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlRXZlbnQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCBvYmplY3RWYWx1ZTtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgaWYgKHZhbHVlICE9PSAnJykge1xuICAgICAgICBvYmplY3RWYWx1ZSA9IHRoaXMuZ2V0RGF0ZVJhbmdlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3RWYWx1ZSA9IGV2ZW50O1xuICAgIH1cblxuICAgIHRoaXMuc2V0VmFsdWUob2JqZWN0VmFsdWUsIHtcbiAgICAgIGNoYW5nZVR5cGU6IE9WYWx1ZUNoYW5nZUV2ZW50LlVTRVJfQ0hBTkdFLFxuICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2VcbiAgICB9KTtcblxuICB9XG5cbiAgcHVibGljIHNldFZhbHVlKHZhbDogYW55LCBvcHRpb25zOiBGb3JtVmFsdWVPcHRpb25zID0ge30sIHNldERpcnR5OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBzdXBlci5zZXRWYWx1ZSh2YWwsIG9wdGlvbnMsIHNldERpcnR5KTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQ2xlYXJWYWx1ZShlOiBFdmVudCk6IHZvaWQge1xuICAgIHN1cGVyLm9uQ2xpY2tDbGVhclZhbHVlKGUpO1xuICAgIHRoaXMucGlja2VyRGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucGlja2VyRGlyZWN0aXZlLmRhdGVzVXBkYXRlZC5lbWl0KCk7XG4gIH1cblxuICBkYXRlc1VwZGF0ZWQocmFuZ2UpIHtcbiAgICB0aGlzLnBpY2tlckRpcmVjdGl2ZS5jbG9zZSgpO1xuICAgIHRoaXMuc2V0VmFsdWUocmFuZ2UsXG4gICAgICB7XG4gICAgICAgIGNoYW5nZVR5cGU6IE9WYWx1ZUNoYW5nZUV2ZW50LlVTRVJfQ0hBTkdFLFxuICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlXG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXRhKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBzdXBlci5zZXREYXRhKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnBpY2tlckRpcmVjdGl2ZS5kYXRlc1VwZGF0ZWQuZW1pdChuZXdWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gIH1cblxuICB1cGRhdGVFbGVtZW50KCkge1xuICAgIGxldCBjaG9zZW5MYWJlbDogYW55O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnZhbHVlKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnZhbHVlLnZhbHVlKSAmJiAhdGhpcy5pc09iamVjdERhdGFSYW5nZU51bGwodGhpcy52YWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlLnZhbHVlW3RoaXMucGlja2VyRGlyZWN0aXZlLnN0YXJ0S2V5XSAmJiB0aGlzLnZhbHVlLnZhbHVlW3RoaXMucGlja2VyRGlyZWN0aXZlLmVuZEtleV0pIHtcbiAgICAgICAgdGhpcy52YWx1ZS52YWx1ZVt0aGlzLnBpY2tlckRpcmVjdGl2ZS5zdGFydEtleV0gPSB0aGlzLmVuc3VyZURhdGVSYW5nZVZhbHVlKHRoaXMudmFsdWUudmFsdWVbdGhpcy5waWNrZXJEaXJlY3RpdmUuc3RhcnRLZXldLCB0aGlzLl92YWx1ZVR5cGUpO1xuICAgICAgICB0aGlzLnZhbHVlLnZhbHVlW3RoaXMucGlja2VyRGlyZWN0aXZlLmVuZEtleV0gPSB0aGlzLmVuc3VyZURhdGVSYW5nZVZhbHVlKHRoaXMudmFsdWUudmFsdWVbdGhpcy5waWNrZXJEaXJlY3RpdmUuZW5kS2V5XSwgdGhpcy5fdmFsdWVUeXBlKTtcbiAgICAgICAgY2hvc2VuTGFiZWwgPSB0aGlzLnZhbHVlLnZhbHVlW3RoaXMucGlja2VyRGlyZWN0aXZlLnN0YXJ0S2V5XS5mb3JtYXQodGhpcy5vZm9ybWF0KSArXG4gICAgICAgICAgdGhpcy5zZXBhcmF0b3IgKyB0aGlzLnZhbHVlLnZhbHVlW3RoaXMucGlja2VyRGlyZWN0aXZlLmVuZEtleV0uZm9ybWF0KHRoaXMub2Zvcm1hdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaG9zZW5MYWJlbCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNob3NlbkxhYmVsID0gbnVsbDtcbiAgICAgIHRoaXMucGlja2VyRGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLnBpY2tlckRpcmVjdGl2ZS5fZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IGNob3NlbkxhYmVsO1xuICB9XG5cblxuICBnZXREYXRlUmFuZ2VUb1N0cmluZyh2YWx1ZVRvU3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHt9O1xuICAgIGNvbnN0IHJhbmdlID0gdmFsdWVUb1N0cmluZy5zcGxpdCh0aGlzLnNlcGFyYXRvcik7XG4gICAgdmFsdWVbdGhpcy5fc3RhcnRLZXldID0gbW9tZW50KHJhbmdlWzBdLnRyaW0oKSwgdGhpcy5vZm9ybWF0KTtcbiAgICB2YWx1ZVt0aGlzLl9lbmRLZXldID0gbW9tZW50KHJhbmdlWzFdLnRyaW0oKSwgdGhpcy5vZm9ybWF0KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuXG4gIHJlc29sdmVWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBzdXBlci5yZXNvbHZlVmFsaWRhdG9ycygpO1xuXG4gICAgdmFsaWRhdG9ycy5wdXNoKHRoaXMucmFuZ2VEYXRlVmFsaWRhdG9yLmJpbmQodGhpcykpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLl9vTWluRGF0ZSkpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLm1pbkRhdGVWYWxpZGF0b3IuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLl9vTWF4RGF0ZSkpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLm1heERhdGVWYWxpZGF0b3IuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdG9ycy5wdXNoKHRoaXMucGFyc2VEYXRlVmFsaWRhdG9yLmJpbmQodGhpcykpO1xuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgaXNPYmplY3REYXRhUmFuZ2VOdWxsKG9iamVjdFZhbHVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG9iamVjdFZhbHVlICE9PSBudWxsICYmIG9iamVjdFZhbHVlLnZhbHVlICE9PSBudWxsICYmXG4gICAgICAhVXRpbC5pc0RlZmluZWQob2JqZWN0VmFsdWUudmFsdWVbdGhpcy5waWNrZXJEaXJlY3RpdmUuc3RhcnRLZXldKSAmJlxuICAgICAgIVV0aWwuaXNEZWZpbmVkKG9iamVjdFZhbHVlLnZhbHVlW3RoaXMucGlja2VyRGlyZWN0aXZlLmVuZEtleV0pO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgcmFuZ2VEYXRlVmFsaWRhdG9yKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuXG4gICAgaWYgKChjb250cm9sLnZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgJiYgIXRoaXMuaXNPYmplY3REYXRhUmFuZ2VOdWxsKGNvbnRyb2wpICYmIGNvbnRyb2wudmFsdWVbdGhpcy5fZW5kS2V5XS5pc1NhbWVPckJlZm9yZShjb250cm9sLnZhbHVlW3RoaXMuX3N0YXJ0S2V5XSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGVSYW5nZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG1pbkRhdGVWYWxpZGF0b3IoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgbWluZGF0ZSA9IG1vbWVudCh0aGlzLl9vTWluRGF0ZSk7XG4gICAgaWYgKChjb250cm9sLnZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgJiYgIXRoaXMuaXNPYmplY3REYXRhUmFuZ2VOdWxsKGNvbnRyb2wpICYmIGNvbnRyb2wudmFsdWVbdGhpcy5fc3RhcnRLZXldLmlzQmVmb3JlKG1pbmRhdGUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRlUmFuZ2VNaW46IHtcbiAgICAgICAgICBkYXRlTWluOiBtaW5kYXRlLmZvcm1hdCh0aGlzLm9mb3JtYXQpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXhEYXRlVmFsaWRhdG9yKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IG1heGRhdGUgPSBtb21lbnQodGhpcy5fb01heERhdGUpO1xuICAgIGlmICgoY29udHJvbC52YWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICYmICF0aGlzLmlzT2JqZWN0RGF0YVJhbmdlTnVsbChjb250cm9sKSAmJiBjb250cm9sLnZhbHVlW3RoaXMuX2VuZEtleV0uaXNBZnRlcihtYXhkYXRlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZVJhbmdlTWF4OiB7XG4gICAgICAgICAgZGF0ZU1heDogbWF4ZGF0ZS5mb3JtYXQodGhpcy5vZm9ybWF0KVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cbiAgcHJvdGVjdGVkIHBhcnNlRGF0ZVZhbGlkYXRvcihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAoKGNvbnRyb2wudmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAmJiAhdGhpcy5pc09iamVjdERhdGFSYW5nZU51bGwoY29udHJvbClcbiAgICAgICYmICgoY29udHJvbC52YWx1ZVt0aGlzLl9zdGFydEtleV0gJiYgIWNvbnRyb2wudmFsdWVbdGhpcy5fc3RhcnRLZXldLmlzVmFsaWQoKSlcbiAgICAgICAgfHwgKGNvbnRyb2wudmFsdWVbdGhpcy5fZW5kS2V5XSAmJiAhY29udHJvbC52YWx1ZVt0aGlzLl9lbmRLZXldLmlzVmFsaWQoKSkpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRlUmFuZ2VQYXJzZToge1xuICAgICAgICAgIGZvcm1hdDogdGhpcy5vZm9ybWF0ICsgdGhpcy5fbG9jYWxlT3B0aW9ucy5zZXBhcmF0b3IgKyB0aGlzLm9mb3JtYXRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgZW5zdXJlRGF0ZVJhbmdlVmFsdWUodmFsOiBhbnksIHZhbHVlVHlwZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gdmFsO1xuICAgIGlmICghbW9tZW50LmlzTW9tZW50KHZhbCkpIHtcbiAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGlmICgodmFsIGluc3RhbmNlb2YgRGF0ZSkgfHwgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBtb21lbnQodmFsKS5mb3JtYXQoJ1lZWVktTU0tRERUaGg6bW0nKSArICdaJztcbiAgICAgICAgICAgIGNvbnN0IHEgPSBtb21lbnQoZGF0ZVN0cmluZyk7XG4gICAgICAgICAgICBpZiAocS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gcTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGltZXN0YW1wJzpcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBtb21lbnQudW5peCh2YWwpLmZvcm1hdCgnWVlZWS1NTS1ERFRoaDptbScpICsgJ1onO1xuICAgICAgICAgICAgY29uc3QgdCA9IG1vbWVudChkYXRlU3RyaW5nKTtcbiAgICAgICAgICAgIGlmICh0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICByZXN1bHQgPSB0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpc28tODYwMSc6XG4gICAgICAgICAgY29uc3QgbSA9IG1vbWVudCh2YWwpO1xuICAgICAgICAgIGlmIChtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChyZXN1bHQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYE9EYXRlUmFuZ2VJbnB1dENvbXBvbmVudCB2YWx1ZSAoJHt2YWx9KSBpcyBub3QgY29uc2lzdGVudCB3aXRoIHZhbHVlLXR5cGUgKCR7dmFsdWVUeXBlfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHNldCB2YWx1ZVR5cGUodmFsOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZVR5cGUgPSBVdGlsLmNvbnZlcnRUb09EYXRlVmFsdWVUeXBlKHZhbCk7XG4gIH1cblxuICBnZXQgdmFsdWVUeXBlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlVHlwZTtcbiAgfVxuXG59XG4iLCI8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCIgW2Zvcm1Hcm91cF09XCJnZXRGb3JtR3JvdXAoKVwiIFttYXRUb29sdGlwXT1cInRvb2x0aXBcIiBbbWF0VG9vbHRpcENsYXNzXT1cInRvb2x0aXBDbGFzc1wiXG4gIFttYXRUb29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uXCIgW21hdFRvb2x0aXBTaG93RGVsYXldPVwidG9vbHRpcFNob3dEZWxheVwiIFttYXRUb29sdGlwSGlkZURlbGF5XT1cInRvb2x0aXBIaWRlRGVsYXlcIj5cblxuICA8bWF0LWZvcm0tZmllbGQgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIiBbaGlkZVJlcXVpcmVkTWFya2VyXT1cImhpZGVSZXF1aXJlZE1hcmtlclwiIFtjbGFzcy5jdXN0b20td2lkdGhdPVwiaGFzQ3VzdG9tV2lkdGhcIlxuICAgIGNsYXNzPVwiaWNvbi1maWVsZFwiIGZ4RmxleEZpbGwgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIj5cbiAgICA8bWF0LWxhYmVsICpuZ0lmPVwibGFiZWxWaXNpYmxlXCI+e3sgb2xhYmVsIHwgb1RyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCAjbWF0SW5wdXRSZWYgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBvLWRhdGVyYW5nZS1pbnB1dCBbaWRdPVwiZ2V0QXR0cmlidXRlKClcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImdldEF0dHJpYnV0ZSgpXCIgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyXCIgW3JlYWRvbmx5XT1cImlzUmVhZE9ubHkgfHwgIXRleHRJbnB1dEVuYWJsZWRcIiBzaG93RHJvcGRvd25zPVwidHJ1ZVwiIHNob3dDYW5jZWw9XCJ0cnVlXCIgW3Nob3dSYW5nZXNdPVwic2hvd1Jhbmdlc1wiXG4gICAgICAoZGF0ZXNVcGRhdGVkKT1cImRhdGVzVXBkYXRlZCgkZXZlbnQpXCIgW29Ub3VjaFVpXT1cIm9Ub3VjaFVpXCIgW21pbkRhdGVdPVwib01pbkRhdGVcIiBbbWF4RGF0ZV09XCJvTWF4RGF0ZVwiIChmb2N1cyk9XCJpbm5lck9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJpbm5lck9uQmx1cigkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiBbbG9jYWxlXT1cImxvY2FsZU9wdGlvbnNcIiBbc2VwYXJhdG9yXT1cInNlcGFyYXRvclwiIFtzdGFydEtleV09XCJzdGFydEtleVwiXG4gICAgICBbZW5kS2V5XT1cImVuZEtleVwiIFtzaG93V2Vla051bWJlcnNdPVwic2hvd1dlZWtOdW1iZXJzXCIgW3NpbmdsZURhdGVQaWNrZXJdPVwiaXNNb2JpbGVNb2RlKClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvcGVuUGlja2VyKClcIiBbZGlzYWJsZWRdPVwiaXNSZWFkT25seSB8fCAhZW5hYmxlZFwiPlxuICAgICAgPG1hdC1pY29uPnRvZGF5PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwic2hvd0NsZWFyQnV0dG9uXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25DbGlja0NsZWFyVmFsdWUoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJpc1JlYWRPbmx5IHx8ICFlbmFibGVkXCI+XG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cImhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcignZGF0ZVJhbmdlJylcIj5cbiAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uREFURVJBTkdFX0lOVkFMSUQnIHwgb1RyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cImhhc0Vycm9yKCdkYXRlUmFuZ2VQYXJzZScpXCI+XG4gICAgICB7eyAnRk9STV9WQUxJREFUSU9OLkRBVEVfUEFSU0UnIHwgb1RyYW5zbGF0ZSB9fSA6IHt7IGdldEVycm9yVmFsdWUoJ2RhdGVSYW5nZVBhcnNlJywgJ2Zvcm1hdCcpIH19XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwiaGFzRXJyb3IoJ2RhdGVSYW5nZU1pbicpXCI+XG4gICAgICB7eyAnRk9STV9WQUxJREFUSU9OLkRBVEVSQU5HRV9NSU4nIHwgb1RyYW5zbGF0ZSB9fSA6IHt7IGdldEVycm9yVmFsdWUoJ2RhdGVSYW5nZU1pbicsICdkYXRlTWluJykgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcignZGF0ZVJhbmdlTWF4JylcIj5cbiAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uREFURVJBTkdFX01BWCcgfCBvVHJhbnNsYXRlIH19IDoge3sgZ2V0RXJyb3JWYWx1ZSgnZGF0ZVJhbmdlTWF4JywgJ2RhdGVNYXgnKSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IG9FcnJvciBvZiBnZXRBY3RpdmVPRXJyb3JzKClcIj5cbiAgICAgIHt7IG9FcnJvci50ZXh0IHwgb1RyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=
|