@gipisistemas/ng-core 1.1.10 → 1.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. package/assets/styles/colors.scss +228 -211
  2. package/assets/styles/styles.scss +50 -5
  3. package/bundles/gipisistemas-ng-core.umd.js +3497 -146
  4. package/bundles/gipisistemas-ng-core.umd.js.map +1 -1
  5. package/bundles/gipisistemas-ng-core.umd.min.js +9 -9
  6. package/bundles/gipisistemas-ng-core.umd.min.js.map +1 -1
  7. package/core/gipi-components/components/abstract-crud.component.d.ts +2 -2
  8. package/core/gipi-components/components/abstract-find.component.d.ts +5 -4
  9. package/core/gipi-components/components/abstract.component.d.ts +1 -0
  10. package/esm2015/core/components/abstract-find.component.js +4 -1
  11. package/esm2015/core/gipi-components/components/abstract-crud.component.js +5 -5
  12. package/esm2015/core/gipi-components/components/abstract-find.component.js +45 -21
  13. package/esm2015/core/gipi-components/components/abstract.component.js +5 -2
  14. package/esm2015/gipi-components.js +19 -6
  15. package/esm2015/gipisistemas-ng-core.js +3 -1
  16. package/esm2015/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
  17. package/esm2015/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
  18. package/esm2015/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
  19. package/esm2015/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
  20. package/esm2015/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +158 -0
  21. package/esm2015/shared/gipi-components/datetime-picker/datetime-picker.module.js +82 -0
  22. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +116 -0
  23. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +676 -0
  24. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +306 -0
  25. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
  26. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
  27. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
  28. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +346 -0
  29. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +83 -0
  30. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
  31. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +451 -0
  32. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +151 -0
  33. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +230 -0
  34. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +43 -0
  35. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +139 -0
  36. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
  37. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +138 -0
  38. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
  39. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +141 -0
  40. package/esm2015/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
  41. package/esm2015/shared/gipi-components/form-field/form-field.component.js +1 -1
  42. package/esm2015/shared/gipi-components/input-currency/input-currency.component.js +1 -1
  43. package/esm2015/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
  44. package/esm2015/shared/gipi-components/input-select/input-select.component.js +1 -1
  45. package/esm2015/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
  46. package/esm2015/shared/gipi-components/radio-group/radio-group.component.js +1 -1
  47. package/esm2015/shared/gipi-components/range-page/range-page.component.js +1 -1
  48. package/esm2015/shared/gipi-components/range-slider/range-slider.component.js +1 -1
  49. package/esm2015/shared/gipi-components/select-button/select-button.component.js +1 -1
  50. package/esm2015/shared/gipi-components/textarea/textarea.component.js +1 -1
  51. package/esm2015/shared/shared.module.js +51 -3
  52. package/esm5/core/components/abstract-find.component.js +4 -1
  53. package/esm5/core/gipi-components/components/abstract-crud.component.js +5 -5
  54. package/esm5/core/gipi-components/components/abstract-find.component.js +45 -21
  55. package/esm5/core/gipi-components/components/abstract.component.js +5 -2
  56. package/esm5/gipi-components.js +19 -6
  57. package/esm5/gipisistemas-ng-core.js +3 -1
  58. package/esm5/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
  59. package/esm5/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
  60. package/esm5/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
  61. package/esm5/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
  62. package/esm5/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +176 -0
  63. package/esm5/shared/gipi-components/datetime-picker/datetime-picker.module.js +85 -0
  64. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +119 -0
  65. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +747 -0
  66. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +332 -0
  67. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
  68. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
  69. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
  70. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +377 -0
  71. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +89 -0
  72. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
  73. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +495 -0
  74. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +160 -0
  75. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +248 -0
  76. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +49 -0
  77. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +145 -0
  78. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
  79. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +141 -0
  80. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
  81. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +151 -0
  82. package/esm5/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
  83. package/esm5/shared/gipi-components/form-field/form-field.component.js +1 -1
  84. package/esm5/shared/gipi-components/input-currency/input-currency.component.js +1 -1
  85. package/esm5/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
  86. package/esm5/shared/gipi-components/input-select/input-select.component.js +1 -1
  87. package/esm5/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
  88. package/esm5/shared/gipi-components/radio-group/radio-group.component.js +1 -1
  89. package/esm5/shared/gipi-components/range-page/range-page.component.js +1 -1
  90. package/esm5/shared/gipi-components/range-slider/range-slider.component.js +1 -1
  91. package/esm5/shared/gipi-components/select-button/select-button.component.js +1 -1
  92. package/esm5/shared/gipi-components/textarea/textarea.component.js +1 -1
  93. package/esm5/shared/shared.module.js +51 -3
  94. package/fesm2015/gipisistemas-ng-core.js +3264 -191
  95. package/fesm2015/gipisistemas-ng-core.js.map +1 -1
  96. package/fesm5/gipisistemas-ng-core.js +3475 -152
  97. package/fesm5/gipisistemas-ng-core.js.map +1 -1
  98. package/gipi-components.d.ts +16 -0
  99. package/gipisistemas-ng-core.d.ts +2 -0
  100. package/gipisistemas-ng-core.metadata.json +1 -1
  101. package/package.json +4 -4
  102. package/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.d.ts +40 -0
  103. package/shared/gipi-components/datetime-picker/datetime-picker.module.d.ts +2 -0
  104. package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.d.ts +50 -0
  105. package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.d.ts +140 -0
  106. package/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.d.ts +66 -0
  107. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.d.ts +8 -0
  108. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.d.ts +2 -0
  109. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.d.ts +5 -0
  110. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.d.ts +98 -0
  111. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.d.ts +20 -0
  112. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.d.ts +1 -0
  113. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.d.ts +133 -0
  114. package/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.d.ts +53 -0
  115. package/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.d.ts +80 -0
  116. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.d.ts +4 -0
  117. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.d.ts +46 -0
  118. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.d.ts +20 -0
  119. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.d.ts +36 -0
  120. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.d.ts +2 -0
  121. package/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.d.ts +52 -0
