@netwin/angular-datetime-picker 1.0.0-rc.3

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 (79) hide show
  1. package/README.md +225 -0
  2. package/assets/style/picker.min.css +1 -0
  3. package/esm2022/lib/date-time/adapter/date-time-adapter.class.mjs +120 -0
  4. package/esm2022/lib/date-time/adapter/date-time-format.class.mjs +7 -0
  5. package/esm2022/lib/date-time/adapter/native-date-time-adapter.class.mjs +253 -0
  6. package/esm2022/lib/date-time/adapter/native-date-time-format.class.mjs +16 -0
  7. package/esm2022/lib/date-time/adapter/native-date-time.module.mjs +45 -0
  8. package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.mjs +228 -0
  9. package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.mjs +16 -0
  10. package/esm2022/lib/date-time/calendar-body.component.mjs +146 -0
  11. package/esm2022/lib/date-time/calendar-month-view.component.mjs +436 -0
  12. package/esm2022/lib/date-time/calendar-multi-year-view.component.mjs +366 -0
  13. package/esm2022/lib/date-time/calendar-year-view.component.mjs +362 -0
  14. package/esm2022/lib/date-time/calendar.component.mjs +368 -0
  15. package/esm2022/lib/date-time/date-time-inline.component.mjs +293 -0
  16. package/esm2022/lib/date-time/date-time-picker-container.component.mjs +405 -0
  17. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +598 -0
  18. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +62 -0
  19. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +64 -0
  20. package/esm2022/lib/date-time/date-time-picker.animations.mjs +21 -0
  21. package/esm2022/lib/date-time/date-time-picker.component.mjs +564 -0
  22. package/esm2022/lib/date-time/date-time.class.mjs +176 -0
  23. package/esm2022/lib/date-time/date-time.module.mjs +83 -0
  24. package/esm2022/lib/date-time/numberedFixLen.pipe.mjs +28 -0
  25. package/esm2022/lib/date-time/options-provider.mjs +34 -0
  26. package/esm2022/lib/date-time/timer-box.component.mjs +140 -0
  27. package/esm2022/lib/date-time/timer.component.mjs +279 -0
  28. package/esm2022/lib/dialog/dialog-config.class.mjs +59 -0
  29. package/esm2022/lib/dialog/dialog-container.component.mjs +232 -0
  30. package/esm2022/lib/dialog/dialog-ref.class.mjs +134 -0
  31. package/esm2022/lib/dialog/dialog.module.mjs +26 -0
  32. package/esm2022/lib/dialog/dialog.service.mjs +228 -0
  33. package/esm2022/lib/utils/array.utils.mjs +12 -0
  34. package/esm2022/lib/utils/constants.mjs +34 -0
  35. package/esm2022/lib/utils/date.utils.mjs +49 -0
  36. package/esm2022/lib/utils/index.mjs +5 -0
  37. package/esm2022/lib/utils/object.utils.mjs +26 -0
  38. package/esm2022/netwin-angular-datetime-picker.mjs +5 -0
  39. package/esm2022/public_api.mjs +25 -0
  40. package/fesm2022/netwin-angular-datetime-picker.mjs +5751 -0
  41. package/fesm2022/netwin-angular-datetime-picker.mjs.map +1 -0
  42. package/index.d.ts +5 -0
  43. package/lib/date-time/adapter/date-time-adapter.class.d.ts +193 -0
  44. package/lib/date-time/adapter/date-time-format.class.d.ts +15 -0
  45. package/lib/date-time/adapter/native-date-time-adapter.class.d.ts +72 -0
  46. package/lib/date-time/adapter/native-date-time-format.class.d.ts +5 -0
  47. package/lib/date-time/adapter/native-date-time.module.d.ts +12 -0
  48. package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.d.ts +67 -0
  49. package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.d.ts +5 -0
  50. package/lib/date-time/calendar-body.component.d.ts +79 -0
  51. package/lib/date-time/calendar-month-view.component.d.ts +141 -0
  52. package/lib/date-time/calendar-multi-year-view.component.d.ts +107 -0
  53. package/lib/date-time/calendar-year-view.component.d.ts +120 -0
  54. package/lib/date-time/calendar.component.d.ts +154 -0
  55. package/lib/date-time/date-time-inline.component.d.ts +102 -0
  56. package/lib/date-time/date-time-picker-container.component.d.ts +130 -0
  57. package/lib/date-time/date-time-picker-input.directive.d.ts +164 -0
  58. package/lib/date-time/date-time-picker-intl.service.d.ts +51 -0
  59. package/lib/date-time/date-time-picker-trigger.directive.d.ts +23 -0
  60. package/lib/date-time/date-time-picker.animations.d.ts +8 -0
  61. package/lib/date-time/date-time-picker.component.d.ts +173 -0
  62. package/lib/date-time/date-time.class.d.ts +103 -0
  63. package/lib/date-time/date-time.module.d.ts +23 -0
  64. package/lib/date-time/numberedFixLen.pipe.d.ts +10 -0
  65. package/lib/date-time/options-provider.d.ts +23 -0
  66. package/lib/date-time/timer-box.component.d.ts +42 -0
  67. package/lib/date-time/timer.component.d.ts +131 -0
  68. package/lib/dialog/dialog-config.class.d.ts +169 -0
  69. package/lib/dialog/dialog-container.component.d.ts +58 -0
  70. package/lib/dialog/dialog-ref.class.d.ts +51 -0
  71. package/lib/dialog/dialog.module.d.ts +11 -0
  72. package/lib/dialog/dialog.service.d.ts +76 -0
  73. package/lib/utils/array.utils.d.ts +5 -0
  74. package/lib/utils/constants.d.ts +19 -0
  75. package/lib/utils/date.utils.d.ts +12 -0
  76. package/lib/utils/index.d.ts +4 -0
  77. package/lib/utils/object.utils.d.ts +11 -0
  78. package/package.json +51 -0
  79. package/public_api.d.ts +24 -0
