@impartner/design-components 2.0.1 → 2.1.1

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.
Files changed (155) hide show
  1. package/README.md +2 -1
  2. package/esm2022/lib/badge/badge.component.mjs +17 -1
  3. package/esm2022/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.mjs +105 -0
  4. package/esm2022/lib/datetime-picker/components/datepicker-nav/index.mjs +2 -0
  5. package/esm2022/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.mjs +30 -0
  6. package/esm2022/lib/datetime-picker/components/datepicker-template-host/index.mjs +2 -0
  7. package/esm2022/lib/datetime-picker/components/datetime-picker/datetime-picker.component.mjs +370 -0
  8. package/esm2022/lib/datetime-picker/components/datetime-picker/index.mjs +2 -0
  9. package/esm2022/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.mjs +367 -0
  10. package/esm2022/lib/datetime-picker/components/datetime-picker-input/index.mjs +2 -0
  11. package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.mjs +68 -0
  12. package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/index.mjs +2 -0
  13. package/esm2022/lib/datetime-picker/components/index.mjs +6 -0
  14. package/esm2022/lib/datetime-picker/constants/datetime-picker-defaults.mjs +12 -0
  15. package/esm2022/lib/datetime-picker/constants/index.mjs +2 -0
  16. package/esm2022/lib/datetime-picker/datetime-picker.module.mjs +22 -0
  17. package/esm2022/lib/datetime-picker/index.mjs +4 -0
  18. package/esm2022/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.mjs +40 -0
  19. package/esm2022/lib/datetime-picker/services/datetime-formatter/index.mjs +2 -0
  20. package/esm2022/lib/datetime-picker/services/index.mjs +2 -0
  21. package/esm2022/lib/datetime-picker/types/datetime-picker-value.interface.mjs +2 -0
  22. package/esm2022/lib/datetime-picker/types/index.mjs +2 -0
  23. package/esm2022/lib/design-components.module.mjs +20 -7
  24. package/esm2022/lib/form-field/component/directives/corner-hint.directive.mjs +15 -0
  25. package/esm2022/lib/form-field/component/directives/error.directive.mjs +27 -0
  26. package/esm2022/lib/form-field/component/directives/form-root.directive.mjs +93 -0
  27. package/esm2022/lib/form-field/component/directives/hint.directive.mjs +25 -0
  28. package/esm2022/lib/form-field/component/directives/index.mjs +25 -0
  29. package/esm2022/lib/form-field/component/directives/label.directive.mjs +15 -0
  30. package/esm2022/lib/form-field/component/directives/prefix.directive.mjs +25 -0
  31. package/esm2022/lib/form-field/component/directives/suffix.directive.mjs +25 -0
  32. package/esm2022/lib/form-field/component/form-field.component.mjs +131 -0
  33. package/esm2022/lib/form-field/component/form-field.module.mjs +24 -0
  34. package/esm2022/lib/form-field/component/index.mjs +4 -0
  35. package/esm2022/lib/form-field/controls/checkbox/checkbox.component.mjs +14 -6
  36. package/esm2022/lib/form-field/controls/checkbox/checkbox.module.mjs +4 -7
  37. package/esm2022/lib/form-field/controls/index.mjs +2 -1
  38. package/esm2022/lib/form-field/controls/input/input.directive.mjs +4 -3
  39. package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +6 -4
  40. package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +4 -3
  41. package/esm2022/lib/form-field/controls/radio/radio.module.mjs +4 -7
  42. package/esm2022/lib/form-field/controls/select/index.mjs +6 -3
  43. package/esm2022/lib/form-field/controls/select/interfaces/index.mjs +2 -0
  44. package/esm2022/lib/form-field/controls/select/interfaces/select-option.interface.mjs +2 -0
  45. package/esm2022/lib/form-field/controls/select/option/index.mjs +2 -2
  46. package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +33 -128
  47. package/esm2022/lib/form-field/controls/select/option-display/index.mjs +2 -0
  48. package/esm2022/lib/form-field/controls/select/option-display/select-option-display.component.mjs +162 -0
  49. package/esm2022/lib/form-field/controls/select/option-group/index.mjs +2 -0
  50. package/esm2022/lib/form-field/controls/select/option-group/select-option-group.component.mjs +35 -0
  51. package/esm2022/lib/form-field/controls/select/option-parent.mjs +2 -1
  52. package/esm2022/lib/form-field/controls/select/select.component.mjs +348 -148
  53. package/esm2022/lib/form-field/controls/select/select.module.mjs +20 -13
  54. package/esm2022/lib/form-field/controls/select/value-tags-display/index.mjs +2 -0
  55. package/esm2022/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.mjs +91 -0
  56. package/esm2022/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +3 -3
  57. package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +19 -3
  58. package/esm2022/lib/form-field/controls/shared/toggle/toggle.module.mjs +4 -6
  59. package/esm2022/lib/form-field/controls/tag-select/index.mjs +2 -0
  60. package/esm2022/lib/form-field/controls/tag-select/tag-select.component.mjs +146 -0
  61. package/esm2022/lib/form-field/impdc-forms.mjs +2 -3
  62. package/esm2022/lib/form-field/impdc-forms.module.mjs +32 -47
  63. package/esm2022/lib/form-field/shared/error-state.mixin.mjs +1 -1
  64. package/esm2022/lib/icon/icon.component.mjs +12 -5
  65. package/esm2022/lib/index.mjs +3 -1
  66. package/esm2022/lib/pagination/pagination.component.mjs +6 -6
  67. package/esm2022/lib/select-icon/select-icon.component.mjs +6 -6
  68. package/esm2022/lib/select-icon/select-icon.module.mjs +5 -1
  69. package/esm2022/lib/table/containers/table.component.mjs +3 -3
  70. package/esm2022/lib/tag/index.mjs +2 -0
  71. package/esm2022/lib/tag/tag.component.mjs +104 -0
  72. package/esm2022/lib/text-highlight/text-highlight.component.mjs +52 -37
  73. package/esm2022/lib/text-highlight/text-highlight.module.mjs +4 -6
  74. package/fesm2022/impartner-design-components.mjs +5620 -3983
  75. package/fesm2022/impartner-design-components.mjs.map +1 -1
  76. package/lib/badge/badge.component.d.ts +15 -1
  77. package/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.d.ts +31 -0
  78. package/lib/datetime-picker/components/datepicker-nav/index.d.ts +1 -0
  79. package/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.d.ts +14 -0
  80. package/lib/datetime-picker/components/datepicker-template-host/index.d.ts +1 -0
  81. package/lib/datetime-picker/components/datetime-picker/datetime-picker.component.d.ts +157 -0
  82. package/lib/datetime-picker/components/datetime-picker/index.d.ts +1 -0
  83. package/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.d.ts +160 -0
  84. package/lib/datetime-picker/components/datetime-picker-input/index.d.ts +1 -0
  85. package/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.d.ts +24 -0
  86. package/lib/datetime-picker/components/datetime-picker-input-footer/index.d.ts +1 -0
  87. package/lib/datetime-picker/components/index.d.ts +5 -0
  88. package/lib/datetime-picker/constants/datetime-picker-defaults.d.ts +4 -0
  89. package/lib/datetime-picker/constants/index.d.ts +1 -0
  90. package/lib/datetime-picker/datetime-picker.module.d.ts +8 -0
  91. package/lib/datetime-picker/index.d.ts +4 -0
  92. package/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.d.ts +20 -0
  93. package/lib/datetime-picker/services/datetime-formatter/index.d.ts +1 -0
  94. package/lib/datetime-picker/services/index.d.ts +1 -0
  95. package/lib/datetime-picker/types/datetime-picker-value.interface.d.ts +5 -0
  96. package/lib/datetime-picker/types/index.d.ts +1 -0
  97. package/lib/design-components.module.d.ts +14 -12
  98. package/lib/form-field/{directives → component/directives}/corner-hint.directive.d.ts +1 -1
  99. package/lib/form-field/{directives → component/directives}/error.directive.d.ts +1 -1
  100. package/lib/form-field/{directives → component/directives}/form-root.directive.d.ts +2 -2
  101. package/lib/form-field/{directives → component/directives}/hint.directive.d.ts +1 -1
  102. package/lib/form-field/component/directives/index.d.ts +15 -0
  103. package/lib/form-field/{directives → component/directives}/label.directive.d.ts +1 -1
  104. package/lib/form-field/{directives → component/directives}/prefix.directive.d.ts +1 -1
  105. package/lib/form-field/{directives → component/directives}/suffix.directive.d.ts +1 -1
  106. package/lib/form-field/{form-field.component.d.ts → component/form-field.component.d.ts} +3 -5
  107. package/lib/form-field/component/form-field.module.d.ts +14 -0
  108. package/lib/form-field/component/index.d.ts +3 -0
  109. package/lib/form-field/controls/checkbox/checkbox.component.d.ts +6 -2
  110. package/lib/form-field/controls/checkbox/checkbox.module.d.ts +1 -3
  111. package/lib/form-field/controls/index.d.ts +1 -0
  112. package/lib/form-field/controls/input/input.directive.d.ts +2 -2
  113. package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +1 -1
  114. package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +2 -2
  115. package/lib/form-field/controls/radio/radio.module.d.ts +1 -3
  116. package/lib/form-field/controls/select/index.d.ts +6 -2
  117. package/lib/form-field/controls/select/interfaces/index.d.ts +1 -0
  118. package/lib/form-field/controls/select/interfaces/select-option.interface.d.ts +6 -0
  119. package/lib/form-field/controls/select/option/index.d.ts +1 -1
  120. package/lib/form-field/controls/select/option/select-option.component.d.ts +10 -49
  121. package/lib/form-field/controls/select/option-display/index.d.ts +1 -0
  122. package/lib/form-field/controls/select/option-display/select-option-display.component.d.ts +64 -0
  123. package/lib/form-field/controls/select/option-group/index.d.ts +1 -0
  124. package/lib/form-field/controls/select/option-group/select-option-group.component.d.ts +11 -0
  125. package/lib/form-field/controls/select/option-parent.d.ts +12 -1
  126. package/lib/form-field/controls/select/select.component.d.ts +113 -51
  127. package/lib/form-field/controls/select/select.module.d.ts +5 -6
  128. package/lib/form-field/controls/select/value-tags-display/index.d.ts +1 -0
  129. package/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.d.ts +46 -0
  130. package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +1 -1
  131. package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +4 -1
  132. package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +1 -2
  133. package/lib/form-field/controls/tag-select/index.d.ts +1 -0
  134. package/lib/form-field/controls/tag-select/tag-select.component.d.ts +43 -0
  135. package/lib/form-field/impdc-forms.d.ts +1 -2
  136. package/lib/form-field/impdc-forms.module.d.ts +8 -14
  137. package/lib/form-field/shared/error-state.mixin.d.ts +4 -4
  138. package/lib/icon/icon.component.d.ts +5 -3
  139. package/lib/index.d.ts +2 -0
  140. package/lib/select-icon/select-icon.module.d.ts +4 -3
  141. package/lib/tag/index.d.ts +1 -0
  142. package/lib/tag/tag.component.d.ts +54 -0
  143. package/lib/text-highlight/text-highlight.component.d.ts +12 -6
  144. package/lib/text-highlight/text-highlight.module.d.ts +1 -2
  145. package/package.json +2 -2
  146. package/esm2022/lib/form-field/directives/corner-hint.directive.mjs +0 -14
  147. package/esm2022/lib/form-field/directives/error.directive.mjs +0 -26
  148. package/esm2022/lib/form-field/directives/form-root.directive.mjs +0 -91
  149. package/esm2022/lib/form-field/directives/hint.directive.mjs +0 -24
  150. package/esm2022/lib/form-field/directives/index.mjs +0 -8
  151. package/esm2022/lib/form-field/directives/label.directive.mjs +0 -14
  152. package/esm2022/lib/form-field/directives/prefix.directive.mjs +0 -24
  153. package/esm2022/lib/form-field/directives/suffix.directive.mjs +0 -24
  154. package/esm2022/lib/form-field/form-field.component.mjs +0 -132
  155. package/lib/form-field/directives/index.d.ts +0 -7