@@ -0,0 +1,747 @@
1
+ import { __decorate, __metadata, __param } from "tslib";
2
+ import { DOWN_ARROW, END, ENTER, HOME, LEFT_ARROW, PAGE_DOWN, PAGE_UP, RIGHT_ARROW, UP_ARROW, } from '@angular/cdk/keycodes';
3
+ import { AfterContentInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, OnDestroy, Optional, Output, ViewEncapsulation, } from '@angular/core';
4
+ import { MatDatepickerIntl } from '@angular/material/datepicker';
5
+ import { first } from 'rxjs/operators';
6
+ import { slideCalendar } from './datetimepicker-animations';
7
+ import { createMissingDateImplError } from './datetimepicker-errors';
8
+ import { GIPIDatetimepickerFilterType } from './datetimepicker-filtertype';
9
+ import { getActiveOffset, isSameMultiYearView, yearsPerPage, yearsPerRow, } from './multi-year-view';
10
+ import { GIPIDatetimeAdapter } from './shared/adapter/datetime-adapter';
11
+ import { GIPI_DATETIME_FORMATS, } from './shared/adapter/datetime-formats';
12
+ /**
13
+ * A calendar that is used as part of the datepicker.
14
+ * @docs-private
15
+ */
16
+ var GIPIDatetimepickerCalendarComponent = /** @class */ (function () {
17
+ function GIPIDatetimepickerCalendarComponent(_elementRef, _intl, _ngZone, _adapter, _dateFormats, changeDetectorRef) {
18
+ var _this = this;
19
+ this._elementRef = _elementRef;
20
+ this._intl = _intl;
21
+ this._ngZone = _ngZone;
22
+ this._adapter = _adapter;
23
+ this._dateFormats = _dateFormats;
24
+ this._clockView = 'hour';
25
+ /** Active multi year view when click on year. */
26
+ this.multiYearSelector = true;
27
+ /** Whether the calendar should be started in month or year view. */
28
+ this.startView = 'month';
29
+ this.twelvehour = false;
30
+ this.timeInterval = 1;
31
+ this.ariaLabel = 'Use arrow keys to navigate';
32
+ this.ariaNextMonthLabel = 'Next month';
33
+ this.ariaPrevMonthLabel = 'Previous month';
34
+ this.ariaNextYearLabel = 'Next year';
35
+ this.ariaPrevYearLabel = 'Previous year';
36
+ this.ariaNextMultiYearLabel = 'Next year range';
37
+ this.ariaPrevMultiYearLabel = 'Previous year range';
38
+ /** Prevent user to select same date time */
39
+ this.preventSameDateTimeSelection = false;
40
+ this._type = 'date';
41
+ /** Emits when the currently selected date changes. */
42
+ this.selectedChange = new EventEmitter();
43
+ /** Emits when the view has been changed. **/
44
+ this.viewChanged = new EventEmitter();
45
+ this._userSelection = new EventEmitter();
46
+ /** Date filter for the month and year views. */
47
+ this._dateFilterForViews = function (date) {
48
+ return (!!date &&
49
+ (!_this.dateFilter || _this.dateFilter(date, GIPIDatetimepickerFilterType.DATE)) &&
50
+ (!_this.minDate || _this._adapter.compareDate(date, _this.minDate) >= 0) &&
51
+ (!_this.maxDate || _this._adapter.compareDate(date, _this.maxDate) <= 0));
52
+ };
53
+ if (!this._adapter) {
54
+ throw createMissingDateImplError('GIPIDatetimeAdapter');
55
+ }
56
+ if (!this._dateFormats) {
57
+ throw createMissingDateImplError('GIPI_DATETIME_FORMATS');
58
+ }
59
+ this._intlChanges = _intl.changes.subscribe(function () { return changeDetectorRef.markForCheck(); });
60
+ }
61
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "type", {
62
+ get: function () {
63
+ return this._type;
64
+ },
65
+ set: function (value) {
66
+ this._type = value || 'date';
67
+ if (this.type === 'year') {
68
+ this.multiYearSelector = true;
69
+ }
70
+ },
71
+ enumerable: false,
72
+ configurable: true
73
+ });
74
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "startAt", {
75
+ get: function () {
76
+ return this._startAt;
77
+ },
78
+ set: function (value) {
79
+ this._startAt = this._adapter.getValidDateOrNull(value);
80
+ },
81
+ enumerable: false,
82
+ configurable: true
83
+ });
84
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "selected", {
85
+ get: function () {
86
+ return this._selected;
87
+ },
88
+ set: function (value) {
89
+ this._selected = this._adapter.getValidDateOrNull(value);
90
+ },
91
+ enumerable: false,
92
+ configurable: true
93
+ });
94
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "minDate", {
95
+ get: function () {
96
+ return this._minDate;
97
+ },
98
+ set: function (value) {
99
+ this._minDate = this._adapter.getValidDateOrNull(value);
100
+ },
101
+ enumerable: false,
102
+ configurable: true
103
+ });
104
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "maxDate", {
105
+ get: function () {
106
+ return this._maxDate;
107
+ },
108
+ set: function (value) {
109
+ this._maxDate = this._adapter.getValidDateOrNull(value);
110
+ },
111
+ enumerable: false,
112
+ configurable: true
113
+ });
114
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_activeDate", {
115
+ /** The current active date. This determines which time period is shown and which date is highlighted when using keyboard navigation. */
116
+ get: function () {
117
+ return this._clampedActiveDate;
118
+ },
119
+ set: function (value) {
120
+ var oldActiveDate = this._clampedActiveDate;
121
+ this._clampedActiveDate = this._adapter.clampDate(value, this.minDate, this.maxDate);
122
+ if (oldActiveDate &&
123
+ this._clampedActiveDate &&
124
+ this.currentView === 'month' &&
125
+ !this._adapter.sameMonthAndYear(oldActiveDate, this._clampedActiveDate)) {
126
+ if (this._adapter.isInNextMonth(oldActiveDate, this._clampedActiveDate)) {
127
+ this.calendarState('right');
128
+ }
129
+ else {
130
+ this.calendarState('left');
131
+ }
132
+ }
133
+ },
134
+ enumerable: false,
135
+ configurable: true
136
+ });
137
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "currentView", {
138
+ get: function () {
139
+ return this._currentView;
140
+ },
141
+ set: function (view) {
142
+ this._currentView = view;
143
+ this.viewChanged.emit(view);
144
+ },
145
+ enumerable: false,
146
+ configurable: true
147
+ });
148
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_yearLabel", {
149
+ /** The label for the current calendar view. */
150
+ get: function () {
151
+ return this._adapter.getYearName(this._activeDate);
152
+ },
153
+ enumerable: false,
154
+ configurable: true
155
+ });
156
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_monthYearLabel", {
157
+ get: function () {
158
+ if (this.currentView === 'multi-year') {
159
+ // The offset from the active year to the "slot" for the starting year is the
160
+ // *actual* first rendered year in the multi-year view, and the last year is
161
+ // just yearsPerPage - 1 away.
162
+ var activeYear = this._adapter.getYear(this._activeDate);
163
+ var minYearOfPage = activeYear - getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate);
164
+ var maxYearOfPage = minYearOfPage + yearsPerPage - 1;
165
+ var minYearName = this._adapter.getYearName(this._adapter.createDate(minYearOfPage, 0, 1));
166
+ var maxYearName = this._adapter.getYearName(this._adapter.createDate(maxYearOfPage, 0, 1));
167
+ return this._intl.formatYearRange(minYearName, maxYearName);
168
+ }
169
+ return this.currentView === 'month'
170
+ ? this._adapter.getMonthNames('long')[this._adapter.getMonth(this._activeDate)]
171
+ : this._adapter.getYearName(this._activeDate);
172
+ },
173
+ enumerable: false,
174
+ configurable: true
175
+ });
176
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_dateLabel", {
177
+ get: function () {
178
+ switch (this.type) {
179
+ case 'month': return this._adapter.getMonthNames('long')[this._adapter.getMonth(this._activeDate)];
180
+ default: return this._adapter.format(this._activeDate, this._dateFormats.display.popupHeaderDateLabel);
181
+ }
182
+ },
183
+ enumerable: false,
184
+ configurable: true
185
+ });
186
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "periodButtonLabel", {
187
+ get: function () {
188
+ return this.currentView == 'month' ? this._intl.switchToMultiYearViewLabel : this._intl.switchToMonthViewLabel;
189
+ },
190
+ enumerable: false,
191
+ configurable: true
192
+ });
193
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "prevButtonLabel", {
194
+ /** The label for the previous button. */
195
+ get: function () {
196
+ return {
197
+ 'month': this._intl.prevMonthLabel,
198
+ 'year': this._intl.prevYearLabel,
199
+ 'multi-year': this._intl.prevMultiYearLabel
200
+ }[this.currentView];
201
+ },
202
+ enumerable: false,
203
+ configurable: true
204
+ });
205
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "nextButtonLabel", {
206
+ /** The label for the next button. */
207
+ get: function () {
208
+ return {
209
+ 'month': this._intl.nextMonthLabel,
210
+ 'year': this._intl.nextYearLabel,
211
+ 'multi-year': this._intl.nextMultiYearLabel
212
+ }[this.currentView];
213
+ },
214
+ enumerable: false,
215
+ configurable: true
216
+ });
217
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_hoursLabel", {
218
+ get: function () {
219
+ var hour = this._adapter.getHour(this._activeDate);
220
+ if (!!this.twelvehour) {
221
+ if (hour === 0) {
222
+ hour = 24;
223
+ }
224
+ hour = hour > 12 ? hour - 12 : hour;
225
+ }
226
+ return this._2digit(hour);
227
+ },
228
+ enumerable: false,
229
+ configurable: true
230
+ });
231
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_minutesLabel", {
232
+ get: function () {
233
+ return this._2digit(this._adapter.getMinute(this._activeDate));
234
+ },
235
+ enumerable: false,
236
+ configurable: true
237
+ });
238
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_ariaLabelNext", {
239
+ get: function () {
240
+ switch (this._currentView) {
241
+ case 'month': return this.ariaNextMonthLabel;
242
+ case 'year': return this.ariaNextYearLabel;
243
+ case 'multi-year': return this.ariaNextMultiYearLabel;
244
+ default: return '';
245
+ }
246
+ },
247
+ enumerable: false,
248
+ configurable: true
249
+ });
250
+ Object.defineProperty(GIPIDatetimepickerCalendarComponent.prototype, "_ariaLabelPrev", {
251
+ get: function () {
252
+ switch (this._currentView) {
253
+ case 'month': return this.ariaPrevMonthLabel;
254
+ case 'year': return this.ariaPrevYearLabel;
255
+ case 'multi-year': return this.ariaPrevMultiYearLabel;
256
+ default: return '';
257
+ }
258
+ },
259
+ enumerable: false,
260
+ configurable: true
261
+ });
262
+ GIPIDatetimepickerCalendarComponent.prototype.ngAfterContentInit = function () {
263
+ this._activeDate = this.startAt || this._adapter.today();
264
+ this._selectAMPM(this._activeDate);
265
+ this._focusActiveCell();
266
+ if (this.type === 'year') {
267
+ this.currentView = 'multi-year';
268
+ }
269
+ else if (this.type === 'month') {
270
+ this.currentView = 'year';
271
+ }
272
+ else if (this.type === 'time') {
273
+ this.currentView = 'clock';
274
+ }
275
+ else {
276
+ this.currentView = this.startView || 'month';
277
+ }
278
+ };
279
+ GIPIDatetimepickerCalendarComponent.prototype.ngOnDestroy = function () {
280
+ this._intlChanges.unsubscribe();
281
+ };
282
+ GIPIDatetimepickerCalendarComponent.prototype._userSelected = function () {
283
+ this._userSelection.emit();
284
+ };
285
+ /** Handles date selection in the month view. */
286
+ GIPIDatetimepickerCalendarComponent.prototype._dateSelected = function (date) {
287
+ if (this.type === 'date') {
288
+ if (!this._adapter.sameDate(date, this.selected) ||
289
+ !this.preventSameDateTimeSelection) {
290
+ this.selectedChange.emit(date);
291
+ }
292
+ }
293
+ else {
294
+ this._activeDate = date;
295
+ this.currentView = 'clock';
296
+ }
297
+ };
298
+ /** Handles month selection in the year view. */
299
+ GIPIDatetimepickerCalendarComponent.prototype._monthSelected = function (month) {
300
+ if (this.type === 'month') {
301
+ if (!this._adapter.sameMonthAndYear(month, this.selected) ||
302
+ !this.preventSameDateTimeSelection) {
303
+ this.selectedChange.emit(this._adapter.getFirstDateOfMonth(month));
304
+ }
305
+ }
306
+ else {
307
+ this._activeDate = month;
308
+ this.currentView = 'month';
309
+ this._clockView = 'hour';
310
+ }
311
+ };
312
+ /** Handles year selection in the multi year view. */
313
+ GIPIDatetimepickerCalendarComponent.prototype._yearSelected = function (year) {
314
+ if (this.type === 'year') {
315
+ if (!this._adapter.sameYear(year, this.selected) ||
316
+ !this.preventSameDateTimeSelection) {
317
+ var normalizedDate = this._adapter.createDatetime(this._adapter.getYear(year), 0, 1, 0, 0);
318
+ this.selectedChange.emit(normalizedDate);
319
+ }
320
+ }
321
+ else {
322
+ this._activeDate = year;
323
+ this.currentView = 'year';
324
+ }
325
+ };
326
+ GIPIDatetimepickerCalendarComponent.prototype._timeSelected = function (date) {
327
+ if (this._clockView !== 'minute') {
328
+ this._activeDate = this._updateDate(date);
329
+ this._clockView = 'minute';
330
+ }
331
+ else {
332
+ if (!this._adapter.sameDatetime(date, this.selected) ||
333
+ !this.preventSameDateTimeSelection) {
334
+ this.selectedChange.emit(date);
335
+ }
336
+ }
337
+ };
338
+ GIPIDatetimepickerCalendarComponent.prototype._onActiveDateChange = function (date) {
339
+ this._activeDate = date;
340
+ };
341
+ GIPIDatetimepickerCalendarComponent.prototype._updateDate = function (date) {
342
+ if (!!this.twelvehour) {
343
+ var HOUR = this._adapter.getHour(date);
344
+ if (HOUR === 12) {
345
+ if (this._AMPM === 'AM') {
346
+ return this._adapter.addCalendarHours(date, -12);
347
+ }
348
+ }
349
+ else if (this._AMPM === 'PM') {
350
+ return this._adapter.addCalendarHours(date, 12);
351
+ }
352
+ }
353
+ return date;
354
+ };
355
+ GIPIDatetimepickerCalendarComponent.prototype._selectAMPM = function (date) {
356
+ if (this._adapter.getHour(date) > 11) {
357
+ this._AMPM = 'PM';
358
+ }
359
+ else {
360
+ this._AMPM = 'AM';
361
+ }
362
+ };
363
+ GIPIDatetimepickerCalendarComponent.prototype._ampmClicked = function (source) {
364
+ if (source === this._AMPM) {
365
+ return;
366
+ }
367
+ this._AMPM = source;
368
+ if (this._AMPM === 'AM') {
369
+ this._activeDate = this._adapter.addCalendarHours(this._activeDate, -12);
370
+ }
371
+ else {
372
+ this._activeDate = this._adapter.addCalendarHours(this._activeDate, 12);
373
+ }
374
+ };
375
+ GIPIDatetimepickerCalendarComponent.prototype._yearClicked = function () {
376
+ if (this.type === 'year' || this.multiYearSelector) {
377
+ this.currentView = 'multi-year';
378
+ return;
379
+ }
380
+ this.currentView = 'year';
381
+ };
382
+ GIPIDatetimepickerCalendarComponent.prototype._dateClicked = function () {
383
+ if (this.type !== 'month') {
384
+ this.currentView = 'month';
385
+ }
386
+ };
387
+ GIPIDatetimepickerCalendarComponent.prototype._hoursClicked = function () {
388
+ this.currentView = 'clock';
389
+ this._clockView = 'hour';
390
+ };
391
+ GIPIDatetimepickerCalendarComponent.prototype._minutesClicked = function () {
392
+ this.currentView = 'clock';
393
+ this._clockView = 'minute';
394
+ };
395
+ /** Handles user clicks on the previous button. */
396
+ GIPIDatetimepickerCalendarComponent.prototype._previousClicked = function () {
397
+ this._activeDate = this.currentView === 'month'
398
+ ? this._adapter.addCalendarMonths(this._activeDate, -1)
399
+ : this._adapter.addCalendarYears(this._activeDate, this.currentView === 'year' ? -1 : -yearsPerPage);
400
+ };
401
+ /** Handles user clicks on the next button. */
402
+ GIPIDatetimepickerCalendarComponent.prototype._nextClicked = function () {
403
+ this._activeDate = (this.currentView === 'month')
404
+ ? this._adapter.addCalendarMonths(this._activeDate, 1)
405
+ : this._adapter.addCalendarYears(this._activeDate, this.currentView === 'year' ? 1 : yearsPerPage);
406
+ };
407
+ /** Whether the previous period button is enabled. */
408
+ GIPIDatetimepickerCalendarComponent.prototype._previousEnabled = function () {
409
+ if (!this.minDate) {
410
+ return true;
411
+ }
412
+ return !this.minDate || !this._isSameView(this._activeDate, this.minDate);
413
+ };
414
+ /** Whether the next period button is enabled. */
415
+ GIPIDatetimepickerCalendarComponent.prototype._nextEnabled = function () {
416
+ return !this.maxDate || !this._isSameView(this._activeDate, this.maxDate);
417
+ };
418
+ /** Handles keydown events on the calendar body. */
419
+ GIPIDatetimepickerCalendarComponent.prototype._handleCalendarBodyKeydown = function (event) {
420
+ // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
421
+ // disabled ones from being selected. This may not be ideal, we should look into whether
422
+ // navigation should skip over disabled dates, and if so, how to implement that efficiently.
423
+ if (this.currentView === 'month') {
424
+ this._handleCalendarBodyKeydownInMonthView(event);
425
+ }
426
+ else if (this.currentView === 'year') {
427
+ this._handleCalendarBodyKeydownInYearView(event);
428
+ }
429
+ else if (this.currentView === 'multi-year') {
430
+ this._handleCalendarBodyKeydownInMultiYearView(event);
431
+ }
432
+ else {
433
+ this._handleCalendarBodyKeydownInClockView(event);
434
+ }
435
+ };
436
+ GIPIDatetimepickerCalendarComponent.prototype._focusActiveCell = function () {
437
+ var _this = this;
438
+ this._ngZone.runOutsideAngular(function () {
439
+ _this._ngZone.onStable
440
+ .asObservable()
441
+ .pipe(first())
442
+ .subscribe(function () { return _this._elementRef.nativeElement.focus(); });
443
+ });
444
+ };
445
+ GIPIDatetimepickerCalendarComponent.prototype._calendarStateDone = function () {
446
+ this._calendarState = '';
447
+ };
448
+ /** Whether the two dates represent the same view in the current view mode (month or year). */
449
+ GIPIDatetimepickerCalendarComponent.prototype._isSameView = function (date1, date2) {
450
+ if (this.currentView === 'month') {
451
+ return (this._adapter.getYear(date1) === this._adapter.getYear(date2) &&
452
+ this._adapter.getMonth(date1) === this._adapter.getMonth(date2));
453
+ }
454
+ if (this.currentView === 'year') {
455
+ return this._adapter.getYear(date1) === this._adapter.getYear(date2);
456
+ }
457
+ // Otherwise we are in 'multi-year' view.
458
+ return isSameMultiYearView(this._adapter, date1, date2, this.minDate, this.maxDate);
459
+ };
460
+ /** Handles keydown events on the calendar body when calendar is in month view. */
461
+ GIPIDatetimepickerCalendarComponent.prototype._handleCalendarBodyKeydownInMonthView = function (event) {
462
+ switch (event.keyCode) {
463
+ case LEFT_ARROW:
464
+ this._activeDate = this._adapter.addCalendarDays(this._activeDate, -1);
465
+ break;
466
+ case RIGHT_ARROW:
467
+ this._activeDate = this._adapter.addCalendarDays(this._activeDate, 1);
468
+ break;
469
+ case UP_ARROW:
470
+ this._activeDate = this._adapter.addCalendarDays(this._activeDate, -7);
471
+ break;
472
+ case DOWN_ARROW:
473
+ this._activeDate = this._adapter.addCalendarDays(this._activeDate, 7);
474
+ break;
475
+ case HOME:
476
+ this._activeDate = this._adapter.addCalendarDays(this._activeDate, 1 - this._adapter.getDate(this._activeDate));
477
+ break;
478
+ case END:
479
+ this._activeDate = this._adapter.addCalendarDays(this._activeDate, this._adapter.getNumDaysInMonth(this._activeDate) - this._adapter.getDate(this._activeDate));
480
+ break;
481
+ case PAGE_UP:
482
+ this._activeDate = event.altKey
483
+ ? this._adapter.addCalendarYears(this._activeDate, -1)
484
+ : this._adapter.addCalendarMonths(this._activeDate, -1);
485
+ break;
486
+ case PAGE_DOWN:
487
+ this._activeDate = event.altKey
488
+ ? this._adapter.addCalendarYears(this._activeDate, 1)
489
+ : this._adapter.addCalendarMonths(this._activeDate, 1);
490
+ break;
491
+ case ENTER:
492
+ if (this._dateFilterForViews(this._activeDate)) {
493
+ this._dateSelected(this._activeDate);
494
+ // Prevent unexpected default actions such as form submission.
495
+ event.preventDefault();
496
+ }
497
+ return;
498
+ default:
499
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
500
+ return;
501
+ }
502
+ // Prevent unexpected default actions such as form submission.
503
+ event.preventDefault();
504
+ };
505
+ /** Handles keydown events on the calendar body when calendar is in year view. */
506
+ GIPIDatetimepickerCalendarComponent.prototype._handleCalendarBodyKeydownInYearView = function (event) {
507
+ switch (event.keyCode) {
508
+ case LEFT_ARROW:
509
+ this._activeDate = this._adapter.addCalendarMonths(this._activeDate, -1);
510
+ break;
511
+ case RIGHT_ARROW:
512
+ this._activeDate = this._adapter.addCalendarMonths(this._activeDate, 1);
513
+ break;
514
+ case UP_ARROW:
515
+ this._activeDate = this._prevMonthInSameCol(this._activeDate);
516
+ break;
517
+ case DOWN_ARROW:
518
+ this._activeDate = this._nextMonthInSameCol(this._activeDate);
519
+ break;
520
+ case HOME:
521
+ this._activeDate = this._adapter.addCalendarMonths(this._activeDate, -this._adapter.getMonth(this._activeDate));
522
+ break;
523
+ case END:
524
+ this._activeDate = this._adapter.addCalendarMonths(this._activeDate, 11 - this._adapter.getMonth(this._activeDate));
525
+ break;
526
+ case PAGE_UP:
527
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? -10 : -1);
528
+ break;
529
+ case PAGE_DOWN:
530
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? 10 : 1);
531
+ break;
532
+ case ENTER:
533
+ this._monthSelected(this._activeDate);
534
+ break;
535
+ default:
536
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
537
+ return;
538
+ }
539
+ // Prevent unexpected default actions such as form submission.
540
+ event.preventDefault();
541
+ };
542
+ /** Handles keydown events on the calendar body when calendar is in multi-year view. */
543
+ GIPIDatetimepickerCalendarComponent.prototype._handleCalendarBodyKeydownInMultiYearView = function (event) {
544
+ switch (event.keyCode) {
545
+ case LEFT_ARROW:
546
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, -1);
547
+ break;
548
+ case RIGHT_ARROW:
549
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, 1);
550
+ break;
551
+ case UP_ARROW:
552
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, -yearsPerRow);
553
+ break;
554
+ case DOWN_ARROW:
555
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, yearsPerRow);
556
+ break;
557
+ case HOME:
558
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, -getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate));
559
+ break;
560
+ case END:
561
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, yearsPerPage - getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate) - 1);
562
+ break;
563
+ case PAGE_UP:
564
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);
565
+ break;
566
+ case PAGE_DOWN:
567
+ this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);
568
+ break;
569
+ case ENTER:
570
+ this._yearSelected(this._activeDate);
571
+ break;
572
+ default:
573
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
574
+ return;
575
+ }
576
+ };
577
+ /** Handles keydown events on the calendar body when calendar is in month view. */
578
+ GIPIDatetimepickerCalendarComponent.prototype._handleCalendarBodyKeydownInClockView = function (event) {
579
+ switch (event.keyCode) {
580
+ case UP_ARROW:
581
+ this._activeDate = this._clockView === 'hour'
582
+ ? this._adapter.addCalendarHours(this._activeDate, 1)
583
+ : this._adapter.addCalendarMinutes(this._activeDate, 1);
584
+ break;
585
+ case DOWN_ARROW:
586
+ this._activeDate = this._clockView === 'hour'
587
+ ? this._adapter.addCalendarHours(this._activeDate, -1)
588
+ : this._adapter.addCalendarMinutes(this._activeDate, -1);
589
+ break;
590
+ case ENTER:
591
+ this._timeSelected(this._activeDate);
592
+ return;
593
+ default:
594
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
595
+ return;
596
+ }
597
+ // Prevent unexpected default actions such as form submission.
598
+ event.preventDefault();
599
+ };
600
+ /**
601
+ * Determine the date for the month that comes before the given month in the same column in the
602
+ * calendar table.
603
+ */
604
+ GIPIDatetimepickerCalendarComponent.prototype._prevMonthInSameCol = function (date) {
605
+ // Determine how many months to jump forward given that there are 2 empty slots at the beginning of each year.
606
+ var increment = this._adapter.getMonth(date) <= 4 ? -5 : this._adapter.getMonth(date) >= 7 ? -7 : -12;
607
+ return this._adapter.addCalendarMonths(date, increment);
608
+ };
609
+ /**
610
+ * Determine the date for the month that comes after the given month in the same column in the
611
+ * calendar table.
612
+ */
613
+ GIPIDatetimepickerCalendarComponent.prototype._nextMonthInSameCol = function (date) {
614
+ // Determine how many months to jump forward given that there are 2 empty slots at the beginning of each year.
615
+ var increment = this._adapter.getMonth(date) <= 4 ? 7 : this._adapter.getMonth(date) >= 7 ? 5 : 12;
616
+ return this._adapter.addCalendarMonths(date, increment);
617
+ };
618
+ GIPIDatetimepickerCalendarComponent.prototype.calendarState = function (direction) {
619
+ this._calendarState = direction;
620
+ };
621
+ GIPIDatetimepickerCalendarComponent.prototype._2digit = function (n) {
622
+ return ('00' + n).slice(-2);
623
+ };
624
+ GIPIDatetimepickerCalendarComponent.ctorParameters = function () { return [
625
+ { type: ElementRef },
626
+ { type: MatDatepickerIntl },
627
+ { type: NgZone },
628
+ { type: GIPIDatetimeAdapter, decorators: [{ type: Optional }] },
629
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [GIPI_DATETIME_FORMATS,] }] },
630
+ { type: ChangeDetectorRef }
631
+ ]; };
632
+ __decorate([
633
+ Input(),
634
+ __metadata("design:type", Boolean)
635
+ ], GIPIDatetimepickerCalendarComponent.prototype, "multiYearSelector", void 0);
636
+ __decorate([
637
+ Input(),
638
+ __metadata("design:type", String)
639
+ ], GIPIDatetimepickerCalendarComponent.prototype, "startView", void 0);
640
+ __decorate([
641
+ Input(),
642
+ __metadata("design:type", Boolean)
643
+ ], GIPIDatetimepickerCalendarComponent.prototype, "twelvehour", void 0);
644
+ __decorate([
645
+ Input(),
646
+ __metadata("design:type", Number)
647
+ ], GIPIDatetimepickerCalendarComponent.prototype, "timeInterval", void 0);
648
+ __decorate([
649
+ Input(),
650
+ __metadata("design:type", Function)
651
+ ], GIPIDatetimepickerCalendarComponent.prototype, "dateFilter", void 0);
652
+ __decorate([
653
+ Input(),
654
+ __metadata("design:type", Object)
655
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaLabel", void 0);
656
+ __decorate([
657
+ Input(),
658
+ __metadata("design:type", Object)
659
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaNextMonthLabel", void 0);
660
+ __decorate([
661
+ Input(),
662
+ __metadata("design:type", Object)
663
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaPrevMonthLabel", void 0);
664
+ __decorate([
665
+ Input(),
666
+ __metadata("design:type", Object)
667
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaNextYearLabel", void 0);
668
+ __decorate([
669
+ Input(),
670
+ __metadata("design:type", Object)
671
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaPrevYearLabel", void 0);
672
+ __decorate([
673
+ Input(),
674
+ __metadata("design:type", Object)
675
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaNextMultiYearLabel", void 0);
676
+ __decorate([
677
+ Input(),
678
+ __metadata("design:type", Object)
679
+ ], GIPIDatetimepickerCalendarComponent.prototype, "ariaPrevMultiYearLabel", void 0);
680
+ __decorate([
681
+ Input(),
682
+ __metadata("design:type", Object)
683
+ ], GIPIDatetimepickerCalendarComponent.prototype, "preventSameDateTimeSelection", void 0);
684
+ __decorate([
685
+ Input(),
686
+ __metadata("design:type", String),
687
+ __metadata("design:paramtypes", [String])
688
+ ], GIPIDatetimepickerCalendarComponent.prototype, "type", null);
689
+ __decorate([
690
+ Input(),
691
+ __metadata("design:type", Object),
692
+ __metadata("design:paramtypes", [Object])
693
+ ], GIPIDatetimepickerCalendarComponent.prototype, "startAt", null);
694
+ __decorate([
695
+ Input(),
696
+ __metadata("design:type", Object),
697
+ __metadata("design:paramtypes", [Object])
698
+ ], GIPIDatetimepickerCalendarComponent.prototype, "selected", null);
699
+ __decorate([
700
+ Input(),
701
+ __metadata("design:type", Object),
702
+ __metadata("design:paramtypes", [Object])
703
+ ], GIPIDatetimepickerCalendarComponent.prototype, "minDate", null);
704
+ __decorate([
705
+ Input(),
706
+ __metadata("design:type", Object),
707
+ __metadata("design:paramtypes", [Object])
708
+ ], GIPIDatetimepickerCalendarComponent.prototype, "maxDate", null);
709
+ __decorate([
710
+ Output(),
711
+ __metadata("design:type", EventEmitter)
712
+ ], GIPIDatetimepickerCalendarComponent.prototype, "selectedChange", void 0);
713
+ __decorate([
714
+ Output(),
715
+ __metadata("design:type", EventEmitter)
716
+ ], GIPIDatetimepickerCalendarComponent.prototype, "viewChanged", void 0);
717
+ __decorate([
718
+ Output(),
719
+ __metadata("design:type", Object)
720
+ ], GIPIDatetimepickerCalendarComponent.prototype, "_userSelection", void 0);
721
+ GIPIDatetimepickerCalendarComponent = __decorate([
722
+ Component({
723
+ selector: 'gipi-mat-datetime-picker-calendar',
724
+ template: "<div class=\"gipi-mat-datetime-picker-calendar-header\">\n <div class=\"gipi-mat-datetime-picker-calendar-controls\">\n <div *ngIf=\"type !== 'time'\"\n role=\"button\"\n cdkAriaLive=\"polite\"\n class=\"gipi-mat-datetime-picker-calendar-period-button\"\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\"\n [attr.aria-label]=\"periodButtonLabel\"\n (click)=\"_yearClicked()\">\n {{ _yearLabel }}\n\n <div *ngIf=\"multiYearSelector || type === 'year'\"\n class=\"gipi-mat-datetime-picker-calendar-arrow\"\n [class.gipi-mat-datetime-picker-calendar-invert]=\"currentView != 'month'\">\n </div>\n </div>\n\n <div class=\"gipi-mat-datetime-picker-calendar-spacer\"> </div>\n\n <button mat-icon-button\n type=\"button\"\n class=\"gipi-mat-datetime-picker-calendar-previous-button\"\n [disabled]=\"!_previousEnabled()\"\n (click)=\"_previousClicked()\"\n [attr.aria-label]=\"prevButtonLabel\">\n </button>\n\n <button mat-icon-button\n type=\"button\"\n class=\"gipi-mat-datetime-picker-calendar-next-button\"\n [disabled]=\"!_nextEnabled()\"\n (click)=\"_nextClicked()\"\n [attr.aria-label]=\"nextButtonLabel\">\n </button>\n </div>\n\n <div class=\"gipi-mat-datetime-picker-calendar-header-date-time\">\n <span *ngIf=\"type !== 'time' && type !== 'year'\"\n role=\"button\"\n class=\"gipi-mat-datetime-picker-calendar-header-date\"\n [class.active]=\"currentView === 'month'\"\n [class.not-clickable]=\"type === 'month'\"\n (click)=\"_dateClicked()\">\n {{ _dateLabel }}\n </span>\n <span *ngIf=\"type.endsWith('time')\"\n class=\"gipi-mat-datetime-picker-calendar-header-time\"\n [class.active]=\"currentView === 'clock'\">\n <span role=\"button\"\n class=\"gipi-mat-datetime-picker-calendar-header-hours\"\n [class.active]=\"currentView === 'clock' && _clockView === 'hour'\"\n (click)=\"_hoursClicked()\">\n {{ _hoursLabel }}\n </span>\n :\n <span role=\"button\"\n class=\"gipi-mat-datetime-picker-calendar-header-minutes\"\n [class.active]=\"currentView === 'clock' && _clockView === 'minute'\"\n (click)=\"_minutesClicked()\">\n {{ _minutesLabel }}\n </span>\n <br />\n <span *ngIf=\"twelvehour\"\n class=\"gipi-mat-datetime-picker-calendar-header-ampm-container\">\n <span class=\"gipi-mat-datetime-picker-calendar-header-ampm\"\n [class.active]=\"currentView === 'clock' && _AMPM === 'AM'\"\n (click)=\"_ampmClicked('AM')\">\n AM\n </span>\n /\n <span class=\"gipi-mat-datetime-picker-calendar-header-ampm\"\n [class.active]=\"currentView === 'clock' && _AMPM === 'PM'\"\n (click)=\"_ampmClicked('PM')\">\n PM\n </span>\n </span>\n </span>\n </div>\n</div>\n\n<div [ngSwitch]=\"currentView\"\n class=\"gipi-mat-datetime-picker-calendar-content\">\n <!-- <div *ngIf=\"currentView === 'month' || currentView === 'year' || currentView === 'multi-year'\"\n class=\"mat-month-content\">\n <div class=\"gipi-mat-datetime-picker-calendar-controls\">\n <div (click)=\"_previousClicked()\"\n [attr.aria-disabled]=\"!_previousEnabled()\"\n [attr.aria-label]=\"_ariaLabelPrev\"\n [class.disabled]=\"!_previousEnabled()\"\n class=\"gipi-mat-datetime-picker-calendar-previous-button\"\n role=\"button\">\n <svg height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path>\n </svg>\n </div>\n <div (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n class=\"gipi-mat-datetime-picker-calendar-period-button\">\n <strong>{{ _monthYearLabel }}</strong>\n </div>\n <div (click)=\"_nextClicked()\"\n [attr.aria-disabled]=\"!_nextEnabled()\"\n [attr.aria-label]=\"_ariaLabelNext\"\n [class.disabled]=\"!_nextEnabled()\"\n class=\"gipi-mat-datetime-picker-calendar-next-button\"\n role=\"button\">\n <svg height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path>\n </svg>\n </div>\n </div>\n </div> -->\n\n <gipi-mat-datetime-picker-month-view (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_dateSelected($event)\"\n *ngSwitchCase=\"'month'\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected\"\n [type]=\"type\">\n </gipi-mat-datetime-picker-month-view>\n <gipi-mat-datetime-picker-year-view (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_monthSelected($event)\"\n *ngSwitchCase=\"'year'\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected\"\n [type]=\"type\">\n </gipi-mat-datetime-picker-year-view>\n <gipi-mat-datetime-picker-multi-year-view (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_yearSelected($event)\"\n *ngSwitchCase=\"'multi-year'\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [type]=\"type\">\n </gipi-mat-datetime-picker-multi-year-view>\n <gipi-mat-datetime-picker-clock (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_timeSelected($event)\"\n *ngSwitchDefault\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"_activeDate\"\n [startView]=\"_clockView\"\n [twelvehour]=\"twelvehour\">\n </gipi-mat-datetime-picker-clock>\n</div>",
725
+ animations: [slideCalendar],
726
+ encapsulation: ViewEncapsulation.None,
727
+ changeDetection: ChangeDetectionStrategy.OnPush,
728
+ host: {
729
+ '[class.gipi-mat-datetime-picker-calendar]': 'true',
730
+ '[attr.aria-label]': 'ariaLabel',
731
+ role: 'dialog',
732
+ tabindex: '0',
733
+ '(keydown)': '_handleCalendarBodyKeydown($event)',
734
+ },
735
+ styles: [".gipi-mat-datetime-picker-calendar{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;outline:0}.gipi-mat-datetime-picker-calendar[mode=landscape]{display:flex}.gipi-mat-datetime-picker-calendar-header{padding:8px 8px 0;font-size:14px;box-sizing:border-box}[mode=landscape] .gipi-mat-datetime-picker-calendar-header{width:150px;min-width:150px}.gipi-mat-datetime-picker-calendar-controls{display:flex;margin:5% calc(33% / 7 - 16px)}.gipi-mat-datetime-picker-calendar-controls .mat-icon-button:hover .mat-button-focus-overlay{opacity:.04}.gipi-mat-datetime-picker-calendar-spacer{flex:1 1 auto}.gipi-mat-datetime-picker-calendar-period-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:0;line-height:36px;padding:0 16px;border-radius:4px}.gipi-mat-datetime-picker-calendar-arrow{display:inline-block;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top-width:5px;border-top-style:solid;margin:0 0 0 5px;vertical-align:middle}.gipi-mat-datetime-picker-calendar-arrow.gipi-mat-datetime-picker-calendar-invert{transform:rotate(180deg)}[dir=rtl] .gipi-mat-datetime-picker-calendar-arrow{margin:0 5px 0 0}.gipi-mat-datetime-picker-calendar-next-button::after,.gipi-mat-datetime-picker-calendar-previous-button::after{top:0;left:0;right:0;bottom:0;position:absolute;content:'';margin:15.5px;border:0 solid currentColor;border-top-width:2px}[dir=rtl] .gipi-mat-datetime-picker-calendar-next-button,[dir=rtl] .gipi-mat-datetime-picker-calendar-previous-button{transform:rotate(180deg)}.gipi-mat-datetime-picker-calendar-previous-button::after{border-left-width:2px;transform:translateX(2px) rotate(-45deg)}.gipi-mat-datetime-picker-calendar-next-button::after{border-right-width:2px;transform:translateX(-2px) rotate(45deg)}.gipi-mat-datetime-picker-calendar-header-date-time{display:flex;flex-direction:row;align-items:center;justify-content:space-between;width:100%;margin-top:6px;font-weight:500;white-space:nowrap}[mode=landscape] .gipi-mat-datetime-picker-calendar-header-date-time{white-space:normal;word-wrap:break-word;margin-top:0}.gipi-mat-datetime-picker-calendar-header-ampm-container{font-size:.77em}.gipi-mat-datetime-picker-calendar-header-date{display:flex;align-items:center;justify-content:center;border-radius:6px;padding-inline:1rem;font-size:14px;line-height:36px;font-weight:600;transition:.2s}.gipi-mat-datetime-picker-calendar-header-date:not(.active){cursor:pointer;opacity:.6}.gipi-mat-datetime-picker-calendar-header-date:not(.active):hover{background:#f5f5f6;opacity:1}.gipi-mat-datetime-picker-calendar-header-date.active{cursor:pointer;background-color:#f3e7e7;color:#e0313e;opacity:1}.gipi-mat-datetime-picker-calendar-header-date.active:hover{background-color:#e0313e;color:#f3e7e7}.gipi-mat-datetime-picker-calendar-header-date.not-clickable{cursor:initial}.gipi-mat-datetime-picker-calendar-header-ampm,.gipi-mat-datetime-picker-calendar-header-hours,.gipi-mat-datetime-picker-calendar-header-minutes{display:flex;align-items:center;justify-content:center;border-radius:6px;width:36px;height:36px;transition:.2s}.gipi-mat-datetime-picker-calendar-header-ampm:not(.active),.gipi-mat-datetime-picker-calendar-header-hours:not(.active),.gipi-mat-datetime-picker-calendar-header-minutes:not(.active){cursor:pointer;opacity:.6}.gipi-mat-datetime-picker-calendar-header-ampm:not(.active):hover,.gipi-mat-datetime-picker-calendar-header-hours:not(.active):hover,.gipi-mat-datetime-picker-calendar-header-minutes:not(.active):hover{background:#f5f5f6;opacity:1}.gipi-mat-datetime-picker-calendar-header-ampm.active,.gipi-mat-datetime-picker-calendar-header-hours.active,.gipi-mat-datetime-picker-calendar-header-minutes.active{cursor:pointer;background-color:#f3e7e7;color:#e0313e;opacity:1}.gipi-mat-datetime-picker-calendar-header-ampm.active:hover,.gipi-mat-datetime-picker-calendar-header-hours.active:hover,.gipi-mat-datetime-picker-calendar-header-minutes.active:hover{background-color:#e0313e;color:#f3e7e7}.gipi-mat-datetime-picker-calendar-header-ampm.not-clickable,.gipi-mat-datetime-picker-calendar-header-hours.not-clickable,.gipi-mat-datetime-picker-calendar-header-minutes.not-clickable{cursor:initial}.gipi-mat-datetime-picker-calendar-header-time{display:flex;align-items:center;justify-content:center;gap:1px;font-size:24px;line-height:36px;padding-left:8px}.gipi-mat-datetime-picker-calendar-header-time:not(.active){opacity:.6}[mode=landscape] .gipi-mat-datetime-picker-calendar-header-time{display:block;padding-left:0}.gipi-mat-datetime-picker-calendar-content{width:100%;padding:0 8px 8px;outline:0;box-sizing:border-box;overflow:hidden}[mode=landscape] .gipi-mat-datetime-picker-calendar-content{padding-top:8px}.gipi-mat-datetime-picker-calendar-controls{display:flex;justify-content:space-between}.gipi-mat-datetime-picker-calendar-next-button,.gipi-mat-datetime-picker-calendar-previous-button{position:relative;display:inline-block;width:48px;height:48px;padding:12px;outline:0;border:0;cursor:pointer;background:0 0;box-sizing:border-box}.gipi-mat-datetime-picker-calendar-next-button.disabled,.gipi-mat-datetime-picker-calendar-previous-button.disabled{color:rgba(0,0,0,.38);pointer-events:none}.gipi-mat-datetime-picker-calendar-next-button svg,.gipi-mat-datetime-picker-calendar-previous-button svg{fill:currentColor;vertical-align:top}.gipi-mat-datetime-picker-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.gipi-mat-datetime-picker-calendar-table-header{color:rgba(0,0,0,.38)}.gipi-mat-datetime-picker-calendar-table-header th{text-align:center;font-size:11px;padding:0 0 8px}.gipi-mat-datetime-picker-calendar-table-header-divider{position:relative;height:1px}.gipi-mat-datetime-picker-calendar-table-header-divider::after{content:'';position:absolute;top:0;left:-8px;right:-8px;height:1px}@media (min-width:480px){.gipi-mat-datetime-picker-calendar[mode=auto]{display:flex}.gipi-mat-datetime-picker-calendar[mode=auto] .gipi-mat-datetime-picker-calendar-header{width:150px;min-width:150px}.gipi-mat-datetime-picker-calendar[mode=auto] .gipi-mat-datetime-picker-calendar-header-date-time{white-space:normal;word-wrap:break-word}.gipi-mat-datetime-picker-calendar[mode=auto] .gipi-mat-datetime-picker-calendar-header-time{display:block;padding-left:0}.gipi-mat-datetime-picker-calendar[mode=auto] .gipi-mat-datetime-picker-calendar-content{padding-top:8px}}"]
736
+ }),
737
+ __param(3, Optional()),
738
+ __param(4, Optional()), __param(4, Inject(GIPI_DATETIME_FORMATS)),
739
+ __metadata("design:paramtypes", [ElementRef,
740
+ MatDatepickerIntl,
741
+ NgZone,
742
+ GIPIDatetimeAdapter, Object, ChangeDetectorRef])
743
+ ], GIPIDatetimepickerCalendarComponent);
744
+ return GIPIDatetimepickerCalendarComponent;
745
+ }());
746
+ export { GIPIDatetimepickerCalendarComponent };
747
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZ2lwaXNpc3RlbWFzL25nLWNvcmUvIiwic291cmNlcyI6WyJzaGFyZWQvZ2lwaS1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlci9tYXQtZGF0ZXRpbWUtcGlja2VyL2NhbGVuZGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFDMU0sT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxXQUFXLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUscUJBQXFCLEdBQXdCLE1BQU0sbUNBQW1DLENBQUM7QUFJaEc7OztHQUdHO0FBZ0JIO0lBeU1JLDZDQUNZLFdBQXVCLEVBQ3ZCLEtBQXdCLEVBQ3hCLE9BQWUsRUFDSCxRQUFnQyxFQUNELFlBQWlDLEVBQ3BGLGlCQUFvQztRQU54QyxpQkFlQztRQWRXLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDSCxhQUFRLEdBQVIsUUFBUSxDQUF3QjtRQUNELGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQTNNeEYsZUFBVSxHQUFrQixNQUFNLENBQUM7UUFNbkMsaURBQWlEO1FBQ3hDLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUUzQyxvRUFBb0U7UUFDM0QsY0FBUyxHQUFxQixPQUFPLENBQUM7UUFDdEMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUl6QixjQUFTLEdBQUcsNEJBQTRCLENBQUM7UUFDekMsdUJBQWtCLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLHVCQUFrQixHQUFHLGdCQUFnQixDQUFDO1FBQ3RDLHNCQUFpQixHQUFHLFdBQVcsQ0FBQztRQUNoQyxzQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFDcEMsMkJBQXNCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsMkJBQXNCLEdBQUcscUJBQXFCLENBQUM7UUFFeEQsNENBQTRDO1FBQ25DLGlDQUE0QixHQUFHLEtBQUssQ0FBQztRQUV0QyxVQUFLLEdBQTJCLE1BQU0sQ0FBQztRQWdEL0Msc0RBQXNEO1FBQzVDLG1CQUFjLEdBQW9CLElBQUksWUFBWSxFQUFLLENBQUM7UUFFbEUsNkNBQTZDO1FBQ25DLGdCQUFXLEdBQW1DLElBQUksWUFBWSxFQUFvQixDQUFDO1FBQ25GLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQTBKcEQsZ0RBQWdEO1FBQ2hELHdCQUFtQixHQUFHLFVBQUMsSUFBTztZQUMxQixPQUFPLENBQ0gsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLEtBQUksQ0FBQyxVQUFVLElBQUksS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlFLENBQUMsQ0FBQyxLQUFJLENBQUMsT0FBTyxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxDQUFDLENBQUMsS0FBSSxDQUFDLE9BQU8sSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN4RSxDQUFDO1FBQ04sQ0FBQyxDQUFDO1FBcENFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE1BQU0sMEJBQTBCLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BCLE1BQU0sMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUM3RDtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBTSxPQUFBLGlCQUFpQixDQUFDLFlBQVksRUFBRSxFQUFoQyxDQUFnQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQXpMUSxzQkFBSSxxREFBSTthQUFSO1lBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RCLENBQUM7YUFDRCxVQUFTLEtBQTZCO1lBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQztZQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUN0QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQ2pDO1FBQ0wsQ0FBQzs7O09BTkE7SUFVUSxzQkFBSSx3REFBTzthQUFYO1lBQ0wsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pCLENBQUM7YUFDRCxVQUFZLEtBQWU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7OztPQUhBO0lBT1Esc0JBQUkseURBQVE7YUFBWjtZQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixDQUFDO2FBRUQsVUFBYSxLQUFlO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDOzs7T0FKQTtJQVFRLHNCQUFJLHdEQUFPO2FBQVg7WUFDTCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQzthQUNELFVBQVksS0FBZTtZQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsQ0FBQzs7O09BSEE7SUFPUSxzQkFBSSx3REFBTzthQUFYO1lBQ0wsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pCLENBQUM7YUFDRCxVQUFZLEtBQWU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7OztPQUhBO0lBYUQsc0JBQUksNERBQVc7UUFEZix3SUFBd0k7YUFDeEk7WUFDSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNuQyxDQUFDO2FBQ0QsVUFBZ0IsS0FBUTtZQUNwQixJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRixJQUNJLGFBQWE7Z0JBQ2IsSUFBSSxDQUFDLGtCQUFrQjtnQkFDdkIsSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPO2dCQUM1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUN6RTtnQkFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTtvQkFDckUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDL0I7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDOUI7YUFDSjtRQUNMLENBQUM7OztPQWhCQTtJQW9CRCxzQkFBSSw0REFBVzthQUFmO1lBQ0ksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzdCLENBQUM7YUFDRCxVQUFnQixJQUFzQjtZQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDOzs7T0FKQTtJQU9ELHNCQUFJLDJEQUFVO1FBRGQsK0NBQStDO2FBQy9DO1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkQsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxnRUFBZTthQUFuQjtZQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLEVBQUU7Z0JBQ25DLDZFQUE2RTtnQkFDN0UsNEVBQTRFO2dCQUM1RSw4QkFBOEI7Z0JBQzlCLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0QsSUFBTSxhQUFhLEdBQUcsVUFBVSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hILElBQU0sYUFBYSxHQUFHLGFBQWEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDL0Q7WUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTztnQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDL0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RCxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDJEQUFVO2FBQWQ7WUFDSSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2YsS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNuRyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUMxRztRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksa0VBQWlCO2FBQXJCO1lBQ0ksT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUNuSCxDQUFDOzs7T0FBQTtJQUdELHNCQUFJLGdFQUFlO1FBRG5CLHlDQUF5QzthQUN6QztZQUNJLE9BQU87Z0JBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztnQkFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDaEMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCO2FBQzlDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksZ0VBQWU7UUFEbkIscUNBQXFDO2FBQ3JDO1lBQ0ksT0FBTztnQkFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjO2dCQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO2dCQUNoQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7YUFDOUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw0REFBVzthQUFmO1lBQ0ksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtvQkFDWixJQUFJLEdBQUcsRUFBRSxDQUFDO2lCQUNiO2dCQUNELElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDdkM7WUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw4REFBYTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLCtEQUFjO2FBQWxCO1lBQ0ksUUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN2QixLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUM3QyxLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUMzQyxLQUFLLFlBQVksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dCQUN0RCxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN0QjtRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0RBQWM7YUFBbEI7WUFDSSxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3ZCLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7Z0JBQzdDLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQzNDLEtBQUssWUFBWSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3RELE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3RCO1FBQ0wsQ0FBQzs7O09BQUE7SUFtQkQsZ0VBQWtCLEdBQWxCO1FBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztTQUNuQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7U0FDN0I7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1NBQzlCO2FBQU07WUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDO1NBQ2hEO0lBQ0wsQ0FBQztJQUVELHlEQUFXLEdBQVg7UUFDSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFZRCwyREFBYSxHQUFiO1FBQ0ksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELDJEQUFhLEdBQWIsVUFBYyxJQUFPO1FBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDdEIsSUFDSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM1QyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFDcEM7Z0JBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELDREQUFjLEdBQWQsVUFBZSxLQUFRO1FBQ25CLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDdkIsSUFDSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3JELENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUNwQztnQkFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdEU7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELDJEQUFhLEdBQWIsVUFBYyxJQUFPO1FBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDdEIsSUFDSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM1QyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFDcEM7Z0JBQ0UsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQzVDO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVELDJEQUFhLEdBQWIsVUFBYyxJQUFPO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1NBQzlCO2FBQU07WUFDSCxJQUNJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2hELENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUNwQztnQkFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNsQztTQUNKO0lBQ0wsQ0FBQztJQUVELGlFQUFtQixHQUFuQixVQUFvQixJQUFPO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCx5REFBVyxHQUFYLFVBQVksSUFBTztRQUNmLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUNiLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUM1QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ25EO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQseURBQVcsR0FBWCxVQUFZLElBQU87UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNyQjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDckI7SUFDTCxDQUFDO0lBRUQsMERBQVksR0FBWixVQUFhLE1BQWM7UUFDdkIsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN2QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzNFO0lBQ0wsQ0FBQztJQUVELDBEQUFZLEdBQVo7UUFDSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNoRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztZQUNoQyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztJQUM5QixDQUFDO0lBRUQsMERBQVksR0FBWjtRQUNJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQsMkRBQWEsR0FBYjtRQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBQzdCLENBQUM7SUFFRCw2REFBZSxHQUFmO1FBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDL0IsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCw4REFBZ0IsR0FBaEI7UUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTztZQUMzQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsMERBQVksR0FBWjtRQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQztZQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsOERBQWdCLEdBQWhCO1FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxpREFBaUQ7SUFDakQsMERBQVksR0FBWjtRQUNJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELHdFQUEwQixHQUExQixVQUEyQixLQUFvQjtRQUMzQyw2RkFBNkY7UUFDN0Ysd0ZBQXdGO1FBQ3hGLDRGQUE0RjtRQUM1RixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxFQUFFO1lBQzlCLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7WUFDcEMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksRUFBRTtZQUMxQyxJQUFJLENBQUMseUNBQXlDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNILElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRDtJQUNMLENBQUM7SUFFRCw4REFBZ0IsR0FBaEI7UUFBQSxpQkFPQztRQU5HLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDM0IsS0FBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2lCQUNoQixZQUFZLEVBQUU7aUJBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNiLFNBQVMsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQXRDLENBQXNDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnRUFBa0IsR0FBbEI7UUFDSSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsOEZBQThGO0lBQ3RGLHlEQUFXLEdBQW5CLFVBQW9CLEtBQVEsRUFBRSxLQUFRO1FBQ2xDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLEVBQUU7WUFDOUIsT0FBTyxDQUNILElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ2xFLENBQUM7U0FDTDtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RTtRQUNELHlDQUF5QztRQUN6QyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsa0ZBQWtGO0lBQzFFLG1GQUFxQyxHQUE3QyxVQUE4QyxLQUFvQjtRQUM5RCxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbkIsS0FBSyxVQUFVO2dCQUNYLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNO1lBQ1YsS0FBSyxXQUFXO2dCQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkUsTUFBTTtZQUNWLEtBQUssVUFBVTtnQkFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU07WUFDVixLQUFLLElBQUk7Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDaEgsTUFBTTtZQUNWLEtBQUssR0FBRztnQkFDSixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hLLE1BQU07WUFDVixLQUFLLE9BQU87Z0JBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTTtvQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNO1lBQ1YsS0FBSyxTQUFTO2dCQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU07b0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3JDLDhEQUE4RDtvQkFDOUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUMxQjtnQkFDRCxPQUFPO1lBQ1g7Z0JBQ0ksc0ZBQXNGO2dCQUN0RixPQUFPO1NBQ2Q7UUFFRCw4REFBOEQ7UUFDOUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxpRkFBaUY7SUFDekUsa0ZBQW9DLEdBQTVDLFVBQTZDLEtBQW9CO1FBQzdELFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLFVBQVU7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekUsTUFBTTtZQUNWLEtBQUssV0FBVztnQkFDWixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEUsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzlELE1BQU07WUFDVixLQUFLLFVBQVU7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hILE1BQU07WUFDVixLQUFLLEdBQUc7Z0JBQ0osSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNwSCxNQUFNO1lBQ1YsS0FBSyxPQUFPO2dCQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RixNQUFNO1lBQ1YsS0FBSyxTQUFTO2dCQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLE1BQU07WUFDVixLQUFLLEtBQUs7Z0JBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU07WUFDVjtnQkFDSSxzRkFBc0Y7Z0JBQ3RGLE9BQU87U0FDZDtRQUVELDhEQUE4RDtRQUM5RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELHVGQUF1RjtJQUMvRSx1RkFBeUMsR0FBakQsVUFBa0QsS0FBb0I7UUFDbEUsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25CLEtBQUssVUFBVTtnQkFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNO1lBQ1YsS0FBSyxXQUFXO2dCQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2xGLE1BQU07WUFDVixLQUFLLFVBQVU7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU07WUFDVixLQUFLLElBQUk7Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ25KLE1BQU07WUFDVixLQUFLLEdBQUc7Z0JBQ0osSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JLLE1BQU07WUFDVixLQUFLLE9BQU87Z0JBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2SCxNQUFNO1lBQ1YsS0FBSyxTQUFTO2dCQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNySCxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNO1lBQ1Y7Z0JBQ0ksc0ZBQXNGO2dCQUN0RixPQUFPO1NBQ2Q7SUFDTCxDQUFDO0lBRUQsa0ZBQWtGO0lBQzFFLG1GQUFxQyxHQUE3QyxVQUE4QyxLQUFvQjtRQUM5RCxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbkIsS0FBSyxRQUFRO2dCQUNULElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNO29CQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUQsTUFBTTtZQUNWLEtBQUssVUFBVTtnQkFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTTtvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPO1lBQ1g7Z0JBQ0ksc0ZBQXNGO2dCQUN0RixPQUFPO1NBQ2Q7UUFFRCw4REFBOEQ7UUFDOUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxpRUFBbUIsR0FBM0IsVUFBNEIsSUFBTztRQUMvQiw4R0FBOEc7UUFDOUcsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEcsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssaUVBQW1CLEdBQTNCLFVBQTRCLElBQU87UUFDL0IsOEdBQThHO1FBQzlHLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JHLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLDJEQUFhLEdBQXJCLFVBQXNCLFNBQWlCO1FBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxxREFBTyxHQUFmLFVBQWdCLENBQVM7UUFDckIsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDOztnQkFoYXdCLFVBQVU7Z0JBQ2hCLGlCQUFpQjtnQkFDZixNQUFNO2dCQUNPLG1CQUFtQix1QkFBaEQsUUFBUTtnREFDUixRQUFRLFlBQUksTUFBTSxTQUFDLHFCQUFxQjtnQkFDdEIsaUJBQWlCOztJQXJNL0I7UUFBUixLQUFLLEVBQUU7O2tGQUFtQztJQUdsQztRQUFSLEtBQUssRUFBRTs7MEVBQXVDO0lBQ3RDO1FBQVIsS0FBSyxFQUFFOzsyRUFBNkI7SUFDNUI7UUFBUixLQUFLLEVBQUU7OzZFQUEwQjtJQUd6QjtRQUFSLEtBQUssRUFBRTs7MkVBQXNFO0lBQ3JFO1FBQVIsS0FBSyxFQUFFOzswRUFBMEM7SUFDekM7UUFBUixLQUFLLEVBQUU7O21GQUFtQztJQUNsQztRQUFSLEtBQUssRUFBRTs7bUZBQXVDO0lBQ3RDO1FBQVIsS0FBSyxFQUFFOztrRkFBaUM7SUFDaEM7UUFBUixLQUFLLEVBQUU7O2tGQUFxQztJQUNwQztRQUFSLEtBQUssRUFBRTs7dUZBQTRDO0lBQzNDO1FBQVIsS0FBSyxFQUFFOzt1RkFBZ0Q7SUFHL0M7UUFBUixLQUFLLEVBQUU7OzZGQUFzQztJQUdyQztRQUFSLEtBQUssRUFBRTs7O21FQUVQO0lBVVE7UUFBUixLQUFLLEVBQUU7OztzRUFFUDtJQU9RO1FBQVIsS0FBSyxFQUFFOzs7dUVBRVA7SUFRUTtRQUFSLEtBQUssRUFBRTs7O3NFQUVQO0lBT1E7UUFBUixLQUFLLEVBQUU7OztzRUFFUDtJQU1TO1FBQVQsTUFBTSxFQUFFO2tDQUFpQixZQUFZOytFQUE0QjtJQUd4RDtRQUFULE1BQU0sRUFBRTtrQ0FBYyxZQUFZOzRFQUEwRDtJQUNuRjtRQUFULE1BQU0sRUFBRTs7K0VBQTJDO0lBbkYzQyxtQ0FBbUM7UUFmL0MsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG1DQUFtQztZQUM3QyxxdFBBQTRCO1lBRTVCLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUMzQixhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtZQUNyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtZQUMvQyxJQUFJLEVBQUU7Z0JBQ0YsMkNBQTJDLEVBQUUsTUFBTTtnQkFDbkQsbUJBQW1CLEVBQUUsV0FBVztnQkFDaEMsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLG9DQUFvQzthQUNwRDs7U0FDSixDQUFDO1FBOE1PLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQTt5Q0FKckIsVUFBVTtZQUNoQixpQkFBaUI7WUFDZixNQUFNO1lBQ08sbUJBQW1CLFVBRTlCLGlCQUFpQjtPQS9NL0IsbUNBQW1DLENBNG1CL0M7SUFBRCwwQ0FBQztDQUFBLEFBNW1CRCxJQTRtQkM7U0E1bUJZLG1DQUFtQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPV05fQVJST1csIEVORCwgRU5URVIsIEhPTUUsIExFRlRfQVJST1csIFBBR0VfRE9XTiwgUEFHRV9VUCwgUklHSFRfQVJST1csIFVQX0FSUk9XLCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VySW50bCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgR0lQSUNsb2NrVmlldyB9IGZyb20gJy4vY2xvY2snO1xuaW1wb3J0IHsgc2xpZGVDYWxlbmRhciB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvciB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItZXJyb3JzJztcbmltcG9ydCB7IEdJUElEYXRldGltZXBpY2tlckZpbHRlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLWZpbHRlcnR5cGUnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lcGlja2VyVHlwZSB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItdHlwZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmVPZmZzZXQsIGlzU2FtZU11bHRpWWVhclZpZXcsIHllYXJzUGVyUGFnZSwgeWVhcnNQZXJSb3csIH0gZnJvbSAnLi9tdWx0aS15ZWFyLXZpZXcnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lQWRhcHRlciB9IGZyb20gJy4vc2hhcmVkL2FkYXB0ZXIvZGF0ZXRpbWUtYWRhcHRlcic7XG5pbXBvcnQgeyBHSVBJX0RBVEVUSU1FX0ZPUk1BVFMsIEdJUElEYXRldGltZUZvcm1hdHMsIH0gZnJvbSAnLi9zaGFyZWQvYWRhcHRlci9kYXRldGltZS1mb3JtYXRzJztcblxuZXhwb3J0IHR5cGUgR0lQSUNhbGVuZGFyVmlldyA9ICdjbG9jaycgfCAnbW9udGgnIHwgJ3llYXInIHwgJ211bHRpLXllYXInO1xuXG4vKipcbiAqIEEgY2FsZW5kYXIgdGhhdCBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlIGRhdGVwaWNrZXIuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NhbGVuZGFyLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydjYWxlbmRhci5zY3NzJ10sXG4gICAgYW5pbWF0aW9uczogW3NsaWRlQ2FsZW5kYXJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLmdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1jYWxlbmRhcl0nOiAndHJ1ZScsXG4gICAgICAgICdbYXR0ci5hcmlhLWxhYmVsXSc6ICdhcmlhTGFiZWwnLFxuICAgICAgICByb2xlOiAnZGlhbG9nJyxcbiAgICAgICAgdGFiaW5kZXg6ICcwJyxcbiAgICAgICAgJyhrZXlkb3duKSc6ICdfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bigkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBHSVBJRGF0ZXRpbWVwaWNrZXJDYWxlbmRhckNvbXBvbmVudDxEPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBfQU1QTTogc3RyaW5nO1xuICAgIF9jbG9ja1ZpZXc6IEdJUElDbG9ja1ZpZXcgPSAnaG91cic7XG4gICAgX2NhbGVuZGFyU3RhdGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgX2ludGxDaGFuZ2VzOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBfY2xhbXBlZEFjdGl2ZURhdGU6IEQ7XG5cbiAgICAvKiogQWN0aXZlIG11bHRpIHllYXIgdmlldyB3aGVuIGNsaWNrIG9uIHllYXIuICovXG4gICAgQElucHV0KCkgbXVsdGlZZWFyU2VsZWN0b3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIHNob3VsZCBiZSBzdGFydGVkIGluIG1vbnRoIG9yIHllYXIgdmlldy4gKi9cbiAgICBASW5wdXQoKSBzdGFydFZpZXc6IEdJUElDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIEBJbnB1dCgpIHR3ZWx2ZWhvdXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSB0aW1lSW50ZXJ2YWw6IG51bWJlciA9IDE7XG5cbiAgICAvKiogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZS4gKi9cbiAgICBASW5wdXQoKSBkYXRlRmlsdGVyOiAoZGF0ZTogRCwgdHlwZTogR0lQSURhdGV0aW1lcGlja2VyRmlsdGVyVHlwZSkgPT4gYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgPSAnVXNlIGFycm93IGtleXMgdG8gbmF2aWdhdGUnO1xuICAgIEBJbnB1dCgpIGFyaWFOZXh0TW9udGhMYWJlbCA9ICdOZXh0IG1vbnRoJztcbiAgICBASW5wdXQoKSBhcmlhUHJldk1vbnRoTGFiZWwgPSAnUHJldmlvdXMgbW9udGgnO1xuICAgIEBJbnB1dCgpIGFyaWFOZXh0WWVhckxhYmVsID0gJ05leHQgeWVhcic7XG4gICAgQElucHV0KCkgYXJpYVByZXZZZWFyTGFiZWwgPSAnUHJldmlvdXMgeWVhcic7XG4gICAgQElucHV0KCkgYXJpYU5leHRNdWx0aVllYXJMYWJlbCA9ICdOZXh0IHllYXIgcmFuZ2UnO1xuICAgIEBJbnB1dCgpIGFyaWFQcmV2TXVsdGlZZWFyTGFiZWwgPSAnUHJldmlvdXMgeWVhciByYW5nZSc7XG5cbiAgICAvKiogUHJldmVudCB1c2VyIHRvIHNlbGVjdCBzYW1lIGRhdGUgdGltZSAqL1xuICAgIEBJbnB1dCgpIHByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX3R5cGU6IEdJUElEYXRldGltZXBpY2tlclR5cGUgPSAnZGF0ZSc7XG4gICAgQElucHV0KCkgZ2V0IHR5cGUoKTogR0lQSURhdGV0aW1lcGlja2VyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cbiAgICBzZXQgdHlwZSh2YWx1ZTogR0lQSURhdGV0aW1lcGlja2VyVHlwZSkge1xuICAgICAgICB0aGlzLl90eXBlID0gdmFsdWUgfHwgJ2RhdGUnO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlZZWFyU2VsZWN0b3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgZGF0ZSByZXByZXNlbnRpbmcgdGhlIHBlcmlvZCAobW9udGggb3IgeWVhcikgdG8gc3RhcnQgdGhlIGNhbGVuZGFyIGluLiAqL1xuICAgIHByaXZhdGUgX3N0YXJ0QXQ6IEQgfCBudWxsO1xuICAgIEBJbnB1dCgpIGdldCBzdGFydEF0KCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0QXQ7XG4gICAgfVxuICAgIHNldCBzdGFydEF0KHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9zdGFydEF0ID0gdGhpcy5fYWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUuICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IEQgfCBudWxsO1xuICAgIEBJbnB1dCgpIGdldCBzZWxlY3RlZCgpOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5fYWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgcHJpdmF0ZSBfbWluRGF0ZTogRCB8IG51bGw7XG4gICAgQElucHV0KCkgZ2V0IG1pbkRhdGUoKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG4gICAgc2V0IG1pbkRhdGUodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLl9hZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgICBwcml2YXRlIF9tYXhEYXRlOiBEIHwgbnVsbDtcbiAgICBASW5wdXQoKSBnZXQgbWF4RGF0ZSgpOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cbiAgICBzZXQgbWF4RGF0ZSh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMuX2FkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSB2aWV3IGhhcyBiZWVuIGNoYW5nZWQuICoqL1xuICAgIEBPdXRwdXQoKSB2aWV3Q2hhbmdlZDogRXZlbnRFbWl0dGVyPEdJUElDYWxlbmRhclZpZXc+ID0gbmV3IEV2ZW50RW1pdHRlcjxHSVBJQ2FsZW5kYXJWaWV3PigpO1xuICAgIEBPdXRwdXQoKSBfdXNlclNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBUaGUgY3VycmVudCBhY3RpdmUgZGF0ZS4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIHRpbWUgcGVyaW9kIGlzIHNob3duIGFuZCB3aGljaCBkYXRlIGlzIGhpZ2hsaWdodGVkIHdoZW4gdXNpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbi4gKi9cbiAgICBnZXQgX2FjdGl2ZURhdGUoKTogRCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZTtcbiAgICB9XG4gICAgc2V0IF9hY3RpdmVEYXRlKHZhbHVlOiBEKSB7XG4gICAgICAgIGNvbnN0IG9sZEFjdGl2ZURhdGUgPSB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZTtcbiAgICAgICAgdGhpcy5fY2xhbXBlZEFjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmNsYW1wRGF0ZSh2YWx1ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBvbGRBY3RpdmVEYXRlICYmXG4gICAgICAgICAgICB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZSAmJlxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJyAmJlxuICAgICAgICAgICAgIXRoaXMuX2FkYXB0ZXIuc2FtZU1vbnRoQW5kWWVhcihvbGRBY3RpdmVEYXRlLCB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWRhcHRlci5pc0luTmV4dE1vbnRoKG9sZEFjdGl2ZURhdGUsIHRoaXMuX2NsYW1wZWRBY3RpdmVEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTdGF0ZSgncmlnaHQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclN0YXRlKCdsZWZ0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgaW4gbW9udGggdmlldy4gKi9cbiAgICBfY3VycmVudFZpZXc6IEdJUElDYWxlbmRhclZpZXc7XG4gICAgZ2V0IGN1cnJlbnRWaWV3KCk6IEdJUElDYWxlbmRhclZpZXcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFZpZXc7XG4gICAgfVxuICAgIHNldCBjdXJyZW50Vmlldyh2aWV3OiBHSVBJQ2FsZW5kYXJWaWV3KSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRWaWV3ID0gdmlldztcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlZC5lbWl0KHZpZXcpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbGFiZWwgZm9yIHRoZSBjdXJyZW50IGNhbGVuZGFyIHZpZXcuICovXG4gICAgZ2V0IF95ZWFyTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuZ2V0WWVhck5hbWUodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgfVxuXG4gICAgZ2V0IF9tb250aFllYXJMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ211bHRpLXllYXInKSB7XG4gICAgICAgICAgICAvLyBUaGUgb2Zmc2V0IGZyb20gdGhlIGFjdGl2ZSB5ZWFyIHRvIHRoZSBcInNsb3RcIiBmb3IgdGhlIHN0YXJ0aW5nIHllYXIgaXMgdGhlXG4gICAgICAgICAgICAvLyAqYWN0dWFsKiBmaXJzdCByZW5kZXJlZCB5ZWFyIGluIHRoZSBtdWx0aS15ZWFyIHZpZXcsIGFuZCB0aGUgbGFzdCB5ZWFyIGlzXG4gICAgICAgICAgICAvLyBqdXN0IHllYXJzUGVyUGFnZSAtIDEgYXdheS5cbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9hZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBtaW5ZZWFyT2ZQYWdlID0gYWN0aXZlWWVhciAtIGdldEFjdGl2ZU9mZnNldCh0aGlzLl9hZGFwdGVyLCB0aGlzLl9hY3RpdmVEYXRlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBtYXhZZWFyT2ZQYWdlID0gbWluWWVhck9mUGFnZSArIHllYXJzUGVyUGFnZSAtIDE7XG4gICAgICAgICAgICBjb25zdCBtaW5ZZWFyTmFtZSA9IHRoaXMuX2FkYXB0ZXIuZ2V0WWVhck5hbWUodGhpcy5fYWRhcHRlci5jcmVhdGVEYXRlKG1pblllYXJPZlBhZ2UsIDAsIDEpKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFllYXJOYW1lID0gdGhpcy5fYWRhcHRlci5nZXRZZWFyTmFtZSh0aGlzLl9hZGFwdGVyLmNyZWF0ZURhdGUobWF4WWVhck9mUGFnZSwgMCwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGwuZm9ybWF0WWVhclJhbmdlKG1pblllYXJOYW1lLCBtYXhZZWFyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJ1xuICAgICAgICAgICAgPyB0aGlzLl9hZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKVt0aGlzLl9hZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpXVxuICAgICAgICAgICAgOiB0aGlzLl9hZGFwdGVyLmdldFllYXJOYW1lKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIH1cblxuICAgIGdldCBfZGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IHJldHVybiB0aGlzLl9hZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKVt0aGlzLl9hZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpXTtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh0aGlzLl9hY3RpdmVEYXRlLCB0aGlzLl9kYXRlRm9ybWF0cy5kaXNwbGF5LnBvcHVwSGVhZGVyRGF0ZUxhYmVsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBwZXJpb2RCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmlldyA9PSAnbW9udGgnID8gdGhpcy5faW50bC5zd2l0Y2hUb011bHRpWWVhclZpZXdMYWJlbCA6IHRoaXMuX2ludGwuc3dpdGNoVG9Nb250aFZpZXdMYWJlbDtcbiAgICB9XG5cbiAgICAvKiogVGhlIGxhYmVsIGZvciB0aGUgcHJldmlvdXMgYnV0dG9uLiAqL1xuICAgIGdldCBwcmV2QnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdtb250aCc6IHRoaXMuX2ludGwucHJldk1vbnRoTGFiZWwsXG4gICAgICAgICAgICAneWVhcic6IHRoaXMuX2ludGwucHJldlllYXJMYWJlbCxcbiAgICAgICAgICAgICdtdWx0aS15ZWFyJzogdGhpcy5faW50bC5wcmV2TXVsdGlZZWFyTGFiZWxcbiAgICAgICAgfVt0aGlzLmN1cnJlbnRWaWV3XTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGxhYmVsIGZvciB0aGUgbmV4dCBidXR0b24uICovXG4gICAgZ2V0IG5leHRCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ21vbnRoJzogdGhpcy5faW50bC5uZXh0TW9udGhMYWJlbCxcbiAgICAgICAgICAgICd5ZWFyJzogdGhpcy5faW50bC5uZXh0WWVhckxhYmVsLFxuICAgICAgICAgICAgJ211bHRpLXllYXInOiB0aGlzLl9pbnRsLm5leHRNdWx0aVllYXJMYWJlbFxuICAgICAgICB9W3RoaXMuY3VycmVudFZpZXddO1xuICAgIH1cblxuICAgIGdldCBfaG91cnNMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgaG91ciA9IHRoaXMuX2FkYXB0ZXIuZ2V0SG91cih0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICAgICAgaWYgKCEhdGhpcy50d2VsdmVob3VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAyNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhvdXIgPSBob3VyID4gMTIgPyBob3VyIC0gMTIgOiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl8yZGlnaXQoaG91cik7XG4gICAgfVxuXG4gICAgZ2V0IF9taW51dGVzTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXzJkaWdpdCh0aGlzLl9hZGFwdGVyLmdldE1pbnV0ZSh0aGlzLl9hY3RpdmVEYXRlKSk7XG4gICAgfVxuXG4gICAgZ2V0IF9hcmlhTGFiZWxOZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fY3VycmVudFZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzogcmV0dXJuIHRoaXMuYXJpYU5leHRNb250aExhYmVsO1xuICAgICAgICAgICAgY2FzZSAneWVhcic6IHJldHVybiB0aGlzLmFyaWFOZXh0WWVhckxhYmVsO1xuICAgICAgICAgICAgY2FzZSAnbXVsdGkteWVhcic6IHJldHVybiB0aGlzLmFyaWFOZXh0TXVsdGlZZWFyTGFiZWw7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX2FyaWFMYWJlbFByZXYoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9jdXJyZW50Vmlldykge1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOiByZXR1cm4gdGhpcy5hcmlhUHJldk1vbnRoTGFiZWw7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzogcmV0dXJuIHRoaXMuYXJpYVByZXZZZWFyTGFiZWw7XG4gICAgICAgICAgICBjYXNlICdtdWx0aS15ZWFyJzogcmV0dXJuIHRoaXMuYXJpYVByZXZNdWx0aVllYXJMYWJlbDtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIF9pbnRsOiBNYXREYXRlcGlja2VySW50bCxcbiAgICAgICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2FkYXB0ZXI6IEdJUElEYXRldGltZUFkYXB0ZXI8RD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0lQSV9EQVRFVElNRV9GT1JNQVRTKSBwcml2YXRlIF9kYXRlRm9ybWF0czogR0lQSURhdGV0aW1lRm9ybWF0cyxcbiAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5fYWRhcHRlcikge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsRXJyb3IoJ0dJUElEYXRldGltZUFkYXB0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RhdGVGb3JtYXRzKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvcignR0lQSV9EQVRFVElNRV9GT1JNQVRTJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW50bENoYW5nZXMgPSBfaW50bC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiBjaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5zdGFydEF0IHx8IHRoaXMuX2FkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0QU1QTSh0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICAgICAgdGhpcy5fZm9jdXNBY3RpdmVDZWxsKCk7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdtdWx0aS15ZWFyJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAndGltZScpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuc3RhcnRWaWV3IHx8ICdtb250aCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5faW50bENoYW5nZXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogRGF0ZSBmaWx0ZXIgZm9yIHRoZSBtb250aCBhbmQgeWVhciB2aWV3cy4gKi9cbiAgICBfZGF0ZUZpbHRlckZvclZpZXdzID0gKGRhdGU6IEQpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICEhZGF0ZSAmJlxuICAgICAgICAgICAgKCF0aGlzLmRhdGVGaWx0ZXIgfHwgdGhpcy5kYXRlRmlsdGVyKGRhdGUsIEdJUElEYXRldGltZXBpY2tlckZpbHRlclR5cGUuREFURSkpICYmXG4gICAgICAgICAgICAoIXRoaXMubWluRGF0ZSB8fCB0aGlzLl9hZGFwdGVyLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMubWluRGF0ZSkgPj0gMCkgJiZcbiAgICAgICAgICAgICghdGhpcy5tYXhEYXRlIHx8IHRoaXMuX2FkYXB0ZXIuY29tcGFyZURhdGUoZGF0ZSwgdGhpcy5tYXhEYXRlKSA8PSAwKVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBfdXNlclNlbGVjdGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl91c2VyU2VsZWN0aW9uLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBkYXRlIHNlbGVjdGlvbiBpbiB0aGUgbW9udGggdmlldy4gKi9cbiAgICBfZGF0ZVNlbGVjdGVkKGRhdGU6IEQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMuX2FkYXB0ZXIuc2FtZURhdGUoZGF0ZSwgdGhpcy5zZWxlY3RlZCkgfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5wcmV2ZW50U2FtZURhdGVUaW1lU2VsZWN0aW9uXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gZGF0ZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMgbW9udGggc2VsZWN0aW9uIGluIHRoZSB5ZWFyIHZpZXcuICovXG4gICAgX21vbnRoU2VsZWN0ZWQobW9udGg6IEQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLl9hZGFwdGVyLnNhbWVNb250aEFuZFllYXIobW9udGgsIHRoaXMuc2VsZWN0ZWQpIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMucHJldmVudFNhbWVEYXRlVGltZVNlbGVjdGlvblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuX2FkYXB0ZXIuZ2V0Rmlyc3REYXRlT2ZNb250aChtb250aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IG1vbnRoO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdtb250aCc7XG4gICAgICAgICAgICB0aGlzLl9jbG9ja1ZpZXcgPSAnaG91cic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyB5ZWFyIHNlbGVjdGlvbiBpbiB0aGUgbXVsdGkgeWVhciB2aWV3LiAqL1xuICAgIF95ZWFyU2VsZWN0ZWQoeWVhcjogRCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5fYWRhcHRlci5zYW1lWWVhcih5ZWFyLCB0aGlzLnNlbGVjdGVkKSB8fFxuICAgICAgICAgICAgICAgICF0aGlzLnByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb25cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRlID0gdGhpcy5fYWRhcHRlci5jcmVhdGVEYXRldGltZSh0aGlzLl9hZGFwdGVyLmdldFllYXIoeWVhciksIDAsIDEsIDAsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChub3JtYWxpemVkRGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0geWVhcjtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdGltZVNlbGVjdGVkKGRhdGU6IEQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb2NrVmlldyAhPT0gJ21pbnV0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl91cGRhdGVEYXRlKGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fY2xvY2tWaWV3ID0gJ21pbnV0ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMuX2FkYXB0ZXIuc2FtZURhdGV0aW1lKGRhdGUsIHRoaXMuc2VsZWN0ZWQpIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMucHJldmVudFNhbWVEYXRlVGltZVNlbGVjdGlvblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uQWN0aXZlRGF0ZUNoYW5nZShkYXRlOiBEKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICAgIH1cblxuICAgIF91cGRhdGVEYXRlKGRhdGU6IEQpOiBEIHtcbiAgICAgICAgaWYgKCEhdGhpcy50d2VsdmVob3VyKSB7XG4gICAgICAgICAgICBjb25zdCBIT1VSID0gdGhpcy5fYWRhcHRlci5nZXRIb3VyKGRhdGUpO1xuICAgICAgICAgICAgaWYgKEhPVVIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX0FNUE0gPT09ICdBTScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJIb3VycyhkYXRlLCAtMTIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fQU1QTSA9PT0gJ1BNJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFySG91cnMoZGF0ZSwgMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIF9zZWxlY3RBTVBNKGRhdGU6IEQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkYXB0ZXIuZ2V0SG91cihkYXRlKSA+IDExKSB7XG4gICAgICAgICAgICB0aGlzLl9BTVBNID0gJ1BNJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX0FNUE0gPSAnQU0nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FtcG1DbGlja2VkKHNvdXJjZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChzb3VyY2UgPT09IHRoaXMuX0FNUE0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9BTVBNID0gc291cmNlO1xuICAgICAgICBpZiAodGhpcy5fQU1QTSA9PT0gJ0FNJykge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJIb3Vycyh0aGlzLl9hY3RpdmVEYXRlLCAtMTIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJIb3Vycyh0aGlzLl9hY3RpdmVEYXRlLCAxMik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfeWVhckNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICd5ZWFyJyB8fCB0aGlzLm11bHRpWWVhclNlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ211bHRpLXllYXInO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XG4gICAgfVxuXG4gICAgX2RhdGVDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ21vbnRoJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9ob3Vyc0NsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnY2xvY2snO1xuICAgICAgICB0aGlzLl9jbG9ja1ZpZXcgPSAnaG91cic7XG4gICAgfVxuXG4gICAgX21pbnV0ZXNDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2Nsb2NrJztcbiAgICAgICAgdGhpcy5fY2xvY2tWaWV3ID0gJ21pbnV0ZSc7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMgdXNlciBjbGlja3Mgb24gdGhlIHByZXZpb3VzIGJ1dHRvbi4gKi9cbiAgICBfcHJldmlvdXNDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJ1xuICAgICAgICAgICAgPyB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIC0xKVxuICAgICAgICAgICAgOiB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInID8gLTEgOiAteWVhcnNQZXJQYWdlKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgbmV4dCBidXR0b24uICovXG4gICAgX25leHRDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpXG4gICAgICAgICAgICA/IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgMSlcbiAgICAgICAgICAgIDogdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJyA/IDEgOiB5ZWFyc1BlclBhZ2UpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBwZXJpb2QgYnV0dG9uIGlzIGVuYWJsZWQuICovXG4gICAgX3ByZXZpb3VzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5taW5EYXRlIHx8ICF0aGlzLl9pc1NhbWVWaWV3KHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMubWluRGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIG5leHQgcGVyaW9kIGJ1dHRvbiBpcyBlbmFibGVkLiAqL1xuICAgIF9uZXh0RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLm1heERhdGUgfHwgIXRoaXMuX2lzU2FtZVZpZXcodGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5tYXhEYXRlKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBrZXlkb3duIGV2ZW50cyBvbiB0aGUgY2FsZW5kYXIgYm9keS4gKi9cbiAgICBfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBUT0RPKG1tYWxlcmJhKTogV2UgY3VycmVudGx5IGFsbG93IGtleWJvYXJkIG5hdmlnYXRpb24gdG8gZGlzYWJsZWQgZGF0ZXMsIGJ1dCBqdXN0IHByZXZlbnRcbiAgICAgICAgLy8gZGlzYWJsZWQgb25lcyBmcm9tIGJlaW5nIHNlbGVjdGVkLiBUaGlzIG1heSBub3QgYmUgaWRlYWwsIHdlIHNob3VsZCBsb29rIGludG8gd2hldGhlclxuICAgICAgICAvLyBuYXZpZ2F0aW9uIHNob3VsZCBza2lwIG92ZXIgZGlzYWJsZWQgZGF0ZXMsIGFuZCBpZiBzbywgaG93IHRvIGltcGxlbWVudCB0aGF0IGVmZmljaWVudGx5LlxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluTW9udGhWaWV3KGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd25JblllYXJWaWV3KGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbXVsdGkteWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd25Jbk11bHRpWWVhclZpZXcoZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluQ2xvY2tWaWV3KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9mb2N1c0FjdGl2ZUNlbGwoKSB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY2FsZW5kYXJTdGF0ZURvbmUoKSB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU3RhdGUgPSAnJztcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgdHdvIGRhdGVzIHJlcHJlc2VudCB0aGUgc2FtZSB2aWV3IGluIHRoZSBjdXJyZW50IHZpZXcgbW9kZSAobW9udGggb3IgeWVhcikuICovXG4gICAgcHJpdmF0ZSBfaXNTYW1lVmlldyhkYXRlMTogRCwgZGF0ZTI6IEQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRhcHRlci5nZXRZZWFyKGRhdGUxKSA9PT0gdGhpcy5fYWRhcHRlci5nZXRZZWFyKGRhdGUyKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2FkYXB0ZXIuZ2V0TW9udGgoZGF0ZTEpID09PSB0aGlzLl9hZGFwdGVyLmdldE1vbnRoKGRhdGUyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRhcHRlci5nZXRZZWFyKGRhdGUxKSA9PT0gdGhpcy5fYWRhcHRlci5nZXRZZWFyKGRhdGUyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2Ugd2UgYXJlIGluICdtdWx0aS15ZWFyJyB2aWV3LlxuICAgICAgICByZXR1cm4gaXNTYW1lTXVsdGlZZWFyVmlldyh0aGlzLl9hZGFwdGVyLCBkYXRlMSwgZGF0ZTIsIHRoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBrZXlkb3duIGV2ZW50cyBvbiB0aGUgY2FsZW5kYXIgYm9keSB3aGVuIGNhbGVuZGFyIGlzIGluIG1vbnRoIHZpZXcuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluTW9udGhWaWV3KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLl9hY3RpdmVEYXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVVBfQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsIC03KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5fYWN0aXZlRGF0ZSwgNyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEhPTUU6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsIDEgLSB0aGlzLl9hZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFTkQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuX2FkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5fYWN0aXZlRGF0ZSkgLSB0aGlzLl9hZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQQUdFX1VQOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBldmVudC5hbHRLZXlcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgLTEpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBBR0VfRE9XTjpcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gZXZlbnQuYWx0S2V5XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsIDEpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRU5URVI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVGaWx0ZXJGb3JWaWV3cyh0aGlzLl9hY3RpdmVEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlU2VsZWN0ZWQodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IG9yIGZvY3VzIGFjdGl2ZSBjZWxsIG9uIGtleXMgdGhhdCB3ZSBkb24ndCBleHBsaWNpdGx5IGhhbmRsZS5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmV2ZW50IHVuZXhwZWN0ZWQgZGVmYXVsdCBhY3Rpb25zIHN1Y2ggYXMgZm9ybSBzdWJtaXNzaW9uLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qKiBIYW5kbGVzIGtleWRvd24gZXZlbnRzIG9uIHRoZSBjYWxlbmRhciBib2R5IHdoZW4gY2FsZW5kYXIgaXMgaW4geWVhciB2aWV3LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd25JblllYXJWaWV3KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUklHSFRfQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFVQX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9wcmV2TW9udGhJblNhbWVDb2wodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERPV05fQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX25leHRNb250aEluU2FtZUNvbCh0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSE9NRTpcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAtdGhpcy5fYWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVORDpcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxMSAtIHRoaXMuX2FkYXB0ZXIuZ2V0TW9udGgodGhpcy5fYWN0aXZlRGF0ZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQQUdFX1VQOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgZXZlbnQuYWx0S2V5ID8gLTEwIDogLTEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQQUdFX0RPV046XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCBldmVudC5hbHRLZXkgPyAxMCA6IDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFTlRFUjpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aFNlbGVjdGVkKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBwcmV2ZW50IGRlZmF1bHQgb3IgZm9jdXMgYWN0aXZlIGNlbGwgb24ga2V5cyB0aGF0IHdlIGRvbid0IGV4cGxpY2l0bHkgaGFuZGxlLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGNhbGVuZGFyIGJvZHkgd2hlbiBjYWxlbmRhciBpcyBpbiBtdWx0aS15ZWFyIHZpZXcuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bkluTXVsdGlZZWFyVmlldyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUklHSFRfQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVVBfQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCAteWVhcnNQZXJSb3cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBET1dOX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgeWVhcnNQZXJSb3cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIT01FOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgLWdldEFjdGl2ZU9mZnNldCh0aGlzLl9hZGFwdGVyLCB0aGlzLl9hY3RpdmVEYXRlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFTkQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCB5ZWFyc1BlclBhZ2UgLSBnZXRBY3RpdmVPZmZzZXQodGhpcy5fYWRhcHRlciwgdGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpIC0gMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBBR0VfVVA6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCBldmVudC5hbHRLZXkgPyAteWVhcnNQZXJQYWdlICogMTAgOiAteWVhcnNQZXJQYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEFHRV9ET1dOOlxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgZXZlbnQuYWx0S2V5ID8geWVhcnNQZXJQYWdlICogMTAgOiB5ZWFyc1BlclBhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFTlRFUjpcbiAgICAgICAgICAgICAgICB0aGlzLl95ZWFyU2VsZWN0ZWQodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIERvbid0IHByZXZlbnQgZGVmYXVsdCBvciBmb2N1cyBhY3RpdmUgY2VsbCBvbiBrZXlzIHRoYXQgd2UgZG9uJ3QgZXhwbGljaXRseSBoYW5kbGUuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGNhbGVuZGFyIGJvZHkgd2hlbiBjYWxlbmRhciBpcyBpbiBtb250aCB2aWV3LiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd25JbkNsb2NrVmlldyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVVBfQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2Nsb2NrVmlldyA9PT0gJ2hvdXInXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckhvdXJzKHRoaXMuX2FjdGl2ZURhdGUsIDEpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhck1pbnV0ZXModGhpcy5fYWN0aXZlRGF0ZSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERPV05fQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2Nsb2NrVmlldyA9PT0gJ2hvdXInXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fYWRhcHRlci5hZGRDYWxlbmRhckhvdXJzKHRoaXMuX2FjdGl2ZURhdGUsIC0xKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNaW51dGVzKHRoaXMuX2FjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRU5URVI6XG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZVNlbGVjdGVkKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IG9yIGZvY3VzIGFjdGl2ZSBjZWxsIG9uIGtleXMgdGhhdCB3ZSBkb24ndCBleHBsaWNpdGx5IGhhbmRsZS5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmV2ZW50IHVuZXhwZWN0ZWQgZGVmYXVsdCBhY3Rpb25zIHN1Y2ggYXMgZm9ybSBzdWJtaXNzaW9uLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSB0aGUgZGF0ZSBmb3IgdGhlIG1vbnRoIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBnaXZlbiBtb250aCBpbiB0aGUgc2FtZSBjb2x1bW4gaW4gdGhlXG4gICAgICogY2FsZW5kYXIgdGFibGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcHJldk1vbnRoSW5TYW1lQ29sKGRhdGU6IEQpOiBEIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtYW55IG1vbnRocyB0byBqdW1wIGZvcndhcmQgZ2l2ZW4gdGhhdCB0aGVyZSBhcmUgMiBlbXB0eSBzbG90cyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggeWVhci5cbiAgICAgICAgY29uc3QgaW5jcmVtZW50ID0gdGhpcy5fYWRhcHRlci5nZXRNb250aChkYXRlKSA8PSA0ID8gLTUgOiB0aGlzLl9hZGFwdGVyLmdldE1vbnRoKGRhdGUpID49IDcgPyAtNyA6IC0xMjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoZGF0ZSwgaW5jcmVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgdGhlIGRhdGUgZm9yIHRoZSBtb250aCB0aGF0IGNvbWVzIGFmdGVyIHRoZSBnaXZlbiBtb250aCBpbiB0aGUgc2FtZSBjb2x1bW4gaW4gdGhlXG4gICAgICogY2FsZW5kYXIgdGFibGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbmV4dE1vbnRoSW5TYW1lQ29sKGRhdGU6IEQpOiBEIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtYW55IG1vbnRocyB0byBqdW1wIGZvcndhcmQgZ2l2ZW4gdGhhdCB0aGVyZSBhcmUgMiBlbXB0eSBzbG90cyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggeWVhci5cbiAgICAgICAgY29uc3QgaW5jcmVtZW50ID0gdGhpcy5fYWRhcHRlci5nZXRNb250aChkYXRlKSA8PSA0ID8gNyA6IHRoaXMuX2FkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkgPj0gNyA/IDUgOiAxMjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoZGF0ZSwgaW5jcmVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGVuZGFyU3RhdGUoZGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTdGF0ZSA9IGRpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF8yZGlnaXQobjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiAoJzAwJyArIG4pLnNsaWNlKC0yKTtcbiAgICB9XG5cbn1cbiJdfQ==