@@ -0,0 +1,368 @@
1
+ /**
2
+ * calendar.component
3
+ */
4
+ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
5
+ import { Subscription } from 'rxjs';
6
+ import { take } from 'rxjs/operators';
7
+ import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
8
+ import { DateView } from './date-time.class';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./date-time-picker-intl.service";
11
+ import * as i2 from "./adapter/date-time-adapter.class";
12
+ import * as i3 from "@angular/common";
13
+ import * as i4 from "@angular/cdk/a11y";
14
+ import * as i5 from "./calendar-multi-year-view.component";
15
+ import * as i6 from "./calendar-year-view.component";
16
+ import * as i7 from "./calendar-month-view.component";
17
+ export class OwlCalendarComponent {
18
+ get minDate() {
19
+ return this._minDate;
20
+ }
21
+ set minDate(value) {
22
+ value = this.dateTimeAdapter.deserialize(value);
23
+ value = this.getValidDate(value);
24
+ this._minDate =
25
+ value ?
26
+ this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(value), this.dateTimeAdapter.getMonth(value), this.dateTimeAdapter.getDate(value))
27
+ : null;
28
+ }
29
+ get maxDate() {
30
+ return this._maxDate;
31
+ }
32
+ set maxDate(value) {
33
+ value = this.dateTimeAdapter.deserialize(value);
34
+ value = this.getValidDate(value);
35
+ this._maxDate =
36
+ value ?
37
+ this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(value), this.dateTimeAdapter.getMonth(value), this.dateTimeAdapter.getDate(value))
38
+ : null;
39
+ }
40
+ get pickerMoment() {
41
+ return this._pickerMoment;
42
+ }
43
+ set pickerMoment(value) {
44
+ value = this.dateTimeAdapter.deserialize(value);
45
+ this._pickerMoment = this.getValidDate(value) || this.dateTimeAdapter.now();
46
+ }
47
+ get selected() {
48
+ return this._selected;
49
+ }
50
+ set selected(value) {
51
+ value = this.dateTimeAdapter.deserialize(value);
52
+ this._selected = this.getValidDate(value);
53
+ }
54
+ get selecteds() {
55
+ return this._selecteds;
56
+ }
57
+ set selecteds(values) {
58
+ this._selecteds = values.map((v) => {
59
+ v = this.dateTimeAdapter.deserialize(v);
60
+ return this.getValidDate(v);
61
+ });
62
+ }
63
+ get periodButtonText() {
64
+ return this.isMonthView ?
65
+ this.dateTimeAdapter.format(this.pickerMoment, this.dateTimeFormats.monthYearLabel)
66
+ : this.dateTimeAdapter.getYearName(this.pickerMoment);
67
+ }
68
+ get periodButtonLabel() {
69
+ return this.isMonthView ? this.pickerIntl.switchToMultiYearViewLabel : this.pickerIntl.switchToMonthViewLabel;
70
+ }
71
+ get prevButtonLabel() {
72
+ if (this._currentView === DateView.MONTH) {
73
+ return this.pickerIntl.prevMonthLabel;
74
+ }
75
+ else if (this._currentView === DateView.YEAR) {
76
+ return this.pickerIntl.prevYearLabel;
77
+ }
78
+ else {
79
+ return null;
80
+ }
81
+ }
82
+ get nextButtonLabel() {
83
+ if (this._currentView === DateView.MONTH) {
84
+ return this.pickerIntl.nextMonthLabel;
85
+ }
86
+ else if (this._currentView === DateView.YEAR) {
87
+ return this.pickerIntl.nextYearLabel;
88
+ }
89
+ else {
90
+ return null;
91
+ }
92
+ }
93
+ get currentView() {
94
+ return this._currentView;
95
+ }
96
+ set currentView(view) {
97
+ this._currentView = view;
98
+ this.moveFocusOnNextTick = true;
99
+ }
100
+ get isInSingleMode() {
101
+ return this.selectMode === 'single';
102
+ }
103
+ get isInRangeMode() {
104
+ return this.selectMode === 'range' || this.selectMode === 'rangeFrom' || this.selectMode === 'rangeTo';
105
+ }
106
+ get showControlArrows() {
107
+ return this._currentView !== DateView.MULTI_YEARS;
108
+ }
109
+ get isMonthView() {
110
+ return this._currentView === DateView.MONTH;
111
+ }
112
+ /**
113
+ * Bind class 'owl-dt-calendar' to host
114
+ * */
115
+ get owlDTCalendarClass() {
116
+ return true;
117
+ }
118
+ constructor(elmRef, pickerIntl, ngZone, cdRef, dateTimeAdapter, dateTimeFormats) {
119
+ this.elmRef = elmRef;
120
+ this.pickerIntl = pickerIntl;
121
+ this.ngZone = ngZone;
122
+ this.cdRef = cdRef;
123
+ this.dateTimeAdapter = dateTimeAdapter;
124
+ this.dateTimeFormats = dateTimeFormats;
125
+ this.DateView = DateView;
126
+ this._selecteds = [];
127
+ /**
128
+ * The view that the calendar should start in.
129
+ */
130
+ this.startView = DateView.MONTH;
131
+ /**
132
+ * Whether to should only the year and multi-year views.
133
+ */
134
+ this.yearOnly = false;
135
+ /**
136
+ * Whether to should only the multi-year view.
137
+ */
138
+ this.multiyearOnly = false;
139
+ /** Emits when the currently picker moment changes. */
140
+ this.pickerMomentChange = new EventEmitter();
141
+ /** Emits when the selected date changes. */
142
+ this.dateClicked = new EventEmitter();
143
+ /** Emits when the currently selected date changes. */
144
+ this.selectedChange = new EventEmitter();
145
+ /** Emits when any date is selected. */
146
+ this.userSelection = new EventEmitter();
147
+ /**
148
+ * Emits the selected year. This doesn't imply a change on the selected date
149
+ * */
150
+ this.yearSelected = new EventEmitter();
151
+ /**
152
+ * Emits the selected month. This doesn't imply a change on the selected date
153
+ * */
154
+ this.monthSelected = new EventEmitter();
155
+ this.intlChangesSub = Subscription.EMPTY;
156
+ /**
157
+ * Used for scheduling that focus should be moved to the active cell on the next tick.
158
+ * We need to schedule it, rather than do it immediately, because we have to wait
159
+ * for Angular to re-evaluate the view children.
160
+ */
161
+ this.moveFocusOnNextTick = false;
162
+ /**
163
+ * Date filter for the month and year view
164
+ */
165
+ this.dateFilterForViews = (date) => {
166
+ return (!!date &&
167
+ (!this.dateFilter || this.dateFilter(date)) &&
168
+ (!this.minDate || this.dateTimeAdapter.compare(date, this.minDate) >= 0) &&
169
+ (!this.maxDate || this.dateTimeAdapter.compare(date, this.maxDate) <= 0));
170
+ };
171
+ this.intlChangesSub = this.pickerIntl.changes.subscribe(() => {
172
+ this.cdRef.markForCheck();
173
+ });
174
+ }
175
+ ngAfterContentInit() {
176
+ this._currentView = this.startView;
177
+ }
178
+ ngAfterViewChecked() {
179
+ if (this.moveFocusOnNextTick) {
180
+ this.moveFocusOnNextTick = false;
181
+ this.focusActiveCell();
182
+ }
183
+ }
184
+ ngOnDestroy() {
185
+ this.intlChangesSub.unsubscribe();
186
+ }
187
+ /**
188
+ * Toggle between month view and year view
189
+ */
190
+ toggleViews() {
191
+ let nextView = null;
192
+ if (this._currentView === DateView.MONTH) {
193
+ nextView = DateView.MULTI_YEARS;
194
+ }
195
+ else {
196
+ if (this.multiyearOnly) {
197
+ nextView = DateView.MULTI_YEARS;
198
+ }
199
+ else if (this.yearOnly) {
200
+ nextView = this._currentView === DateView.YEAR ? DateView.MULTI_YEARS : DateView.YEAR;
201
+ }
202
+ else {
203
+ nextView = DateView.MONTH;
204
+ }
205
+ }
206
+ this.currentView = nextView;
207
+ }
208
+ /**
209
+ * Handles user clicks on the previous button.
210
+ * */
211
+ previousClicked() {
212
+ this.pickerMoment =
213
+ this.isMonthView ?
214
+ this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, -1)
215
+ : this.dateTimeAdapter.addCalendarYears(this.pickerMoment, -1);
216
+ this.pickerMomentChange.emit(this.pickerMoment);
217
+ }
218
+ /**
219
+ * Handles user clicks on the next button.
220
+ * */
221
+ nextClicked() {
222
+ this.pickerMoment =
223
+ this.isMonthView ?
224
+ this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, 1)
225
+ : this.dateTimeAdapter.addCalendarYears(this.pickerMoment, 1);
226
+ this.pickerMomentChange.emit(this.pickerMoment);
227
+ }
228
+ dateSelected(date) {
229
+ if (!this.dateFilterForViews(date)) {
230
+ return;
231
+ }
232
+ this.dateClicked.emit(date);
233
+ this.selectedChange.emit(date);
234
+ /*if ((this.isInSingleMode && !this.dateTimeAdapter.isSameDay(date, this.selected)) ||
235
+ this.isInRangeMode) {
236
+ this.selectedChange.emit(date);
237
+ }*/
238
+ }
239
+ /**
240
+ * Change the pickerMoment value and switch to a specific view
241
+ */
242
+ goToDateInView(date, view) {
243
+ this.handlePickerMomentChange(date);
244
+ if ((!this.yearOnly && !this.multiyearOnly) ||
245
+ (this.multiyearOnly && view !== DateView.MONTH && view !== DateView.YEAR) ||
246
+ (this.yearOnly && view !== DateView.MONTH)) {
247
+ this.currentView = view;
248
+ }
249
+ return;
250
+ }
251
+ /**
252
+ * Change the pickerMoment value
253
+ */
254
+ handlePickerMomentChange(date) {
255
+ this.pickerMoment = this.dateTimeAdapter.clampDate(date, this.minDate, this.maxDate);
256
+ this.pickerMomentChange.emit(this.pickerMoment);
257
+ return;
258
+ }
259
+ userSelected() {
260
+ this.userSelection.emit();
261
+ }
262
+ /**
263
+ * Whether the previous period button is enabled.
264
+ */
265
+ prevButtonEnabled() {
266
+ return !this.minDate || !this.isSameView(this.pickerMoment, this.minDate);
267
+ }
268
+ /**
269
+ * Whether the next period button is enabled.
270
+ */
271
+ nextButtonEnabled() {
272
+ return !this.maxDate || !this.isSameView(this.pickerMoment, this.maxDate);
273
+ }
274
+ /**
275
+ * Focus to the host element
276
+ * */
277
+ focusActiveCell() {
278
+ this.ngZone.runOutsideAngular(() => {
279
+ this.ngZone.onStable
280
+ .asObservable()
281
+ .pipe(take(1))
282
+ .subscribe(() => {
283
+ this.elmRef.nativeElement.querySelector('.owl-dt-calendar-cell-active').focus();
284
+ });
285
+ });
286
+ }
287
+ selectYearInMultiYearView(normalizedYear) {
288
+ this.yearSelected.emit(normalizedYear);
289
+ }
290
+ selectMonthInYearView(normalizedMonth) {
291
+ this.monthSelected.emit(normalizedMonth);
292
+ }
293
+ /**
294
+ * Whether the two dates represent the same view in the current view mode (month or year).
295
+ */
296
+ isSameView(date1, date2) {
297
+ if (this._currentView === DateView.MONTH) {
298
+ return !!(date1 &&
299
+ date2 &&
300
+ this.dateTimeAdapter.getYear(date1) === this.dateTimeAdapter.getYear(date2) &&
301
+ this.dateTimeAdapter.getMonth(date1) === this.dateTimeAdapter.getMonth(date2));
302
+ }
303
+ else if (this._currentView === DateView.YEAR) {
304
+ return !!(date1 && date2 && this.dateTimeAdapter.getYear(date1) === this.dateTimeAdapter.getYear(date2));
305
+ }
306
+ else {
307
+ return false;
308
+ }
309
+ }
310
+ /**
311
+ * Get a valid date object
312
+ */
313
+ getValidDate(obj) {
314
+ return this.dateTimeAdapter.isDateInstance(obj) && this.dateTimeAdapter.isValid(obj) ? obj : null;
315
+ }
316
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: OwlCalendarComponent, deps: [{ token: i0.ElementRef }, { token: i1.OwlDateTimeIntl }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i2.DateTimeAdapter, optional: true }, { token: OWL_DATE_TIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
317
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: OwlCalendarComponent, selector: "owl-date-time-calendar", inputs: { minDate: "minDate", maxDate: "maxDate", pickerMoment: "pickerMoment", selected: "selected", selecteds: "selecteds", dateFilter: "dateFilter", firstDayOfWeek: "firstDayOfWeek", selectMode: "selectMode", startView: "startView", yearOnly: "yearOnly", multiyearOnly: "multiyearOnly", hideOtherMonths: "hideOtherMonths" }, outputs: { pickerMomentChange: "pickerMomentChange", dateClicked: "dateClicked", selectedChange: "selectedChange", userSelection: "userSelection", yearSelected: "yearSelected", monthSelected: "monthSelected" }, host: { properties: { "class.owl-dt-calendar": "owlDTCalendarClass" } }, exportAs: ["owlDateTimeCalendar"], ngImport: i0, template: "<div class=\"owl-dt-calendar-control\">\n <!-- focus when keyboard tab (http://kizu.ru/en/blog/keyboard-only-focus/#x) -->\n <button\n [attr.aria-label]=\"prevButtonLabel\"\n [disabled]=\"!prevButtonEnabled()\"\n [style.visibility]=\"showControlArrows ? 'visible' : 'hidden'\"\n (click)=\"previousClicked()\"\n class=\"owl-dt-control owl-dt-control-button owl-dt-control-arrow-button\"\n tabindex=\"0\"\n type=\"button\">\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Left\"> -->\n <svg\n xml:space=\"preserve\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n height=\"100%\"\n style=\"enable-background: new 0 0 250.738 250.738\"\n version=\"1.1\"\n viewBox=\"0 0 250.738 250.738\"\n width=\"100%\"\n x=\"0px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n y=\"0px\">\n <path\n d=\"M96.633,125.369l95.053-94.533c7.101-7.055,7.101-18.492,0-25.546 c-7.1-7.054-18.613-7.054-25.714,0L58.989,111.689c-3.784,3.759-5.487,8.759-5.238,13.68c-0.249,4.922,1.454,9.921,5.238,13.681 l106.983,106.398c7.101,7.055,18.613,7.055,25.714,0c7.101-7.054,7.101-18.491,0-25.544L96.633,125.369z\"\n style=\"fill-rule: evenodd; clip-rule: evenodd\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n </button>\n <div class=\"owl-dt-calendar-control-content\">\n <button\n [attr.aria-label]=\"periodButtonLabel\"\n (click)=\"toggleViews()\"\n class=\"owl-dt-control owl-dt-control-button owl-dt-control-period-button\"\n tabindex=\"0\"\n type=\"button\">\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n {{ periodButtonText }}\n\n <span\n [style.transform]=\"'rotate(' + (isMonthView ? 0 : 180) + 'deg)'\"\n class=\"owl-dt-control-button-arrow\">\n <!-- <editor-fold desc=\"SVG Arrow\"> -->\n <svg\n xml:space=\"preserve\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n height=\"50%\"\n style=\"enable-background: new 0 0 292.362 292.362\"\n version=\"1.1\"\n viewBox=\"0 0 292.362 292.362\"\n width=\"50%\"\n x=\"0px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n y=\"0px\">\n <g>\n <path\n d=\"M286.935,69.377c-3.614-3.617-7.898-5.424-12.848-5.424H18.274c-4.952,0-9.233,1.807-12.85,5.424\n C1.807,72.998,0,77.279,0,82.228c0,4.948,1.807,9.229,5.424,12.847l127.907,127.907c3.621,3.617,7.902,5.428,12.85,5.428\n s9.233-1.811,12.847-5.428L286.935,95.074c3.613-3.617,5.427-7.898,5.427-12.847C292.362,77.279,290.548,72.998,286.935,69.377z\" />\n </g>\n </svg>\n <!-- </editor-fold> -->\n </span>\n </span>\n </button>\n </div>\n <button\n [attr.aria-label]=\"nextButtonLabel\"\n [disabled]=\"!nextButtonEnabled()\"\n [style.visibility]=\"showControlArrows ? 'visible' : 'hidden'\"\n (click)=\"nextClicked()\"\n class=\"owl-dt-control owl-dt-control-button owl-dt-control-arrow-button\"\n tabindex=\"0\"\n type=\"button\">\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Right\"> -->\n <svg\n xml:space=\"preserve\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n style=\"enable-background: new 0 0 250.738 250.738\"\n version=\"1.1\"\n viewBox=\"0 0 250.738 250.738\"\n x=\"0px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n y=\"0px\">\n <path\n d=\"M191.75,111.689L84.766,5.291c-7.1-7.055-18.613-7.055-25.713,0\n c-7.101,7.054-7.101,18.49,0,25.544l95.053,94.534l-95.053,94.533c-7.101,7.054-7.101,18.491,0,25.545\n c7.1,7.054,18.613,7.054,25.713,0L191.75,139.05c3.784-3.759,5.487-8.759,5.238-13.681\n C197.237,120.447,195.534,115.448,191.75,111.689z\"\n style=\"fill-rule: evenodd; clip-rule: evenodd\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n </button>\n</div>\n<div\n [ngSwitch]=\"currentView\"\n cdkMonitorSubtreeFocus\n class=\"owl-dt-calendar-main\"\n tabindex=\"-1\">\n <owl-date-time-month-view\n *ngSwitchCase=\"DateView.MONTH\"\n [dateFilter]=\"dateFilter\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [hideOtherMonths]=\"hideOtherMonths\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [pickerMoment]=\"pickerMoment\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n (pickerMomentChange)=\"handlePickerMomentChange($event)\"\n (selectedChange)=\"dateSelected($event)\"\n (userSelection)=\"userSelected()\"></owl-date-time-month-view>\n\n <owl-date-time-year-view\n *ngSwitchCase=\"DateView.YEAR\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [pickerMoment]=\"pickerMoment\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n (change)=\"goToDateInView($event, DateView.MONTH)\"\n (keyboardEnter)=\"focusActiveCell()\"\n (monthSelected)=\"selectMonthInYearView($event)\"\n (pickerMomentChange)=\"handlePickerMomentChange($event)\"></owl-date-time-year-view>\n\n <owl-date-time-multi-year-view\n *ngSwitchCase=\"DateView.MULTI_YEARS\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [pickerMoment]=\"pickerMoment\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n (change)=\"goToDateInView($event, DateView.YEAR)\"\n (keyboardEnter)=\"focusActiveCell()\"\n (pickerMomentChange)=\"handlePickerMomentChange($event)\"\n (yearSelected)=\"selectYearInMultiYearView($event)\"></owl-date-time-multi-year-view>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: i5.OwlMultiYearViewComponent, selector: "owl-date-time-multi-year-view", inputs: ["selectMode", "selected", "selecteds", "pickerMoment", "dateFilter", "minDate", "maxDate"], outputs: ["change", "yearSelected", "pickerMomentChange", "keyboardEnter"] }, { kind: "component", type: i6.OwlYearViewComponent, selector: "owl-date-time-year-view", inputs: ["selectMode", "selected", "selecteds", "pickerMoment", "dateFilter", "minDate", "maxDate"], outputs: ["change", "monthSelected", "pickerMomentChange", "keyboardEnter"], exportAs: ["owlMonthView"] }, { kind: "component", type: i7.OwlMonthViewComponent, selector: "owl-date-time-month-view", inputs: ["hideOtherMonths", "firstDayOfWeek", "selectMode", "selected", "selecteds", "pickerMoment", "dateFilter", "minDate", "maxDate"], outputs: ["selectedChange", "userSelection", "pickerMomentChange"], exportAs: ["owlYearView"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
318
+ }
319
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: OwlCalendarComponent, decorators: [{
320
+ type: Component,
321
+ args: [{ selector: 'owl-date-time-calendar', exportAs: 'owlDateTimeCalendar', host: {
322
+ '[class.owl-dt-calendar]': 'owlDTCalendarClass'
323
+ }, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"owl-dt-calendar-control\">\n <!-- focus when keyboard tab (http://kizu.ru/en/blog/keyboard-only-focus/#x) -->\n <button\n [attr.aria-label]=\"prevButtonLabel\"\n [disabled]=\"!prevButtonEnabled()\"\n [style.visibility]=\"showControlArrows ? 'visible' : 'hidden'\"\n (click)=\"previousClicked()\"\n class=\"owl-dt-control owl-dt-control-button owl-dt-control-arrow-button\"\n tabindex=\"0\"\n type=\"button\">\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Left\"> -->\n <svg\n xml:space=\"preserve\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n height=\"100%\"\n style=\"enable-background: new 0 0 250.738 250.738\"\n version=\"1.1\"\n viewBox=\"0 0 250.738 250.738\"\n width=\"100%\"\n x=\"0px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n y=\"0px\">\n <path\n d=\"M96.633,125.369l95.053-94.533c7.101-7.055,7.101-18.492,0-25.546 c-7.1-7.054-18.613-7.054-25.714,0L58.989,111.689c-3.784,3.759-5.487,8.759-5.238,13.68c-0.249,4.922,1.454,9.921,5.238,13.681 l106.983,106.398c7.101,7.055,18.613,7.055,25.714,0c7.101-7.054,7.101-18.491,0-25.544L96.633,125.369z\"\n style=\"fill-rule: evenodd; clip-rule: evenodd\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n </button>\n <div class=\"owl-dt-calendar-control-content\">\n <button\n [attr.aria-label]=\"periodButtonLabel\"\n (click)=\"toggleViews()\"\n class=\"owl-dt-control owl-dt-control-button owl-dt-control-period-button\"\n tabindex=\"0\"\n type=\"button\">\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n {{ periodButtonText }}\n\n <span\n [style.transform]=\"'rotate(' + (isMonthView ? 0 : 180) + 'deg)'\"\n class=\"owl-dt-control-button-arrow\">\n <!-- <editor-fold desc=\"SVG Arrow\"> -->\n <svg\n xml:space=\"preserve\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n height=\"50%\"\n style=\"enable-background: new 0 0 292.362 292.362\"\n version=\"1.1\"\n viewBox=\"0 0 292.362 292.362\"\n width=\"50%\"\n x=\"0px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n y=\"0px\">\n <g>\n <path\n d=\"M286.935,69.377c-3.614-3.617-7.898-5.424-12.848-5.424H18.274c-4.952,0-9.233,1.807-12.85,5.424\n C1.807,72.998,0,77.279,0,82.228c0,4.948,1.807,9.229,5.424,12.847l127.907,127.907c3.621,3.617,7.902,5.428,12.85,5.428\n s9.233-1.811,12.847-5.428L286.935,95.074c3.613-3.617,5.427-7.898,5.427-12.847C292.362,77.279,290.548,72.998,286.935,69.377z\" />\n </g>\n </svg>\n <!-- </editor-fold> -->\n </span>\n </span>\n </button>\n </div>\n <button\n [attr.aria-label]=\"nextButtonLabel\"\n [disabled]=\"!nextButtonEnabled()\"\n [style.visibility]=\"showControlArrows ? 'visible' : 'hidden'\"\n (click)=\"nextClicked()\"\n class=\"owl-dt-control owl-dt-control-button owl-dt-control-arrow-button\"\n tabindex=\"0\"\n type=\"button\">\n <span\n class=\"owl-dt-control-content owl-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Right\"> -->\n <svg\n xml:space=\"preserve\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n style=\"enable-background: new 0 0 250.738 250.738\"\n version=\"1.1\"\n viewBox=\"0 0 250.738 250.738\"\n x=\"0px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n y=\"0px\">\n <path\n d=\"M191.75,111.689L84.766,5.291c-7.1-7.055-18.613-7.055-25.713,0\n c-7.101,7.054-7.101,18.49,0,25.544l95.053,94.534l-95.053,94.533c-7.101,7.054-7.101,18.491,0,25.545\n c7.1,7.054,18.613,7.054,25.713,0L191.75,139.05c3.784-3.759,5.487-8.759,5.238-13.681\n C197.237,120.447,195.534,115.448,191.75,111.689z\"\n style=\"fill-rule: evenodd; clip-rule: evenodd\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n </button>\n</div>\n<div\n [ngSwitch]=\"currentView\"\n cdkMonitorSubtreeFocus\n class=\"owl-dt-calendar-main\"\n tabindex=\"-1\">\n <owl-date-time-month-view\n *ngSwitchCase=\"DateView.MONTH\"\n [dateFilter]=\"dateFilter\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [hideOtherMonths]=\"hideOtherMonths\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [pickerMoment]=\"pickerMoment\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n (pickerMomentChange)=\"handlePickerMomentChange($event)\"\n (selectedChange)=\"dateSelected($event)\"\n (userSelection)=\"userSelected()\"></owl-date-time-month-view>\n\n <owl-date-time-year-view\n *ngSwitchCase=\"DateView.YEAR\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [pickerMoment]=\"pickerMoment\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n (change)=\"goToDateInView($event, DateView.MONTH)\"\n (keyboardEnter)=\"focusActiveCell()\"\n (monthSelected)=\"selectMonthInYearView($event)\"\n (pickerMomentChange)=\"handlePickerMomentChange($event)\"></owl-date-time-year-view>\n\n <owl-date-time-multi-year-view\n *ngSwitchCase=\"DateView.MULTI_YEARS\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [pickerMoment]=\"pickerMoment\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n (change)=\"goToDateInView($event, DateView.YEAR)\"\n (keyboardEnter)=\"focusActiveCell()\"\n (pickerMomentChange)=\"handlePickerMomentChange($event)\"\n (yearSelected)=\"selectYearInMultiYearView($event)\"></owl-date-time-multi-year-view>\n</div>\n" }]
324
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.OwlDateTimeIntl }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i2.DateTimeAdapter, decorators: [{
325
+ type: Optional
326
+ }] }, { type: undefined, decorators: [{
327
+ type: Optional
328
+ }, {
329
+ type: Inject,
330
+ args: [OWL_DATE_TIME_FORMATS]
331
+ }] }], propDecorators: { minDate: [{
332
+ type: Input
333
+ }], maxDate: [{
334
+ type: Input
335
+ }], pickerMoment: [{
336
+ type: Input
337
+ }], selected: [{
338
+ type: Input
339
+ }], selecteds: [{
340
+ type: Input
341
+ }], dateFilter: [{
342
+ type: Input
343
+ }], firstDayOfWeek: [{
344
+ type: Input
345
+ }], selectMode: [{
346
+ type: Input
347
+ }], startView: [{
348
+ type: Input
349
+ }], yearOnly: [{
350
+ type: Input
351
+ }], multiyearOnly: [{
352
+ type: Input
353
+ }], hideOtherMonths: [{
354
+ type: Input
355
+ }], pickerMomentChange: [{
356
+ type: Output
357
+ }], dateClicked: [{
358
+ type: Output
359
+ }], selectedChange: [{
360
+ type: Output
361
+ }], userSelection: [{
362
+ type: Output
363
+ }], yearSelected: [{
364
+ type: Output
365
+ }], monthSelected: [{
366
+ type: Output
367
+ }] } });
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGlja2VyL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BpY2tlci9zcmMvbGliL2RhdGUtdGltZS9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFHTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFFLHFCQUFxQixFQUFzQixNQUFNLGtDQUFrQyxDQUFDO0FBRTdGLE9BQU8sRUFBRSxRQUFRLEVBQTRCLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7OztBQWF2RSxNQUFNLE9BQU8sb0JBQW9CO0lBRy9CLElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBZTtRQUN6QixLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFFBQVE7WUFDWCxLQUFLLENBQUMsQ0FBQztnQkFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMs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QUNKLHlCQUF5QixFQUFFLG9CQUFvQjtxQkFDaEQsdUJBQ29CLEtBQUssbUJBQ1QsdUJBQXVCLENBQUMsTUFBTTs7MEJBOEk1QyxRQUFROzswQkFDUixRQUFROzswQkFDUixNQUFNOzJCQUFDLHFCQUFxQjt5Q0ExSTNCLE9BQU87c0JBRFYsS0FBSztnQkFvQkYsT0FBTztzQkFEVixLQUFLO2dCQW9CRixZQUFZO3NCQURmLEtBQUs7Z0JBV0YsUUFBUTtzQkFEWCxLQUFLO2dCQVdGLFNBQVM7c0JBRFosS0FBSztnQkE2Rk4sVUFBVTtzQkFEVCxLQUFLO2dCQU9OLGNBQWM7c0JBRGIsS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBWU4sU0FBUztzQkFEUixLQUFLO2dCQU9OLFFBQVE7c0JBRFAsS0FBSztnQkFPTixhQUFhO3NCQURaLEtBQUs7Z0JBT04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLGtCQUFrQjtzQkFEakIsTUFBTTtnQkFLRSxXQUFXO3NCQURuQixNQUFNO2dCQUtFLGNBQWM7c0JBRHRCLE1BQU07Z0JBS0UsYUFBYTtzQkFEckIsTUFBTTtnQkFPRSxZQUFZO3NCQURwQixNQUFNO2dCQU9FLGFBQWE7c0JBRHJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNhbGVuZGFyLmNvbXBvbmVudFxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJztcbmltcG9ydCB7IE9XTF9EQVRFX1RJTUVfRk9STUFUUywgT3dsRGF0ZVRpbWVGb3JtYXRzIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnO1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVJbnRsIH0gZnJvbSAnLi9kYXRlLXRpbWUtcGlja2VyLWludGwuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlVmlldywgRGF0ZVZpZXdUeXBlLCBTZWxlY3RNb2RlIH0gZnJvbSAnLi9kYXRlLXRpbWUuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvd2wtZGF0ZS10aW1lLWNhbGVuZGFyJyxcbiAgZXhwb3J0QXM6ICdvd2xEYXRlVGltZUNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Mub3dsLWR0LWNhbGVuZGFyXSc6ICdvd2xEVENhbGVuZGFyQ2xhc3MnXG4gIH0sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBPd2xDYWxlbmRhckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIERhdGVWaWV3ID0gRGF0ZVZpZXc7XG5cbiAgQElucHV0KClcbiAgZ2V0IG1pbkRhdGUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICB9XG5cbiAgc2V0IG1pbkRhdGUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgdmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl9taW5EYXRlID1cbiAgICAgIHZhbHVlID9cbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh2YWx1ZSksXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh2YWx1ZSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IG1heERhdGUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICB9XG5cbiAgc2V0IG1heERhdGUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgdmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl9tYXhEYXRlID1cbiAgICAgIHZhbHVlID9cbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh2YWx1ZSksXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh2YWx1ZSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IHBpY2tlck1vbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGlja2VyTW9tZW50O1xuICB9XG5cbiAgc2V0IHBpY2tlck1vbWVudCh2YWx1ZTogVCkge1xuICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgIHRoaXMuX3BpY2tlck1vbWVudCA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKSB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgc2V0IHNlbGVjdGVkKHZhbHVlOiBUIHwgbnVsbCkge1xuICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGVkcygpOiBBcnJheTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkcztcbiAgfVxuXG4gIHNldCBzZWxlY3RlZHModmFsdWVzOiBBcnJheTxUPikge1xuICAgIHRoaXMuX3NlbGVjdGVkcyA9IHZhbHVlcy5tYXAoKHYpID0+IHtcbiAgICAgIHYgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2KTtcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZSh2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwZXJpb2RCdXR0b25UZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNNb250aFZpZXcgP1xuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQodGhpcy5waWNrZXJNb21lbnQsIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLm1vbnRoWWVhckxhYmVsKVxuICAgICAgOiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyTmFtZSh0aGlzLnBpY2tlck1vbWVudCk7XG4gIH1cblxuICBnZXQgcGVyaW9kQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc01vbnRoVmlldyA/IHRoaXMucGlja2VySW50bC5zd2l0Y2hUb011bHRpWWVhclZpZXdMYWJlbCA6IHRoaXMucGlja2VySW50bC5zd2l0Y2hUb01vbnRoVmlld0xhYmVsO1xuICB9XG5cbiAgZ2V0IHByZXZCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZVZpZXcuTU9OVEgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucHJldk1vbnRoTGFiZWw7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZVZpZXcuWUVBUikge1xuICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5wcmV2WWVhckxhYmVsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgbmV4dEJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRWaWV3ID09PSBEYXRlVmlldy5NT05USCkge1xuICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5uZXh0TW9udGhMYWJlbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRWaWV3ID09PSBEYXRlVmlldy5ZRUFSKSB7XG4gICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLm5leHRZZWFyTGFiZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50VmlldygpOiBEYXRlVmlld1R5cGUge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmlldztcbiAgfVxuXG4gIHNldCBjdXJyZW50Vmlldyh2aWV3OiBEYXRlVmlld1R5cGUpIHtcbiAgICB0aGlzLl9jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgdGhpcy5tb3ZlRm9jdXNPbk5leHRUaWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJztcbiAgfVxuXG4gIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZScgfHwgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyB8fCB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJztcbiAgfVxuXG4gIGdldCBzaG93Q29udHJvbEFycm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZpZXcgIT09IERhdGVWaWV3Lk1VTFRJX1lFQVJTO1xuICB9XG5cbiAgZ2V0IGlzTW9udGhWaWV3KCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZVZpZXcuTU9OVEg7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBjbGFzcyAnb3dsLWR0LWNhbGVuZGFyJyB0byBob3N0XG4gICAqICovXG4gIGdldCBvd2xEVENhbGVuZGFyQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsbVJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHBpY2tlckludGw6IE93bERhdGVUaW1lSW50bCxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGF0ZVRpbWVBZGFwdGVyOiBEYXRlVGltZUFkYXB0ZXI8VD4sXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE9XTF9EQVRFX1RJTUVfRk9STUFUUylcbiAgICBwcml2YXRlIGRhdGVUaW1lRm9ybWF0czogT3dsRGF0ZVRpbWVGb3JtYXRzXG4gICkge1xuICAgIHRoaXMuaW50bENoYW5nZXNTdWIgPSB0aGlzLnBpY2tlckludGwuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIGZpbHRlciBmb3IgdGhlIG1vbnRoIGFuZCB5ZWFyIHZpZXdcbiAgICogKi9cbiAgQElucHV0KClcbiAgZGF0ZUZpbHRlcjogKGRhdGU6IFQpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZpcnN0RGF5T2ZXZWVrOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgcHJpdmF0ZSBfbWluRGF0ZTogVCB8IG51bGw7XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgcHJpdmF0ZSBfbWF4RGF0ZTogVCB8IG51bGw7XG5cbiAgLyoqIFRoZSBjdXJyZW50IHBpY2tlciBtb21lbnQgKi9cbiAgcHJpdmF0ZSBfcGlja2VyTW9tZW50OiBUO1xuXG4gIEBJbnB1dCgpXG4gIHNlbGVjdE1vZGU6IFNlbGVjdE1vZGU7XG5cbiAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbW9tZW50LiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZDogVCB8IG51bGw7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRzOiBBcnJheTxUPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlldyB0aGF0IHRoZSBjYWxlbmRhciBzaG91bGQgc3RhcnQgaW4uXG4gICAqL1xuICBASW5wdXQoKVxuICBzdGFydFZpZXc6IERhdGVWaWV3VHlwZSA9IERhdGVWaWV3Lk1PTlRIO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3VsZCBvbmx5IHRoZSB5ZWFyIGFuZCBtdWx0aS15ZWFyIHZpZXdzLlxuICAgKi9cbiAgQElucHV0KClcbiAgeWVhck9ubHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG91bGQgb25seSB0aGUgbXVsdGkteWVhciB2aWV3LlxuICAgKi9cbiAgQElucHV0KClcbiAgbXVsdGl5ZWFyT25seSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhpZGUgZGF0ZXMgaW4gb3RoZXIgbW9udGhzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGN1cnJlbnQgbW9udGguXG4gICAqICovXG4gIEBJbnB1dCgpXG4gIGhpZGVPdGhlck1vbnRoczogYm9vbGVhbjtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgY3VycmVudGx5IHBpY2tlciBtb21lbnQgY2hhbmdlcy4gKi9cbiAgQE91dHB1dCgpXG4gIHBpY2tlck1vbWVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgc2VsZWN0ZWQgZGF0ZSBjaGFuZ2VzLiAqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZGF0ZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlIGNoYW5nZXMuICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBzZWxlY3RlZC4gKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHVzZXJTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzZWxlY3RlZCB5ZWFyLiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGVcbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHllYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNlbGVjdGVkIG1vbnRoLiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGVcbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IG1vbnRoU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgcHJpdmF0ZSBfY3VycmVudFZpZXc6IERhdGVWaWV3VHlwZTtcblxuICBwcml2YXRlIGludGxDaGFuZ2VzU3ViID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzY2hlZHVsaW5nIHRoYXQgZm9jdXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhY3RpdmUgY2VsbCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgKiBXZSBuZWVkIHRvIHNjaGVkdWxlIGl0LCByYXRoZXIgdGhhbiBkbyBpdCBpbW1lZGlhdGVseSwgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXRcbiAgICogZm9yIEFuZ3VsYXIgdG8gcmUtZXZhbHVhdGUgdGhlIHZpZXcgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIG1vdmVGb2N1c09uTmV4dFRpY2sgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGF0ZSBmaWx0ZXIgZm9yIHRoZSBtb250aCBhbmQgeWVhciB2aWV3XG4gICAqL1xuICBwdWJsaWMgZGF0ZUZpbHRlckZvclZpZXdzID0gKGRhdGU6IFQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFkYXRlICYmXG4gICAgICAoIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpICYmXG4gICAgICAoIXRoaXMubWluRGF0ZSB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGRhdGUsIHRoaXMubWluRGF0ZSkgPj0gMCkgJiZcbiAgICAgICghdGhpcy5tYXhEYXRlIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZGF0ZSwgdGhpcy5tYXhEYXRlKSA8PSAwKVxuICAgICk7XG4gIH07XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50VmlldyA9IHRoaXMuc3RhcnRWaWV3O1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5tb3ZlRm9jdXNPbk5leHRUaWNrKSB7XG4gICAgICB0aGlzLm1vdmVGb2N1c09uTmV4dFRpY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9jdXNBY3RpdmVDZWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaW50bENoYW5nZXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgYmV0d2VlbiBtb250aCB2aWV3IGFuZCB5ZWFyIHZpZXdcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVWaWV3cygpOiB2b2lkIHtcbiAgICBsZXQgbmV4dFZpZXcgPSBudWxsO1xuICAgIGlmICh0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZVZpZXcuTU9OVEgpIHtcbiAgICAgIG5leHRWaWV3ID0gRGF0ZVZpZXcuTVVMVElfWUVBUlM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm11bHRpeWVhck9ubHkpIHtcbiAgICAgICAgbmV4dFZpZXcgPSBEYXRlVmlldy5NVUxUSV9ZRUFSUztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy55ZWFyT25seSkge1xuICAgICAgICBuZXh0VmlldyA9IHRoaXMuX2N1cnJlbnRWaWV3ID09PSBEYXRlVmlldy5ZRUFSID8gRGF0ZVZpZXcuTVVMVElfWUVBUlMgOiBEYXRlVmlldy5ZRUFSO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFZpZXcgPSBEYXRlVmlldy5NT05USDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IG5leHRWaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdXNlciBjbGlja3Mgb24gdGhlIHByZXZpb3VzIGJ1dHRvbi5cbiAgICogKi9cbiAgcHVibGljIHByZXZpb3VzQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnBpY2tlck1vbWVudCA9XG4gICAgICB0aGlzLmlzTW9udGhWaWV3ID9cbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5waWNrZXJNb21lbnQsIC0xKVxuICAgICAgOiB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMucGlja2VyTW9tZW50LCAtMSk7XG5cbiAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KHRoaXMucGlja2VyTW9tZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHVzZXIgY2xpY2tzIG9uIHRoZSBuZXh0IGJ1dHRvbi5cbiAgICogKi9cbiAgcHVibGljIG5leHRDbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMucGlja2VyTW9tZW50ID1cbiAgICAgIHRoaXMuaXNNb250aFZpZXcgP1xuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLnBpY2tlck1vbWVudCwgMSlcbiAgICAgIDogdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLnBpY2tlck1vbWVudCwgMSk7XG5cbiAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KHRoaXMucGlja2VyTW9tZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlU2VsZWN0ZWQoZGF0ZTogVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyRm9yVmlld3MoZGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVDbGlja2VkLmVtaXQoZGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGRhdGUpO1xuXG4gICAgLyppZiAoKHRoaXMuaXNJblNpbmdsZU1vZGUgJiYgIXRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzU2FtZURheShkYXRlLCB0aGlzLnNlbGVjdGVkKSkgfHxcbiAgICAgICAgICAgIHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGRhdGUpO1xuICAgICAgICB9Ki9cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIHBpY2tlck1vbWVudCB2YWx1ZSBhbmQgc3dpdGNoIHRvIGEgc3BlY2lmaWMgdmlld1xuICAgKi9cbiAgcHVibGljIGdvVG9EYXRlSW5WaWV3KGRhdGU6IFQsIHZpZXc6IERhdGVWaWV3VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlUGlja2VyTW9tZW50Q2hhbmdlKGRhdGUpO1xuICAgIGlmIChcbiAgICAgICghdGhpcy55ZWFyT25seSAmJiAhdGhpcy5tdWx0aXllYXJPbmx5KSB8fFxuICAgICAgKHRoaXMubXVsdGl5ZWFyT25seSAmJiB2aWV3ICE9PSBEYXRlVmlldy5NT05USCAmJiB2aWV3ICE9PSBEYXRlVmlldy5ZRUFSKSB8fFxuICAgICAgKHRoaXMueWVhck9ubHkgJiYgdmlldyAhPT0gRGF0ZVZpZXcuTU9OVEgpXG4gICAgKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmlldztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgcGlja2VyTW9tZW50IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlUGlja2VyTW9tZW50Q2hhbmdlKGRhdGU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLnBpY2tlck1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsYW1wRGF0ZShkYXRlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSk7XG4gICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdCh0aGlzLnBpY2tlck1vbWVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVibGljIHVzZXJTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJTZWxlY3Rpb24uZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHByZXZpb3VzIHBlcmlvZCBidXR0b24gaXMgZW5hYmxlZC5cbiAgICovXG4gIHB1YmxpYyBwcmV2QnV0dG9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubWluRGF0ZSB8fCAhdGhpcy5pc1NhbWVWaWV3KHRoaXMucGlja2VyTW9tZW50LCB0aGlzLm1pbkRhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5leHQgcGVyaW9kIGJ1dHRvbiBpcyBlbmFibGVkLlxuICAgKi9cbiAgcHVibGljIG5leHRCdXR0b25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tYXhEYXRlIHx8ICF0aGlzLmlzU2FtZVZpZXcodGhpcy5waWNrZXJNb21lbnQsIHRoaXMubWF4RGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdG8gdGhlIGhvc3QgZWxlbWVudFxuICAgKiAqL1xuICBwdWJsaWMgZm9jdXNBY3RpdmVDZWxsKCkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vd2wtZHQtY2FsZW5kYXItY2VsbC1hY3RpdmUnKS5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RZZWFySW5NdWx0aVllYXJWaWV3KG5vcm1hbGl6ZWRZZWFyOiBUKTogdm9pZCB7XG4gICAgdGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkWWVhcik7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TW9udGhJblllYXJWaWV3KG5vcm1hbGl6ZWRNb250aDogVCk6IHZvaWQge1xuICAgIHRoaXMubW9udGhTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWRNb250aCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdHdvIGRhdGVzIHJlcHJlc2VudCB0aGUgc2FtZSB2aWV3IGluIHRoZSBjdXJyZW50IHZpZXcgbW9kZSAobW9udGggb3IgeWVhcikuXG4gICAqL1xuICBwcml2YXRlIGlzU2FtZVZpZXcoZGF0ZTE6IFQsIGRhdGUyOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRWaWV3ID09PSBEYXRlVmlldy5NT05USCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICBkYXRlMSAmJlxuICAgICAgICBkYXRlMiAmJlxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGUxKSA9PT0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlMikgJiZcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZTEpID09PSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aChkYXRlMilcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZVZpZXcuWUVBUikge1xuICAgICAgcmV0dXJuICEhKGRhdGUxICYmIGRhdGUyICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIoZGF0ZTEpID09PSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGUyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsaWQgZGF0ZSBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgZ2V0VmFsaWREYXRlKG9iajogYW55KTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQob2JqKSA/IG9iaiA6IG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvd2wtZHQtY2FsZW5kYXItY29udHJvbFwiPlxuICA8IS0tIGZvY3VzIHdoZW4ga2V5Ym9hcmQgdGFiIChodHRwOi8va2l6dS5ydS9lbi9ibG9nL2tleWJvYXJkLW9ubHktZm9jdXMvI3gpIC0tPlxuICA8YnV0dG9uXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwcmV2QnV0dG9uTGFiZWxcIlxuICAgIFtkaXNhYmxlZF09XCIhcHJldkJ1dHRvbkVuYWJsZWQoKVwiXG4gICAgW3N0eWxlLnZpc2liaWxpdHldPVwic2hvd0NvbnRyb2xBcnJvd3MgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gICAgKGNsaWNrKT1cInByZXZpb3VzQ2xpY2tlZCgpXCJcbiAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sIG93bC1kdC1jb250cm9sLWJ1dHRvbiBvd2wtZHQtY29udHJvbC1hcnJvdy1idXR0b25cIlxuICAgIHRhYmluZGV4PVwiMFwiXG4gICAgdHlwZT1cImJ1dHRvblwiPlxuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sLWNvbnRlbnQgb3dsLWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxuICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgPCEtLSA8ZWRpdG9yLWZvbGQgZGVzYz1cIlNWRyBBcnJvdyBMZWZ0XCI+IC0tPlxuICAgICAgPHN2Z1xuICAgICAgICB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiXG4gICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgICBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDI1MC43MzggMjUwLjczOFwiXG4gICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI1MC43MzggMjUwLjczOFwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIHg9XCIwcHhcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgeT1cIjBweFwiPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNOTYuNjMzLDEyNS4zNjlsOTUuMDUzLTk0LjUzM2M3LjEwMS03LjA1NSw3LjEwMS0xOC40OTIsMC0yNS41NDYgICBjLTcuMS03LjA1NC0xOC42MTMtNy4wNTQtMjUuNzE0LDBMNTguOTg5LDExMS42ODljLTMuNzg0LDMuNzU5LTUuNDg3LDguNzU5LTUuMjM4LDEzLjY4Yy0wLjI0OSw0LjkyMiwxLjQ1NCw5LjkyMSw1LjIzOCwxMy42ODEgICBsMTA2Ljk4MywxMDYuMzk4YzcuMTAxLDcuMDU1LDE4LjYxMyw3LjA1NSwyNS43MTQsMGM3LjEwMS03LjA1NCw3LjEwMS0xOC40OTEsMC0yNS41NDRMOTYuNjMzLDEyNS4zNjl6XCJcbiAgICAgICAgICBzdHlsZT1cImZpbGwtcnVsZTogZXZlbm9kZDsgY2xpcC1ydWxlOiBldmVub2RkXCIgLz5cbiAgICAgIDwvc3ZnPlxuICAgICAgPCEtLSA8L2VkaXRvci1mb2xkPiAtLT5cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8ZGl2IGNsYXNzPVwib3dsLWR0LWNhbGVuZGFyLWNvbnRyb2wtY29udGVudFwiPlxuICAgIDxidXR0b25cbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicGVyaW9kQnV0dG9uTGFiZWxcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVZpZXdzKClcIlxuICAgICAgY2xhc3M9XCJvd2wtZHQtY29udHJvbCBvd2wtZHQtY29udHJvbC1idXR0b24gb3dsLWR0LWNvbnRyb2wtcGVyaW9kLWJ1dHRvblwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtY29udHJvbC1jb250ZW50IG93bC1kdC1jb250cm9sLWJ1dHRvbi1jb250ZW50XCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICB7eyBwZXJpb2RCdXR0b25UZXh0IH19XG5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cIidyb3RhdGUoJyArIChpc01vbnRoVmlldyA/IDAgOiAxODApICsgJ2RlZyknXCJcbiAgICAgICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sLWJ1dHRvbi1hcnJvd1wiPlxuICAgICAgICAgIDwhLS0gPGVkaXRvci1mb2xkIGRlc2M9XCJTVkcgQXJyb3dcIj4gLS0+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgeG1sOnNwYWNlPVwicHJlc2VydmVcIlxuICAgICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjUwJVwiXG4gICAgICAgICAgICBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDI5Mi4zNjIgMjkyLjM2MlwiXG4gICAgICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjkyLjM2MiAyOTIuMzYyXCJcbiAgICAgICAgICAgIHdpZHRoPVwiNTAlXCJcbiAgICAgICAgICAgIHg9XCIwcHhcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICB5PVwiMHB4XCI+XG4gICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTI4Ni45MzUsNjkuMzc3Yy0zLjYxNC0zLjYxNy03Ljg5OC01LjQyNC0xMi44NDgtNS40MjRIMTguMjc0Yy00Ljk1MiwwLTkuMjMzLDEuODA3LTEyLjg1LDUuNDI0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMxLjgwNyw3Mi45OTgsMCw3Ny4yNzksMCw4Mi4yMjhjMCw0Ljk0OCwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDdsMTI3LjkwNywxMjcuOTA3YzMuNjIxLDMuNjE3LDcuOTAyLDUuNDI4LDEyLjg1LDUuNDI4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM5LjIzMy0xLjgxMSwxMi44NDctNS40MjhMMjg2LjkzNSw5NS4wNzRjMy42MTMtMy42MTcsNS40MjctNy44OTgsNS40MjctMTIuODQ3QzI5Mi4zNjIsNzcuMjc5LDI5MC41NDgsNzIuOTk4LDI4Ni45MzUsNjkuMzc3elwiIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPCEtLSA8L2VkaXRvci1mb2xkPiAtLT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGJ1dHRvblxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibmV4dEJ1dHRvbkxhYmVsXCJcbiAgICBbZGlzYWJsZWRdPVwiIW5leHRCdXR0b25FbmFibGVkKClcIlxuICAgIFtzdHlsZS52aXNpYmlsaXR5XT1cInNob3dDb250cm9sQXJyb3dzID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgIChjbGljayk9XCJuZXh0Q2xpY2tlZCgpXCJcbiAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sIG93bC1kdC1jb250cm9sLWJ1dHRvbiBvd2wtZHQtY29udHJvbC1hcnJvdy1idXR0b25cIlxuICAgIHRhYmluZGV4PVwiMFwiXG4gICAgdHlwZT1cImJ1dHRvblwiPlxuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sLWNvbnRlbnQgb3dsLWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxuICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgPCEtLSA8ZWRpdG9yLWZvbGQgZGVzYz1cIlNWRyBBcnJvdyBSaWdodFwiPiAtLT5cbiAgICAgIDxzdmdcbiAgICAgICAgeG1sOnNwYWNlPVwicHJlc2VydmVcIlxuICAgICAgICB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxuICAgICAgICBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDI1MC43MzggMjUwLjczOFwiXG4gICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI1MC43MzggMjUwLjczOFwiXG4gICAgICAgIHg9XCIwcHhcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgeT1cIjBweFwiPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMTkxLjc1LDExMS42ODlMODQuNzY2LDUuMjkxYy03LjEtNy4wNTUtMTguNjEzLTcuMDU1LTI1LjcxMywwXG4gICAgICAgICAgICAgICAgICAgIGMtNy4xMDEsNy4wNTQtNy4xMDEsMTguNDksMCwyNS41NDRsOTUuMDUzLDk0LjUzNGwtOTUuMDUzLDk0LjUzM2MtNy4xMDEsNy4wNTQtNy4xMDEsMTguNDkxLDAsMjUuNTQ1XG4gICAgICAgICAgICAgICAgICAgIGM3LjEsNy4wNTQsMTguNjEzLDcuMDU0LDI1LjcxMywwTDE5MS43NSwxMzkuMDVjMy43ODQtMy43NTksNS40ODctOC43NTksNS4yMzgtMTMuNjgxXG4gICAgICAgICAgICAgICAgICAgIEMxOTcuMjM3LDEyMC40NDcsMTk1LjUzNCwxMTUuNDQ4LDE5MS43NSwxMTEuNjg5elwiXG4gICAgICAgICAgc3R5bGU9XCJmaWxsLXJ1bGU6IGV2ZW5vZGQ7IGNsaXAtcnVsZTogZXZlbm9kZFwiIC8+XG4gICAgICA8L3N2Zz5cbiAgICAgIDwhLS0gPC9lZGl0b3ItZm9sZD4gLS0+XG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuPGRpdlxuICBbbmdTd2l0Y2hdPVwiY3VycmVudFZpZXdcIlxuICBjZGtNb25pdG9yU3VidHJlZUZvY3VzXG4gIGNsYXNzPVwib3dsLWR0LWNhbGVuZGFyLW1haW5cIlxuICB0YWJpbmRleD1cIi0xXCI+XG4gIDxvd2wtZGF0ZS10aW1lLW1vbnRoLXZpZXdcbiAgICAqbmdTd2l0Y2hDYXNlPVwiRGF0ZVZpZXcuTU9OVEhcIlxuICAgIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXJcIlxuICAgIFtmaXJzdERheU9mV2Vla109XCJmaXJzdERheU9mV2Vla1wiXG4gICAgW2hpZGVPdGhlck1vbnRoc109XCJoaWRlT3RoZXJNb250aHNcIlxuICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgIFtwaWNrZXJNb21lbnRdPVwicGlja2VyTW9tZW50XCJcbiAgICBbc2VsZWN0TW9kZV09XCJzZWxlY3RNb2RlXCJcbiAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgIFtzZWxlY3RlZHNdPVwic2VsZWN0ZWRzXCJcbiAgICAocGlja2VyTW9tZW50Q2hhbmdlKT1cImhhbmRsZVBpY2tlck1vbWVudENoYW5nZSgkZXZlbnQpXCJcbiAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiZGF0ZVNlbGVjdGVkKCRldmVudClcIlxuICAgICh1c2VyU2VsZWN0aW9uKT1cInVzZXJTZWxlY3RlZCgpXCI+PC9vd2wtZGF0ZS10aW1lLW1vbnRoLXZpZXc+XG5cbiAgPG93bC1kYXRlLXRpbWUteWVhci12aWV3XG4gICAgKm5nU3dpdGNoQ2FzZT1cIkRhdGVWaWV3LllFQVJcIlxuICAgIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXJcIlxuICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgIFtwaWNrZXJNb21lbnRdPVwicGlja2VyTW9tZW50XCJcbiAgICBbc2VsZWN0TW9kZV09XCJzZWxlY3RNb2RlXCJcbiAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgIFtzZWxlY3RlZHNdPVwic2VsZWN0ZWRzXCJcbiAgICAoY2hhbmdlKT1cImdvVG9EYXRlSW5WaWV3KCRldmVudCwgRGF0ZVZpZXcuTU9OVEgpXCJcbiAgICAoa2V5Ym9hcmRFbnRlcik9XCJmb2N1c0FjdGl2ZUNlbGwoKVwiXG4gICAgKG1vbnRoU2VsZWN0ZWQpPVwic2VsZWN0TW9udGhJblllYXJWaWV3KCRldmVudClcIlxuICAgIChwaWNrZXJNb21lbnRDaGFuZ2UpPVwiaGFuZGxlUGlja2VyTW9tZW50Q2hhbmdlKCRldmVudClcIj48L293bC1kYXRlLXRpbWUteWVhci12aWV3PlxuXG4gIDxvd2wtZGF0ZS10aW1lLW11bHRpLXllYXItdmlld1xuICAgICpuZ1N3aXRjaENhc2U9XCJEYXRlVmlldy5NVUxUSV9ZRUFSU1wiXG4gICAgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiXG4gICAgW21heERhdGVdPVwibWF4RGF0ZVwiXG4gICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgW3BpY2tlck1vbWVudF09XCJwaWNrZXJNb21lbnRcIlxuICAgIFtzZWxlY3RNb2RlXT1cInNlbGVjdE1vZGVcIlxuICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG4gICAgW3NlbGVjdGVkc109XCJzZWxlY3RlZHNcIlxuICAgIChjaGFuZ2UpPVwiZ29Ub0RhdGVJblZpZXcoJGV2ZW50LCBEYXRlVmlldy5ZRUFSKVwiXG4gICAgKGtleWJvYXJkRW50ZXIpPVwiZm9jdXNBY3RpdmVDZWxsKClcIlxuICAgIChwaWNrZXJNb21lbnRDaGFuZ2UpPVwiaGFuZGxlUGlja2VyTW9tZW50Q2hhbmdlKCRldmVudClcIlxuICAgICh5ZWFyU2VsZWN0ZWQpPVwic2VsZWN0WWVhckluTXVsdGlZZWFyVmlldygkZXZlbnQpXCI+PC9vd2wtZGF0ZS10aW1lLW11bHRpLXllYXItdmlldz5cbjwvZGl2PlxuIl19