@entake/particle 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +396 -0
  3. package/app/modules/accordion/accordion.component.d.ts +26 -0
  4. package/app/modules/accordion/accordion.module.d.ts +11 -0
  5. package/app/modules/accordion/directives/accordion-content.directive.d.ts +8 -0
  6. package/app/modules/accordion/directives/accordion-header.directive.d.ts +8 -0
  7. package/app/modules/accordion/directives/accordion-item.directive.d.ts +13 -0
  8. package/app/modules/background-carousel/background-carousel.directive.d.ts +42 -0
  9. package/app/modules/background-carousel/carousel-options.model.d.ts +30 -0
  10. package/app/modules/background-carousel/particle-background-carousel.module.d.ts +8 -0
  11. package/app/modules/checkbox/checkbox.component.d.ts +43 -0
  12. package/app/modules/checkbox/checkbox.module.d.ts +9 -0
  13. package/app/modules/color-picker/color-picker.component.d.ts +149 -0
  14. package/app/modules/color-picker/color-picker.module.d.ts +9 -0
  15. package/app/modules/date-picker/components/calendar/calendar.component.d.ts +211 -0
  16. package/app/modules/date-picker/components/date-range-picker/date-range-picker.component.d.ts +95 -0
  17. package/app/modules/date-picker/date-picker.component.d.ts +259 -0
  18. package/app/modules/date-picker/date-picker.module.d.ts +15 -0
  19. package/app/modules/dialog/dialog.component.d.ts +87 -0
  20. package/app/modules/dialog/dialog.module.d.ts +9 -0
  21. package/app/modules/dropdown/dropdown.component.d.ts +288 -0
  22. package/app/modules/dropdown/dropdown.module.d.ts +9 -0
  23. package/app/modules/dropdown/models/dropdown-option-group.model.d.ts +16 -0
  24. package/app/modules/dropdown/models/dropdown-option.model.d.ts +25 -0
  25. package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +46 -0
  26. package/app/modules/endpoint-state/endpoint-state.module.d.ts +8 -0
  27. package/app/modules/icons/components/icon-select.component.d.ts +229 -0
  28. package/app/modules/icons/models/fontawesome-icons-brands.model.d.ts +13 -0
  29. package/app/modules/icons/models/fontawesome-icons-regular.model.d.ts +13 -0
  30. package/app/modules/icons/models/fontawesome-icons-solid.model.d.ts +13 -0
  31. package/app/modules/icons/models/particle-icons-light.model.d.ts +197 -0
  32. package/app/modules/icons/models/particle-icons-regular.model.d.ts +205 -0
  33. package/app/modules/icons/models/particle-icons-solid.model.d.ts +365 -0
  34. package/app/modules/icons/particle-icons.module.d.ts +13 -0
  35. package/app/modules/icons/services/icons.service.d.ts +44 -0
  36. package/app/modules/idle-timeout/idle-timeout.component.d.ts +35 -0
  37. package/app/modules/idle-timeout/idle-timer.d.ts +14 -0
  38. package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +9 -0
  39. package/app/modules/input-mask/input-mask.component.d.ts +86 -0
  40. package/app/modules/input-mask/input-mask.module.d.ts +8 -0
  41. package/app/modules/keyfilter/keyfilter.directive.d.ts +60 -0
  42. package/app/modules/keyfilter/keyfilter.module.d.ts +8 -0
  43. package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
  44. package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
  45. package/app/modules/layout/layout.module.d.ts +10 -0
  46. package/app/modules/loader/components/loader.component.d.ts +11 -0
  47. package/app/modules/loader/loader.module.d.ts +8 -0
  48. package/app/modules/multi-select/models/multi-select-option-group.model.d.ts +16 -0
  49. package/app/modules/multi-select/models/multi-select-option.model.d.ts +25 -0
  50. package/app/modules/multi-select/multi-select.component.d.ts +279 -0
  51. package/app/modules/multi-select/multi-select.module.d.ts +8 -0
  52. package/app/modules/notification/models/notification.model.d.ts +21 -0
  53. package/app/modules/notification/notification.component.d.ts +46 -0
  54. package/app/modules/notification/notification.module.d.ts +8 -0
  55. package/app/modules/notification/services/notification.service.d.ts +54 -0
  56. package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +8 -0
  57. package/app/modules/ordinal-number-pipe/ordinal-number.pipe.d.ts +15 -0
  58. package/app/modules/paginator/pagination-event.model.d.ts +24 -0
  59. package/app/modules/paginator/paginator.component.d.ts +103 -0
  60. package/app/modules/paginator/particle-paginator.module.d.ts +13 -0
  61. package/app/modules/popover/popover.component.d.ts +140 -0
  62. package/app/modules/popover/popover.module.d.ts +9 -0
  63. package/app/modules/profile-pic/particle-profile-pic.module.d.ts +9 -0
  64. package/app/modules/profile-pic/profile-pic.component.d.ts +32 -0
  65. package/app/modules/progress-bar/progress-bar.component.d.ts +16 -0
  66. package/app/modules/progress-bar/progress-bar.module.d.ts +8 -0
  67. package/app/modules/push-container/particle-push-container.module.d.ts +9 -0
  68. package/app/modules/push-container/push-container-state.model.d.ts +7 -0
  69. package/app/modules/push-container/push-container.component.d.ts +137 -0
  70. package/app/modules/rich-text/particle-rich-text.module.d.ts +15 -0
  71. package/app/modules/rich-text/render-rich-text.component.d.ts +6 -0
  72. package/app/modules/rich-text/rich-text-capabilities.model.d.ts +7 -0
  73. package/app/modules/rich-text/rich-text.component.d.ts +48 -0
  74. package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +8 -0
  75. package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +19 -0
  76. package/app/modules/slideover/particle-slideover.module.d.ts +8 -0
  77. package/app/modules/slideover/slideover.component.d.ts +35 -0
  78. package/app/modules/slider/slider.component.d.ts +143 -0
  79. package/app/modules/slider/slider.module.d.ts +9 -0
  80. package/app/modules/theming/components/theming.component.d.ts +43 -0
  81. package/app/modules/theming/models/theme.model.d.ts +88 -0
  82. package/app/modules/theming/services/theme-change-detection.service.d.ts +26 -0
  83. package/app/modules/theming/services/theming.service.d.ts +142 -0
  84. package/app/modules/theming/theming.module.d.ts +12 -0
  85. package/app/modules/toggle-switch/models/toggle-options.model.d.ts +11 -0
  86. package/app/modules/toggle-switch/toggle-switch.component.d.ts +43 -0
  87. package/app/modules/toggle-switch/toggle-switch.module.d.ts +8 -0
  88. package/app/modules/tooltip/tooltip.directive.d.ts +157 -0
  89. package/app/modules/tooltip/tooltip.module.d.ts +8 -0
  90. package/app/modules/week-picker/week-picker.component.d.ts +289 -0
  91. package/app/modules/week-picker/week-picker.module.d.ts +13 -0
  92. package/app/shared/enums/endpoint-status.enum.d.ts +9 -0
  93. package/app/shared/interceptors/json.interceptor.d.ts +17 -0
  94. package/app/shared/models/auditable.model.d.ts +21 -0
  95. package/app/shared/models/data-list.model.d.ts +9 -0
  96. package/app/shared/models/id.model.d.ts +9 -0
  97. package/app/shared/models/observable-container.d.ts +8 -0
  98. package/app/shared/models/particle-component-text.model.d.ts +211 -0
  99. package/app/shared/services/base-data.service.d.ts +130 -0
  100. package/app/shared/services/dialog.service.d.ts +10 -0
  101. package/app/shared/services/local-storage.service.d.ts +41 -0
  102. package/esm2022/app/modules/accordion/accordion.component.mjs +101 -0
  103. package/esm2022/app/modules/accordion/accordion.module.mjs +37 -0
  104. package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +17 -0
  105. package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +17 -0
  106. package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +36 -0
  107. package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +91 -0
  108. package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +36 -0
  109. package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +24 -0
  110. package/esm2022/app/modules/checkbox/checkbox.component.mjs +108 -0
  111. package/esm2022/app/modules/checkbox/checkbox.module.mjs +28 -0
  112. package/esm2022/app/modules/color-picker/color-picker.component.mjs +306 -0
  113. package/esm2022/app/modules/color-picker/color-picker.module.mjs +19 -0
  114. package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +496 -0
  115. package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +250 -0
  116. package/esm2022/app/modules/date-picker/date-picker.component.mjs +538 -0
  117. package/esm2022/app/modules/date-picker/date-picker.module.mjs +56 -0
  118. package/esm2022/app/modules/dialog/dialog.component.mjs +177 -0
  119. package/esm2022/app/modules/dialog/dialog.module.mjs +28 -0
  120. package/esm2022/app/modules/dropdown/dropdown.component.mjs +682 -0
  121. package/esm2022/app/modules/dropdown/dropdown.module.mjs +28 -0
  122. package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +2 -0
  123. package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +2 -0
  124. package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +75 -0
  125. package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +22 -0
  126. package/esm2022/app/modules/icons/components/icon-select.component.mjs +377 -0
  127. package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +471 -0
  128. package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +166 -0
  129. package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +1016 -0
  130. package/esm2022/app/modules/icons/models/particle-icons-light.model.mjs +310 -0
  131. package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +324 -0
  132. package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +581 -0
  133. package/esm2022/app/modules/icons/particle-icons.module.mjs +66 -0
  134. package/esm2022/app/modules/icons/services/icons.service.mjs +86 -0
  135. package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +85 -0
  136. package/esm2022/app/modules/idle-timeout/idle-timer.mjs +66 -0
  137. package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +28 -0
  138. package/esm2022/app/modules/input-mask/input-mask.component.mjs +594 -0
  139. package/esm2022/app/modules/input-mask/input-mask.module.mjs +18 -0
  140. package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +158 -0
  141. package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +18 -0
  142. package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +79 -0
  143. package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +65 -0
  144. package/esm2022/app/modules/layout/layout.module.mjs +33 -0
  145. package/esm2022/app/modules/loader/components/loader.component.mjs +30 -0
  146. package/esm2022/app/modules/loader/loader.module.mjs +24 -0
  147. package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +2 -0
  148. package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +2 -0
  149. package/esm2022/app/modules/multi-select/multi-select.component.mjs +665 -0
  150. package/esm2022/app/modules/multi-select/multi-select.module.mjs +18 -0
  151. package/esm2022/app/modules/notification/models/notification.model.mjs +2 -0
  152. package/esm2022/app/modules/notification/notification.component.mjs +122 -0
  153. package/esm2022/app/modules/notification/notification.module.mjs +18 -0
  154. package/esm2022/app/modules/notification/services/notification.service.mjs +84 -0
  155. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +20 -0
  156. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +49 -0
  157. package/esm2022/app/modules/paginator/pagination-event.model.mjs +29 -0
  158. package/esm2022/app/modules/paginator/paginator.component.mjs +207 -0
  159. package/esm2022/app/modules/paginator/particle-paginator.module.mjs +48 -0
  160. package/esm2022/app/modules/popover/popover.component.mjs +352 -0
  161. package/esm2022/app/modules/popover/popover.module.mjs +24 -0
  162. package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +28 -0
  163. package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +74 -0
  164. package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +43 -0
  165. package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +24 -0
  166. package/esm2022/app/modules/push-container/particle-push-container.module.mjs +26 -0
  167. package/esm2022/app/modules/push-container/push-container-state.model.mjs +2 -0
  168. package/esm2022/app/modules/push-container/push-container.component.mjs +363 -0
  169. package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +64 -0
  170. package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +18 -0
  171. package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +2 -0
  172. package/esm2022/app/modules/rich-text/rich-text.component.mjs +187 -0
  173. package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +24 -0
  174. package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +49 -0
  175. package/esm2022/app/modules/slideover/particle-slideover.module.mjs +24 -0
  176. package/esm2022/app/modules/slideover/slideover.component.mjs +115 -0
  177. package/esm2022/app/modules/slider/slider.component.mjs +243 -0
  178. package/esm2022/app/modules/slider/slider.module.mjs +26 -0
  179. package/esm2022/app/modules/theming/components/theming.component.mjs +86 -0
  180. package/esm2022/app/modules/theming/models/theme.model.mjs +9 -0
  181. package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +38 -0
  182. package/esm2022/app/modules/theming/services/theming.service.mjs +507 -0
  183. package/esm2022/app/modules/theming/theming.module.mjs +55 -0
  184. package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +2 -0
  185. package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +107 -0
  186. package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +24 -0
  187. package/esm2022/app/modules/tooltip/tooltip.directive.mjs +381 -0
  188. package/esm2022/app/modules/tooltip/tooltip.module.mjs +18 -0
  189. package/esm2022/app/modules/week-picker/week-picker.component.mjs +511 -0
  190. package/esm2022/app/modules/week-picker/week-picker.module.mjs +40 -0
  191. package/esm2022/app/shared/enums/endpoint-status.enum.mjs +11 -0
  192. package/esm2022/app/shared/interceptors/json.interceptor.mjs +23 -0
  193. package/esm2022/app/shared/models/auditable.model.mjs +2 -0
  194. package/esm2022/app/shared/models/data-list.model.mjs +2 -0
  195. package/esm2022/app/shared/models/id.model.mjs +2 -0
  196. package/esm2022/app/shared/models/observable-container.mjs +15 -0
  197. package/esm2022/app/shared/models/particle-component-text.model.mjs +2 -0
  198. package/esm2022/app/shared/services/base-data.service.mjs +190 -0
  199. package/esm2022/app/shared/services/dialog.service.mjs +50 -0
  200. package/esm2022/app/shared/services/local-storage.service.mjs +60 -0
  201. package/esm2022/entake-particle.mjs +5 -0
  202. package/esm2022/public_api.mjs +98 -0
  203. package/fesm2022/entake-particle.mjs +12477 -0
  204. package/fesm2022/entake-particle.mjs.map +1 -0
  205. package/index.d.ts +5 -0
  206. package/package.json +65 -0
  207. package/particle.css +1 -0
  208. package/public_api.d.ts +97 -0