@@ -0,0 +1,370 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, EventEmitter, Inject, Input, Optional, Output, Self, ViewChild, booleanAttribute, inject } from '@angular/core';
2
+ import { CommonModule, TranslationWidth } from '@angular/common';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { FormBuilder, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
5
+ import { NgbDateAdapter, NgbDatepicker, NgbDatepickerModule, NgbTimepickerModule } from '@ng-bootstrap/ng-bootstrap';
6
+ import { nanoid } from 'nanoid';
7
+ import { Subject, debounceTime } from 'rxjs';
8
+ import { IMPDC_FORM_ROOT, ImpdcFormFieldControl, ImpdcFormsModule, mixinDisabled, mixinErrorState, mixinTabIndex } from '../../../form-field';
9
+ import { DEFAULT_MAX_DATE, DEFAULT_MIN_DATE, DEFAULT_USE_MERIDIAN_LABEL } from '../../constants';
10
+ import { DatepickerTemplateHostComponent } from '../datepicker-template-host';
11
+ import { DatetimePickerInputFooterComponent } from '../datetime-picker-input-footer';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "../../../form-field";
14
+ import * as i2 from "@angular/forms";
15
+ import * as i3 from "@angular/common";
16
+ import * as i4 from "@ng-bootstrap/ng-bootstrap";
17
+ import * as i5 from "../../../form-field/component/directives/form-root.directive";
18
+ import * as i6 from "../../../form-field/controls/checkbox/checkbox.component";
19
+ export const DEFAULT_TIME_LAYOUT = {
20
+ border: false,
21
+ layout: 'inline'
22
+ };
23
+ const _DatetimePickerComponentBase = mixinTabIndex(mixinDisabled(mixinErrorState(class {
24
+ constructor(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
25
+ this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
26
+ this._formRoot = _formRoot;
27
+ this._parentForm = _parentForm;
28
+ this._parentFormGroup = _parentFormGroup;
29
+ this.ngControl = ngControl;
30
+ this.stateChanges = new Subject();
31
+ }
32
+ })));
33
+ /**
34
+ * A control for selecting date or datetime via an inline calendar control.
35
+ *
36
+ * Implements [ControlValueAccessor](https://angular.io/api/forms/ControlValueAccessor) to support two-way binding with
37
+ * Angular forms via usage of the \`[(ngModel)]\`, \`[formControl]\`, and \`[formControlName]\` directives.
38
+ *
39
+ * The date and time controls inside this component leverage the value adapter patterns and services of NG-Bootstrap's
40
+ * [Datepicker](https://ng-bootstrap.github.io/#/components/datepicker/overview#date-model) and
41
+ * [Timepicker](https://ng-bootstrap.github.io/#/components/timepicker/examples#adapter) components when working with input values.
42
+ * This means that `date` values will be [NgbDateStruct](https://ng-bootstrap.github.io/#/components/datepicker/api#NgbDateStruct)
43
+ * objects and `time` values will be [NgbTimeStruct](https://ng-bootstrap.github.io/#/components/timepicker/api#NgbTimeStruct) objects
44
+ * by default, and the [NgbDateAdapter](https://ng-bootstrap.github.io/#/components/datepicker/api#NgbDateAdapter) and
45
+ * [NgbTimeAdapter](https://ng-bootstrap.github.io/#/components/timepicker/api#NgbTimeAdapter) services will be used to handle them respectively.
46
+ * If usage of alternative date and time models is desired, consult NG-Bootstrap's documentation for directions.
47
+ */
48
+ export class DatetimePickerComponent extends _DatetimePickerComponentBase {
49
+ /**
50
+ * The earliest allowable date for display or selection.
51
+ *
52
+ * @default { year: 1900, month: 1, day: 1 }
53
+ */
54
+ get minDate() {
55
+ return { ...this._minDate };
56
+ }
57
+ set minDate(value) {
58
+ this._minDate = value || DEFAULT_MIN_DATE;
59
+ }
60
+ /**
61
+ * The latest allowable date for display or selection.
62
+ *
63
+ * @default { year: 2099, month: 12, day: 31 }
64
+ */
65
+ get maxDate() {
66
+ return { ...this._maxDate };
67
+ }
68
+ set maxDate(value) {
69
+ this._maxDate = value || DEFAULT_MAX_DATE;
70
+ }
71
+ /**
72
+ * Configurable options for setting the layout of the date and time controls within the component.
73
+ */
74
+ get timeLayout() {
75
+ return { ...this._timeLayout };
76
+ }
77
+ set timeLayout(value) {
78
+ this._timeLayout = {
79
+ ...DEFAULT_TIME_LAYOUT,
80
+ ...value
81
+ };
82
+ }
83
+ constructor(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
84
+ super(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl);
85
+ this._changeDetector = inject(ChangeDetectorRef);
86
+ this._destroyRef = inject(DestroyRef);
87
+ this._hostElement = inject(ElementRef);
88
+ this._ngbDateAdapter = inject((NgbDateAdapter));
89
+ this._uid = `impdc-datetime-picker-${nanoid()}`;
90
+ this.NgTranslationWidth = TranslationWidth;
91
+ this.formGroup = inject(FormBuilder).group({
92
+ date: new FormControl(null),
93
+ time: new FormControl(null),
94
+ useMeridian: new FormControl(true, { nonNullable: true })
95
+ });
96
+ this.cvaOnChange = (_) => { };
97
+ this.cvaOnTouched = () => { };
98
+ this._minDate = DEFAULT_MIN_DATE;
99
+ this._maxDate = DEFAULT_MAX_DATE;
100
+ this._timeLayout = { ...DEFAULT_TIME_LAYOUT };
101
+ /**
102
+ * Label to be displayed with time controls to allow the user to input 24-hour or meridian-based (AM, PM) time.
103
+ */
104
+ this.meridianToggleLabel = DEFAULT_USE_MERIDIAN_LABEL;
105
+ /**
106
+ * Set whether to display controls for selecting a time value in addition to the date.
107
+ */
108
+ this.withTime = false;
109
+ /**
110
+ * Events fire when raw value of picker input changes. Mainly exists to handle
111
+ * two-way binding of `value` input property.
112
+ * @ignore
113
+ */
114
+ this.valueChange = new EventEmitter();
115
+ /** @ignore */
116
+ this.blur = new EventEmitter();
117
+ this._focused = false;
118
+ this.controlType = 'impdc-datetime-picker';
119
+ this.supportsAffixes = false;
120
+ this.markDateDisabledFn = (date, current) => {
121
+ return (this._dateIsOutsideCurrentMonth(date, current) ||
122
+ (!!this.markDateDisabled && this.markDateDisabled(date, current)));
123
+ };
124
+ if (this.ngControl) {
125
+ this.ngControl.valueAccessor = this;
126
+ }
127
+ this.id = this.id;
128
+ }
129
+ /** @ignore */
130
+ focus() {
131
+ this.ngbDatepicker.focus();
132
+ }
133
+ /* Lifecycle Hooks */
134
+ /** @ignore */
135
+ ngDoCheck() {
136
+ const ngControl = this.ngControl;
137
+ if (!ngControl) {
138
+ return;
139
+ }
140
+ if (this._previousControl !== ngControl.control) {
141
+ if (this._previousControl !== undefined &&
142
+ ngControl.disabled !== null &&
143
+ ngControl.disabled !== this.disabled) {
144
+ this.disabled = ngControl?.disabled;
145
+ }
146
+ this._previousControl = ngControl.control;
147
+ }
148
+ this.updateErrorState();
149
+ }
150
+ /** @ignore */
151
+ ngOnChanges(changes) {
152
+ // Managing disabled state is handled via the `mixinDisabled` mixin/generator, but we still need to signal
153
+ // to the parent form field so it can run change detection when disabled state is changed.
154
+ if (changes['disabled']) {
155
+ this.stateChanges.next();
156
+ }
157
+ }
158
+ /** @ignore */
159
+ ngOnDestroy() {
160
+ this.stateChanges.complete();
161
+ }
162
+ /** @ignore */
163
+ ngOnInit() {
164
+ this.formGroup.valueChanges
165
+ .pipe(takeUntilDestroyed(this._destroyRef), debounceTime(100))
166
+ .subscribe(formValue => {
167
+ const changeValue = this._getValueFromFormModel(formValue);
168
+ this.cvaOnChange(changeValue);
169
+ this.valueChange.emit(changeValue);
170
+ this.cvaOnTouched();
171
+ });
172
+ }
173
+ /* ControlValueAccessor */
174
+ /** @ignore */
175
+ writeValue(obj) {
176
+ let newValue = {};
177
+ if (obj && 'date' in obj) {
178
+ newValue = {
179
+ ...newValue,
180
+ date: obj.date
181
+ };
182
+ }
183
+ if (this.withTime && obj && 'time' in obj) {
184
+ newValue = {
185
+ ...newValue,
186
+ time: obj.time
187
+ };
188
+ }
189
+ this.formGroup.patchValue(newValue, { emitEvent: false });
190
+ if ('date' in newValue) {
191
+ this.ngbDatepicker.focusDate(this._ngbDateAdapter.fromModel(newValue.date));
192
+ }
193
+ this.stateChanges.next();
194
+ }
195
+ /** @ignore */
196
+ registerOnChange(fn) {
197
+ this.cvaOnChange = fn;
198
+ }
199
+ /** @ignore */
200
+ registerOnTouched(fn) {
201
+ this.cvaOnTouched = fn;
202
+ }
203
+ /** @ignore */
204
+ setDisabledState(isDisabled) {
205
+ this.disabled = isDisabled;
206
+ if (isDisabled) {
207
+ this.formGroup.disable();
208
+ }
209
+ else {
210
+ this.formGroup.enable();
211
+ }
212
+ }
213
+ /* ImpdcFormFieldControl */
214
+ get value() {
215
+ return this._getValueFromFormModel(this.formGroup.value);
216
+ }
217
+ set value(value) {
218
+ this.writeValue(value);
219
+ }
220
+ get id() {
221
+ return this._id;
222
+ }
223
+ set id(value) {
224
+ this._id = value || this._uid;
225
+ this.stateChanges.next();
226
+ }
227
+ /**
228
+ * Used to set requiredness of control in a template-based manner;
229
+ * not necessary when using the Angular reactive forms API and `required` validator.
230
+ *
231
+ * @default false
232
+ */
233
+ get required() {
234
+ return (this._required ??
235
+ this.ngControl?.control?.hasValidator(Validators.required) ??
236
+ false);
237
+ }
238
+ set required(value) {
239
+ this._required = value;
240
+ this.stateChanges.next();
241
+ }
242
+ get focused() {
243
+ return this._focused;
244
+ }
245
+ /* Internals */
246
+ get useMeridian() {
247
+ return this.formGroup.getRawValue().useMeridian;
248
+ }
249
+ get useMeridianLabelText() {
250
+ return this.meridianToggleLabel?.trim() || DEFAULT_USE_MERIDIAN_LABEL;
251
+ }
252
+ handleFocusOut(evt) {
253
+ if (!evt.relatedTarget ||
254
+ !this._hostElement.nativeElement.contains(evt.relatedTarget)) {
255
+ this._onBlur(evt);
256
+ }
257
+ }
258
+ _getValueFromFormModel(formValue) {
259
+ if (!formValue.date && !formValue.time) {
260
+ return null;
261
+ }
262
+ let result = {
263
+ date: formValue.date
264
+ };
265
+ if (this.withTime) {
266
+ result = {
267
+ ...result,
268
+ time: formValue.time
269
+ };
270
+ }
271
+ return result;
272
+ }
273
+ _dateIsOutsideCurrentMonth(date, current) {
274
+ return !!current && date.month !== current.month;
275
+ }
276
+ _onFocus() {
277
+ if (!this.disabled) {
278
+ this._focused = true;
279
+ this.stateChanges.next();
280
+ }
281
+ }
282
+ _onBlur(focusEvent) {
283
+ this._focused = false;
284
+ if (!this.disabled) {
285
+ this.cvaOnTouched();
286
+ this.blur.emit(focusEvent);
287
+ this._changeDetector.markForCheck();
288
+ this.stateChanges.next();
289
+ }
290
+ }
291
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: DatetimePickerComponent, deps: [{ token: i1.ErrorStateMatcher }, { token: IMPDC_FORM_ROOT, optional: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
292
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.1", type: DatetimePickerComponent, isStandalone: true, selector: "impdc-datetime-picker", inputs: { disabled: "disabled", tabIndex: "tabIndex", markDateDisabled: "markDateDisabled", minDate: "minDate", maxDate: "maxDate", timeLayout: "timeLayout", meridianToggleLabel: "meridianToggleLabel", withTime: "withTime", errorStateMatcher: "errorStateMatcher", value: "value", id: "id", required: ["required", "required", booleanAttribute] }, outputs: { valueChange: "valueChange", blur: "blur" }, host: { listeners: { "focus": "_onFocus(); focus()" }, properties: { "attr.id": "id", "attr.tabindex": "tabIndex", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.is-invalid": "errorState", "class.impdc-form-field-control": "true", "class.impdc-datetime-picker--required": "required", "class.impdc-datetime-picker--disabled": "disabled", "class.impdc-datetime-picker--invalid": "errorState", "class.impdc-datetime-picker--empty": "empty" } }, providers: [
293
+ {
294
+ provide: ImpdcFormFieldControl,
295
+ useExisting: DatetimePickerComponent
296
+ }
297
+ ], viewQueries: [{ propertyName: "ngbDatepicker", first: true, predicate: NgbDatepicker, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<impdc-datepicker-template-host #templateHost></impdc-datepicker-template-host>\n<div\n [formGroup]=\"formGroup\"\n class=\"d-flex\"\n [ngClass]=\"{\n 'flex-column': withTime && timeLayout.layout === 'stacked'\n }\"\n (focusout)=\"handleFocusOut($event)\">\n <ngb-datepicker\n class=\"impdc-datetime-picker--datepicker\"\n formControlName=\"date\"\n [dayTemplate]=\"templateHost.dayTemplateRef\"\n [contentTemplate]=\"templateHost.contentTemplateRef\"\n [showWeekNumbers]=\"false\"\n outsideDays=\"visible\"\n [weekdays]=\"NgTranslationWidth.Abbreviated\"\n [markDisabled]=\"markDateDisabledFn\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\" />\n @if (withTime) {\n <div\n class=\"impdc-datetime-picker--timepicker d-flex flex-column gap-4 p-4 w-100\"\n [ngClass]=\"{\n 'border-0': !timeLayout.border,\n 'border-gray-200': timeLayout.border,\n 'mt-2': timeLayout.layout === 'stacked',\n 'border-top': timeLayout.border && timeLayout.layout === 'stacked',\n 'ms-2': timeLayout.layout === 'inline',\n 'border-start': timeLayout.border && timeLayout.layout === 'inline'\n }\">\n <impdc-checkbox\n [label]=\"useMeridianLabelText\"\n formControlName=\"useMeridian\"\n [isSwitch]=\"true\"\n layout=\"check-end\" />\n <ngb-timepicker\n formControlName=\"time\"\n [meridian]=\"useMeridian\"\n [seconds]=\"false\"\n [spinners]=\"false\"\n size=\"medium\"></ngb-timepicker>\n </div>\n }\n</div>\n", styles: [":host{display:block}ngb-datepicker{border:0}ngb-timepicker{font-size:var(--impd-font-size-sm)}::ng-deep .ngb-dp-header{display:none}::ng-deep .ngb-tp-spacer{width:var(--impd-size-4)}.impdc-datetime-picker--datepicker,.impdc-datetime-picker--timepicker{max-width:312px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "component", type: i4.NgbDatepicker, selector: "ngb-datepicker", inputs: ["contentTemplate", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "maxDate", "minDate", "navigation", "outsideDays", "showWeekNumbers", "startDate", "weekdays"], outputs: ["navigate", "dateSelect"], exportAs: ["ngbDatepicker"] }, { kind: "ngmodule", type: NgbTimepickerModule }, { kind: "component", type: i4.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "component", type: DatepickerTemplateHostComponent, selector: "impdc-datepicker-template-host" }, { kind: "ngmodule", type: ImpdcFormsModule }, { kind: "directive", type: i5.RootFormGroupDirective, selector: "[formGroup]" }, { kind: "component", type: i6.CheckboxComponent, selector: "impdc-checkbox", inputs: ["tabIndex", "id", "label", "description", "isSwitch", "switchIcons", "inline", "layout", "checked", "indeterminate", "disabled", "errorStateMatcher", "required"], outputs: ["change", "indeterminateChange"], exportAs: ["impdcCheckControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
298
+ }
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: DatetimePickerComponent, decorators: [{
300
+ type: Component,
301
+ args: [{ selector: 'impdc-datetime-picker', standalone: true, imports: [
302
+ CommonModule,
303
+ ReactiveFormsModule,
304
+ NgbDatepickerModule,
305
+ NgbTimepickerModule,
306
+ DatepickerTemplateHostComponent,
307
+ DatetimePickerInputFooterComponent,
308
+ ImpdcFormsModule
309
+ ], changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['disabled', 'tabIndex'], host: {
310
+ '[attr.id]': 'id',
311
+ '[attr.tabindex]': 'tabIndex',
312
+ '[attr.aria-required]': 'required.toString()',
313
+ '[attr.aria-disabled]': 'disabled.toString()',
314
+ '[attr.aria-invalid]': 'errorState',
315
+ '[class.is-invalid]': 'errorState',
316
+ '[class.impdc-form-field-control]': 'true',
317
+ '[class.impdc-datetime-picker--required]': 'required',
318
+ '[class.impdc-datetime-picker--disabled]': 'disabled',
319
+ '[class.impdc-datetime-picker--invalid]': 'errorState',
320
+ '[class.impdc-datetime-picker--empty]': 'empty',
321
+ '(focus)': '_onFocus(); focus()'
322
+ }, providers: [
323
+ {
324
+ provide: ImpdcFormFieldControl,
325
+ useExisting: DatetimePickerComponent
326
+ }
327
+ ], template: "<impdc-datepicker-template-host #templateHost></impdc-datepicker-template-host>\n<div\n [formGroup]=\"formGroup\"\n class=\"d-flex\"\n [ngClass]=\"{\n 'flex-column': withTime && timeLayout.layout === 'stacked'\n }\"\n (focusout)=\"handleFocusOut($event)\">\n <ngb-datepicker\n class=\"impdc-datetime-picker--datepicker\"\n formControlName=\"date\"\n [dayTemplate]=\"templateHost.dayTemplateRef\"\n [contentTemplate]=\"templateHost.contentTemplateRef\"\n [showWeekNumbers]=\"false\"\n outsideDays=\"visible\"\n [weekdays]=\"NgTranslationWidth.Abbreviated\"\n [markDisabled]=\"markDateDisabledFn\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\" />\n @if (withTime) {\n <div\n class=\"impdc-datetime-picker--timepicker d-flex flex-column gap-4 p-4 w-100\"\n [ngClass]=\"{\n 'border-0': !timeLayout.border,\n 'border-gray-200': timeLayout.border,\n 'mt-2': timeLayout.layout === 'stacked',\n 'border-top': timeLayout.border && timeLayout.layout === 'stacked',\n 'ms-2': timeLayout.layout === 'inline',\n 'border-start': timeLayout.border && timeLayout.layout === 'inline'\n }\">\n <impdc-checkbox\n [label]=\"useMeridianLabelText\"\n formControlName=\"useMeridian\"\n [isSwitch]=\"true\"\n layout=\"check-end\" />\n <ngb-timepicker\n formControlName=\"time\"\n [meridian]=\"useMeridian\"\n [seconds]=\"false\"\n [spinners]=\"false\"\n size=\"medium\"></ngb-timepicker>\n </div>\n }\n</div>\n", styles: [":host{display:block}ngb-datepicker{border:0}ngb-timepicker{font-size:var(--impd-font-size-sm)}::ng-deep .ngb-dp-header{display:none}::ng-deep .ngb-tp-spacer{width:var(--impd-size-4)}.impdc-datetime-picker--datepicker,.impdc-datetime-picker--timepicker{max-width:312px}\n"] }]
328
+ }], ctorParameters: () => [{ type: i1.ErrorStateMatcher }, { type: undefined, decorators: [{
329
+ type: Optional
330
+ }, {
331
+ type: Inject,
332
+ args: [IMPDC_FORM_ROOT]
333
+ }] }, { type: i2.NgForm, decorators: [{
334
+ type: Optional
335
+ }] }, { type: i2.FormGroupDirective, decorators: [{
336
+ type: Optional
337
+ }] }, { type: i2.NgControl, decorators: [{
338
+ type: Self
339
+ }, {
340
+ type: Optional
341
+ }] }], propDecorators: { ngbDatepicker: [{
342
+ type: ViewChild,
343
+ args: [NgbDatepicker, { static: true }]
344
+ }], markDateDisabled: [{
345
+ type: Input
346
+ }], minDate: [{
347
+ type: Input
348
+ }], maxDate: [{
349
+ type: Input
350
+ }], timeLayout: [{
351
+ type: Input
352
+ }], meridianToggleLabel: [{
353
+ type: Input
354
+ }], withTime: [{
355
+ type: Input
356
+ }], errorStateMatcher: [{
357
+ type: Input
358
+ }], valueChange: [{
359
+ type: Output
360
+ }], blur: [{
361
+ type: Output
362
+ }], value: [{
363
+ type: Input
364
+ }], id: [{
365
+ type: Input
366
+ }], required: [{
367
+ type: Input,
368
+ args: [{ transform: booleanAttribute }]
369
+ }] } });
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZGF0ZXRpbWUtcGlja2VyL2NvbXBvbmVudHMvZGF0ZXRpbWUtcGlja2VyL2RhdGV0aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL2RhdGV0aW1lLXBpY2tlci9jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlci9kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFFVixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosU0FBUyxFQUNULGdCQUFnQixFQUNoQixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHTCxXQUFXLEVBQ1gsV0FBVyxFQUlYLG1CQUFtQixFQUNuQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsY0FBYyxFQUVkLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3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LHNCQUFzQixFQUFFLHFCQUFxQjt3QkFDN0MscUJBQXFCLEVBQUUsWUFBWTt3QkFDbkMsb0JBQW9CLEVBQUUsWUFBWTt3QkFDbEMsa0NBQWtDLEVBQUUsTUFBTTt3QkFDMUMseUNBQXlDLEVBQUUsVUFBVTt3QkFDckQseUNBQXlDLEVBQUUsVUFBVTt3QkFDckQsd0NBQXdDLEVBQUUsWUFBWTt3QkFDdEQsc0NBQXNDLEVBQUUsT0FBTzt3QkFDL0MsU0FBUyxFQUFFLHFCQUFxQjtxQkFDakMsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUscUJBQXFCOzRCQUM5QixXQUFXLHlCQUF5Qjt5QkFDckM7cUJBQ0Y7OzBCQTBIRSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGVBQWU7OzBCQUNsQyxRQUFROzswQkFDUixRQUFROzswQkFDUixJQUFJOzswQkFBSSxRQUFRO3lDQTlGVCxhQUFhO3NCQUR0QixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBV25DLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFZSyxPQUFPO3NCQURqQixLQUFLO2dCQWVLLE9BQU87c0JBRGpCLEtBQUs7Z0JBYUssVUFBVTtzQkFEcEIsS0FBSztnQkFnQkMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQU9DLFFBQVE7c0JBRGQsS0FBSztnQkFJVSxpQkFBaUI7c0JBRGhDLEtBQUs7Z0JBU1UsV0FBVztzQkFEMUIsTUFBTTtnQkFTUyxJQUFJO3NCQUZuQixNQUFNO2dCQXVJSSxLQUFLO3NCQURmLEtBQUs7Z0JBU0ssRUFBRTtzQkFEWixLQUFLO2dCQWlCSyxRQUFRO3NCQURsQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2VsZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIFRyYW5zbGF0aW9uV2lkdGggfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5nQ29udHJvbCxcbiAgTmdGb3JtLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE5nYkRhdGVBZGFwdGVyLFxuICBOZ2JEYXRlU3RydWN0LFxuICBOZ2JEYXRlcGlja2VyLFxuICBOZ2JEYXRlcGlja2VyTW9kdWxlLFxuICBOZ2JUaW1lcGlja2VyTW9kdWxlXG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgRXJyb3JTdGF0ZU1hdGNoZXIsXG4gIElDYW5VcGRhdGVFcnJvclN0YXRlLFxuICBJSGFzRXJyb3JTdGF0ZSxcbiAgSU1QRENfRk9STV9ST09ULFxuICBJbXBkY0Zvcm1GaWVsZENvbnRyb2wsXG4gIEltcGRjRm9ybVJvb3QsXG4gIEltcGRjRm9ybXNNb2R1bGUsXG4gIG1peGluRGlzYWJsZWQsXG4gIG1peGluRXJyb3JTdGF0ZSxcbiAgbWl4aW5UYWJJbmRleFxufSBmcm9tICcuLi8uLi8uLi9mb3JtLWZpZWxkJztcbmltcG9ydCB7XG4gIERFRkFVTFRfTUFYX0RBVEUsXG4gIERFRkFVTFRfTUlOX0RBVEUsXG4gIERFRkFVTFRfVVNFX01FUklESUFOX0xBQkVMXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJRGF0ZXRpbWVQaWNrZXJWYWx1ZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IERhdGVwaWNrZXJUZW1wbGF0ZUhvc3RDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlcGlja2VyLXRlbXBsYXRlLWhvc3QnO1xuaW1wb3J0IHsgRGF0ZXRpbWVQaWNrZXJJbnB1dEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGV0aW1lLXBpY2tlci1pbnB1dC1mb290ZXInO1xuXG5pbnRlcmZhY2UgSVRpbWVPcHRpb25zIHtcbiAgcmVhZG9ubHkgYm9yZGVyOiBib29sZWFuO1xuICByZWFkb25seSBsYXlvdXQ6ICdpbmxpbmUnIHwgJ3N0YWNrZWQnO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9USU1FX0xBWU9VVDogSVRpbWVPcHRpb25zID0ge1xuICBib3JkZXI6IGZhbHNlLFxuICBsYXlvdXQ6ICdpbmxpbmUnXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRCYXNlID0gbWl4aW5UYWJJbmRleChcbiAgbWl4aW5EaXNhYmxlZChcbiAgICBtaXhpbkVycm9yU3RhdGUoXG4gICAgICBjbGFzcyB7XG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgIHB1YmxpYyBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICAgICAgICBwdWJsaWMgX2Zvcm1Sb290OiBJbXBkY0Zvcm1Sb290LFxuICAgICAgICAgIHB1YmxpYyBfcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgICAgICAgIHB1YmxpYyBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgICAgICAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbFxuICAgICAgICApIHt9XG4gICAgICB9XG4gICAgKVxuICApXG4pO1xuXG4vKipcbiAqIEEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGRhdGUgb3IgZGF0ZXRpbWUgdmlhIGFuIGlubGluZSBjYWxlbmRhciBjb250cm9sLlxuICpcbiAqIEltcGxlbWVudHMgW0NvbnRyb2xWYWx1ZUFjY2Vzc29yXShodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0NvbnRyb2xWYWx1ZUFjY2Vzc29yKSB0byBzdXBwb3J0IHR3by13YXkgYmluZGluZyB3aXRoXG4gKiBBbmd1bGFyIGZvcm1zIHZpYSB1c2FnZSBvZiB0aGUgXFxgWyhuZ01vZGVsKV1cXGAsIFxcYFtmb3JtQ29udHJvbF1cXGAsIGFuZCBcXGBbZm9ybUNvbnRyb2xOYW1lXVxcYCBkaXJlY3RpdmVzLlxuICpcbiAqIFRoZSBkYXRlIGFuZCB0aW1lIGNvbnRyb2xzIGluc2lkZSB0aGlzIGNvbXBvbmVudCBsZXZlcmFnZSB0aGUgdmFsdWUgYWRhcHRlciBwYXR0ZXJucyBhbmQgc2VydmljZXMgb2YgTkctQm9vdHN0cmFwJ3NcbiAqIFtEYXRlcGlja2VyXShodHRwczovL25nLWJvb3RzdHJhcC5naXRodWIuaW8vIy9jb21wb25lbnRzL2RhdGVwaWNrZXIvb3ZlcnZpZXcjZGF0ZS1tb2RlbCkgYW5kXG4gKiBbVGltZXBpY2tlcl0oaHR0cHM6Ly9uZy1ib290c3RyYXAuZ2l0aHViLmlvLyMvY29tcG9uZW50cy90aW1lcGlja2VyL2V4YW1wbGVzI2FkYXB0ZXIpIGNvbXBvbmVudHMgd2hlbiB3b3JraW5nIHdpdGggaW5wdXQgdmFsdWVzLlxuICogVGhpcyBtZWFucyB0aGF0IGBkYXRlYCB2YWx1ZXMgd2lsbCBiZSBbTmdiRGF0ZVN0cnVjdF0oaHR0cHM6Ly9uZy1ib290c3RyYXAuZ2l0aHViLmlvLyMvY29tcG9uZW50cy9kYXRlcGlja2VyL2FwaSNOZ2JEYXRlU3RydWN0KVxuICogb2JqZWN0cyBhbmQgYHRpbWVgIHZhbHVlcyB3aWxsIGJlIFtOZ2JUaW1lU3RydWN0XShodHRwczovL25nLWJvb3RzdHJhcC5naXRodWIuaW8vIy9jb21wb25lbnRzL3RpbWVwaWNrZXIvYXBpI05nYlRpbWVTdHJ1Y3QpIG9iamVjdHNcbiAqIGJ5IGRlZmF1bHQsIGFuZCB0aGUgW05nYkRhdGVBZGFwdGVyXShodHRwczovL25nLWJvb3RzdHJhcC5naXRodWIuaW8vIy9jb21wb25lbnRzL2RhdGVwaWNrZXIvYXBpI05nYkRhdGVBZGFwdGVyKSBhbmRcbiAqIFtOZ2JUaW1lQWRhcHRlcl0oaHR0cHM6Ly9uZy1ib290c3RyYXAuZ2l0aHViLmlvLyMvY29tcG9uZW50cy90aW1lcGlja2VyL2FwaSNOZ2JUaW1lQWRhcHRlcikgc2VydmljZXMgd2lsbCBiZSB1c2VkIHRvIGhhbmRsZSB0aGVtIHJlc3BlY3RpdmVseS5cbiAqIElmIHVzYWdlIG9mIGFsdGVybmF0aXZlIGRhdGUgYW5kIHRpbWUgbW9kZWxzIGlzIGRlc2lyZWQsIGNvbnN1bHQgTkctQm9vdHN0cmFwJ3MgZG9jdW1lbnRhdGlvbiBmb3IgZGlyZWN0aW9ucy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1wZGMtZGF0ZXRpbWUtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nYkRhdGVwaWNrZXJNb2R1bGUsXG4gICAgTmdiVGltZXBpY2tlck1vZHVsZSxcbiAgICBEYXRlcGlja2VyVGVtcGxhdGVIb3N0Q29tcG9uZW50LFxuICAgIERhdGV0aW1lUGlja2VySW5wdXRGb290ZXJDb21wb25lbnQsXG4gICAgSW1wZGNGb3Jtc01vZHVsZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0cy1tZXRhZGF0YS1wcm9wZXJ0eVxuICBpbnB1dHM6IFsnZGlzYWJsZWQnLCAndGFiSW5kZXgnXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1ob3N0LW1ldGFkYXRhLXByb3BlcnR5XG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ3RhYkluZGV4JyxcbiAgICAnW2F0dHIuYXJpYS1yZXF1aXJlZF0nOiAncmVxdWlyZWQudG9TdHJpbmcoKScsXG4gICAgJ1thdHRyLmFyaWEtZGlzYWJsZWRdJzogJ2Rpc2FibGVkLnRvU3RyaW5nKCknLFxuICAgICdbYXR0ci5hcmlhLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbY2xhc3MuaXMtaW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5pbXBkYy1mb3JtLWZpZWxkLWNvbnRyb2xdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuaW1wZGMtZGF0ZXRpbWUtcGlja2VyLS1yZXF1aXJlZF0nOiAncmVxdWlyZWQnLFxuICAgICdbY2xhc3MuaW1wZGMtZGF0ZXRpbWUtcGlja2VyLS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdbY2xhc3MuaW1wZGMtZGF0ZXRpbWUtcGlja2VyLS1pbnZhbGlkXSc6ICdlcnJvclN0YXRlJyxcbiAgICAnW2NsYXNzLmltcGRjLWRhdGV0aW1lLXBpY2tlci0tZW1wdHldJzogJ2VtcHR5JyxcbiAgICAnKGZvY3VzKSc6ICdfb25Gb2N1cygpOyBmb2N1cygpJ1xuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBJbXBkY0Zvcm1GaWVsZENvbnRyb2wsXG4gICAgICB1c2VFeGlzdGluZzogRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRcbiAgZXh0ZW5kcyBfRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRCYXNlXG4gIGltcGxlbWVudHNcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBEb0NoZWNrLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIEltcGRjRm9ybUZpZWxkQ29udHJvbDxJRGF0ZXRpbWVQaWNrZXJWYWx1ZTxhbnksIGFueT4gfCBudWxsPixcbiAgICBJQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcbiAgICBJSGFzRXJyb3JTdGF0ZVxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3RFbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uZ2JEYXRlQWRhcHRlciA9IGluamVjdChOZ2JEYXRlQWRhcHRlcjxhbnk+KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdWlkID0gYGltcGRjLWRhdGV0aW1lLXBpY2tlci0ke25hbm9pZCgpfWA7XG4gIHByaXZhdGUgX3ByZXZpb3VzQ29udHJvbD86IEFic3RyYWN0Q29udHJvbCB8IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE5nVHJhbnNsYXRpb25XaWR0aCA9IFRyYW5zbGF0aW9uV2lkdGg7XG4gIHByb3RlY3RlZCByZWFkb25seSBmb3JtR3JvdXAgPSBpbmplY3QoRm9ybUJ1aWxkZXIpLmdyb3VwKHtcbiAgICBkYXRlOiBuZXcgRm9ybUNvbnRyb2w8YW55PihudWxsKSxcbiAgICB0aW1lOiBuZXcgRm9ybUNvbnRyb2w8YW55PihudWxsKSxcbiAgICB1c2VNZXJpZGlhbjogbmV3IEZvcm1Db250cm9sPGJvb2xlYW4+KHRydWUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSlcbiAgfSk7XG4gIHByb3RlY3RlZCBjdmFPbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuICBwcm90ZWN0ZWQgY3ZhT25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgQFZpZXdDaGlsZChOZ2JEYXRlcGlja2VyLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgbmdiRGF0ZXBpY2tlciE6IE5nYkRhdGVwaWNrZXI7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYW4gYmUgZXZhbHVhdGVkIHRvIGRlY2lkZSBpZiBhIGdpdmVuIGRhdGUgaXMgZGlzYWJsZWRcbiAgICogaW4gdGhlIGNhbGVuZGFyIHZpZXcuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRlIEFuIFtgTmdiRGF0ZWBdKGh0dHBzOi8vbmctYm9vdHN0cmFwLmdpdGh1Yi5pby8jL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9hcGkjTmdiRGF0ZSkgdmFsdWUgZGVzY3JpYmluZyB0aGUgc2luZ3VsYXIgZGF0ZSBiZWluZyBldmFsdWF0ZWQuXG4gICAqIEBwYXJhbSBjdXJyZW50IFRoZSBtb250aCBhbmQgeWVhciBzZWxlY3RlZCBmb3IgdGhlIGN1cnJlbnQgY2FsZW5kYXIgdmlldy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXJrRGF0ZURpc2FibGVkPzogKFxuICAgIGRhdGU6IE5nYkRhdGVTdHJ1Y3QsXG4gICAgY3VycmVudD86IHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH1cbiAgKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZWFybGllc3QgYWxsb3dhYmxlIGRhdGUgZm9yIGRpc3BsYXkgb3Igc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7IHllYXI6IDE5MDAsIG1vbnRoOiAxLCBkYXk6IDEgfVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBtaW5EYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX21pbkRhdGUgfTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbkRhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsKSB7XG4gICAgdGhpcy5fbWluRGF0ZSA9IHZhbHVlIHx8IERFRkFVTFRfTUlOX0RBVEU7XG4gIH1cbiAgcHJpdmF0ZSBfbWluRGF0ZTogTmdiRGF0ZVN0cnVjdCA9IERFRkFVTFRfTUlOX0RBVEU7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgYWxsb3dhYmxlIGRhdGUgZm9yIGRpc3BsYXkgb3Igc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7IHllYXI6IDIwOTksIG1vbnRoOiAxMiwgZGF5OiAzMSB9XG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IG1heERhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fbWF4RGF0ZSB9O1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4RGF0ZSh2YWx1ZTogTmdiRGF0ZVN0cnVjdCB8IG51bGwpIHtcbiAgICB0aGlzLl9tYXhEYXRlID0gdmFsdWUgfHwgREVGQVVMVF9NQVhfREFURTtcbiAgfVxuICBwcml2YXRlIF9tYXhEYXRlOiBOZ2JEYXRlU3RydWN0ID0gREVGQVVMVF9NQVhfREFURTtcblxuICAvKipcbiAgICogQ29uZmlndXJhYmxlIG9wdGlvbnMgZm9yIHNldHRpbmcgdGhlIGxheW91dCBvZiB0aGUgZGF0ZSBhbmQgdGltZSBjb250cm9scyB3aXRoaW4gdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgdGltZUxheW91dCgpOiBJVGltZU9wdGlvbnMge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RpbWVMYXlvdXQgfTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpbWVMYXlvdXQodmFsdWU6IFBhcnRpYWw8SVRpbWVPcHRpb25zPikge1xuICAgIHRoaXMuX3RpbWVMYXlvdXQgPSB7XG4gICAgICAuLi5ERUZBVUxUX1RJTUVfTEFZT1VULFxuICAgICAgLi4udmFsdWVcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgX3RpbWVMYXlvdXQ6IElUaW1lT3B0aW9ucyA9IHsgLi4uREVGQVVMVF9USU1FX0xBWU9VVCB9O1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byBiZSBkaXNwbGF5ZWQgd2l0aCB0aW1lIGNvbnRyb2xzIHRvIGFsbG93IHRoZSB1c2VyIHRvIGlucHV0IDI0LWhvdXIgb3IgbWVyaWRpYW4tYmFzZWQgKEFNLCBQTSkgdGltZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXJpZGlhblRvZ2dsZUxhYmVsOiBzdHJpbmcgPSBERUZBVUxUX1VTRV9NRVJJRElBTl9MQUJFTDtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBjb250cm9scyBmb3Igc2VsZWN0aW5nIGEgdGltZSB2YWx1ZSBpbiBhZGRpdGlvbiB0byB0aGUgZGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aXRoVGltZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBlcnJvclN0YXRlTWF0Y2hlciE6IEVycm9yU3RhdGVNYXRjaGVyO1xuXG4gIC8qKlxuICAgKiBFdmVudHMgZmlyZSB3aGVuIHJhdyB2YWx1ZSBvZiBwaWNrZXIgaW5wdXQgY2hhbmdlcy4gTWFpbmx5IGV4aXN0cyB0byBoYW5kbGVcbiAgICogdHdvLXdheSBiaW5kaW5nIG9mIGB2YWx1ZWAgaW5wdXQgcHJvcGVydHkuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJRGF0ZXRpbWVQaWNrZXJWYWx1ZTxcbiAgICBhbnksXG4gICAgYW55XG4gID4gfCBudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8SURhdGV0aW1lUGlja2VyVmFsdWU8YW55LCBhbnk+IHwgbnVsbD4oKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBAT3V0cHV0KClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIHB1YmxpYyByZWFkb25seSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSU1QRENfRk9STV9ST09UKSBfZm9ybVJvb3Q6IEltcGRjRm9ybVJvb3QsXG4gICAgQE9wdGlvbmFsKCkgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w6IE5nQ29udHJvbFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICBfZm9ybVJvb3QsXG4gICAgICBfcGFyZW50Rm9ybSxcbiAgICAgIF9wYXJlbnRGb3JtR3JvdXAsXG4gICAgICBuZ0NvbnRyb2xcbiAgICApO1xuXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmlkID0gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLm5nYkRhdGVwaWNrZXIuZm9jdXMoKTtcbiAgfVxuXG4gIC8qIExpZmVjeWNsZSBIb29rcyAqL1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgY29uc3QgbmdDb250cm9sID0gdGhpcy5uZ0NvbnRyb2w7XG5cbiAgICBpZiAoIW5nQ29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wcmV2aW91c0NvbnRyb2wgIT09IG5nQ29udHJvbC5jb250cm9sKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzQ29udHJvbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIG5nQ29udHJvbC5kaXNhYmxlZCAhPT0gbnVsbCAmJlxuICAgICAgICBuZ0NvbnRyb2wuZGlzYWJsZWQgIT09IHRoaXMuZGlzYWJsZWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gbmdDb250cm9sPy5kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJldmlvdXNDb250cm9sID0gbmdDb250cm9sLmNvbnRyb2w7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVFcnJvclN0YXRlKCk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIE1hbmFnaW5nIGRpc2FibGVkIHN0YXRlIGlzIGhhbmRsZWQgdmlhIHRoZSBgbWl4aW5EaXNhYmxlZGAgbWl4aW4vZ2VuZXJhdG9yLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzaWduYWxcbiAgICAvLyB0byB0aGUgcGFyZW50IGZvcm0gZmllbGQgc28gaXQgY2FuIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHdoZW4gZGlzYWJsZWQgc3RhdGUgaXMgY2hhbmdlZC5cbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSkge1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLCBkZWJvdW5jZVRpbWUoMTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoZm9ybVZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlVmFsdWUgPSB0aGlzLl9nZXRWYWx1ZUZyb21Gb3JtTW9kZWwoZm9ybVZhbHVlKTtcbiAgICAgICAgdGhpcy5jdmFPbkNoYW5nZShjaGFuZ2VWYWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjaGFuZ2VWYWx1ZSk7XG4gICAgICAgIHRoaXMuY3ZhT25Ub3VjaGVkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qIENvbnRyb2xWYWx1ZUFjY2Vzc29yICovXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBJRGF0ZXRpbWVQaWNrZXJWYWx1ZTxhbnksIGFueT4gfCBhbnkpOiB2b2lkIHtcbiAgICBsZXQgbmV3VmFsdWU6IFBhcnRpYWw8SURhdGV0aW1lUGlja2VyVmFsdWU+ID0ge307XG4gICAgaWYgKG9iaiAmJiAnZGF0ZScgaW4gb2JqKSB7XG4gICAgICBuZXdWYWx1ZSA9IHtcbiAgICAgICAgLi4ubmV3VmFsdWUsXG4gICAgICAgIGRhdGU6IG9iai5kYXRlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpdGhUaW1lICYmIG9iaiAmJiAndGltZScgaW4gb2JqKSB7XG4gICAgICBuZXdWYWx1ZSA9IHtcbiAgICAgICAgLi4ubmV3VmFsdWUsXG4gICAgICAgIHRpbWU6IG9iai50aW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUobmV3VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAoJ2RhdGUnIGluIG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLm5nYkRhdGVwaWNrZXIuZm9jdXNEYXRlKFxuICAgICAgICB0aGlzLl9uZ2JEYXRlQWRhcHRlci5mcm9tTW9kZWwobmV3VmFsdWUuZGF0ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY3ZhT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jdmFPblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG5cbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiBJbXBkY0Zvcm1GaWVsZENvbnRyb2wgKi9cblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IElEYXRldGltZVBpY2tlclZhbHVlPGFueSwgYW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9nZXRWYWx1ZUZyb21Gb3JtTW9kZWwodGhpcy5mb3JtR3JvdXAudmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IElEYXRldGltZVBpY2tlclZhbHVlPGFueSwgYW55PiB8IG51bGwpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlIHx8IHRoaXMuX3VpZDtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9pZCE6IHN0cmluZztcblxuICAvKipcbiAgICogVXNlZCB0byBzZXQgcmVxdWlyZWRuZXNzIG9mIGNvbnRyb2wgaW4gYSB0ZW1wbGF0ZS1iYXNlZCBtYW5uZXI7XG4gICAqIG5vdCBuZWNlc3Nhcnkgd2hlbiB1c2luZyB0aGUgQW5ndWxhciByZWFjdGl2ZSBmb3JtcyBBUEkgYW5kIGByZXF1aXJlZGAgdmFsaWRhdG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3JlcXVpcmVkID8/XG4gICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpID8/XG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZDtcbiAgfVxuICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udHJvbFR5cGU6IHN0cmluZyA9ICdpbXBkYy1kYXRldGltZS1waWNrZXInO1xuICBwdWJsaWMgcmVhZG9ubHkgc3VwcG9ydHNBZmZpeGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyogSW50ZXJuYWxzICovXG5cbiAgcHJvdGVjdGVkIGdldCB1c2VNZXJpZGlhbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKS51c2VNZXJpZGlhbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdXNlTWVyaWRpYW5MYWJlbFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXJpZGlhblRvZ2dsZUxhYmVsPy50cmltKCkgfHwgREVGQVVMVF9VU0VfTUVSSURJQU5fTEFCRUw7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRm9jdXNPdXQoZXZ0OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWV2dC5yZWxhdGVkVGFyZ2V0IHx8XG4gICAgICAhdGhpcy5faG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhldnQucmVsYXRlZFRhcmdldClcbiAgICApIHtcbiAgICAgIHRoaXMuX29uQmx1cihldnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFZhbHVlRnJvbUZvcm1Nb2RlbChcbiAgICBmb3JtVmFsdWU6IFBhcnRpYWw8eyBkYXRlOiBhbnk7IHRpbWU6IGFueTsgdXNlTWVyaWRpYW46IGFueSB9PlxuICApOiBJRGF0ZXRpbWVQaWNrZXJWYWx1ZTxhbnksIGFueT4gfCBudWxsIHtcbiAgICBpZiAoIWZvcm1WYWx1ZS5kYXRlICYmICFmb3JtVmFsdWUudGltZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogSURhdGV0aW1lUGlja2VyVmFsdWU8YW55LCBhbnk+ID0ge1xuICAgICAgZGF0ZTogZm9ybVZhbHVlLmRhdGVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMud2l0aFRpbWUpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICB0aW1lOiBmb3JtVmFsdWUudGltZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZGF0ZUlzT3V0c2lkZUN1cnJlbnRNb250aChcbiAgICBkYXRlOiBOZ2JEYXRlU3RydWN0LFxuICAgIGN1cnJlbnQ/OiB7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWN1cnJlbnQgJiYgZGF0ZS5tb250aCAhPT0gY3VycmVudC5tb250aDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBtYXJrRGF0ZURpc2FibGVkRm4gPSAoXG4gICAgZGF0ZTogTmdiRGF0ZVN0cnVjdCxcbiAgICBjdXJyZW50PzogeyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfVxuICApID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZGF0ZUlzT3V0c2lkZUN1cnJlbnRNb250aChkYXRlLCBjdXJyZW50KSB8fFxuICAgICAgKCEhdGhpcy5tYXJrRGF0ZURpc2FibGVkICYmIHRoaXMubWFya0RhdGVEaXNhYmxlZChkYXRlLCBjdXJyZW50KSlcbiAgICApO1xuICB9O1xuXG4gIHByb3RlY3RlZCBfb25Gb2N1cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX2ZvY3VzZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfb25CbHVyKGZvY3VzRXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY3ZhT25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLmJsdXIuZW1pdChmb2N1c0V2ZW50KTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGltcGRjLWRhdGVwaWNrZXItdGVtcGxhdGUtaG9zdCAjdGVtcGxhdGVIb3N0PjwvaW1wZGMtZGF0ZXBpY2tlci10ZW1wbGF0ZS1ob3N0PlxuPGRpdlxuICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gIGNsYXNzPVwiZC1mbGV4XCJcbiAgW25nQ2xhc3NdPVwie1xuICAgICdmbGV4LWNvbHVtbic6IHdpdGhUaW1lICYmIHRpbWVMYXlvdXQubGF5b3V0ID09PSAnc3RhY2tlZCdcbiAgfVwiXG4gIChmb2N1c291dCk9XCJoYW5kbGVGb2N1c091dCgkZXZlbnQpXCI+XG4gIDxuZ2ItZGF0ZXBpY2tlclxuICAgIGNsYXNzPVwiaW1wZGMtZGF0ZXRpbWUtcGlja2VyLS1kYXRlcGlja2VyXCJcbiAgICBmb3JtQ29udHJvbE5hbWU9XCJkYXRlXCJcbiAgICBbZGF5VGVtcGxhdGVdPVwidGVtcGxhdGVIb3N0LmRheVRlbXBsYXRlUmVmXCJcbiAgICBbY29udGVudFRlbXBsYXRlXT1cInRlbXBsYXRlSG9zdC5jb250ZW50VGVtcGxhdGVSZWZcIlxuICAgIFtzaG93V2Vla051bWJlcnNdPVwiZmFsc2VcIlxuICAgIG91dHNpZGVEYXlzPVwidmlzaWJsZVwiXG4gICAgW3dlZWtkYXlzXT1cIk5nVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZFwiXG4gICAgW21hcmtEaXNhYmxlZF09XCJtYXJrRGF0ZURpc2FibGVkRm5cIlxuICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgIFttYXhEYXRlXT1cIm1heERhdGVcIiAvPlxuICBAaWYgKHdpdGhUaW1lKSB7XG4gIDxkaXZcbiAgICBjbGFzcz1cImltcGRjLWRhdGV0aW1lLXBpY2tlci0tdGltZXBpY2tlciBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTQgcC00IHctMTAwXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnYm9yZGVyLTAnOiAhdGltZUxheW91dC5ib3JkZXIsXG4gICAgICAnYm9yZGVyLWdyYXktMjAwJzogdGltZUxheW91dC5ib3JkZXIsXG4gICAgICAnbXQtMic6IHRpbWVMYXlvdXQubGF5b3V0ID09PSAnc3RhY2tlZCcsXG4gICAgICAnYm9yZGVyLXRvcCc6IHRpbWVMYXlvdXQuYm9yZGVyICYmIHRpbWVMYXlvdXQubGF5b3V0ID09PSAnc3RhY2tlZCcsXG4gICAgICAnbXMtMic6IHRpbWVMYXlvdXQubGF5b3V0ID09PSAnaW5saW5lJyxcbiAgICAgICdib3JkZXItc3RhcnQnOiB0aW1lTGF5b3V0LmJvcmRlciAmJiB0aW1lTGF5b3V0LmxheW91dCA9PT0gJ2lubGluZSdcbiAgICB9XCI+XG4gICAgPGltcGRjLWNoZWNrYm94XG4gICAgICBbbGFiZWxdPVwidXNlTWVyaWRpYW5MYWJlbFRleHRcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidXNlTWVyaWRpYW5cIlxuICAgICAgW2lzU3dpdGNoXT1cInRydWVcIlxuICAgICAgbGF5b3V0PVwiY2hlY2stZW5kXCIgLz5cbiAgICA8bmdiLXRpbWVwaWNrZXJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpbWVcIlxuICAgICAgW21lcmlkaWFuXT1cInVzZU1lcmlkaWFuXCJcbiAgICAgIFtzZWNvbmRzXT1cImZhbHNlXCJcbiAgICAgIFtzcGlubmVyc109XCJmYWxzZVwiXG4gICAgICBzaXplPVwibWVkaXVtXCI+PC9uZ2ItdGltZXBpY2tlcj5cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './datetime-picker.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL2RhdGV0aW1lLXBpY2tlci9jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kYXRldGltZS1waWNrZXIuY29tcG9uZW50JztcbiJdfQ==