@tolle_/tolle-ui 18.2.29 → 18.3.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 (294) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +12 -12
  4. package/esm2022/lib/alert-dialog.component.mjs +82 -64
  5. package/esm2022/lib/alert-dialog.service.mjs +38 -6
  6. package/esm2022/lib/alert.component.mjs +5 -11
  7. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  8. package/esm2022/lib/attachment.component.mjs +334 -0
  9. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  10. package/esm2022/lib/avatar.component.mjs +4 -9
  11. package/esm2022/lib/badge.component.mjs +4 -9
  12. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  15. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  16. package/esm2022/lib/bubble.component.mjs +301 -0
  17. package/esm2022/lib/button.component.mjs +5 -11
  18. package/esm2022/lib/calendar.component.mjs +5 -11
  19. package/esm2022/lib/card.component.mjs +14 -43
  20. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  21. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  22. package/esm2022/lib/chart-pie.component.mjs +386 -0
  23. package/esm2022/lib/chart.component.mjs +1146 -0
  24. package/esm2022/lib/chart.service.mjs +555 -0
  25. package/esm2022/lib/checkbox.component.mjs +5 -11
  26. package/esm2022/lib/checkpoint.component.mjs +134 -0
  27. package/esm2022/lib/collapsible.component.mjs +4 -11
  28. package/esm2022/lib/combobox.component.mjs +372 -0
  29. package/esm2022/lib/command-dialog.component.mjs +164 -0
  30. package/esm2022/lib/command.component.mjs +514 -0
  31. package/esm2022/lib/command.service.mjs +130 -0
  32. package/esm2022/lib/confirmation.component.mjs +219 -0
  33. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  34. package/esm2022/lib/context-menu.component.mjs +460 -0
  35. package/esm2022/lib/context-menu.service.mjs +125 -0
  36. package/esm2022/lib/context.component.mjs +377 -0
  37. package/esm2022/lib/conversation.component.mjs +442 -0
  38. package/esm2022/lib/country-selector.component.mjs +5 -11
  39. package/esm2022/lib/data-table.component.mjs +59 -12
  40. package/esm2022/lib/date-picker.component.mjs +251 -198
  41. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  42. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  43. package/esm2022/lib/direction.component.mjs +79 -0
  44. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  48. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  49. package/esm2022/lib/empty-state.component.mjs +4 -9
  50. package/esm2022/lib/field.component.mjs +394 -0
  51. package/esm2022/lib/hover-card.component.mjs +6 -16
  52. package/esm2022/lib/inline-citation.component.mjs +263 -0
  53. package/esm2022/lib/input-group.component.mjs +418 -0
  54. package/esm2022/lib/input.component.mjs +5 -11
  55. package/esm2022/lib/item.component.mjs +243 -0
  56. package/esm2022/lib/kbd.component.mjs +82 -0
  57. package/esm2022/lib/label.component.mjs +4 -9
  58. package/esm2022/lib/marker.component.mjs +135 -0
  59. package/esm2022/lib/masked-input.component.mjs +5 -11
  60. package/esm2022/lib/menubar.component.mjs +683 -0
  61. package/esm2022/lib/message-scroller.component.mjs +353 -0
  62. package/esm2022/lib/message-scroller.service.mjs +157 -0
  63. package/esm2022/lib/message.component.mjs +228 -0
  64. package/esm2022/lib/modal-ref.mjs +36 -7
  65. package/esm2022/lib/modal.component.mjs +42 -28
  66. package/esm2022/lib/modal.mjs +2 -29
  67. package/esm2022/lib/modal.service.mjs +26 -4
  68. package/esm2022/lib/model-selector.component.mjs +310 -0
  69. package/esm2022/lib/multi-select.component.mjs +155 -72
  70. package/esm2022/lib/native-select.component.mjs +201 -0
  71. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  72. package/esm2022/lib/otp-group.component.mjs +3 -3
  73. package/esm2022/lib/otp-slot.component.mjs +4 -9
  74. package/esm2022/lib/otp.component.mjs +5 -11
  75. package/esm2022/lib/pagination.component.mjs +7 -10
  76. package/esm2022/lib/plan.component.mjs +335 -0
  77. package/esm2022/lib/popover-content.component.mjs +4 -9
  78. package/esm2022/lib/popover.component.mjs +15 -13
  79. package/esm2022/lib/progress.component.mjs +4 -9
  80. package/esm2022/lib/prompt-input.component.mjs +526 -0
  81. package/esm2022/lib/queue.component.mjs +280 -0
  82. package/esm2022/lib/radio-group.component.mjs +6 -13
  83. package/esm2022/lib/radio-item.component.mjs +4 -9
  84. package/esm2022/lib/range-calendar.component.mjs +5 -11
  85. package/esm2022/lib/reasoning.component.mjs +335 -0
  86. package/esm2022/lib/resizable-panel.component.mjs +5 -5
  87. package/esm2022/lib/resizable.component.mjs +219 -0
  88. package/esm2022/lib/segment.component.mjs +19 -9
  89. package/esm2022/lib/select-group.component.mjs +4 -8
  90. package/esm2022/lib/select-item.component.mjs +4 -9
  91. package/esm2022/lib/select-separator.component.mjs +4 -8
  92. package/esm2022/lib/select.component.mjs +133 -49
  93. package/esm2022/lib/separator.component.mjs +4 -9
  94. package/esm2022/lib/sheet.component.mjs +38 -56
  95. package/esm2022/lib/shimmer.component.mjs +84 -0
  96. package/esm2022/lib/sidebar.component.mjs +11 -1
  97. package/esm2022/lib/skeleton.component.mjs +4 -9
  98. package/esm2022/lib/sources.component.mjs +452 -0
  99. package/esm2022/lib/spinner.component.mjs +68 -0
  100. package/esm2022/lib/suggestion.component.mjs +207 -0
  101. package/esm2022/lib/switch.component.mjs +5 -11
  102. package/esm2022/lib/table.component.mjs +213 -0
  103. package/esm2022/lib/tabs.component.mjs +4 -11
  104. package/esm2022/lib/tag-input.component.mjs +5 -11
  105. package/esm2022/lib/task.component.mjs +359 -0
  106. package/esm2022/lib/textarea.component.mjs +5 -11
  107. package/esm2022/lib/theme.service.mjs +17 -6
  108. package/esm2022/lib/time-picker.component.mjs +923 -0
  109. package/esm2022/lib/toast.service.mjs +3 -2
  110. package/esm2022/lib/toaster.component.mjs +76 -39
  111. package/esm2022/lib/toggle-group.component.mjs +4 -9
  112. package/esm2022/lib/toggle.component.mjs +5 -11
  113. package/esm2022/lib/tool.component.mjs +462 -0
  114. package/esm2022/lib/typography.component.mjs +83 -0
  115. package/esm2022/lib/utils/color.mjs +140 -19
  116. package/esm2022/public-api.mjs +61 -1
  117. package/fesm2022/tolle-ui.mjs +16642 -1105
  118. package/fesm2022/tolle-ui.mjs.map +1 -1
  119. package/lib/alert-dialog-dynamic.component.d.ts +5 -0
  120. package/lib/alert-dialog.component.d.ts +23 -2
  121. package/lib/aspect-ratio.component.d.ts +20 -0
  122. package/lib/attachment.component.d.ts +101 -0
  123. package/lib/bubble.component.d.ts +112 -0
  124. package/lib/chain-of-thought.component.d.ts +166 -0
  125. package/lib/chart-pie.component.d.ts +108 -0
  126. package/lib/chart.component.d.ts +369 -0
  127. package/lib/chart.service.d.ts +222 -0
  128. package/lib/checkpoint.component.d.ts +51 -0
  129. package/lib/combobox.component.d.ts +90 -0
  130. package/lib/command-dialog.component.d.ts +53 -0
  131. package/lib/command.component.d.ts +189 -0
  132. package/lib/command.service.d.ts +67 -0
  133. package/lib/confirmation.component.d.ts +70 -0
  134. package/lib/context-menu-trigger.directive.d.ts +12 -0
  135. package/lib/context-menu.component.d.ts +41 -0
  136. package/lib/context-menu.service.d.ts +38 -0
  137. package/lib/context.component.d.ts +134 -0
  138. package/lib/conversation.component.d.ts +165 -0
  139. package/lib/data-table.component.d.ts +26 -1
  140. package/lib/date-picker.component.d.ts +72 -11
  141. package/lib/date-range-picker.component.d.ts +63 -6
  142. package/lib/date-time-picker.component.d.ts +119 -0
  143. package/lib/direction.component.d.ts +45 -0
  144. package/lib/field.component.d.ts +201 -0
  145. package/lib/inline-citation.component.d.ts +103 -0
  146. package/lib/input-group.component.d.ts +150 -0
  147. package/lib/item.component.d.ts +154 -0
  148. package/lib/kbd.component.d.ts +50 -0
  149. package/lib/marker.component.d.ts +58 -0
  150. package/lib/menubar.component.d.ts +247 -0
  151. package/lib/message-scroller.component.d.ts +159 -0
  152. package/lib/message-scroller.service.d.ts +73 -0
  153. package/lib/message.component.d.ts +128 -0
  154. package/lib/modal-ref.d.ts +6 -1
  155. package/lib/modal.component.d.ts +7 -4
  156. package/lib/modal.d.ts +9 -3
  157. package/lib/model-selector.component.d.ts +103 -0
  158. package/lib/multi-select.component.d.ts +66 -14
  159. package/lib/native-select.component.d.ts +57 -0
  160. package/lib/navigation-menu.component.d.ts +230 -0
  161. package/lib/plan.component.d.ts +120 -0
  162. package/lib/popover.component.d.ts +1 -0
  163. package/lib/prompt-input.component.d.ts +194 -0
  164. package/lib/queue.component.d.ts +106 -0
  165. package/lib/reasoning.component.d.ts +127 -0
  166. package/lib/resizable.component.d.ts +43 -0
  167. package/lib/segment.component.d.ts +13 -3
  168. package/lib/select.component.d.ts +37 -5
  169. package/lib/sheet.component.d.ts +3 -0
  170. package/lib/shimmer.component.d.ts +38 -0
  171. package/lib/sidebar.component.d.ts +2 -0
  172. package/lib/sources.component.d.ts +156 -0
  173. package/lib/spinner.component.d.ts +29 -0
  174. package/lib/suggestion.component.d.ts +96 -0
  175. package/lib/table.component.d.ts +106 -0
  176. package/lib/task.component.d.ts +151 -0
  177. package/lib/theme.service.d.ts +9 -0
  178. package/lib/time-picker.component.d.ts +243 -0
  179. package/lib/toast.service.d.ts +3 -1
  180. package/lib/toaster.component.d.ts +26 -9
  181. package/lib/tool.component.d.ts +158 -0
  182. package/lib/typography.component.d.ts +32 -0
  183. package/lib/utils/color.d.ts +19 -5
  184. package/package.json +3 -2
  185. package/preset.js +7 -1
  186. package/public-api.d.ts +50 -0
  187. package/registry/docs-content.json +8480 -1542
  188. package/registry/llms-full.txt +2679 -319
  189. package/registry/llms.txt +43 -4
  190. package/registry/manifest.json +9090 -1742
  191. package/registry/r/accordion-item.json +1 -1
  192. package/registry/r/accordion.json +1 -1
  193. package/registry/r/alert-dialog-dynamic.json +1 -1
  194. package/registry/r/alert-dialog.json +1 -1
  195. package/registry/r/alert.json +1 -1
  196. package/registry/r/attachment.json +23 -0
  197. package/registry/r/avatar-fallback.json +1 -1
  198. package/registry/r/avatar.json +1 -1
  199. package/registry/r/badge.json +1 -1
  200. package/registry/r/breadcrumb-item.json +1 -1
  201. package/registry/r/breadcrumb-link.json +1 -1
  202. package/registry/r/breadcrumb-separator.json +1 -1
  203. package/registry/r/breadcrumb.json +1 -1
  204. package/registry/r/bubble.json +23 -0
  205. package/registry/r/button.json +1 -1
  206. package/registry/r/calendar.json +1 -1
  207. package/registry/r/card.json +1 -1
  208. package/registry/r/carousel.json +1 -1
  209. package/registry/r/chain-of-thought.json +23 -0
  210. package/registry/r/chart-pie.json +30 -0
  211. package/registry/r/chart.json +28 -0
  212. package/registry/r/checkbox.json +1 -1
  213. package/registry/r/checkpoint.json +23 -0
  214. package/registry/r/collapsible.json +1 -1
  215. package/registry/r/combobox.json +31 -0
  216. package/registry/r/command-dialog.json +21 -0
  217. package/registry/r/command.json +26 -0
  218. package/registry/r/confirmation.json +23 -0
  219. package/registry/r/context-menu-trigger.json +1 -1
  220. package/registry/r/context-menu.json +1 -1
  221. package/registry/r/context.json +26 -0
  222. package/registry/r/conversation.json +23 -0
  223. package/registry/r/country-selector.json +1 -1
  224. package/registry/r/data-table.json +1 -1
  225. package/registry/r/date-picker.json +4 -4
  226. package/registry/r/date-range-picker.json +3 -3
  227. package/registry/r/date-time-picker.json +28 -0
  228. package/registry/r/direction.json +16 -0
  229. package/registry/r/dropdown-item.json +1 -1
  230. package/registry/r/dropdown-label.json +1 -1
  231. package/registry/r/dropdown-menu.json +1 -1
  232. package/registry/r/dropdown-separator.json +1 -1
  233. package/registry/r/dropdown-trigger.json +1 -1
  234. package/registry/r/empty-state.json +1 -1
  235. package/registry/r/field.json +23 -0
  236. package/registry/r/hover-card.json +1 -1
  237. package/registry/r/inline-citation.json +26 -0
  238. package/registry/r/input-group.json +23 -0
  239. package/registry/r/input.json +1 -1
  240. package/registry/r/item.json +23 -0
  241. package/registry/r/kbd.json +23 -0
  242. package/registry/r/label.json +1 -1
  243. package/registry/r/marker.json +23 -0
  244. package/registry/r/masked-input.json +1 -1
  245. package/registry/r/menubar.json +24 -0
  246. package/registry/r/message-scroller.json +26 -0
  247. package/registry/r/message.json +23 -0
  248. package/registry/r/modal.json +3 -3
  249. package/registry/r/model-selector.json +32 -0
  250. package/registry/r/multi-select.json +2 -2
  251. package/registry/r/native-select.json +23 -0
  252. package/registry/r/navigation-menu.json +24 -0
  253. package/registry/r/otp-group.json +1 -1
  254. package/registry/r/otp-slot.json +1 -1
  255. package/registry/r/otp.json +1 -1
  256. package/registry/r/pagination.json +3 -2
  257. package/registry/r/plan.json +23 -0
  258. package/registry/r/popover-content.json +1 -1
  259. package/registry/r/popover.json +1 -1
  260. package/registry/r/progress.json +1 -1
  261. package/registry/r/prompt-input.json +23 -0
  262. package/registry/r/queue.json +23 -0
  263. package/registry/r/radio-group.json +1 -1
  264. package/registry/r/radio-item.json +1 -1
  265. package/registry/r/range-calendar.json +1 -1
  266. package/registry/r/reasoning.json +23 -0
  267. package/registry/r/resizable-panel.json +1 -1
  268. package/registry/r/segment.json +1 -1
  269. package/registry/r/select-group.json +1 -1
  270. package/registry/r/select-item.json +1 -1
  271. package/registry/r/select-separator.json +1 -1
  272. package/registry/r/select.json +4 -3
  273. package/registry/r/separator.json +1 -1
  274. package/registry/r/sheet.json +1 -1
  275. package/registry/r/shimmer.json +23 -0
  276. package/registry/r/sidebar.json +1 -1
  277. package/registry/r/skeleton.json +1 -1
  278. package/registry/r/sources.json +23 -0
  279. package/registry/r/spinner.json +23 -0
  280. package/registry/r/suggestion.json +23 -0
  281. package/registry/r/switch.json +1 -1
  282. package/registry/r/table.json +21 -0
  283. package/registry/r/tabs.json +1 -1
  284. package/registry/r/tag-input.json +1 -1
  285. package/registry/r/task.json +23 -0
  286. package/registry/r/textarea.json +1 -1
  287. package/registry/r/time-picker.json +24 -0
  288. package/registry/r/toaster.json +2 -2
  289. package/registry/r/toggle-group.json +1 -1
  290. package/registry/r/toggle.json +1 -1
  291. package/registry/r/tool.json +23 -0
  292. package/registry/r/typography.json +23 -0
  293. package/registry/registry.json +915 -22
  294. package/theme.css +121 -8