@@ -0,0 +1,496 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren } from '@angular/core';
2
+ import { addDays, endOfMonth, isWithinInterval, subDays } from 'date-fns';
3
+ import { BehaviorSubject, combineLatest, Subscription } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/cdk/a11y";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@angular/forms";
9
+ import * as i4 from "../../../ordinal-number-pipe/ordinal-number.pipe";
10
+ /**
11
+ * Component that allows a user to select a date from a calendar
12
+ */
13
+ export class CalendarComponent {
14
+ renderer;
15
+ /**
16
+ * The keyboard arrow keys
17
+ * @private
18
+ */
19
+ static ARROW_KEYS = ['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'];
20
+ /**
21
+ * ViewChild of the calendar widget parent div element
22
+ */
23
+ calendarWidgetDiv = null;
24
+ /**
25
+ * ViewChild of the month select element
26
+ */
27
+ yearSelect = null;
28
+ /**
29
+ * ViewChild of the done button
30
+ */
31
+ doneButton = null;
32
+ /**
33
+ * QueryList of the calendar date buttons for the currently selected month/year
34
+ */
35
+ calendarDates = null;
36
+ /**
37
+ * The selected date value
38
+ */
39
+ set value(value) {
40
+ let metaDateValue = null;
41
+ if (!!value) {
42
+ metaDateValue = {
43
+ day: value.getDay(),
44
+ date: value.getDate(),
45
+ month: value.getMonth(),
46
+ year: value.getFullYear(),
47
+ selectable: true
48
+ };
49
+ }
50
+ this._value.next(metaDateValue);
51
+ }
52
+ /**
53
+ * The range of available dates to choose from
54
+ */
55
+ set dateRange(dateRange) {
56
+ if (dateRange?.minDate > dateRange?.maxDate) {
57
+ throw new Error(this.text.minGreaterThenMax);
58
+ }
59
+ const { year } = this.currentDate;
60
+ this._validSelectionInterval.next({
61
+ start: dateRange?.minDate ?? new Date(year - 100, 0, 1),
62
+ end: dateRange?.maxDate ?? new Date(year + 50, 11, 31)
63
+ });
64
+ }
65
+ set text(text) {
66
+ if (text) {
67
+ this._text = text;
68
+ this.weekDays = [
69
+ text.sunday,
70
+ text.monday,
71
+ text.tuesday,
72
+ text.wednesday,
73
+ text.thursday,
74
+ text.friday,
75
+ text.saturday
76
+ ];
77
+ }
78
+ }
79
+ get text() {
80
+ return this._text;
81
+ }
82
+ showControls = true;
83
+ _text = {
84
+ selectAYear: 'Select a Year',
85
+ selectAMonth: 'Select a Month',
86
+ january: 'January',
87
+ february: 'February',
88
+ march: 'March',
89
+ april: 'April',
90
+ may: 'May',
91
+ june: 'June',
92
+ july: 'July',
93
+ august: 'August',
94
+ september: 'September',
95
+ october: 'October',
96
+ november: 'November',
97
+ december: 'December',
98
+ sundayAbbr: 'Su',
99
+ mondayAbbr: 'Mo',
100
+ tuesdayAbbr: 'Tu',
101
+ wednesdayAbbr: 'We',
102
+ thursdayAbbr: 'Th',
103
+ fridayAbbr: 'Fr',
104
+ saturdayAbbr: 'Sa',
105
+ sunday: 'Sunday',
106
+ monday: 'Monday',
107
+ tuesday: 'Tuesday',
108
+ wednesday: 'Wednesday',
109
+ thursday: 'Thursday',
110
+ friday: 'Friday',
111
+ saturday: 'Saturday',
112
+ select: 'Select',
113
+ the: 'the',
114
+ resetDateToToday: 'Reset date selection to today\'s date',
115
+ selectToday: 'Select Today',
116
+ saveDate: 'Save date selection',
117
+ done: 'Done',
118
+ minGreaterThenMax: 'Min date must be less than max date'
119
+ };
120
+ /**
121
+ * Event emitted on date select
122
+ */
123
+ selected = new EventEmitter();
124
+ /**
125
+ * Event emitted on close (either through the button, escape keyup or click off of widget).
126
+ * Note: it is the parent component's job to actually hide the calendar, this event
127
+ * acts as a signal that that action should be taken
128
+ */
129
+ closed = new EventEmitter();
130
+ /**
131
+ * The current Date broken down by day/month/year
132
+ */
133
+ currentDate;
134
+ /**
135
+ * Array of days of the week
136
+ */
137
+ weekDays = [
138
+ this.text.sunday,
139
+ this.text.monday,
140
+ this.text.tuesday,
141
+ this.text.wednesday,
142
+ this.text.thursday,
143
+ this.text.friday,
144
+ this.text.saturday
145
+ ];
146
+ /**
147
+ * BehaviorSubject tracking the current value
148
+ */
149
+ _value = new BehaviorSubject(null);
150
+ /**
151
+ * BehaviorSubject tracking the valid selection interval
152
+ */
153
+ _validSelectionInterval = new BehaviorSubject(null);
154
+ /**
155
+ * BehaviorSubject tracking the currently selected month
156
+ */
157
+ _selectedMonth = new BehaviorSubject(0);
158
+ /**
159
+ * BehaviorSubject tracking the currently selected year
160
+ */
161
+ _selectedYear = new BehaviorSubject(1970);
162
+ /**
163
+ * The full month for the current selected month/year
164
+ */
165
+ fullMonth$ = combineLatest([
166
+ this._selectedMonth,
167
+ this._selectedYear,
168
+ this._validSelectionInterval
169
+ ]).pipe(map(([selectedMonth, selectedYear, validSelectionInterval]) => {
170
+ return CalendarComponent.generateMonth(selectedMonth, selectedYear, validSelectionInterval);
171
+ }));
172
+ /**
173
+ * The range of selectable years as an Observable
174
+ */
175
+ validYearRange$ = this._validSelectionInterval.pipe(map(selectionInterval => {
176
+ if (this._selectedYear.getValue() < selectionInterval?.start?.getFullYear()) {
177
+ this._selectedYear.next(selectionInterval?.start?.getFullYear());
178
+ }
179
+ return CalendarComponent.generateYearRange(selectionInterval?.start?.getFullYear() ?? null, selectionInterval?.end?.getFullYear() ?? null, this.currentDate.year);
180
+ // check if the _selectedYear is valid in the new date range, if not update to min year of range
181
+ }));
182
+ /**
183
+ * Subscription for the combination of value and valid selection interval
184
+ * @private
185
+ */
186
+ subscription = new Subscription();
187
+ /**
188
+ * The currently selected date
189
+ */
190
+ selectedDate = null;
191
+ /**
192
+ * Generate a 42 element array representing the input month's days with
193
+ * padding from the previous/following month
194
+ * @param month the month to generate dates for
195
+ * @param year the year to generate the month for
196
+ * @param selectionInterval the selection interval
197
+ */
198
+ static generateMonth(month, year, selectionInterval) {
199
+ if (!!selectionInterval) {
200
+ const beginningOfMonthDate = new Date(year, month, 1);
201
+ const endOfMonthDate = endOfMonth(beginningOfMonthDate);
202
+ const fullMonth = [];
203
+ let dayOfMonth = beginningOfMonthDate.getDay();
204
+ for (let i = 1; i <= endOfMonthDate.getDate(); i++) {
205
+ const dateOfMonth = new Date(year, month, i);
206
+ fullMonth.push({
207
+ day: dayOfMonth,
208
+ date: i,
209
+ month,
210
+ year,
211
+ selectable: isWithinInterval(dateOfMonth, selectionInterval)
212
+ });
213
+ dayOfMonth = dayOfMonth === 6 ? 0 : dayOfMonth + 1;
214
+ }
215
+ if (beginningOfMonthDate.getDay() > 0) {
216
+ const lastMonthDates = [];
217
+ for (let i = beginningOfMonthDate.getDay(); i > 0; i--) {
218
+ const subtractedDate = subDays(beginningOfMonthDate, i);
219
+ lastMonthDates.push({
220
+ day: subtractedDate.getDay(),
221
+ date: subtractedDate.getDate(),
222
+ month: subtractedDate.getMonth(),
223
+ year: subtractedDate.getFullYear(),
224
+ selectable: false
225
+ });
226
+ }
227
+ fullMonth.unshift(...lastMonthDates);
228
+ }
229
+ let daysToAdd = 1;
230
+ while (fullMonth.length < 42) {
231
+ const addedDate = addDays(endOfMonthDate, daysToAdd++);
232
+ fullMonth.push({
233
+ day: addedDate.getDay(),
234
+ date: addedDate.getDate(),
235
+ month: addedDate.getMonth(),
236
+ year: addedDate.getFullYear(),
237
+ selectable: false
238
+ });
239
+ }
240
+ return fullMonth;
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * Generate an Array of numbers representing the span of years between the input
246
+ * @param minYear the start of the range
247
+ * @param maxYear the end of the range
248
+ * @param currentYear the current year
249
+ */
250
+ static generateYearRange(minYear, maxYear, currentYear) {
251
+ let start, end;
252
+ if (!minYear && !!maxYear) {
253
+ start = maxYear = 50;
254
+ end = maxYear;
255
+ }
256
+ else if (!!minYear && !maxYear) {
257
+ start = minYear;
258
+ end = minYear + 50;
259
+ }
260
+ else if (!!minYear && !!maxYear) {
261
+ start = minYear;
262
+ end = maxYear;
263
+ }
264
+ else {
265
+ start = currentYear - 100;
266
+ end = currentYear + 50;
267
+ }
268
+ const range = [];
269
+ for (let i = start; i <= end; i++) {
270
+ range.push(i);
271
+ }
272
+ return range;
273
+ }
274
+ /**
275
+ * Dependency injection site
276
+ * @param renderer the Angular renderer
277
+ */
278
+ constructor(renderer) {
279
+ this.renderer = renderer;
280
+ const currentDate = new Date();
281
+ this.currentDate = {
282
+ day: currentDate.getDay(),
283
+ date: currentDate.getDate(),
284
+ month: currentDate.getMonth(),
285
+ year: currentDate.getFullYear(),
286
+ selectable: true
287
+ };
288
+ }
289
+ /**
290
+ * Init component
291
+ */
292
+ ngOnInit() {
293
+ this.subscription.add(combineLatest([this._value, this._validSelectionInterval]).subscribe(([value, validSelectionInterval]) => {
294
+ let selectionInterval = validSelectionInterval;
295
+ if (!selectionInterval) {
296
+ const { year } = this.currentDate;
297
+ selectionInterval = {
298
+ start: new Date(year - 100, 0, 1),
299
+ end: new Date(year + 50, 11, 31)
300
+ };
301
+ this.currentDate.selectable = isWithinInterval(new Date(this.currentDate.year, this.currentDate.month, this.currentDate.date), selectionInterval);
302
+ }
303
+ if (!!value) {
304
+ const valueDate = new Date(value.year, value.month, value.date);
305
+ if (isWithinInterval(valueDate, selectionInterval)) {
306
+ this.selectedDate = value;
307
+ this._selectedMonth.next(value.month);
308
+ this._selectedYear.next(value.year);
309
+ }
310
+ else {
311
+ this._value.next(null);
312
+ this.selectedDate = null;
313
+ }
314
+ }
315
+ else {
316
+ this._selectedMonth.next(this.currentDate.month);
317
+ this._selectedYear.next(this.currentDate.year);
318
+ }
319
+ }));
320
+ }
321
+ /**
322
+ * Destroy component, unsubscribe from any active subscriptions
323
+ */
324
+ ngOnDestroy() {
325
+ this.subscription.unsubscribe();
326
+ }
327
+ /**
328
+ * Handle window keyup events
329
+ * @param event the keyup KeyboardEvent
330
+ */
331
+ onKeyUp(event) {
332
+ const { key } = event;
333
+ if (CalendarComponent.ARROW_KEYS.includes(key)) {
334
+ this.onArrowKeyUp(key);
335
+ }
336
+ }
337
+ /**
338
+ * Emit closed event on click if clicked outside calendar widget
339
+ * @param event the click MouseEvent
340
+ */
341
+ handleClick(event) {
342
+ const { pageX, pageY } = event;
343
+ // this check is to prevent the click event from firing on keypress when focused on a button
344
+ if (pageX > 0 && pageY > 0) {
345
+ const { top, bottom, left, right } = this.calendarWidgetDiv.nativeElement.getBoundingClientRect();
346
+ const insideX = (pageX >= left) && (pageX <= right);
347
+ const insideY = (pageY >= top) && (pageY <= bottom);
348
+ // this check is for IE11 where option values might render outside of the calendar
349
+ const tagName = event.target.tagName;
350
+ const shouldClose = !(insideX && insideY) && tagName !== 'OPTION';
351
+ if (shouldClose) {
352
+ this.closed.emit();
353
+ }
354
+ }
355
+ }
356
+ /**
357
+ * Update selected date and emit selection event
358
+ * @param selectedDate the selected date
359
+ */
360
+ handleDateSelection(selectedDate) {
361
+ this.selectedDate = selectedDate;
362
+ this.selected.emit(new Date(selectedDate.year, selectedDate.month, selectedDate.date));
363
+ }
364
+ /**
365
+ * Select the current date and toggle selected month/year to match
366
+ */
367
+ selectToday() {
368
+ this.handleDateSelection(this.currentDate);
369
+ this._selectedMonth.next(this.currentDate.month);
370
+ this._selectedYear.next(this.currentDate.year);
371
+ this.doneButton.nativeElement.focus();
372
+ }
373
+ /**
374
+ * Handle arrow key navigation for calendar date buttons
375
+ * @param key the pressed arrow key
376
+ * @private
377
+ */
378
+ onArrowKeyUp(key) {
379
+ const { activeElement } = document;
380
+ if (!!activeElement) {
381
+ const activeDate = activeElement.getAttribute('data-date');
382
+ if (activeDate !== null && activeDate !== '') {
383
+ if (key === 'ArrowLeft') {
384
+ this.navigateLeft(Number.parseInt(activeDate, 10));
385
+ }
386
+ else if (key === 'ArrowRight') {
387
+ this.navigateRight(Number.parseInt(activeDate, 10));
388
+ }
389
+ else if (key === 'ArrowUp') {
390
+ this.navigateUp(Number.parseInt(activeDate, 10));
391
+ }
392
+ else if (key === 'ArrowDown') {
393
+ this.navigateDown(Number.parseInt(activeDate, 10));
394
+ }
395
+ }
396
+ }
397
+ }
398
+ /**
399
+ * Attempt to focus on date indexed immediately to the left of the input date
400
+ * @param date the day of the month
401
+ * @private
402
+ */
403
+ navigateLeft(date) {
404
+ if (date > 1) {
405
+ const calendarDates = this.calendarDates.toArray();
406
+ const foundIndex = calendarDates.findIndex(calendarDate => {
407
+ return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
408
+ });
409
+ if (foundIndex > 0) {
410
+ calendarDates[foundIndex - 1].nativeElement.focus();
411
+ }
412
+ }
413
+ }
414
+ /**
415
+ * Attempt to focus on date indexed immediately to the right of the input date
416
+ * @param date the day of the month
417
+ * @private
418
+ */
419
+ navigateRight(date) {
420
+ const calendarDates = this.calendarDates.toArray();
421
+ const foundIndex = calendarDates.findIndex(calendarDate => {
422
+ return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
423
+ });
424
+ if ((foundIndex > -1) && (foundIndex < (calendarDates.length - 1))) {
425
+ calendarDates[foundIndex + 1].nativeElement.focus();
426
+ }
427
+ }
428
+ /**
429
+ * Attempt to navigate one week in the past from the input date
430
+ * @param date the day of the month
431
+ * @private
432
+ */
433
+ navigateUp(date) {
434
+ const calendarDates = this.calendarDates.toArray();
435
+ const foundIndex = calendarDates.findIndex(calendarDate => {
436
+ return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
437
+ });
438
+ if ((foundIndex > -1) && (foundIndex - 7 >= 0)) {
439
+ calendarDates[foundIndex - 7].nativeElement.focus();
440
+ }
441
+ }
442
+ /**
443
+ * Attempt to navigate one week in the future from the input date
444
+ * @param date the day of the month
445
+ * @private
446
+ */
447
+ navigateDown(date) {
448
+ const calendarDates = this.calendarDates.toArray();
449
+ const foundIndex = calendarDates.findIndex(calendarDate => {
450
+ return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
451
+ });
452
+ if ((foundIndex > -1) && ((foundIndex + 7) < (calendarDates.length))) {
453
+ calendarDates[foundIndex + 7].nativeElement.focus();
454
+ }
455
+ }
456
+ clear() {
457
+ this.selectedDate = null;
458
+ }
459
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: CalendarComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
460
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", type: CalendarComponent, selector: "particle-calendar", inputs: { value: "value", dateRange: "dateRange", text: "text", showControls: "showControls" }, outputs: { selected: "selected", closed: "closed" }, host: { listeners: { "window:keyup": "onKeyUp($event)", "window:click": "handleClick($event)" } }, viewQueries: [{ propertyName: "calendarWidgetDiv", first: true, predicate: ["calendarWidgetDiv"], descendants: true }, { propertyName: "yearSelect", first: true, predicate: ["yearSelect"], descendants: true }, { propertyName: "doneButton", first: true, predicate: ["doneButton"], descendants: true }, { propertyName: "calendarDates", predicate: ["calendarDate"], descendants: true }], ngImport: i0, template: "<div #calendarWidgetDiv\r\n cdkTrapFocus\r\n cdkTrapFocusAutoCapture\r\n class=\"particle_datepicker_options\"\r\n role=\"application\">\r\n <!-- month / year select -->\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"particle_datepicker_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <div class=\"row wrap space_between\">\r\n <ng-container *ngFor=\"let dayInMonth of fullMonth$ | async\">\r\n <div [ngClass]=\"{'today': (dayInMonth.date === currentDate.date && dayInMonth.month === currentDate.month && dayInMonth.year === currentDate.year)}\"\r\n class=\"particle_datepicker_day\">\r\n <ng-container *ngIf=\"dayInMonth.selectable else disabledDate\">\r\n <button #calendarDate\r\n (click)=\"handleDateSelection(dayInMonth)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-date]=\"dayInMonth.date\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [attr.aria-label]=\"text.select + ' ' + weekDays[dayInMonth.day] + ' ' + text.the + ' ' + (dayInMonth.date | ordinalNumber)\"\r\n [ngClass]=\"{\r\n 'ok_button_color': (dayInMonth.date === selectedDate?.date && dayInMonth.month === selectedDate?.month && dayInMonth.year === selectedDate?.year),\r\n 'bg_overlay_rev brdr hov_bg': (dayInMonth.date !== selectedDate?.date || dayInMonth.month !== selectedDate?.month || dayInMonth.year !== selectedDate?.year)\r\n }\"\r\n class=\"access day_button\">\r\n {{dayInMonth.date}}\r\n </button>\r\n </ng-container>\r\n <ng-template #disabledDate>\r\n <div class=\"day_disabled\">\r\n {{dayInMonth.date}}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showControls\">\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"(currentDate.date === selectedDate?.date && currentDate.month === selectedDate?.month && currentDate.year === selectedDate?.year) else selectTodayButton\"\r\n disabled\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n <ng-template #selectTodayButton>\r\n <button (keyup.escape)=\"closed.emit()\"\r\n (click)=\"selectToday()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button #doneButton\r\n (keyup.escape)=\"closed.emit()\"\r\n (click)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.saveDate\">\r\n <i class=\"fas fa-check mar_right5\"></i><span class=\"text bold\">{{text.done}}</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".particle_datepicker_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);width:300px}.particle_datepicker_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.particle_datepicker_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent}.particle_datepicker_day.today{background-color:#8080801a}.particle_datepicker_day .day_button{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;display:flex;flex:1;width:100%;align-items:center;justify-content:center;padding:0;border-radius:3px}.particle_datepicker_day .day_disabled{opacity:.3;display:flex;flex:1;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.OrdinalNumberPipe, name: "ordinalNumber" }] });
461
+ }
462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: CalendarComponent, decorators: [{
463
+ type: Component,
464
+ args: [{ selector: 'particle-calendar', template: "<div #calendarWidgetDiv\r\n cdkTrapFocus\r\n cdkTrapFocusAutoCapture\r\n class=\"particle_datepicker_options\"\r\n role=\"application\">\r\n <!-- month / year select -->\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"particle_datepicker_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <div class=\"row wrap space_between\">\r\n <ng-container *ngFor=\"let dayInMonth of fullMonth$ | async\">\r\n <div [ngClass]=\"{'today': (dayInMonth.date === currentDate.date && dayInMonth.month === currentDate.month && dayInMonth.year === currentDate.year)}\"\r\n class=\"particle_datepicker_day\">\r\n <ng-container *ngIf=\"dayInMonth.selectable else disabledDate\">\r\n <button #calendarDate\r\n (click)=\"handleDateSelection(dayInMonth)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-date]=\"dayInMonth.date\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [attr.aria-label]=\"text.select + ' ' + weekDays[dayInMonth.day] + ' ' + text.the + ' ' + (dayInMonth.date | ordinalNumber)\"\r\n [ngClass]=\"{\r\n 'ok_button_color': (dayInMonth.date === selectedDate?.date && dayInMonth.month === selectedDate?.month && dayInMonth.year === selectedDate?.year),\r\n 'bg_overlay_rev brdr hov_bg': (dayInMonth.date !== selectedDate?.date || dayInMonth.month !== selectedDate?.month || dayInMonth.year !== selectedDate?.year)\r\n }\"\r\n class=\"access day_button\">\r\n {{dayInMonth.date}}\r\n </button>\r\n </ng-container>\r\n <ng-template #disabledDate>\r\n <div class=\"day_disabled\">\r\n {{dayInMonth.date}}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showControls\">\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"(currentDate.date === selectedDate?.date && currentDate.month === selectedDate?.month && currentDate.year === selectedDate?.year) else selectTodayButton\"\r\n disabled\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n <ng-template #selectTodayButton>\r\n <button (keyup.escape)=\"closed.emit()\"\r\n (click)=\"selectToday()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button #doneButton\r\n (keyup.escape)=\"closed.emit()\"\r\n (click)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.saveDate\">\r\n <i class=\"fas fa-check mar_right5\"></i><span class=\"text bold\">{{text.done}}</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".particle_datepicker_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);width:300px}.particle_datepicker_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.particle_datepicker_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent}.particle_datepicker_day.today{background-color:#8080801a}.particle_datepicker_day .day_button{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;display:flex;flex:1;width:100%;align-items:center;justify-content:center;padding:0;border-radius:3px}.particle_datepicker_day .day_disabled{opacity:.3;display:flex;flex:1;align-items:center;justify-content:center}\n"] }]
465
+ }], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { calendarWidgetDiv: [{
466
+ type: ViewChild,
467
+ args: ['calendarWidgetDiv']
468
+ }], yearSelect: [{
469
+ type: ViewChild,
470
+ args: ['yearSelect']
471
+ }], doneButton: [{
472
+ type: ViewChild,
473
+ args: ['doneButton']
474
+ }], calendarDates: [{
475
+ type: ViewChildren,
476
+ args: ['calendarDate']
477
+ }], value: [{
478
+ type: Input
479
+ }], dateRange: [{
480
+ type: Input
481
+ }], text: [{
482
+ type: Input
483
+ }], showControls: [{
484
+ type: Input
485
+ }], selected: [{
486
+ type: Output
487
+ }], closed: [{
488
+ type: Output
489
+ }], onKeyUp: [{
490
+ type: HostListener,
491
+ args: ['window:keyup', ['$event']]
492
+ }], handleClick: [{
493
+ type: HostListener,
494
+ args: ['window:click', ['$event']]
495
+ }] } });
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2RhdGUtcGlja2VyL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2RhdGUtcGlja2VyL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBMkNyQzs7R0FFRztBQU1ILE1BQU0sT0FBTyxpQkFBaUI7SUF1VVI7SUFyVXBCOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxVQUFVLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV6Rjs7T0FFRztJQUVILGlCQUFpQixHQUErQixJQUFXLENBQUM7SUFFNUQ7O09BRUc7SUFFSCxVQUFVLEdBQWtDLElBQVcsQ0FBQztJQUV4RDs7T0FFRztJQUVILFVBQVUsR0FBa0MsSUFBVyxDQUFDO0lBRXhEOztPQUVHO0lBRUgsYUFBYSxHQUE2QyxJQUFXLENBQUM7SUFFdEU7O09BRUc7SUFDSCxJQUNJLEtBQUssQ0FBQyxLQUFXO1FBQ25CLElBQUksYUFB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QkFBQyxjQUFjO2dCQU94QixLQUFLO3NCQURSLEtBQUs7Z0JBcUJGLFNBQVM7c0JBRFosS0FBSztnQkFjRixJQUFJO3NCQURQLEtBQUs7Z0JBcUJOLFlBQVk7c0JBRFgsS0FBSztnQkE2Q04sUUFBUTtzQkFEUCxNQUFNO2dCQVNQLE1BQU07c0JBREwsTUFBTTtnQkEwUFAsT0FBTztzQkFETixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFjeEMsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgYWRkRGF5cywgZW5kT2ZNb250aCwgaXNXaXRoaW5JbnRlcnZhbCwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0NhbGVuZGFyVGV4dH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIGRhdGUgaW50ZXJ2YWxcclxuICovXHJcbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJbnRlcnZhbCB7XHJcbiAgc3RhcnQ6IERhdGUgfCBudW1iZXI7XHJcbiAgZW5kOiBEYXRlIHwgbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIERhdGUgYnJva2VuIGRvd24gYnkgZGF0ZS9tb250aC95ZWFyXHJcbiAqIHdpdGggZXh0ZW5kZWQgbWV0YWRhdGFcclxuICovXHJcbmRlY2xhcmUgaW50ZXJmYWNlIE1ldGFEYXRlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgd2VlayAoc3RhcnRpbmcgYXQgMClcclxuICAgKi9cclxuICBkYXk6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggKHN0YXJ0aW5nIGF0IDEpXHJcbiAgICovXHJcbiAgZGF0ZTogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbW9udGggKHN0YXJ0aW5nIGF0IDApXHJcbiAgICovXHJcbiAgbW9udGg6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZ1bGwgeWVhclxyXG4gICAqL1xyXG4gIHllYXI6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZGF5IGlzIHNlbGVjdGFibGVcclxuICAgKi9cclxuICBzZWxlY3RhYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50IHRoYXQgYWxsb3dzIGEgdXNlciB0byBzZWxlY3QgYSBkYXRlIGZyb20gYSBjYWxlbmRhclxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwYXJ0aWNsZS1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUga2V5Ym9hcmQgYXJyb3cga2V5c1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJST1dfS0VZUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBjYWxlbmRhciB3aWRnZXQgcGFyZW50IGRpdiBlbGVtZW50XHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJXaWRnZXREaXYnKVxyXG4gIGNhbGVuZGFyV2lkZ2V0RGl2OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIG1vbnRoIHNlbGVjdCBlbGVtZW50XHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgneWVhclNlbGVjdCcpXHJcbiAgeWVhclNlbGVjdDogRWxlbWVudFJlZjxIVE1MU2VsZWN0RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkb25lIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2RvbmVCdXR0b24nKVxyXG4gIGRvbmVCdXR0b246IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5TGlzdCBvZiB0aGUgY2FsZW5kYXIgZGF0ZSBidXR0b25zIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1vbnRoL3llYXJcclxuICAgKi9cclxuICBAVmlld0NoaWxkcmVuKCdjYWxlbmRhckRhdGUnKVxyXG4gIGNhbGVuZGFyRGF0ZXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNlbGVjdGVkIGRhdGUgdmFsdWVcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSkge1xyXG4gICAgbGV0IG1ldGFEYXRlVmFsdWU6IE1ldGFEYXRlID0gbnVsbCBhcyBhbnlcclxuXHJcbiAgICBpZiAoISF2YWx1ZSkge1xyXG4gICAgICBtZXRhRGF0ZVZhbHVlID0ge1xyXG4gICAgICAgIGRheTogdmFsdWUuZ2V0RGF5KCksXHJcbiAgICAgICAgZGF0ZTogdmFsdWUuZ2V0RGF0ZSgpLFxyXG4gICAgICAgIG1vbnRoOiB2YWx1ZS5nZXRNb250aCgpLFxyXG4gICAgICAgIHllYXI6IHZhbHVlLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3ZhbHVlLm5leHQobWV0YURhdGVWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmFuZ2Ugb2YgYXZhaWxhYmxlIGRhdGVzIHRvIGNob29zZSBmcm9tXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGF0ZVJhbmdlKGRhdGVSYW5nZTogeyBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlIH0pIHtcclxuICAgIGlmIChkYXRlUmFuZ2U/Lm1pbkRhdGUgPiBkYXRlUmFuZ2U/Lm1heERhdGUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudGV4dC5taW5HcmVhdGVyVGhlbk1heCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge3llYXJ9ID0gdGhpcy5jdXJyZW50RGF0ZTtcclxuICAgIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWwubmV4dCh7XHJcbiAgICAgIHN0YXJ0OiBkYXRlUmFuZ2U/Lm1pbkRhdGUgPz8gbmV3IERhdGUoeWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgIGVuZDogZGF0ZVJhbmdlPy5tYXhEYXRlID8/IG5ldyBEYXRlKHllYXIgKyA1MCwgMTEsIDMxKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCB0ZXh0KHRleHQ6IENhbGVuZGFyVGV4dCkge1xyXG4gICAgaWYgKHRleHQpIHtcclxuICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7XHJcbiAgICAgIHRoaXMud2Vla0RheXMgPSBbXHJcbiAgICAgICAgdGV4dC5zdW5kYXksXHJcbiAgICAgICAgdGV4dC5tb25kYXksXHJcbiAgICAgICAgdGV4dC50dWVzZGF5LFxyXG4gICAgICAgIHRleHQud2VkbmVzZGF5LFxyXG4gICAgICAgIHRleHQudGh1cnNkYXksXHJcbiAgICAgICAgdGV4dC5mcmlkYXksXHJcbiAgICAgICAgdGV4dC5zYXR1cmRheVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRleHQoKTogQ2FsZW5kYXJUZXh0IHtcclxuICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzaG93Q29udHJvbHMgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF90ZXh0OiBDYWxlbmRhclRleHQgPSB7XHJcbiAgICBzZWxlY3RBWWVhcjogJ1NlbGVjdCBhIFllYXInLFxyXG4gICAgc2VsZWN0QU1vbnRoOiAnU2VsZWN0IGEgTW9udGgnLFxyXG4gICAgamFudWFyeTogJ0phbnVhcnknLFxyXG4gICAgZmVicnVhcnk6ICdGZWJydWFyeScsXHJcbiAgICBtYXJjaDogJ01hcmNoJyxcclxuICAgIGFwcmlsOiAnQXByaWwnLFxyXG4gICAgbWF5OiAnTWF5JyxcclxuICAgIGp1bmU6ICdKdW5lJyxcclxuICAgIGp1bHk6ICdKdWx5JyxcclxuICAgIGF1Z3VzdDogJ0F1Z3VzdCcsXHJcbiAgICBzZXB0ZW1iZXI6ICdTZXB0ZW1iZXInLFxyXG4gICAgb2N0b2JlcjogJ09jdG9iZXInLFxyXG4gICAgbm92ZW1iZXI6ICdOb3ZlbWJlcicsXHJcbiAgICBkZWNlbWJlcjogJ0RlY2VtYmVyJyxcclxuICAgIHN1bmRheUFiYnI6ICdTdScsXHJcbiAgICBtb25kYXlBYmJyOiAnTW8nLFxyXG4gICAgdHVlc2RheUFiYnI6ICdUdScsXHJcbiAgICB3ZWRuZXNkYXlBYmJyOiAnV2UnLFxyXG4gICAgdGh1cnNkYXlBYmJyOiAnVGgnLFxyXG4gICAgZnJpZGF5QWJicjogJ0ZyJyxcclxuICAgIHNhdHVyZGF5QWJicjogJ1NhJyxcclxuICAgIHN1bmRheTogJ1N1bmRheScsXHJcbiAgICBtb25kYXk6ICdNb25kYXknLFxyXG4gICAgdHVlc2RheTogJ1R1ZXNkYXknLFxyXG4gICAgd2VkbmVzZGF5OiAnV2VkbmVzZGF5JyxcclxuICAgIHRodXJzZGF5OiAnVGh1cnNkYXknLFxyXG4gICAgZnJpZGF5OiAnRnJpZGF5JyxcclxuICAgIHNhdHVyZGF5OiAnU2F0dXJkYXknLFxyXG4gICAgc2VsZWN0OiAnU2VsZWN0JyxcclxuICAgIHRoZTogJ3RoZScsXHJcbiAgICByZXNldERhdGVUb1RvZGF5OiAnUmVzZXQgZGF0ZSBzZWxlY3Rpb24gdG8gdG9kYXlcXCdzIGRhdGUnLFxyXG4gICAgc2VsZWN0VG9kYXk6ICdTZWxlY3QgVG9kYXknLFxyXG4gICAgc2F2ZURhdGU6ICdTYXZlIGRhdGUgc2VsZWN0aW9uJyxcclxuICAgIGRvbmU6ICdEb25lJyxcclxuICAgIG1pbkdyZWF0ZXJUaGVuTWF4OiAnTWluIGRhdGUgbXVzdCBiZSBsZXNzIHRoYW4gbWF4IGRhdGUnXHJcbiAgfSBhcyBDYWxlbmRhclRleHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gZGF0ZSBzZWxlY3RcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCBvbiBjbG9zZSAoZWl0aGVyIHRocm91Z2ggdGhlIGJ1dHRvbiwgZXNjYXBlIGtleXVwIG9yIGNsaWNrIG9mZiBvZiB3aWRnZXQpLlxyXG4gICAqIE5vdGU6IGl0IGlzIHRoZSBwYXJlbnQgY29tcG9uZW50J3Mgam9iIHRvIGFjdHVhbGx5IGhpZGUgdGhlIGNhbGVuZGFyLCB0aGlzIGV2ZW50XHJcbiAgICogICAgICAgYWN0cyBhcyBhIHNpZ25hbCB0aGF0IHRoYXQgYWN0aW9uIHNob3VsZCBiZSB0YWtlblxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgRGF0ZSBicm9rZW4gZG93biBieSBkYXkvbW9udGgveWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlOiBNZXRhRGF0ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXJyYXkgb2YgZGF5cyBvZiB0aGUgd2Vla1xyXG4gICAqL1xyXG4gIHdlZWtEYXlzID0gW1xyXG4gICAgdGhpcy50ZXh0LnN1bmRheSxcclxuICAgIHRoaXMudGV4dC5tb25kYXksXHJcbiAgICB0aGlzLnRleHQudHVlc2RheSxcclxuICAgIHRoaXMudGV4dC53ZWRuZXNkYXksXHJcbiAgICB0aGlzLnRleHQudGh1cnNkYXksXHJcbiAgICB0aGlzLnRleHQuZnJpZGF5LFxyXG4gICAgdGhpcy50ZXh0LnNhdHVyZGF5XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50IHZhbHVlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX3ZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhRGF0ZT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIHZhbGlkIHNlbGVjdGlvbiBpbnRlcnZhbFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF92YWxpZFNlbGVjdGlvbkludGVydmFsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcnZhbD4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtb250aFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZE1vbnRoID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgeWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZFllYXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDE5NzApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZnVsbCBtb250aCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbW9udGgveWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGZ1bGxNb250aCQ6IE9ic2VydmFibGU8QXJyYXk8TWV0YURhdGU+PiA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRNb250aCxcclxuICAgIHRoaXMuX3NlbGVjdGVkWWVhcixcclxuICAgIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxcclxuICBdKS5waXBlKFxyXG4gICAgbWFwKChbc2VsZWN0ZWRNb250aCwgc2VsZWN0ZWRZZWFyLCB2YWxpZFNlbGVjdGlvbkludGVydmFsXSkgPT4ge1xyXG4gICAgICByZXR1cm4gQ2FsZW5kYXJDb21wb25lbnQuZ2VuZXJhdGVNb250aChcclxuICAgICAgICBzZWxlY3RlZE1vbnRoLFxyXG4gICAgICAgIHNlbGVjdGVkWWVhcixcclxuICAgICAgICB2YWxpZFNlbGVjdGlvbkludGVydmFsXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByYW5nZSBvZiBzZWxlY3RhYmxlIHllYXJzIGFzIGFuIE9ic2VydmFibGVcclxuICAgKi9cclxuICByZWFkb25seSB2YWxpZFllYXJSYW5nZSQ6IE9ic2VydmFibGU8QXJyYXk8bnVtYmVyPj4gPSB0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLnBpcGUoXHJcbiAgICBtYXAoc2VsZWN0aW9uSW50ZXJ2YWwgPT4ge1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkWWVhci5nZXRWYWx1ZSgpIDwgKHNlbGVjdGlvbkludGVydmFsPy5zdGFydCBhcyBEYXRlKT8uZ2V0RnVsbFllYXIoKSkge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQoKHNlbGVjdGlvbkludGVydmFsPy5zdGFydCBhcyBEYXRlKT8uZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIENhbGVuZGFyQ29tcG9uZW50LmdlbmVyYXRlWWVhclJhbmdlKFxyXG4gICAgICAgIChzZWxlY3Rpb25JbnRlcnZhbD8uc3RhcnQgYXMgRGF0ZSk/LmdldEZ1bGxZZWFyKCkgPz8gbnVsbCxcclxuICAgICAgICAoc2VsZWN0aW9uSW50ZXJ2YWw/LmVuZCBhcyBEYXRlKT8uZ2V0RnVsbFllYXIoKSA/PyBudWxsLFxyXG4gICAgICAgIHRoaXMuY3VycmVudERhdGUueWVhclxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIF9zZWxlY3RlZFllYXIgaXMgdmFsaWQgaW4gdGhlIG5ldyBkYXRlIHJhbmdlLCBpZiBub3QgdXBkYXRlIHRvIG1pbiB5ZWFyIG9mIHJhbmdlXHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmlwdGlvbiBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIHZhbHVlIGFuZCB2YWxpZCBzZWxlY3Rpb24gaW50ZXJ2YWxcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGVcclxuICAgKi9cclxuICBzZWxlY3RlZERhdGU6IE1ldGFEYXRlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgNDIgZWxlbWVudCBhcnJheSByZXByZXNlbnRpbmcgdGhlIGlucHV0IG1vbnRoJ3MgZGF5cyB3aXRoXHJcbiAgICogcGFkZGluZyBmcm9tIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbW9udGhcclxuICAgKiBAcGFyYW0gbW9udGggdGhlIG1vbnRoIHRvIGdlbmVyYXRlIGRhdGVzIGZvclxyXG4gICAqIEBwYXJhbSB5ZWFyIHRoZSB5ZWFyIHRvIGdlbmVyYXRlIHRoZSBtb250aCBmb3JcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uSW50ZXJ2YWwgdGhlIHNlbGVjdGlvbiBpbnRlcnZhbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlTW9udGgoXHJcbiAgICBtb250aDogbnVtYmVyLFxyXG4gICAgeWVhcjogbnVtYmVyLFxyXG4gICAgc2VsZWN0aW9uSW50ZXJ2YWw6IEludGVydmFsXHJcbiAgKTogQXJyYXk8TWV0YURhdGU+IHtcclxuICAgIGlmICghIXNlbGVjdGlvbkludGVydmFsKSB7XHJcbiAgICAgIGNvbnN0IGJlZ2lubmluZ09mTW9udGhEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgICBjb25zdCBlbmRPZk1vbnRoRGF0ZSA9IGVuZE9mTW9udGgoYmVnaW5uaW5nT2ZNb250aERhdGUpO1xyXG5cclxuICAgICAgY29uc3QgZnVsbE1vbnRoOiBBcnJheTxNZXRhRGF0ZT4gPSBbXTtcclxuICAgICAgbGV0IGRheU9mTW9udGggPSBiZWdpbm5pbmdPZk1vbnRoRGF0ZS5nZXREYXkoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZW5kT2ZNb250aERhdGUuZ2V0RGF0ZSgpOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRlT2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKTtcclxuICAgICAgICBmdWxsTW9udGgucHVzaCh7XHJcbiAgICAgICAgICBkYXk6IGRheU9mTW9udGgsXHJcbiAgICAgICAgICBkYXRlOiBpLFxyXG4gICAgICAgICAgbW9udGgsXHJcbiAgICAgICAgICB5ZWFyLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogaXNXaXRoaW5JbnRlcnZhbChkYXRlT2ZNb250aCwgc2VsZWN0aW9uSW50ZXJ2YWwpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRheU9mTW9udGggPSBkYXlPZk1vbnRoID09PSA2ID8gMCA6IGRheU9mTW9udGggKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYmVnaW5uaW5nT2ZNb250aERhdGUuZ2V0RGF5KCkgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdE1vbnRoRGF0ZXM6IEFycmF5PE1ldGFEYXRlPiA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBiZWdpbm5pbmdPZk1vbnRoRGF0ZS5nZXREYXkoKTsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgICAgY29uc3Qgc3VidHJhY3RlZERhdGUgPSBzdWJEYXlzKGJlZ2lubmluZ09mTW9udGhEYXRlLCBpKTtcclxuICAgICAgICAgIGxhc3RNb250aERhdGVzLnB1c2goe1xyXG4gICAgICAgICAgICBkYXk6IHN1YnRyYWN0ZWREYXRlLmdldERheSgpLFxyXG4gICAgICAgICAgICBkYXRlOiBzdWJ0cmFjdGVkRGF0ZS5nZXREYXRlKCksXHJcbiAgICAgICAgICAgIG1vbnRoOiBzdWJ0cmFjdGVkRGF0ZS5nZXRNb250aCgpLFxyXG4gICAgICAgICAgICB5ZWFyOiBzdWJ0cmFjdGVkRGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdWxsTW9udGgudW5zaGlmdCguLi5sYXN0TW9udGhEYXRlcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkYXlzVG9BZGQgPSAxO1xyXG4gICAgICB3aGlsZSAoZnVsbE1vbnRoLmxlbmd0aCA8IDQyKSB7XHJcbiAgICAgICAgY29uc3QgYWRkZWREYXRlID0gYWRkRGF5cyhlbmRPZk1vbnRoRGF0ZSwgZGF5c1RvQWRkKyspO1xyXG4gICAgICAgIGZ1bGxNb250aC5wdXNoKHtcclxuICAgICAgICAgIGRheTogYWRkZWREYXRlLmdldERheSgpLFxyXG4gICAgICAgICAgZGF0ZTogYWRkZWREYXRlLmdldERhdGUoKSxcclxuICAgICAgICAgIG1vbnRoOiBhZGRlZERhdGUuZ2V0TW9udGgoKSxcclxuICAgICAgICAgIHllYXI6IGFkZGVkRGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZ1bGxNb250aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbCBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhbiBBcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB5ZWFycyBiZXR3ZWVuIHRoZSBpbnB1dFxyXG4gICAqIEBwYXJhbSBtaW5ZZWFyIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2VcclxuICAgKiBAcGFyYW0gbWF4WWVhciB0aGUgZW5kIG9mIHRoZSByYW5nZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50WWVhciB0aGUgY3VycmVudCB5ZWFyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVZZWFyUmFuZ2UobWluWWVhcjogbnVtYmVyLCBtYXhZZWFyOiBudW1iZXIsIGN1cnJlbnRZZWFyOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcclxuICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcclxuICAgIGlmICghbWluWWVhciAmJiAhIW1heFllYXIpIHtcclxuICAgICAgc3RhcnQgPSBtYXhZZWFyID0gNTA7XHJcbiAgICAgIGVuZCA9IG1heFllYXI7XHJcbiAgICB9IGVsc2UgaWYgKCEhbWluWWVhciAmJiAhbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1pblllYXI7XHJcbiAgICAgIGVuZCA9IG1pblllYXIgKyA1MDtcclxuICAgIH0gZWxzZSBpZiAoISFtaW5ZZWFyICYmICEhbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1pblllYXI7XHJcbiAgICAgIGVuZCA9IG1heFllYXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdGFydCA9IGN1cnJlbnRZZWFyIC0gMTAwO1xyXG4gICAgICBlbmQgPSBjdXJyZW50WWVhciArIDUwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhbmdlOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgcmFuZ2UucHVzaChpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmFuZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXBlbmRlbmN5IGluamVjdGlvbiBzaXRlXHJcbiAgICogQHBhcmFtIHJlbmRlcmVyIHRoZSBBbmd1bGFyIHJlbmRlcmVyXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnREYXRlID0ge1xyXG4gICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERheSgpLFxyXG4gICAgICBkYXRlOiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXHJcbiAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpLFxyXG4gICAgICB5ZWFyOiBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBzZWxlY3RhYmxlOiB0cnVlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdCBjb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5fdmFsdWUsIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxdKS5zdWJzY3JpYmUoXHJcbiAgICAgIChbdmFsdWUsIHZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxdKSA9PiB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbkludGVydmFsID0gdmFsaWRTZWxlY3Rpb25JbnRlcnZhbDtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgICAgY29uc3Qge3llYXJ9ID0gdGhpcy5jdXJyZW50RGF0ZTtcclxuICAgICAgICAgIHNlbGVjdGlvbkludGVydmFsID0ge1xyXG4gICAgICAgICAgICBzdGFydDogbmV3IERhdGUoeWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgICAgICAgIGVuZDogbmV3IERhdGUoeWVhciArIDUwLCAxMSwgMzEpXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuY3VycmVudERhdGUuc2VsZWN0YWJsZSA9IGlzV2l0aGluSW50ZXJ2YWwoXHJcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUueWVhciwgdGhpcy5jdXJyZW50RGF0ZS5tb250aCwgdGhpcy5jdXJyZW50RGF0ZS5kYXRlKSxcclxuICAgICAgICAgICAgc2VsZWN0aW9uSW50ZXJ2YWxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISF2YWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVEYXRlID0gbmV3IERhdGUodmFsdWUueWVhciwgdmFsdWUubW9udGgsIHZhbHVlLmRhdGUpO1xyXG4gICAgICAgICAgaWYgKGlzV2l0aGluSW50ZXJ2YWwodmFsdWVEYXRlLCBzZWxlY3Rpb25JbnRlcnZhbCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHZhbHVlLm1vbnRoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodmFsdWUueWVhcik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZS5uZXh0KG51bGwgYXMgYW55KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsIGFzIGFueTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHRoaXMuY3VycmVudERhdGUubW9udGgpO1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodGhpcy5jdXJyZW50RGF0ZS55ZWFyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHJveSBjb21wb25lbnQsIHVuc3Vic2NyaWJlIGZyb20gYW55IGFjdGl2ZSBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHdpbmRvdyBrZXl1cCBldmVudHNcclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleXVwIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtrZXl9ID0gZXZlbnQ7XHJcblxyXG4gICAgaWYgKENhbGVuZGFyQ29tcG9uZW50LkFSUk9XX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICB0aGlzLm9uQXJyb3dLZXlVcChrZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdCBjbG9zZWQgZXZlbnQgb24gY2xpY2sgaWYgY2xpY2tlZCBvdXRzaWRlIGNhbGVuZGFyIHdpZGdldFxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2xpY2sgTW91c2VFdmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtwYWdlWCwgcGFnZVl9ID0gZXZlbnQ7XHJcblxyXG4gICAgLy8gdGhpcyBjaGVjayBpcyB0byBwcmV2ZW50IHRoZSBjbGljayBldmVudCBmcm9tIGZpcmluZyBvbiBrZXlwcmVzcyB3aGVuIGZvY3VzZWQgb24gYSBidXR0b25cclxuICAgIGlmIChwYWdlWCA+IDAgJiYgcGFnZVkgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9ID0gdGhpcy5jYWxlbmRhcldpZGdldERpdi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgY29uc3QgaW5zaWRlWCA9IChwYWdlWCA+PSBsZWZ0KSAmJiAocGFnZVggPD0gcmlnaHQpO1xyXG4gICAgICBjb25zdCBpbnNpZGVZID0gKHBhZ2VZID49IHRvcCkgJiYgKHBhZ2VZIDw9IGJvdHRvbSk7XHJcblxyXG4gICAgICAvLyB0aGlzIGNoZWNrIGlzIGZvciBJRTExIHdoZXJlIG9wdGlvbiB2YWx1ZXMgbWlnaHQgcmVuZGVyIG91dHNpZGUgb2YgdGhlIGNhbGVuZGFyXHJcbiAgICAgIGNvbnN0IHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xyXG4gICAgICBjb25zdCBzaG91bGRDbG9zZSA9ICEoaW5zaWRlWCAmJiBpbnNpZGVZKSAmJiB0YWdOYW1lICE9PSAnT1BUSU9OJztcclxuXHJcbiAgICAgIGlmIChzaG91bGRDbG9zZSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNlbGVjdGVkIGRhdGUgYW5kIGVtaXQgc2VsZWN0aW9uIGV2ZW50XHJcbiAgICogQHBhcmFtIHNlbGVjdGVkRGF0ZSB0aGUgc2VsZWN0ZWQgZGF0ZVxyXG4gICAqL1xyXG4gIGhhbmRsZURhdGVTZWxlY3Rpb24oc2VsZWN0ZWREYXRlOiBNZXRhRGF0ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBzZWxlY3RlZERhdGU7XHJcbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3IERhdGUoc2VsZWN0ZWREYXRlLnllYXIsIHNlbGVjdGVkRGF0ZS5tb250aCwgc2VsZWN0ZWREYXRlLmRhdGUpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCB0aGUgY3VycmVudCBkYXRlIGFuZCB0b2dnbGUgc2VsZWN0ZWQgbW9udGgveWVhciB0byBtYXRjaFxyXG4gICAqL1xyXG4gIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVEYXRlU2VsZWN0aW9uKHRoaXMuY3VycmVudERhdGUpO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHRoaXMuY3VycmVudERhdGUubW9udGgpO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodGhpcy5jdXJyZW50RGF0ZS55ZWFyKTtcclxuICAgIHRoaXMuZG9uZUJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYXJyb3cga2V5IG5hdmlnYXRpb24gZm9yIGNhbGVuZGFyIGRhdGUgYnV0dG9uc1xyXG4gICAqIEBwYXJhbSBrZXkgdGhlIHByZXNzZWQgYXJyb3cga2V5XHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIG9uQXJyb3dLZXlVcChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSBkb2N1bWVudDtcclxuXHJcbiAgICBpZiAoISFhY3RpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IGFjdGl2ZURhdGUgPSBhY3RpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJyk7XHJcblxyXG4gICAgICBpZiAoYWN0aXZlRGF0ZSAhPT0gbnVsbCAmJiBhY3RpdmVEYXRlICE9PSAnJykge1xyXG4gICAgICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlTGVmdChOdW1iZXIucGFyc2VJbnQoYWN0aXZlRGF0ZSwgMTApKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlUmlnaHQoTnVtYmVyLnBhcnNlSW50KGFjdGl2ZURhdGUsIDEwKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdBcnJvd1VwJykge1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZVVwKE51bWJlci5wYXJzZUludChhY3RpdmVEYXRlLCAxMCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnQXJyb3dEb3duJykge1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZURvd24oTnVtYmVyLnBhcnNlSW50KGFjdGl2ZURhdGUsIDEwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRlbXB0IHRvIGZvY3VzIG9uIGRhdGUgaW5kZXhlZCBpbW1lZGlhdGVseSB0byB0aGUgbGVmdCBvZiB0aGUgaW5wdXQgZGF0ZVxyXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIG5hdmlnYXRlTGVmdChkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChkYXRlID4gMSkge1xyXG4gICAgICBjb25zdCBjYWxlbmRhckRhdGVzID0gdGhpcy5jYWxlbmRhckRhdGVzLnRvQXJyYXkoKTtcclxuICAgICAgY29uc3QgZm91bmRJbmRleCA9IGNhbGVuZGFyRGF0ZXMuZmluZEluZGV4KGNhbGVuZGFyRGF0ZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUgPT09IE51bWJlci5wYXJzZUludChcclxuICAgICAgICAgIGNhbGVuZGFyRGF0ZS5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJykgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgMTBcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChmb3VuZEluZGV4ID4gMCkge1xyXG4gICAgICAgIGNhbGVuZGFyRGF0ZXNbZm91bmRJbmRleCAtIDFdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR0ZW1wdCB0byBmb2N1cyBvbiBkYXRlIGluZGV4ZWQgaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBkYXRlXHJcbiAgICogQHBhcmFtIGRhdGUgdGhlIGRheSBvZiB0aGUgbW9udGhcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbmF2aWdhdGVSaWdodChkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbGVuZGFyRGF0ZXMgPSB0aGlzLmNhbGVuZGFyRGF0ZXMudG9BcnJheSgpO1xyXG4gICAgY29uc3QgZm91bmRJbmRleCA9IGNhbGVuZGFyRGF0ZXMuZmluZEluZGV4KGNhbGVuZGFyRGF0ZSA9PiB7XHJcbiAgICAgIHJldHVybiBkYXRlID09PSBOdW1iZXIucGFyc2VJbnQoXHJcbiAgICAgICAgY2FsZW5kYXJEYXRlLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgMTBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgoZm91bmRJbmRleCA+IC0xKSAmJiAoZm91bmRJbmRleCA8IChjYWxlbmRhckRhdGVzLmxlbmd0aCAtIDEpKSkge1xyXG4gICAgICBjYWxlbmRhckRhdGVzW2ZvdW5kSW5kZXggKyAxXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRlbXB0IHRvIG5hdmlnYXRlIG9uZSB3ZWVrIGluIHRoZSBwYXN0IGZyb20gdGhlIGlucHV0IGRhdGVcclxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVVwKGRhdGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgY2FsZW5kYXJEYXRlcyA9IHRoaXMuY2FsZW5kYXJEYXRlcy50b0FycmF5KCk7XHJcbiAgICBjb25zdCBmb3VuZEluZGV4ID0gY2FsZW5kYXJEYXRlcy5maW5kSW5kZXgoY2FsZW5kYXJEYXRlID0+IHtcclxuICAgICAgcmV0dXJuIGRhdGUgPT09IE51bWJlci5wYXJzZUludChcclxuICAgICAgICBjYWxlbmRhckRhdGUubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpIGFzIHN0cmluZyxcclxuICAgICAgICAxMFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKChmb3VuZEluZGV4ID4gLTEpICYmIChmb3VuZEluZGV4IC0gNyA+PSAwKSkge1xyXG4gICAgICBjYWxlbmRhckRhdGVzW2ZvdW5kSW5kZXggLSA3XS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRlbXB0IHRvIG5hdmlnYXRlIG9uZSB3ZWVrIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgaW5wdXQgZGF0ZVxyXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIG5hdmlnYXRlRG93bihkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbGVuZGFyRGF0ZXMgPSB0aGlzLmNhbGVuZGFyRGF0ZXMudG9BcnJheSgpO1xyXG4gICAgY29uc3QgZm91bmRJbmRleCA9IGNhbGVuZGFyRGF0ZXMuZmluZEluZGV4KGNhbGVuZGFyRGF0ZSA9PiB7XHJcbiAgICAgIHJldHVybiBkYXRlID09PSBOdW1iZXIucGFyc2VJbnQoXHJcbiAgICAgICAgY2FsZW5kYXJEYXRlLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgMTBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgoZm91bmRJbmRleCA+IC0xKSAmJiAoKGZvdW5kSW5kZXggKyA3KSA8IChjYWxlbmRhckRhdGVzLmxlbmd0aCkpKSB7XHJcbiAgICAgIGNhbGVuZGFyRGF0ZXNbZm91bmRJbmRleCArIDddLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNjYWxlbmRhcldpZGdldERpdlxyXG4gICAgIGNka1RyYXBGb2N1c1xyXG4gICAgIGNka1RyYXBGb2N1c0F1dG9DYXB0dXJlXHJcbiAgICAgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX29wdGlvbnNcIlxyXG4gICAgIHJvbGU9XCJhcHBsaWNhdGlvblwiPlxyXG4gIDwhLS0gbW9udGggLyB5ZWFyIHNlbGVjdCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY29udGVudF9jb2xvciBwYWRfNSBwYWRfYm90MFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBzcGFjZV9iZXR3ZWVuXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8xIG1hcl81XCI+XHJcbiAgICAgICAgPHNlbGVjdCAjeWVhclNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX3NlbGVjdGVkWWVhciB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJfc2VsZWN0ZWRZZWFyLm5leHQoK3llYXJTZWxlY3QudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwiY2xvc2VkLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBpbnB1dCBzbSBjb250ZW50X2NvbG9yXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RBWWVhclwiPlxyXG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB2YWxpZFllYXJSYW5nZSQgfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ5ZWFyXCI+XHJcbiAgICAgICAgICAgICAge3t5ZWFyfX1cclxuICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzIgbWFyXzVcIj5cclxuICAgICAgICA8c2VsZWN0ICNtb250aFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX3NlbGVjdGVkTW9udGggfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl9zZWxlY3RlZE1vbnRoLm5leHQoK21vbnRoU2VsZWN0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cImNsb3NlZC5lbWl0KClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBpbnB1dCBzbSBjb250ZW50X2NvbG9yXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RBTW9udGhcIj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+e3t0ZXh0LmphbnVhcnl9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj57e3RleHQuZmVicnVhcnl9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj57e3RleHQubWFyY2h9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjNcIj57e3RleHQuYXByaWx9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjRcIj57e3RleHQubWF5fX08L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1XCI+e3t0ZXh0Lmp1bmV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjZcIj57e3RleHQuanVseX19PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiN1wiPnt7dGV4dC5hdWd1c3R9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjhcIj57e3RleHQuc2VwdGVtYmVyfX08L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI5XCI+e3t0ZXh0Lm9jdG9iZXJ9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwXCI+e3t0ZXh0Lm5vdmVtYmVyfX08L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMVwiPnt7dGV4dC5kZWNlbWJlcn19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRlbnRfY29sb3IgcGFkXzVcIj5cclxuICAgIDwhLS0gd2Vla2RheXMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFyXzUgbWFyX2JvdDEwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgd3JhcCBzcGFjZV9iZXR3ZWVuIHB0bF9pbnB1dF9iZ19jb2xvciBwdGxfYnJkcl9jb2xvciBib3JkZXJfYm90dG9tIGJyYWRfMyBtYXJfYm90NVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX3dlZWtkYXlcIj57e3RleHQuc3VuZGF5QWJicn19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2RhdGVwaWNrZXJfd2Vla2RheVwiPnt7dGV4dC5tb25kYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl93ZWVrZGF5XCI+e3t0ZXh0LnR1ZXNkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl93ZWVrZGF5XCI+e3t0ZXh0LndlZG5lc2RheUFiYnJ9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX3dlZWtkYXlcIj57e3RleHQudGh1cnNkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl93ZWVrZGF5XCI+e3t0ZXh0LmZyaWRheUFiYnJ9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX3dlZWtkYXlcIj57e3RleHQuc2F0dXJkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gZGF5cyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyB3cmFwIHNwYWNlX2JldHdlZW5cIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXlJbk1vbnRoIG9mIGZ1bGxNb250aCQgfCBhc3luY1wiPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3RvZGF5JzogKGRheUluTW9udGguZGF0ZSA9PT0gY3VycmVudERhdGUuZGF0ZSAmJiBkYXlJbk1vbnRoLm1vbnRoID09PSBjdXJyZW50RGF0ZS5tb250aCAmJiBkYXlJbk1vbnRoLnllYXIgPT09IGN1cnJlbnREYXRlLnllYXIpfVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl9kYXlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRheUluTW9udGguc2VsZWN0YWJsZSBlbHNlIGRpc2FibGVkRGF0ZVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gI2NhbGVuZGFyRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURhdGVTZWxlY3Rpb24oZGF5SW5Nb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZWQuZW1pdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF0ZV09XCJkYXlJbk1vbnRoLmRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0ICsgJyAnICsgd2Vla0RheXNbZGF5SW5Nb250aC5kYXldICsgJyAnICsgdGV4dC50aGUgKyAnICcgKyAoZGF5SW5Nb250aC5kYXRlIHwgb3JkaW5hbE51bWJlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnb2tfYnV0dG9uX2NvbG9yJzogKGRheUluTW9udGguZGF0ZSA9PT0gc2VsZWN0ZWREYXRlPy5kYXRlICYmIGRheUluTW9udGgubW9udGggPT09IHNlbGVjdGVkRGF0ZT8ubW9udGggJiYgZGF5SW5Nb250aC55ZWFyID09PSBzZWxlY3RlZERhdGU/LnllYXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmdfb3ZlcmxheV9yZXYgYnJkciBob3ZfYmcnOiAoZGF5SW5Nb250aC5kYXRlICE9PSBzZWxlY3RlZERhdGU/LmRhdGUgfHwgZGF5SW5Nb250aC5tb250aCAhPT0gc2VsZWN0ZWREYXRlPy5tb250aCB8fCBkYXlJbk1vbnRoLnllYXIgIT09IHNlbGVjdGVkRGF0ZT8ueWVhcilcclxuICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgZGF5X2J1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAge3tkYXlJbk1vbnRoLmRhdGV9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZERhdGU+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheV9kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAge3tkYXlJbk1vbnRoLmRhdGV9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NvbnRyb2xzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiZ19vdmVybGF5IGJyZHIgaHIgbWFyXzVcIj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBzcGFjZV9iZXR3ZWVuXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnREYXRlLnNlbGVjdGFibGVcIj5cclxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIoY3VycmVudERhdGUuZGF0ZSA9PT0gc2VsZWN0ZWREYXRlPy5kYXRlICYmIGN1cnJlbnREYXRlLm1vbnRoID09PSBzZWxlY3RlZERhdGU/Lm1vbnRoICYmIGN1cnJlbnREYXRlLnllYXIgPT09IHNlbGVjdGVkRGF0ZT8ueWVhcikgZWxzZSBzZWxlY3RUb2RheUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBiZ19vdmVybGF5X3JldiBicmRyIGhvdl9iZyBtYXJfNVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5yZXNldERhdGVUb1RvZGF5XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0IGJvbGRcIj57e3RleHQuc2VsZWN0VG9kYXl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdFRvZGF5QnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChrZXl1cC5lc2NhcGUpPVwiY2xvc2VkLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBiZ19vdmVybGF5X3JldiBicmRyIGhvdl9iZyBtYXJfNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnJlc2V0RGF0ZVRvVG9kYXlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7dGV4dC5zZWxlY3RUb2RheX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPGJ1dHRvbiAjZG9uZUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZWQuZW1pdCgpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZWQuZW1pdCgpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNtIGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyXzUgaG92X2JnXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zYXZlRGF0ZVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2sgbWFyX3JpZ2h0NVwiPjwvaT48c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7dGV4dC5kb25lfX08L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=