@@ -1,28 +1,98 @@
1
- import { Component, Input, forwardRef, ViewChild, HostListener } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, forwardRef, ViewChild, ChangeDetectionStrategy, HostListener } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
4
- import { computePosition, flip, shift, offset, autoUpdate, size } from '@floating-ui/dom';
4
+ import { computePosition, flip, shift, offset, autoUpdate, size as sizeMiddleware } from '@floating-ui/dom';
5
+ import { cva } from 'class-variance-authority';
5
6
  import { cn } from './utils/cn';
6
7
  import { RangeCalendarComponent } from './range-calendar.component';
7
8
  import { format } from 'date-fns';
8
- import { InputComponent } from './input.component';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/common";
11
11
  import * as i2 from "@angular/forms";
12
+ /**
13
+ * The trigger button — same shape as `tolle-date-time-picker`'s and
14
+ * `tolle-date-picker`'s, so all three read as one family: a bordered field
15
+ * that opens a floating panel, not a typeable text input.
16
+ */
17
+ const dateRangePickerTriggerVariants = cva('flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background text-foreground shadow-sm transition-colors ' +
18
+ 'focus:outline-none focus-visible:border-primary/80 focus-visible:ring-4 focus-visible:ring-ring/30 ' +
19
+ 'disabled:cursor-not-allowed disabled:opacity-50', {
20
+ variants: {
21
+ size: {
22
+ xs: 'h-8 px-2 text-xs',
23
+ sm: 'h-9 px-3 text-sm',
24
+ default: 'h-10 px-3 text-sm',
25
+ lg: 'h-11 px-4 text-base',
26
+ },
27
+ invalid: {
28
+ true: 'border-destructive focus-visible:border-destructive/80 focus-visible:ring-destructive/30',
29
+ false: '',
30
+ },
31
+ },
32
+ defaultVariants: { size: 'default', invalid: false },
33
+ });
34
+ /**
35
+ * A button trigger paired with a `tolle-range-calendar` in a floating panel,
36
+ * for picking a start and an end date.
37
+ *
38
+ * The value is a `DateRange` — `{ start, end }` — and a half-made range is a
39
+ * legal intermediate state: picking a start emits `{ start, end: null }` and
40
+ * leaves the panel open, so a consumer can react to the first click. The panel
41
+ * only closes once both ends exist.
42
+ *
43
+ * Implements `ControlValueAccessor`, so it works with `ngModel` and reactive
44
+ * forms. Use `tolle-date-picker` for a single date — this trigger is
45
+ * deliberately the same shape as that one and as `tolle-date-time-picker`.
46
+ */
12
47
  export class DateRangePickerComponent {
13
48
  cdr;
49
+ /**
50
+ * Angular writes a bound `class` input through its styling path, which does
51
+ * not mark an OnPush component dirty — without this hook the component keeps
52
+ * rendering the class it was born with.
53
+ */
54
+ ngOnChanges() {
55
+ this.cdr.markForCheck();
56
+ }
57
+ /** Disables the control. @default false */
14
58
  disabled = false;
59
+ /** Text shown on the trigger when no range is selected. @default 'Pick a date range' */
15
60
  placeholder = 'Pick a date range';
61
+ /** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). @default '' */
16
62
  class = '';
63
+ /** Disables every day before today in the calendar. @default false */
17
64
  disablePastDates = false;
65
+ /** Height and text size of the trigger. @default 'default' */
18
66
  size = 'default';
19
67
  /** Consecutive months shown in the popover (e.g. `2` for a two-month picker). @default 1 */
20
68
  numberOfMonths = 1;
69
+ /** Applies the destructive border and focus ring. @default false */
70
+ invalid = false;
71
+ /** Accessible name when there is no associated visible label. @default '' */
72
+ ariaLabel = '';
73
+ /** Emitted with the selected range, including the half-made `{ start, end: null }` state. */
74
+ valueChange = new EventEmitter();
75
+ /** Emitted when the calendar panel opens. */
76
+ opened = new EventEmitter();
77
+ /** Emitted when the calendar panel closes. */
78
+ closed = new EventEmitter();
21
79
  trigger;
22
80
  popover;
23
81
  value = { start: null, end: null };
24
82
  isOpen = false;
25
83
  cleanupAutoUpdate;
84
+ /** Footer buttons, styled exactly as the date-time picker's. */
85
+ footerButtonClass = cn('rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors', 'hover:bg-accent hover:text-accent-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring');
86
+ /** Footer Clear — empties the range and leaves the panel open, like the reference. */
87
+ clearFromFooter() {
88
+ this.value = { start: null, end: null };
89
+ this.emit();
90
+ this.cdr.markForCheck();
91
+ }
92
+ /** Footer Done — commits what is already selected and closes. */
93
+ done() {
94
+ this.close();
95
+ }
26
96
  _outsideClickHandler = (event) => {
27
97
  if (!this.trigger.nativeElement.contains(event.target) && !this.popover?.nativeElement.contains(event.target)) {
28
98
  this.close();
@@ -31,33 +101,43 @@ export class DateRangePickerComponent {
31
101
  constructor(cdr) {
32
102
  this.cdr = cdr;
33
103
  }
104
+ get computedTriggerClass() {
105
+ return cn(dateRangePickerTriggerVariants({ size: this.size, invalid: this.invalid }), this.class);
106
+ }
34
107
  get displayValue() {
35
108
  if (!this.value.start)
36
109
  return '';
37
- const startStr = format(this.value.start, 'MMM dd, yyyy');
110
+ const startStr = format(this.value.start, 'MMM d, yyyy');
38
111
  if (!this.value.end)
39
112
  return startStr;
40
- const endStr = format(this.value.end, 'MMM dd, yyyy');
41
- return `${startStr} - ${endStr}`;
113
+ const endStr = format(this.value.end, 'MMM d, yyyy');
114
+ return startStr + ' - ' + endStr;
42
115
  }
43
116
  onCalendarSelect(range) {
44
117
  this.value = range;
45
- this.onChange(this.value);
118
+ this.emit();
46
119
  // Close only if range is complete
47
120
  if (range.start && range.end) {
48
121
  setTimeout(() => this.close(), 150);
49
122
  }
123
+ this.cdr.markForCheck();
50
124
  }
51
- togglePopover(event) {
52
- event.stopPropagation();
53
- if (this.disabled)
54
- return;
125
+ toggle() {
55
126
  this.isOpen ? this.close() : this.open();
56
127
  }
128
+ onTriggerKeyDown(event) {
129
+ if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key) && !this.isOpen) {
130
+ event.preventDefault();
131
+ this.open();
132
+ }
133
+ }
57
134
  onEscape() { if (this.isOpen)
58
135
  this.close(); }
59
136
  open() {
137
+ if (this.disabled || this.isOpen)
138
+ return;
60
139
  this.isOpen = true;
140
+ this.opened.emit();
61
141
  // Render the popover synchronously so its DOM node + @ViewChild('popover') exist
62
142
  // before we position it. Otherwise, with zone eventCoalescing (Angular defers change
63
143
  // detection to the next animation frame), updatePosition() can run first, find no
@@ -69,22 +149,24 @@ export class DateRangePickerComponent {
69
149
  const schedule = typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : (fn) => setTimeout(fn, 0);
70
150
  schedule(() => {
71
151
  this.updatePosition();
72
- document.addEventListener('mousedown', this._outsideClickHandler);
152
+ document.addEventListener('pointerdown', this._outsideClickHandler, true);
73
153
  });
74
154
  }
75
155
  close() {
156
+ if (!this.isOpen)
157
+ return;
76
158
  this.isOpen = false;
77
- if (this.cleanupAutoUpdate) {
78
- this.cleanupAutoUpdate();
79
- this.cleanupAutoUpdate = undefined;
80
- }
81
- document.removeEventListener('mousedown', this._outsideClickHandler);
159
+ this.closed.emit();
160
+ this.teardown();
161
+ // Both the outside-click handler and the deferred close after a completed
162
+ // range run outside any template binding, so nothing else marks this OnPush
163
+ // view dirty.
164
+ this.cdr.markForCheck();
82
165
  }
83
- clear(event) {
84
- event.stopPropagation();
85
- this.value = { start: null, end: null };
166
+ /** Reports the current range to the form and to `valueChange`. */
167
+ emit() {
86
168
  this.onChange(this.value);
87
- this.cdr.markForCheck();
169
+ this.valueChange.emit(this.value);
88
170
  }
89
171
  // --- Floating UI Positioning with Fixed Strategy ---
90
172
  updatePosition() {
@@ -92,7 +174,7 @@ export class DateRangePickerComponent {
92
174
  return;
93
175
  this.cleanupAutoUpdate = autoUpdate(this.trigger.nativeElement, this.popover.nativeElement, () => {
94
176
  computePosition(this.trigger.nativeElement, this.popover.nativeElement, {
95
- placement: 'bottom-end',
177
+ placement: 'bottom-start',
96
178
  strategy: 'fixed', // Use fixed to escape column layout
97
179
  middleware: [
98
180
  offset(4),
@@ -101,7 +183,7 @@ export class DateRangePickerComponent {
101
183
  padding: 8
102
184
  }),
103
185
  shift({ padding: 8 }),
104
- size({
186
+ sizeMiddleware({
105
187
  apply({ rects, elements, availableHeight }) {
106
188
  // Constrain popover to available space
107
189
  Object.assign(elements.floating.style, {
@@ -128,10 +210,15 @@ export class DateRangePickerComponent {
128
210
  });
129
211
  });
130
212
  }
131
- ngOnDestroy() {
132
- if (this.cleanupAutoUpdate)
213
+ teardown() {
214
+ if (this.cleanupAutoUpdate) {
133
215
  this.cleanupAutoUpdate();
134
- document.removeEventListener('mousedown', this._outsideClickHandler);
216
+ this.cleanupAutoUpdate = undefined;
217
+ }
218
+ document.removeEventListener('pointerdown', this._outsideClickHandler, true);
219
+ }
220
+ ngOnDestroy() {
221
+ this.teardown();
135
222
  }
136
223
  onWindowResize() {
137
224
  if (this.isOpen) {
@@ -155,122 +242,133 @@ export class DateRangePickerComponent {
155
242
  }
156
243
  registerOnChange(fn) { this.onChange = fn; }
157
244
  registerOnTouched(fn) { this.onTouched = fn; }
158
- setDisabledState(isDisabled) { this.disabled = isDisabled; }
245
+ setDisabledState(isDisabled) {
246
+ this.disabled = isDisabled;
247
+ this.cdr.markForCheck();
248
+ }
159
249
  cn = cn;
160
250
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateRangePickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
161
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DateRangePickerComponent, isStandalone: true, selector: "tolle-date-range-picker", inputs: { disabled: "disabled", placeholder: "placeholder", class: "class", disablePastDates: "disablePastDates", size: "size", numberOfMonths: "numberOfMonths" }, host: { listeners: { "keydown.escape": "onEscape()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, providers: [
251
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DateRangePickerComponent, isStandalone: true, selector: "tolle-date-range-picker", inputs: { disabled: "disabled", placeholder: "placeholder", class: "class", disablePastDates: "disablePastDates", size: "size", numberOfMonths: "numberOfMonths", invalid: "invalid", ariaLabel: "ariaLabel" }, outputs: { valueChange: "valueChange", opened: "opened", closed: "closed" }, host: { listeners: { "keydown.escape": "onEscape()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, providers: [
162
252
  {
163
253
  provide: NG_VALUE_ACCESSOR,
164
254
  useExisting: forwardRef(() => DateRangePickerComponent),
165
255
  multi: true
166
256
  }
167
- ], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }], ngImport: i0, template: `
168
- <div class="relative w-full">
169
- <tolle-input
170
- [placeholder]="placeholder"
171
- [disabled]="disabled"
172
- [ngModel]="displayValue"
173
- [class]="class"
174
- >
175
- <div suffix class="flex items-center gap-1.5">
176
- <button
177
- type="button"
178
- tabindex="-1"
179
- aria-label="Clear date range"
180
- *ngIf="(value.start || value.end) && !disabled"
181
- (click)="clear($event)"
182
- class="ri-close-line cursor-pointer text-muted-foreground hover:text-foreground transition-colors"
183
- ></button>
257
+ ], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
258
+ <button
259
+ #trigger
260
+ type="button"
261
+ aria-haspopup="dialog"
262
+ [attr.aria-expanded]="isOpen"
263
+ [attr.aria-label]="ariaLabel || null"
264
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
265
+ [disabled]="disabled"
266
+ [class]="computedTriggerClass"
267
+ (click)="toggle()"
268
+ (keydown)="onTriggerKeyDown($event)"
269
+ >
270
+ <span [class]="cn('truncate', displayValue ? 'text-foreground' : 'text-muted-foreground')">
271
+ {{ displayValue || placeholder }}
272
+ </span>
273
+ <i class="ri-calendar-line shrink-0 text-muted-foreground" aria-hidden="true"></i>
274
+ </button>
184
275
 
276
+ <div
277
+ #popover
278
+ *ngIf="isOpen"
279
+ role="dialog"
280
+ [attr.aria-label]="'Choose a date range'"
281
+ class="fixed left-0 top-0 z-50"
282
+ style="visibility: hidden"
283
+ >
284
+ <div class="rounded-md border border-border bg-popover text-popover-foreground shadow-md">
285
+ <div class="p-3">
286
+ <tolle-range-calendar
287
+ [bordered]="false"
288
+ [ngModel]="value"
289
+ (rangeSelect)="onCalendarSelect($event)"
290
+ [disablePastDates]="disablePastDates"
291
+ [numberOfMonths]="numberOfMonths"
292
+ ></tolle-range-calendar>
293
+ </div>
294
+
295
+ <div class="flex items-center justify-between gap-2 border-t border-border px-3 py-2">
296
+ <button type="button" [class]="footerButtonClass" (click)="clearFromFooter()">
297
+ Clear
298
+ </button>
185
299
  <button
186
- #trigger
187
300
  type="button"
188
- (click)="togglePopover($event)"
189
- aria-label="Open calendar"
190
- aria-haspopup="dialog"
191
- [attr.aria-expanded]="isOpen"
192
- class="ri-calendar-line cursor-pointer text-muted-foreground hover:text-primary transition-colors bg-transparent border-0 p-0"
193
- ></button>
301
+ [class]="cn(footerButtonClass, 'bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground')"
302
+ (click)="done()"
303
+ >
304
+ Done
305
+ </button>
194
306
  </div>
195
- </tolle-input>
196
-
197
- <div
198
- #popover
199
- *ngIf="isOpen"
200
- role="dialog"
201
- class="fixed z-50"
202
- style="visibility: hidden;"
203
- >
204
- <tolle-range-calendar class="shadow-lg"
205
- [ngModel]="value"
206
- (rangeSelect)="onCalendarSelect($event)"
207
- [disablePastDates]="disablePastDates"
208
- [numberOfMonths]="numberOfMonths"
209
- ></tolle-range-calendar>
210
307
  </div>
211
308
  </div>
212
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RangeCalendarComponent, selector: "tolle-range-calendar", inputs: ["class", "disablePastDates", "bordered", "numberOfMonths"], outputs: ["rangeSelect"] }, { kind: "component", type: InputComponent, selector: "tolle-input", inputs: ["id", "label", "hint", "errorMessage", "type", "placeholder", "size", "containerClass", "class", "disabled", "readonly", "error", "hideHintOnFocus"] }] });
309
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RangeCalendarComponent, selector: "tolle-range-calendar", inputs: ["class", "disablePastDates", "bordered", "numberOfMonths"], outputs: ["rangeSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
213
310
  }
214
311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DateRangePickerComponent, decorators: [{
215
312
  type: Component,
216
- args: [{
217
- selector: 'tolle-date-range-picker',
218
- standalone: true,
219
- imports: [CommonModule, FormsModule, RangeCalendarComponent, InputComponent],
220
- providers: [
313
+ args: [{ selector: 'tolle-date-range-picker', standalone: true, imports: [CommonModule, FormsModule, RangeCalendarComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
221
314
  {
222
315
  provide: NG_VALUE_ACCESSOR,
223
316
  useExisting: forwardRef(() => DateRangePickerComponent),
224
317
  multi: true
225
318
  }
226
- ],
227
- template: `
228
- <div class="relative w-full">
229
- <tolle-input
230
- [placeholder]="placeholder"
231
- [disabled]="disabled"
232
- [ngModel]="displayValue"
233
- [class]="class"
234
- >
235
- <div suffix class="flex items-center gap-1.5">
236
- <button
237
- type="button"
238
- tabindex="-1"
239
- aria-label="Clear date range"
240
- *ngIf="(value.start || value.end) && !disabled"
241
- (click)="clear($event)"
242
- class="ri-close-line cursor-pointer text-muted-foreground hover:text-foreground transition-colors"
243
- ></button>
319
+ ], template: `
320
+ <button
321
+ #trigger
322
+ type="button"
323
+ aria-haspopup="dialog"
324
+ [attr.aria-expanded]="isOpen"
325
+ [attr.aria-label]="ariaLabel || null"
326
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
327
+ [disabled]="disabled"
328
+ [class]="computedTriggerClass"
329
+ (click)="toggle()"
330
+ (keydown)="onTriggerKeyDown($event)"
331
+ >
332
+ <span [class]="cn('truncate', displayValue ? 'text-foreground' : 'text-muted-foreground')">
333
+ {{ displayValue || placeholder }}
334
+ </span>
335
+ <i class="ri-calendar-line shrink-0 text-muted-foreground" aria-hidden="true"></i>
336
+ </button>
244
337
 
338
+ <div
339
+ #popover
340
+ *ngIf="isOpen"
341
+ role="dialog"
342
+ [attr.aria-label]="'Choose a date range'"
343
+ class="fixed left-0 top-0 z-50"
344
+ style="visibility: hidden"
345
+ >
346
+ <div class="rounded-md border border-border bg-popover text-popover-foreground shadow-md">
347
+ <div class="p-3">
348
+ <tolle-range-calendar
349
+ [bordered]="false"
350
+ [ngModel]="value"
351
+ (rangeSelect)="onCalendarSelect($event)"
352
+ [disablePastDates]="disablePastDates"
353
+ [numberOfMonths]="numberOfMonths"
354
+ ></tolle-range-calendar>
355
+ </div>
356
+
357
+ <div class="flex items-center justify-between gap-2 border-t border-border px-3 py-2">
358
+ <button type="button" [class]="footerButtonClass" (click)="clearFromFooter()">
359
+ Clear
360
+ </button>
245
361
  <button
246
- #trigger
247
362
  type="button"
248
- (click)="togglePopover($event)"
249
- aria-label="Open calendar"
250
- aria-haspopup="dialog"
251
- [attr.aria-expanded]="isOpen"
252
- class="ri-calendar-line cursor-pointer text-muted-foreground hover:text-primary transition-colors bg-transparent border-0 p-0"
253
- ></button>
363
+ [class]="cn(footerButtonClass, 'bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground')"
364
+ (click)="done()"
365
+ >
366
+ Done
367
+ </button>
254
368
  </div>
255
- </tolle-input>
256
-
257
- <div
258
- #popover
259
- *ngIf="isOpen"
260
- role="dialog"
261
- class="fixed z-50"
262
- style="visibility: hidden;"
263
- >
264
- <tolle-range-calendar class="shadow-lg"
265
- [ngModel]="value"
266
- (rangeSelect)="onCalendarSelect($event)"
267
- [disablePastDates]="disablePastDates"
268
- [numberOfMonths]="numberOfMonths"
269
- ></tolle-range-calendar>
270
369
  </div>
271
370
  </div>
272
- `
273
- }]
371
+ `, styles: [":host{display:block}\n"] }]
274
372
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { disabled: [{
275
373
  type: Input
276
374
  }], placeholder: [{
@@ -283,6 +381,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
283
381
  type: Input
284
382
  }], numberOfMonths: [{
285
383
  type: Input
384
+ }], invalid: [{
385
+ type: Input
386
+ }], ariaLabel: [{
387
+ type: Input
388
+ }], valueChange: [{
389
+ type: Output
390
+ }], opened: [{
391
+ type: Output
392
+ }], closed: [{
393
+ type: Output
286
394
  }], trigger: [{
287
395
  type: ViewChild,
288
396
  args: ['trigger']
@@ -299,4 +407,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
299
407
  type: HostListener,
300
408
  args: ['window:scroll']
301
409
  }] } });
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFjLFNBQVMsRUFBZ0MsWUFBWSxFQUNoRyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBNkRuRCxNQUFNLE9BQU8sd0JBQXdCO0lBc0JmO0lBckJYLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsV0FBVyxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxHQUFtQyxTQUFTLENBQUM7SUFDMUQsNEZBQTRGO0lBQ25GLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFFTixPQUFPLENBQWM7SUFDckIsT0FBTyxDQUFjO0lBRTNDLEtBQUssR0FBYyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxF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Q1ksUUFBUTtzQkFBdkMsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBd0Y5QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZTtnQkFRN0IsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBmb3J3YXJkUmVmLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29tcHV0ZVBvc2l0aW9uLCBmbGlwLCBzaGlmdCwgb2Zmc2V0LCBhdXRvVXBkYXRlLCBzaXplIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgUmFuZ2VDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4vcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50JztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi90eXBlcy9kYXRlLXJhbmdlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtZGF0ZS1yYW5nZS1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmFuZ2VDYWxlbmRhckNvbXBvbmVudCwgSW5wdXRDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCI+XG4gICAgICA8dG9sbGUtaW5wdXRcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW25nTW9kZWxdPVwiZGlzcGxheVZhbHVlXCJcbiAgICAgICAgW2NsYXNzXT1cImNsYXNzXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBzdWZmaXggY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBkYXRlIHJhbmdlXCJcbiAgICAgICAgICAgICpuZ0lmPVwiKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkgJiYgIWRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwicmktY2xvc2UtbGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICA+PC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAjdHJpZ2dlclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUG9wb3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIGNhbGVuZGFyXCJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgY2xhc3M9XCJyaS1jYWxlbmRhci1saW5lIGN1cnNvci1wb2ludGVyIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LXByaW1hcnkgdHJhbnNpdGlvbi1jb2xvcnMgYmctdHJhbnNwYXJlbnQgYm9yZGVyLTAgcC0wXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90b2xsZS1pbnB1dD5cblxuICAgICAgPGRpdlxuICAgICAgICAjcG9wb3ZlclxuICAgICAgICAqbmdJZj1cImlzT3BlblwiXG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBjbGFzcz1cImZpeGVkIHotNTBcIlxuICAgICAgICBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIlxuICAgICAgPlxuICAgICAgICA8dG9sbGUtcmFuZ2UtY2FsZW5kYXIgY2xhc3M9XCJzaGFkb3ctbGdcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInZhbHVlXCJcbiAgICAgICAgICAocmFuZ2VTZWxlY3QpPVwib25DYWxlbmRhclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICBbZGlzYWJsZVBhc3REYXRlc109XCJkaXNhYmxlUGFzdERhdGVzXCJcbiAgICAgICAgICBbbnVtYmVyT2ZNb250aHNdPVwibnVtYmVyT2ZNb250aHNcIlxuICAgICAgICA+PC90b2xsZS1yYW5nZS1jYWxlbmRhcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdQaWNrIGEgZGF0ZSByYW5nZSc7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0RGF0ZXMgPSBmYWxzZTtcbiAgQElucHV0KCkgc2l6ZTogJ3hzJyB8ICdzbScgfCAnZGVmYXVsdCcgfCAnbGcnID0gJ2RlZmF1bHQnO1xuICAvKiogQ29uc2VjdXRpdmUgbW9udGhzIHNob3duIGluIHRoZSBwb3BvdmVyIChlLmcuIGAyYCBmb3IgYSB0d28tbW9udGggcGlja2VyKS4gQGRlZmF1bHQgMSAqL1xuICBASW5wdXQoKSBudW1iZXJPZk1vbnRocyA9IDE7XG5cbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicpIHRyaWdnZXIhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3BvdmVyJykgcG9wb3ZlciE6IEVsZW1lbnRSZWY7XG5cbiAgdmFsdWU6IERhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICBpc09wZW4gPSBmYWxzZTtcbiAgY2xlYW51cEF1dG9VcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgX291dHNpZGVDbGlja0hhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoIXRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgIXRoaXMucG9wb3Zlcj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnZhbHVlLnN0YXJ0KSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBzdGFydFN0ciA9IGZvcm1hdCh0aGlzLnZhbHVlLnN0YXJ0LCAnTU1NIGRkLCB5eXl5Jyk7XG4gICAgaWYgKCF0aGlzLnZhbHVlLmVuZCkgcmV0dXJuIHN0YXJ0U3RyO1xuXG4gICAgY29uc3QgZW5kU3RyID0gZm9ybWF0KHRoaXMudmFsdWUuZW5kLCAnTU1NIGRkLCB5eXl5Jyk7XG4gICAgcmV0dXJuIGAke3N0YXJ0U3RyfSAtICR7ZW5kU3RyfWA7XG4gIH1cblxuICBvbkNhbGVuZGFyU2VsZWN0KHJhbmdlOiBEYXRlUmFuZ2UpIHtcbiAgICB0aGlzLnZhbHVlID0gcmFuZ2U7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcblxuICAgIC8vIENsb3NlIG9ubHkgaWYgcmFuZ2UgaXMgY29tcGxldGVcbiAgICBpZiAocmFuZ2Uuc3RhcnQgJiYgcmFuZ2UuZW5kKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2xvc2UoKSwgMTUwKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVQb3BvdmVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmlzT3BlbiA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnKSBvbkVzY2FwZSgpIHsgaWYgKHRoaXMuaXNPcGVuKSB0aGlzLmNsb3NlKCk7IH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAvLyBSZW5kZXIgdGhlIHBvcG92ZXIgc3luY2hyb25vdXNseSBzbyBpdHMgRE9NIG5vZGUgKyBAVmlld0NoaWxkKCdwb3BvdmVyJykgZXhpc3RcbiAgICAvLyBiZWZvcmUgd2UgcG9zaXRpb24gaXQuIE90aGVyd2lzZSwgd2l0aCB6b25lIGV2ZW50Q29hbGVzY2luZyAoQW5ndWxhciBkZWZlcnMgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uIHRvIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZSksIHVwZGF0ZVBvc2l0aW9uKCkgY2FuIHJ1biBmaXJzdCwgZmluZCBub1xuICAgIC8vIHBvcG92ZXIsIGFuZCB0aGUgY2FsZW5kYXIgc3RheXMgaGlkZGVuIOKAlCByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBwaWNrZXIgaXMgdXNlZC5cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMudHJpZ2dlcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJyA/IHJlcXVlc3RBbmltYXRpb25GcmFtZSA6IChmbjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoZm4sIDApO1xuICAgIHNjaGVkdWxlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX291dHNpZGVDbGlja0hhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5jbGVhbnVwQXV0b1VwZGF0ZSkge1xuICAgICAgdGhpcy5jbGVhbnVwQXV0b1VwZGF0ZSgpO1xuICAgICAgdGhpcy5jbGVhbnVwQXV0b1VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb3V0c2lkZUNsaWNrSGFuZGxlcik7XG4gIH1cblxuICBjbGVhcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gLS0tIEZsb2F0aW5nIFVJIFBvc2l0aW9uaW5nIHdpdGggRml4ZWQgU3RyYXRlZ3kgLS0tXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIgfHwgIXRoaXMucG9wb3ZlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGVhbnVwQXV0b1VwZGF0ZSA9IGF1dG9VcGRhdGUoXG4gICAgICB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb21wdXRlUG9zaXRpb24odGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgICAgcGxhY2VtZW50OiAnYm90dG9tLWVuZCcsXG4gICAgICAgICAgc3RyYXRlZ3k6ICdmaXhlZCcsIC8vIFVzZSBmaXhlZCB0byBlc2NhcGUgY29sdW1uIGxheW91dFxuICAgICAgICAgIG1pZGRsZXdhcmU6IFtcbiAgICAgICAgICAgIG9mZnNldCg0KSxcbiAgICAgICAgICAgIGZsaXAoe1xuICAgICAgICAgICAgICBmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uOiAnc3RhcnQnLFxuICAgICAgICAgICAgICBwYWRkaW5nOiA4XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoaWZ0KHsgcGFkZGluZzogOCB9KSxcbiAgICAgICAgICAgIHNpemUoe1xuICAgICAgICAgICAgICBhcHBseSh7IHJlY3RzLCBlbGVtZW50cywgYXZhaWxhYmxlSGVpZ2h0IH0pIHtcbiAgICAgICAgICAgICAgICAvLyBDb25zdHJhaW4gcG9wb3ZlciB0byBhdmFpbGFibGUgc3BhY2VcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnRzLmZsb2F0aW5nLnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWluKDQwMCwgYXZhaWxhYmxlSGVpZ2h0KX1weGAsXG4gICAgICAgICAgICAgICAgICBtaW5XaWR0aDogYCR7TWF0aC5tYXgocmVjdHMucmVmZXJlbmNlLndpZHRoLCAzMjApfXB4YCwgLy8gQ2FsZW5kYXIgbWluaW11bSB3aWR0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLnRoZW4oKHsgeCwgeSwgcGxhY2VtZW50IH0pID0+IHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICBsZWZ0OiBgJHt4fXB4YCxcbiAgICAgICAgICAgIHRvcDogYCR7eX1weGAsXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBPcHRpb25hbDogQWRkIHBsYWNlbWVudCBjbGFzcyBmb3Igc3R5bGluZ1xuICAgICAgICAgIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2NhbGVuZGFyLXRvcCcsICdjYWxlbmRhci1ib3R0b20nKTtcbiAgICAgICAgICBpZiAocGxhY2VtZW50LmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2FsZW5kYXItdG9wJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NhbGVuZGFyLWJvdHRvbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmNsZWFudXBBdXRvVXBkYXRlKSB0aGlzLmNsZWFudXBBdXRvVXBkYXRlKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb3V0c2lkZUNsaWNrSGFuZGxlcik7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7IC8vIENsb3NlIG9uIHJlc2l6ZSBmb3Igc2ltcGxpY2l0eVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBvbldpbmRvd1Njcm9sbCgpIHtcbiAgICAvLyBGbG9hdGluZy1VSSdzIGF1dG9VcGRhdGUgaGFuZGxlcyBzY3JvbGwgcmVwb3NpdGlvbmluZ1xuICB9XG5cbiAgLy8gLS0tIENvbnRyb2wgVmFsdWUgQWNjZXNzb3IgLS0tXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbDogRGF0ZVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7IC4uLnZhbCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7IHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkOyB9XG5cbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
410
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQWMsU0FBUyxFQUFxQix1QkFBdUIsRUFBYSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2xNLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsR0FBRyxFQUFxQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQzs7OztBQUdsQzs7OztHQUlHO0FBQ0gsTUFBTSw4QkFBOEIsR0FBRyxHQUFHLENBQ3hDLDBJQUEwSTtJQUN4SSxxR0FBcUc7SUFDckcsaURBQWlELEVBQ25EO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFO1lBQ0osRUFBRSxFQUFFLGtCQUFrQjtZQUN0QixFQUFFLEVBQUUsa0JBQWtCO1lBQ3RCLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsRUFBRSxFQUFFLHFCQUFxQjtTQUMxQjtRQUNELE9BQU8sRUFBRTtZQUNQLElBQUks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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uRGVzdHJveSwgSG9zdExpc3RlbmVyLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUsIHNpemUgYXMgc2l6ZU1pZGRsZXdhcmUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7IFJhbmdlQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuL3JhbmdlLWNhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuL3R5cGVzL2RhdGUtcmFuZ2UnO1xuXG4vKipcbiAqIFRoZSB0cmlnZ2VyIGJ1dHRvbiDigJQgc2FtZSBzaGFwZSBhcyBgdG9sbGUtZGF0ZS10aW1lLXBpY2tlcmAncyBhbmRcbiAqIGB0b2xsZS1kYXRlLXBpY2tlcmAncywgc28gYWxsIHRocmVlIHJlYWQgYXMgb25lIGZhbWlseTogYSBib3JkZXJlZCBmaWVsZFxuICogdGhhdCBvcGVucyBhIGZsb2F0aW5nIHBhbmVsLCBub3QgYSB0eXBlYWJsZSB0ZXh0IGlucHV0LlxuICovXG5jb25zdCBkYXRlUmFuZ2VQaWNrZXJUcmlnZ2VyVmFyaWFudHMgPSBjdmEoXG4gICdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gdHJhbnNpdGlvbi1jb2xvcnMgJyArXG4gICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1wcmltYXJ5LzgwIGZvY3VzLXZpc2libGU6cmluZy00IGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzMwICcgK1xuICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgc2l6ZToge1xuICAgICAgICB4czogJ2gtOCBweC0yIHRleHQteHMnLFxuICAgICAgICBzbTogJ2gtOSBweC0zIHRleHQtc20nLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCBweC0zIHRleHQtc20nLFxuICAgICAgICBsZzogJ2gtMTEgcHgtNCB0ZXh0LWJhc2UnLFxuICAgICAgfSxcbiAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgdHJ1ZTogJ2JvcmRlci1kZXN0cnVjdGl2ZSBmb2N1cy12aXNpYmxlOmJvcmRlci1kZXN0cnVjdGl2ZS84MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMzAnLFxuICAgICAgICBmYWxzZTogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7IHNpemU6ICdkZWZhdWx0JywgaW52YWxpZDogZmFsc2UgfSxcbiAgfVxuKTtcblxuLyoqIFZhcmlhbnQgcHJvcHMgZm9yIHRoZSBkYXRlIHJhbmdlIHBpY2tlci4gKi9cbmV4cG9ydCB0eXBlIERhdGVSYW5nZVBpY2tlclByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBkYXRlUmFuZ2VQaWNrZXJUcmlnZ2VyVmFyaWFudHM+O1xuXG4vKipcbiAqIEEgYnV0dG9uIHRyaWdnZXIgcGFpcmVkIHdpdGggYSBgdG9sbGUtcmFuZ2UtY2FsZW5kYXJgIGluIGEgZmxvYXRpbmcgcGFuZWwsXG4gKiBmb3IgcGlja2luZyBhIHN0YXJ0IGFuZCBhbiBlbmQgZGF0ZS5cbiAqXG4gKiBUaGUgdmFsdWUgaXMgYSBgRGF0ZVJhbmdlYCDigJQgYHsgc3RhcnQsIGVuZCB9YCDigJQgYW5kIGEgaGFsZi1tYWRlIHJhbmdlIGlzIGFcbiAqIGxlZ2FsIGludGVybWVkaWF0ZSBzdGF0ZTogcGlja2luZyBhIHN0YXJ0IGVtaXRzIGB7IHN0YXJ0LCBlbmQ6IG51bGwgfWAgYW5kXG4gKiBsZWF2ZXMgdGhlIHBhbmVsIG9wZW4sIHNvIGEgY29uc3VtZXIgY2FuIHJlYWN0IHRvIHRoZSBmaXJzdCBjbGljay4gVGhlIHBhbmVsXG4gKiBvbmx5IGNsb3NlcyBvbmNlIGJvdGggZW5kcyBleGlzdC5cbiAqXG4gKiBJbXBsZW1lbnRzIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAsIHNvIGl0IHdvcmtzIHdpdGggYG5nTW9kZWxgIGFuZCByZWFjdGl2ZVxuICogZm9ybXMuIFVzZSBgdG9sbGUtZGF0ZS1waWNrZXJgIGZvciBhIHNpbmdsZSBkYXRlIOKAlCB0aGlzIHRyaWdnZXIgaXNcbiAqIGRlbGliZXJhdGVseSB0aGUgc2FtZSBzaGFwZSBhcyB0aGF0IG9uZSBhbmQgYXMgYHRvbGxlLWRhdGUtdGltZS1waWNrZXJgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1kYXRlLXJhbmdlLXBpY2tlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSYW5nZUNhbGVuZGFyQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgICN0cmlnZ2VyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5kYXRhLXN0YXRlXT1cImlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRUcmlnZ2VyQ2xhc3NcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleURvd24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNwYW4gW2NsYXNzXT1cImNuKCd0cnVuY2F0ZScsIGRpc3BsYXlWYWx1ZSA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgIHt7IGRpc3BsYXlWYWx1ZSB8fCBwbGFjZWhvbGRlciB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPGkgY2xhc3M9XCJyaS1jYWxlbmRhci1saW5lIHNocmluay0wIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICNwb3BvdmVyXG4gICAgICAqbmdJZj1cImlzT3BlblwiXG4gICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Nob29zZSBhIGRhdGUgcmFuZ2UnXCJcbiAgICAgIGNsYXNzPVwiZml4ZWQgbGVmdC0wIHRvcC0wIHotNTBcIlxuICAgICAgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW5cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIj5cbiAgICAgICAgICA8dG9sbGUtcmFuZ2UtY2FsZW5kYXJcbiAgICAgICAgICAgIFtib3JkZXJlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAocmFuZ2VTZWxlY3QpPVwib25DYWxlbmRhclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlUGFzdERhdGVzXT1cImRpc2FibGVQYXN0RGF0ZXNcIlxuICAgICAgICAgICAgW251bWJlck9mTW9udGhzXT1cIm51bWJlck9mTW9udGhzXCJcbiAgICAgICAgICA+PC90b2xsZS1yYW5nZS1jYWxlbmRhcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMiBib3JkZXItdCBib3JkZXItYm9yZGVyIHB4LTMgcHktMlwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJmb290ZXJCdXR0b25DbGFzc1wiIChjbGljayk9XCJjbGVhckZyb21Gb290ZXIoKVwiPlxuICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbihmb290ZXJCdXR0b25DbGFzcywgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeS85MCBob3Zlcjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkb25lKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERvbmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRGlzYWJsZXMgdGhlIGNvbnRyb2wuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBUZXh0IHNob3duIG9uIHRoZSB0cmlnZ2VyIHdoZW4gbm8gcmFuZ2UgaXMgc2VsZWN0ZWQuIEBkZWZhdWx0ICdQaWNrIGEgZGF0ZSByYW5nZScgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnUGljayBhIGRhdGUgcmFuZ2UnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdHJpZ2dlciB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICAvKiogRGlzYWJsZXMgZXZlcnkgZGF5IGJlZm9yZSB0b2RheSBpbiB0aGUgY2FsZW5kYXIuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0RGF0ZXMgPSBmYWxzZTtcbiAgLyoqIEhlaWdodCBhbmQgdGV4dCBzaXplIG9mIHRoZSB0cmlnZ2VyLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogRGF0ZVJhbmdlUGlja2VyUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIENvbnNlY3V0aXZlIG1vbnRocyBzaG93biBpbiB0aGUgcG9wb3ZlciAoZS5nLiBgMmAgZm9yIGEgdHdvLW1vbnRoIHBpY2tlcikuIEBkZWZhdWx0IDEgKi9cbiAgQElucHV0KCkgbnVtYmVyT2ZNb250aHMgPSAxO1xuICAvKiogQXBwbGllcyB0aGUgZGVzdHJ1Y3RpdmUgYm9yZGVyIGFuZCBmb2N1cyByaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG4gIC8qKiBBY2Nlc3NpYmxlIG5hbWUgd2hlbiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHZpc2libGUgbGFiZWwuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICcnO1xuXG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIHNlbGVjdGVkIHJhbmdlLCBpbmNsdWRpbmcgdGhlIGhhbGYtbWFkZSBgeyBzdGFydCwgZW5kOiBudWxsIH1gIHN0YXRlLiAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgY2FsZW5kYXIgcGFuZWwgb3BlbnMuICovXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIGNhbGVuZGFyIHBhbmVsIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgdHJpZ2dlciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcG92ZXInKSBwb3BvdmVyITogRWxlbWVudFJlZjtcblxuICB2YWx1ZTogRGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gIGlzT3BlbiA9IGZhbHNlO1xuICBjbGVhbnVwQXV0b1VwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIEZvb3RlciBidXR0b25zLCBzdHlsZWQgZXhhY3RseSBhcyB0aGUgZGF0ZS10aW1lIHBpY2tlcidzLiAqL1xuICByZWFkb25seSBmb290ZXJCdXR0b25DbGFzcyA9IGNuKFxuICAgICdyb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICdmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZydcbiAgKTtcblxuICAvKiogRm9vdGVyIENsZWFyIOKAlCBlbXB0aWVzIHRoZSByYW5nZSBhbmQgbGVhdmVzIHRoZSBwYW5lbCBvcGVuLCBsaWtlIHRoZSByZWZlcmVuY2UuICovXG4gIGNsZWFyRnJvbUZvb3RlcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRm9vdGVyIERvbmUg4oCUIGNvbW1pdHMgd2hhdCBpcyBhbHJlYWR5IHNlbGVjdGVkIGFuZCBjbG9zZXMuICovXG4gIGRvbmUoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3V0c2lkZUNsaWNrSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICghdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhdGhpcy5wb3BvdmVyPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGdldCBjb21wdXRlZFRyaWdnZXJDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbihkYXRlUmFuZ2VQaWNrZXJUcmlnZ2VyVmFyaWFudHMoeyBzaXplOiB0aGlzLnNpemUsIGludmFsaWQ6IHRoaXMuaW52YWxpZCB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cblxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnZhbHVlLnN0YXJ0KSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBzdGFydFN0ciA9IGZvcm1hdCh0aGlzLnZhbHVlLnN0YXJ0LCAnTU1NIGQsIHl5eXknKTtcbiAgICBpZiAoIXRoaXMudmFsdWUuZW5kKSByZXR1cm4gc3RhcnRTdHI7XG5cbiAgICBjb25zdCBlbmRTdHIgPSBmb3JtYXQodGhpcy52YWx1ZS5lbmQsICdNTU0gZCwgeXl5eScpO1xuICAgIHJldHVybiBzdGFydFN0ciArICcgLSAnICsgZW5kU3RyO1xuICB9XG5cbiAgb25DYWxlbmRhclNlbGVjdChyYW5nZTogRGF0ZVJhbmdlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHJhbmdlO1xuICAgIHRoaXMuZW1pdCgpO1xuXG4gICAgLy8gQ2xvc2Ugb25seSBpZiByYW5nZSBpcyBjb21wbGV0ZVxuICAgIGlmIChyYW5nZS5zdGFydCAmJiByYW5nZS5lbmQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCAxNTApO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICB9XG5cbiAgb25UcmlnZ2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChbJ0Fycm93RG93bicsICdBcnJvd1VwJywgJ0VudGVyJywgJyAnXS5pbmNsdWRlcyhldmVudC5rZXkpICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZXNjYXBlJykgb25Fc2NhcGUoKSB7IGlmICh0aGlzLmlzT3BlbikgdGhpcy5jbG9zZSgpOyB9XG5cbiAgb3BlbigpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5lZC5lbWl0KCk7XG4gICAgLy8gUmVuZGVyIHRoZSBwb3BvdmVyIHN5bmNocm9ub3VzbHkgc28gaXRzIERPTSBub2RlICsgQFZpZXdDaGlsZCgncG9wb3ZlcicpIGV4aXN0XG4gICAgLy8gYmVmb3JlIHdlIHBvc2l0aW9uIGl0LiBPdGhlcndpc2UsIHdpdGggem9uZSBldmVudENvYWxlc2NpbmcgKEFuZ3VsYXIgZGVmZXJzIGNoYW5nZVxuICAgIC8vIGRldGVjdGlvbiB0byB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUpLCB1cGRhdGVQb3NpdGlvbigpIGNhbiBydW4gZmlyc3QsIGZpbmQgbm9cbiAgICAvLyBwb3BvdmVyLCBhbmQgdGhlIGNhbGVuZGFyIHN0YXlzIGhpZGRlbiDigJQgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgcGlja2VyIGlzIHVzZWQuXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGlmICh0aGlzLnRyaWdnZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIGNvbnN0IHNjaGVkdWxlID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiAoZm46IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX291dHNpZGVDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgIHRoaXMudGVhcmRvd24oKTtcbiAgICAvLyBCb3RoIHRoZSBvdXRzaWRlLWNsaWNrIGhhbmRsZXIgYW5kIHRoZSBkZWZlcnJlZCBjbG9zZSBhZnRlciBhIGNvbXBsZXRlZFxuICAgIC8vIHJhbmdlIHJ1biBvdXRzaWRlIGFueSB0ZW1wbGF0ZSBiaW5kaW5nLCBzbyBub3RoaW5nIGVsc2UgbWFya3MgdGhpcyBPblB1c2hcbiAgICAvLyB2aWV3IGRpcnR5LlxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFJlcG9ydHMgdGhlIGN1cnJlbnQgcmFuZ2UgdG8gdGhlIGZvcm0gYW5kIHRvIGB2YWx1ZUNoYW5nZWAuICovXG4gIHByaXZhdGUgZW1pdCgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIC0tLSBGbG9hdGluZyBVSSBQb3NpdGlvbmluZyB3aXRoIEZpeGVkIFN0cmF0ZWd5IC0tLVxuICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgIGlmICghdGhpcy50cmlnZ2VyIHx8ICF0aGlzLnBvcG92ZXIpIHJldHVybjtcblxuICAgIHRoaXMuY2xlYW51cEF1dG9VcGRhdGUgPSBhdXRvVXBkYXRlKFxuICAgICAgdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29tcHV0ZVBvc2l0aW9uKHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbS1zdGFydCcsXG4gICAgICAgICAgc3RyYXRlZ3k6ICdmaXhlZCcsIC8vIFVzZSBmaXhlZCB0byBlc2NhcGUgY29sdW1uIGxheW91dFxuICAgICAgICAgIG1pZGRsZXdhcmU6IFtcbiAgICAgICAgICAgIG9mZnNldCg0KSxcbiAgICAgICAgICAgIGZsaXAoe1xuICAgICAgICAgICAgICBmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uOiAnc3RhcnQnLFxuICAgICAgICAgICAgICBwYWRkaW5nOiA4XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoaWZ0KHsgcGFkZGluZzogOCB9KSxcbiAgICAgICAgICAgIHNpemVNaWRkbGV3YXJlKHtcbiAgICAgICAgICAgICAgYXBwbHkoeyByZWN0cywgZWxlbWVudHMsIGF2YWlsYWJsZUhlaWdodCB9KSB7XG4gICAgICAgICAgICAgICAgLy8gQ29uc3RyYWluIHBvcG92ZXIgdG8gYXZhaWxhYmxlIHNwYWNlXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50cy5mbG9hdGluZy5zdHlsZSwge1xuICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBgJHtNYXRoLm1pbig0MDAsIGF2YWlsYWJsZUhlaWdodCl9cHhgLFxuICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGAke01hdGgubWF4KHJlY3RzLnJlZmVyZW5jZS53aWR0aCwgMzIwKX1weGAsIC8vIENhbGVuZGFyIG1pbmltdW0gd2lkdGhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdLFxuICAgICAgICB9KS50aGVuKCh7IHgsIHksIHBsYWNlbWVudCB9KSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgbGVmdDogYCR7eH1weGAsXG4gICAgICAgICAgICB0b3A6IGAke3l9cHhgLFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gT3B0aW9uYWw6IEFkZCBwbGFjZW1lbnQgY2xhc3MgZm9yIHN0eWxpbmdcbiAgICAgICAgICB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdjYWxlbmRhci10b3AnLCAnY2FsZW5kYXItYm90dG9tJyk7XG4gICAgICAgICAgaWYgKHBsYWNlbWVudC5pbmNsdWRlcygndG9wJykpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NhbGVuZGFyLXRvcCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjYWxlbmRhci1ib3R0b20nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRlYXJkb3duKCkge1xuICAgIGlmICh0aGlzLmNsZWFudXBBdXRvVXBkYXRlKSB7XG4gICAgICB0aGlzLmNsZWFudXBBdXRvVXBkYXRlKCk7XG4gICAgICB0aGlzLmNsZWFudXBBdXRvVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX291dHNpZGVDbGlja0hhbmRsZXIsIHRydWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy50ZWFyZG93bigpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCkge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZSgpOyAvLyBDbG9zZSBvbiByZXNpemUgZm9yIHNpbXBsaWNpdHlcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgb25XaW5kb3dTY3JvbGwoKSB7XG4gICAgLy8gRmxvYXRpbmctVUkncyBhdXRvVXBkYXRlIGhhbmRsZXMgc2Nyb2xsIHJlcG9zaXRpb25pbmdcbiAgfVxuXG4gIC8vIC0tLSBDb250cm9sIFZhbHVlIEFjY2Vzc29yIC0tLVxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgd3JpdGVWYWx1ZSh2YWw6IERhdGVSYW5nZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLnZhbHVlID0geyAuLi52YWwgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=