@sbb-esta/lyne-elements 1.12.1 → 1.14.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 (936) hide show
  1. package/accordion/accordion.d.ts +4 -8
  2. package/accordion/accordion.d.ts.map +1 -1
  3. package/accordion.js +90 -81
  4. package/action-group/action-group.d.ts +5 -5
  5. package/action-group/action-group.d.ts.map +1 -1
  6. package/action-group.js +100 -50
  7. package/alert/alert/alert.d.ts +11 -11
  8. package/alert/alert/alert.d.ts.map +1 -1
  9. package/alert/alert-group/alert-group.d.ts +4 -4
  10. package/alert/alert-group/alert-group.d.ts.map +1 -1
  11. package/alert/alert-group.js +101 -69
  12. package/alert/alert.js +191 -104
  13. package/autocomplete/autocomplete-base-element.d.ts +3 -7
  14. package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  15. package/autocomplete/autocomplete.d.ts.map +1 -1
  16. package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  17. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
  18. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
  19. package/autocomplete-grid/autocomplete-grid-button.js +53 -60
  20. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
  21. package/autocomplete-grid/autocomplete-grid-cell.js +20 -22
  22. package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
  23. package/autocomplete-grid/autocomplete-grid-optgroup.js +31 -35
  24. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
  25. package/autocomplete-grid/autocomplete-grid-option.js +45 -63
  26. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
  27. package/autocomplete-grid/autocomplete-grid-row.js +23 -25
  28. package/autocomplete-grid/autocomplete-grid.js +112 -133
  29. package/autocomplete.js +283 -295
  30. package/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
  31. package/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
  32. package/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
  33. package/breadcrumb/breadcrumb-group.js +107 -114
  34. package/breadcrumb/breadcrumb.js +44 -35
  35. package/button/button/button.d.ts.map +1 -1
  36. package/button/button-link/button-link.d.ts.map +1 -1
  37. package/button/button-link.js +15 -18
  38. package/button/button-static/button-static.d.ts.map +1 -1
  39. package/button/button-static.js +15 -18
  40. package/button/button.js +15 -18
  41. package/button/common/button-common.d.ts +4 -4
  42. package/button/common/button-common.d.ts.map +1 -1
  43. package/button/common.js +41 -30
  44. package/button/mini-button/mini-button-base-element.d.ts.map +1 -1
  45. package/button/mini-button/mini-button.d.ts.map +1 -1
  46. package/button/mini-button-group/mini-button-group.d.ts +2 -2
  47. package/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  48. package/button/mini-button-group.js +55 -43
  49. package/button/mini-button.js +28 -32
  50. package/button/secondary-button/secondary-button.d.ts.map +1 -1
  51. package/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
  52. package/button/secondary-button-link.js +15 -18
  53. package/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
  54. package/button/secondary-button-static.js +15 -18
  55. package/button/secondary-button.js +15 -18
  56. package/button/tertiary-button/tertiary-button.d.ts.map +1 -1
  57. package/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
  58. package/button/tertiary-button-link.js +15 -18
  59. package/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
  60. package/button/tertiary-button-static.js +15 -18
  61. package/button/tertiary-button.js +15 -18
  62. package/button/transparent-button/transparent-button.d.ts.map +1 -1
  63. package/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
  64. package/button/transparent-button-link.js +15 -18
  65. package/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
  66. package/button/transparent-button-static.js +15 -18
  67. package/button/transparent-button.js +15 -18
  68. package/calendar/calendar.d.ts +7 -7
  69. package/calendar/calendar.d.ts.map +1 -1
  70. package/calendar.js +638 -692
  71. package/card/card/card.d.ts +2 -2
  72. package/card/card/card.d.ts.map +1 -1
  73. package/card/card-badge/card-badge.d.ts +1 -1
  74. package/card/card-badge/card-badge.d.ts.map +1 -1
  75. package/card/card-badge.js +45 -34
  76. package/card/card-button/card-button.d.ts.map +1 -1
  77. package/card/card-button.js +16 -16
  78. package/card/card-link/card-link.d.ts.map +1 -1
  79. package/card/card-link.js +17 -17
  80. package/card/card.js +55 -36
  81. package/card/common/card-action-common.d.ts +1 -1
  82. package/card/common/card-action-common.d.ts.map +1 -1
  83. package/card/common.js +27 -33
  84. package/checkbox/checkbox/checkbox.d.ts +3 -4
  85. package/checkbox/checkbox/checkbox.d.ts.map +1 -1
  86. package/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
  87. package/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  88. package/checkbox/checkbox-group.js +99 -76
  89. package/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
  90. package/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  91. package/checkbox/checkbox-panel.js +51 -50
  92. package/checkbox/checkbox.js +54 -43
  93. package/checkbox/common/checkbox-common.d.ts +1 -1
  94. package/checkbox/common/checkbox-common.d.ts.map +1 -1
  95. package/checkbox/common.js +39 -24
  96. package/chip/chip.d.ts +2 -2
  97. package/chip/chip.d.ts.map +1 -1
  98. package/chip.js +45 -26
  99. package/clock/clock.d.ts +1 -1
  100. package/clock/clock.d.ts.map +1 -1
  101. package/clock.js +136 -144
  102. package/container/container/container.d.ts +3 -3
  103. package/container/container/container.d.ts.map +1 -1
  104. package/container/container.js +60 -35
  105. package/container/sticky-bar/sticky-bar.d.ts +1 -1
  106. package/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  107. package/container/sticky-bar.js +55 -47
  108. package/core/a11y.js +29 -51
  109. package/core/base-elements/action-base-element.d.ts.map +1 -1
  110. package/core/base-elements/button-base-element.d.ts +2 -2
  111. package/core/base-elements/button-base-element.d.ts.map +1 -1
  112. package/core/base-elements/link-base-element.d.ts +5 -5
  113. package/core/base-elements/link-base-element.d.ts.map +1 -1
  114. package/core/base-elements.js +243 -196
  115. package/core/controllers.js +8 -13
  116. package/core/decorators/base.d.ts +14 -0
  117. package/core/decorators/base.d.ts.map +1 -0
  118. package/core/decorators/force-type.d.ts +8 -0
  119. package/core/decorators/force-type.d.ts.map +1 -0
  120. package/core/decorators/get-override.d.ts +7 -0
  121. package/core/decorators/get-override.d.ts.map +1 -0
  122. package/core/decorators/handle-distinct-change.d.ts +8 -0
  123. package/core/decorators/handle-distinct-change.d.ts.map +1 -0
  124. package/core/decorators/omit-empty-converter.d.ts +8 -0
  125. package/core/decorators/omit-empty-converter.d.ts.map +1 -0
  126. package/core/decorators.d.ts +4 -0
  127. package/core/decorators.d.ts.map +1 -1
  128. package/core/decorators.js +59 -15
  129. package/core/dom.js +1 -5
  130. package/core/eventing.js +1 -4
  131. package/core/interfaces/paginator-page.d.ts +7 -0
  132. package/core/interfaces/paginator-page.d.ts.map +1 -0
  133. package/core/interfaces.d.ts +1 -0
  134. package/core/interfaces.d.ts.map +1 -1
  135. package/core/mixins/disabled-mixin.d.ts +2 -3
  136. package/core/mixins/disabled-mixin.d.ts.map +1 -1
  137. package/core/mixins/form-associated-checkbox-mixin.d.ts +1 -0
  138. package/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  139. package/core/mixins/form-associated-mixin.d.ts +6 -6
  140. package/core/mixins/form-associated-mixin.d.ts.map +1 -1
  141. package/core/mixins/named-slot-list-mixin.d.ts +1 -1
  142. package/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  143. package/core/mixins/negative-mixin.d.ts +1 -1
  144. package/core/mixins/negative-mixin.d.ts.map +1 -1
  145. package/core/mixins/panel-mixin.d.ts +3 -3
  146. package/core/mixins/panel-mixin.d.ts.map +1 -1
  147. package/core/mixins/required-mixin.d.ts +2 -3
  148. package/core/mixins/required-mixin.d.ts.map +1 -1
  149. package/core/mixins.js +291 -242
  150. package/core/styles/mixins/buttons.scss +1 -1
  151. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +4 -0
  152. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss +5 -1
  153. package/core/testing/private.d.ts +1 -0
  154. package/core/testing/private.d.ts.map +1 -1
  155. package/core/testing.js +7 -13
  156. package/core.css +5 -1
  157. package/custom-elements.json +14515 -13465
  158. package/datepicker/common/datepicker-button.d.ts +2 -2
  159. package/datepicker/common/datepicker-button.d.ts.map +1 -1
  160. package/datepicker/common.js +110 -116
  161. package/datepicker/datepicker/datepicker.d.ts +6 -6
  162. package/datepicker/datepicker/datepicker.d.ts.map +1 -1
  163. package/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  164. package/datepicker/datepicker-next-day.js +24 -26
  165. package/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  166. package/datepicker/datepicker-previous-day.js +25 -27
  167. package/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
  168. package/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
  169. package/datepicker/datepicker-toggle.js +154 -136
  170. package/datepicker/datepicker.js +248 -213
  171. package/development/accordion/accordion.d.ts +4 -8
  172. package/development/accordion/accordion.d.ts.map +1 -1
  173. package/development/accordion.js +118 -93
  174. package/development/action-group/action-group.d.ts +5 -5
  175. package/development/action-group/action-group.d.ts.map +1 -1
  176. package/development/action-group.js +138 -64
  177. package/development/alert/alert/alert.d.ts +11 -11
  178. package/development/alert/alert/alert.d.ts.map +1 -1
  179. package/development/alert/alert-group/alert-group.d.ts +4 -4
  180. package/development/alert/alert-group/alert-group.d.ts.map +1 -1
  181. package/development/alert/alert-group.js +135 -79
  182. package/development/alert/alert.js +259 -109
  183. package/development/autocomplete/autocomplete-base-element.d.ts +3 -7
  184. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  185. package/development/autocomplete/autocomplete.d.ts.map +1 -1
  186. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
  187. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
  188. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
  189. package/development/autocomplete-grid/autocomplete-grid-button.js +75 -76
  190. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
  191. package/development/autocomplete-grid/autocomplete-grid-cell.js +24 -24
  192. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
  193. package/development/autocomplete-grid/autocomplete-grid-optgroup.js +38 -39
  194. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
  195. package/development/autocomplete-grid/autocomplete-grid-option.js +57 -73
  196. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
  197. package/development/autocomplete-grid/autocomplete-grid-row.js +28 -28
  198. package/development/autocomplete-grid/autocomplete-grid.js +142 -160
  199. package/development/autocomplete.js +394 -393
  200. package/development/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
  201. package/development/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
  202. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
  203. package/development/breadcrumb/breadcrumb-group.js +130 -130
  204. package/development/breadcrumb/breadcrumb.js +53 -36
  205. package/development/button/button/button.d.ts.map +1 -1
  206. package/development/button/button-link/button-link.d.ts.map +1 -1
  207. package/development/button/button-link.js +18 -19
  208. package/development/button/button-static/button-static.d.ts.map +1 -1
  209. package/development/button/button-static.js +18 -19
  210. package/development/button/button.js +18 -19
  211. package/development/button/common/button-common.d.ts +4 -4
  212. package/development/button/common/button-common.d.ts.map +1 -1
  213. package/development/button/common.js +51 -30
  214. package/development/button/mini-button/mini-button-base-element.d.ts.map +1 -1
  215. package/development/button/mini-button/mini-button.d.ts.map +1 -1
  216. package/development/button/mini-button-group/mini-button-group.d.ts +2 -2
  217. package/development/button/mini-button-group/mini-button-group.d.ts.map +1 -1
  218. package/development/button/mini-button-group.js +77 -50
  219. package/development/button/mini-button.js +39 -38
  220. package/development/button/secondary-button/secondary-button.d.ts.map +1 -1
  221. package/development/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
  222. package/development/button/secondary-button-link.js +18 -19
  223. package/development/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
  224. package/development/button/secondary-button-static.js +18 -19
  225. package/development/button/secondary-button.js +18 -19
  226. package/development/button/tertiary-button/tertiary-button.d.ts.map +1 -1
  227. package/development/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
  228. package/development/button/tertiary-button-link.js +18 -19
  229. package/development/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
  230. package/development/button/tertiary-button-static.js +18 -19
  231. package/development/button/tertiary-button.js +18 -19
  232. package/development/button/transparent-button/transparent-button.d.ts.map +1 -1
  233. package/development/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
  234. package/development/button/transparent-button-link.js +18 -19
  235. package/development/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
  236. package/development/button/transparent-button-static.js +18 -19
  237. package/development/button/transparent-button.js +18 -19
  238. package/development/calendar/calendar.d.ts +7 -7
  239. package/development/calendar/calendar.d.ts.map +1 -1
  240. package/development/calendar.js +768 -766
  241. package/development/card/card/card.d.ts +2 -2
  242. package/development/card/card/card.d.ts.map +1 -1
  243. package/development/card/card-badge/card-badge.d.ts +1 -1
  244. package/development/card/card-badge/card-badge.d.ts.map +1 -1
  245. package/development/card/card-badge.js +65 -45
  246. package/development/card/card-button/card-button.d.ts.map +1 -1
  247. package/development/card/card-button.js +23 -20
  248. package/development/card/card-link/card-link.d.ts.map +1 -1
  249. package/development/card/card-link.js +23 -20
  250. package/development/card/card.js +72 -41
  251. package/development/card/common/card-action-common.d.ts +1 -1
  252. package/development/card/common/card-action-common.d.ts.map +1 -1
  253. package/development/card/common.js +74 -73
  254. package/development/checkbox/checkbox/checkbox.d.ts +3 -4
  255. package/development/checkbox/checkbox/checkbox.d.ts.map +1 -1
  256. package/development/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
  257. package/development/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
  258. package/development/checkbox/checkbox-group.js +139 -92
  259. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
  260. package/development/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
  261. package/development/checkbox/checkbox-panel.js +68 -60
  262. package/development/checkbox/checkbox.js +69 -46
  263. package/development/checkbox/common/checkbox-common.d.ts +1 -1
  264. package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
  265. package/development/checkbox/common.js +65 -46
  266. package/development/chip/chip.d.ts +2 -2
  267. package/development/chip/chip.d.ts.map +1 -1
  268. package/development/chip.js +64 -33
  269. package/development/clock/clock.d.ts +1 -1
  270. package/development/clock/clock.d.ts.map +1 -1
  271. package/development/clock.js +203 -201
  272. package/development/container/container/container.d.ts +3 -3
  273. package/development/container/container/container.d.ts.map +1 -1
  274. package/development/container/container.js +86 -45
  275. package/development/container/sticky-bar/sticky-bar.d.ts +1 -1
  276. package/development/container/sticky-bar/sticky-bar.d.ts.map +1 -1
  277. package/development/container/sticky-bar.js +76 -58
  278. package/development/core/a11y.js +40 -62
  279. package/development/core/base-elements/action-base-element.d.ts.map +1 -1
  280. package/development/core/base-elements/button-base-element.d.ts +2 -2
  281. package/development/core/base-elements/button-base-element.d.ts.map +1 -1
  282. package/development/core/base-elements/link-base-element.d.ts +5 -5
  283. package/development/core/base-elements/link-base-element.d.ts.map +1 -1
  284. package/development/core/base-elements.js +329 -226
  285. package/development/core/config.js +1 -1
  286. package/development/core/controllers.js +13 -21
  287. package/development/core/datetime.js +1 -1
  288. package/development/core/decorators/base.d.ts +14 -0
  289. package/development/core/decorators/base.d.ts.map +1 -0
  290. package/development/core/decorators/force-type.d.ts +8 -0
  291. package/development/core/decorators/force-type.d.ts.map +1 -0
  292. package/development/core/decorators/get-override.d.ts +7 -0
  293. package/development/core/decorators/get-override.d.ts.map +1 -0
  294. package/development/core/decorators/handle-distinct-change.d.ts +8 -0
  295. package/development/core/decorators/handle-distinct-change.d.ts.map +1 -0
  296. package/development/core/decorators/omit-empty-converter.d.ts +8 -0
  297. package/development/core/decorators/omit-empty-converter.d.ts.map +1 -0
  298. package/development/core/decorators.d.ts +4 -0
  299. package/development/core/decorators.d.ts.map +1 -1
  300. package/development/core/decorators.js +69 -5
  301. package/development/core/dom.js +2 -6
  302. package/development/core/eventing.js +2 -5
  303. package/development/core/i18n.js +1 -1
  304. package/development/core/interfaces/paginator-page.d.ts +7 -0
  305. package/development/core/interfaces/paginator-page.d.ts.map +1 -0
  306. package/development/core/interfaces.d.ts +1 -0
  307. package/development/core/interfaces.d.ts.map +1 -1
  308. package/development/core/mixins/disabled-mixin.d.ts +2 -3
  309. package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
  310. package/development/core/mixins/form-associated-checkbox-mixin.d.ts +1 -0
  311. package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  312. package/development/core/mixins/form-associated-mixin.d.ts +6 -6
  313. package/development/core/mixins/form-associated-mixin.d.ts.map +1 -1
  314. package/development/core/mixins/named-slot-list-mixin.d.ts +1 -1
  315. package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
  316. package/development/core/mixins/negative-mixin.d.ts +1 -1
  317. package/development/core/mixins/negative-mixin.d.ts.map +1 -1
  318. package/development/core/mixins/panel-mixin.d.ts +3 -3
  319. package/development/core/mixins/panel-mixin.d.ts.map +1 -1
  320. package/development/core/mixins/required-mixin.d.ts +2 -3
  321. package/development/core/mixins/required-mixin.d.ts.map +1 -1
  322. package/development/core/mixins.js +573 -478
  323. package/development/core/observers.js +1 -1
  324. package/development/core/overlay.js +1 -1
  325. package/development/core/testing/private.d.ts +1 -0
  326. package/development/core/testing/private.d.ts.map +1 -1
  327. package/development/core/testing.js +16 -22
  328. package/development/datepicker/common/datepicker-button.d.ts +2 -2
  329. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  330. package/development/datepicker/common.js +144 -142
  331. package/development/datepicker/datepicker/datepicker.d.ts +6 -6
  332. package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
  333. package/development/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
  334. package/development/datepicker/datepicker-next-day.js +33 -33
  335. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
  336. package/development/datepicker/datepicker-previous-day.js +33 -33
  337. package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
  338. package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
  339. package/development/datepicker/datepicker-toggle.js +227 -174
  340. package/development/datepicker/datepicker.js +327 -249
  341. package/development/dialog/dialog/dialog.d.ts +1 -1
  342. package/development/dialog/dialog/dialog.d.ts.map +1 -1
  343. package/development/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
  344. package/development/dialog/dialog-actions.js +21 -20
  345. package/development/dialog/dialog-content/dialog-content.d.ts.map +1 -1
  346. package/development/dialog/dialog-content.js +22 -21
  347. package/development/dialog/dialog-title/dialog-title.d.ts +3 -3
  348. package/development/dialog/dialog-title/dialog-title.d.ts.map +1 -1
  349. package/development/dialog/dialog-title.js +121 -66
  350. package/development/dialog/dialog.js +205 -191
  351. package/development/divider/divider.d.ts +1 -1
  352. package/development/divider/divider.d.ts.map +1 -1
  353. package/development/divider.js +55 -36
  354. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
  355. package/development/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  356. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
  357. package/development/expansion-panel/expansion-panel-content.js +25 -25
  358. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
  359. package/development/expansion-panel/expansion-panel-header.js +56 -63
  360. package/development/expansion-panel/expansion-panel.js +227 -182
  361. package/development/file-selector/file-selector.d.ts +26 -15
  362. package/development/file-selector/file-selector.d.ts.map +1 -1
  363. package/development/file-selector.js +305 -172
  364. package/development/flip-card/flip-card/flip-card.d.ts +2 -2
  365. package/development/flip-card/flip-card/flip-card.d.ts.map +1 -1
  366. package/development/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
  367. package/development/flip-card/flip-card-details.js +39 -39
  368. package/development/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
  369. package/development/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
  370. package/development/flip-card/flip-card-summary.js +57 -38
  371. package/development/flip-card/flip-card.js +110 -78
  372. package/development/footer/footer.d.ts +4 -4
  373. package/development/footer/footer.d.ts.map +1 -1
  374. package/development/footer.js +103 -41
  375. package/development/form-error/form-error.d.ts.map +1 -1
  376. package/development/form-error.js +29 -28
  377. package/development/form-field/form-field/form-field.d.ts +10 -10
  378. package/development/form-field/form-field/form-field.d.ts.map +1 -1
  379. package/development/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
  380. package/development/form-field/form-field-clear.js +51 -51
  381. package/development/form-field/form-field.js +439 -328
  382. package/development/header/common/header-action-common.d.ts +2 -2
  383. package/development/header/common/header-action-common.d.ts.map +1 -1
  384. package/development/header/common.js +95 -28
  385. package/development/header/header/header.d.ts +4 -4
  386. package/development/header/header/header.d.ts.map +1 -1
  387. package/development/header/header-button/header-button.d.ts.map +1 -1
  388. package/development/header/header-button.js +19 -18
  389. package/development/header/header-link/header-link.d.ts.map +1 -1
  390. package/development/header/header-link.js +19 -16
  391. package/development/header/header.js +198 -140
  392. package/development/icon/icon-base.d.ts +3 -4
  393. package/development/icon/icon-base.d.ts.map +1 -1
  394. package/development/icon/icon-name-mixin.d.ts +1 -1
  395. package/development/icon/icon-name-mixin.d.ts.map +1 -1
  396. package/development/icon/icon.d.ts +2 -2
  397. package/development/icon/icon.d.ts.map +1 -1
  398. package/development/icon.js +258 -157
  399. package/development/image/image.d.ts +17 -17
  400. package/development/image/image.d.ts.map +1 -1
  401. package/development/image.js +584 -216
  402. package/development/journey-header/journey-header.d.ts +5 -5
  403. package/development/journey-header/journey-header.d.ts.map +1 -1
  404. package/development/journey-header.js +115 -43
  405. package/development/lead-container/lead-container.d.ts.map +1 -1
  406. package/development/lead-container.js +22 -21
  407. package/development/link/block-link/block-link.d.ts.map +1 -1
  408. package/development/link/block-link-button/block-link-button.d.ts.map +1 -1
  409. package/development/link/block-link-button.js +19 -18
  410. package/development/link/block-link-static/block-link-static.d.ts.map +1 -1
  411. package/development/link/block-link-static.js +19 -18
  412. package/development/link/block-link.js +19 -18
  413. package/development/link/common/block-link-common.d.ts +4 -3
  414. package/development/link/common/block-link-common.d.ts.map +1 -1
  415. package/development/link/common/link-common.d.ts +1 -1
  416. package/development/link/common/link-common.d.ts.map +1 -1
  417. package/development/link/common.js +81 -51
  418. package/development/link/link/link.d.ts.map +1 -1
  419. package/development/link/link-button/link-button.d.ts.map +1 -1
  420. package/development/link/link-button.js +19 -18
  421. package/development/link/link-static/link-static.d.ts.map +1 -1
  422. package/development/link/link-static.js +19 -18
  423. package/development/link/link.js +19 -18
  424. package/development/link-list/common/link-list-base.d.ts +3 -3
  425. package/development/link-list/common/link-list-base.d.ts.map +1 -1
  426. package/development/link-list/common.js +97 -48
  427. package/development/link-list/link-list/link-list.d.ts +2 -2
  428. package/development/link-list/link-list/link-list.d.ts.map +1 -1
  429. package/development/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
  430. package/development/link-list/link-list-anchor.js +18 -17
  431. package/development/link-list/link-list.js +60 -28
  432. package/development/loading-indicator/loading-indicator.d.ts +3 -3
  433. package/development/loading-indicator/loading-indicator.d.ts.map +1 -1
  434. package/development/loading-indicator.js +83 -45
  435. package/development/logo/logo.d.ts +2 -2
  436. package/development/logo/logo.d.ts.map +1 -1
  437. package/development/logo.js +64 -32
  438. package/development/map-container/map-container.d.ts +2 -2
  439. package/development/map-container/map-container.d.ts.map +1 -1
  440. package/development/map-container.js +107 -75
  441. package/development/menu/common/menu-action-common.d.ts +2 -2
  442. package/development/menu/common/menu-action-common.d.ts.map +1 -1
  443. package/development/menu/common.js +41 -20
  444. package/development/menu/menu/menu.d.ts +1 -1
  445. package/development/menu/menu/menu.d.ts.map +1 -1
  446. package/development/menu/menu-button/menu-button.d.ts.map +1 -1
  447. package/development/menu/menu-button.js +19 -18
  448. package/development/menu/menu-link/menu-link.d.ts.map +1 -1
  449. package/development/menu/menu-link.js +19 -18
  450. package/development/menu/menu.js +261 -241
  451. package/development/message/message.d.ts +2 -2
  452. package/development/message/message.d.ts.map +1 -1
  453. package/development/message.js +65 -32
  454. package/development/navigation/common/navigation-action-common.d.ts +1 -1
  455. package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
  456. package/development/navigation/common.js +63 -52
  457. package/development/navigation/navigation/navigation.d.ts +2 -2
  458. package/development/navigation/navigation/navigation.d.ts.map +1 -1
  459. package/development/navigation/navigation-button/navigation-button.d.ts.map +1 -1
  460. package/development/navigation/navigation-button.js +19 -18
  461. package/development/navigation/navigation-link/navigation-link.d.ts.map +1 -1
  462. package/development/navigation/navigation-link.js +19 -18
  463. package/development/navigation/navigation-list/navigation-list.d.ts +1 -1
  464. package/development/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  465. package/development/navigation/navigation-list.js +64 -41
  466. package/development/navigation/navigation-marker/navigation-marker.d.ts +1 -1
  467. package/development/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  468. package/development/navigation/navigation-marker.js +108 -91
  469. package/development/navigation/navigation-section/navigation-section.d.ts +3 -3
  470. package/development/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  471. package/development/navigation/navigation-section.js +282 -236
  472. package/development/navigation/navigation.js +278 -254
  473. package/development/notification/notification.d.ts +6 -6
  474. package/development/notification/notification.d.ts.map +1 -1
  475. package/development/notification.js +212 -146
  476. package/development/option/optgroup/optgroup-base-element.d.ts +3 -3
  477. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  478. package/development/option/optgroup/optgroup.d.ts.map +1 -1
  479. package/development/option/optgroup.js +187 -142
  480. package/development/option/option/option-base-element.d.ts +7 -7
  481. package/development/option/option/option-base-element.d.ts.map +1 -1
  482. package/development/option/option/option.d.ts.map +1 -1
  483. package/development/option/option.js +392 -296
  484. package/development/overlay/overlay-base-element.d.ts +1 -1
  485. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  486. package/development/overlay/overlay.d.ts +4 -4
  487. package/development/overlay/overlay.d.ts.map +1 -1
  488. package/development/overlay.js +260 -207
  489. package/development/paginator/common/paginator-common.d.ts +26 -0
  490. package/development/paginator/common/paginator-common.d.ts.map +1 -0
  491. package/development/paginator/common.d.ts +2 -0
  492. package/development/paginator/common.d.ts.map +1 -0
  493. package/development/paginator/common.js +189 -0
  494. package/development/paginator/compact-paginator/compact-paginator.d.ts +20 -0
  495. package/development/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
  496. package/development/paginator/compact-paginator.d.ts +2 -0
  497. package/development/paginator/compact-paginator.d.ts.map +1 -0
  498. package/development/paginator/compact-paginator.js +96 -0
  499. package/development/paginator/paginator/paginator.d.ts +51 -0
  500. package/development/paginator/paginator/paginator.d.ts.map +1 -0
  501. package/development/paginator/paginator.d.ts +1 -90
  502. package/development/paginator/paginator.d.ts.map +1 -1
  503. package/development/paginator/paginator.js +449 -0
  504. package/development/paginator.d.ts +2 -0
  505. package/development/paginator.d.ts.map +1 -1
  506. package/development/paginator.js +4 -519
  507. package/development/popover/popover/popover.d.ts +6 -7
  508. package/development/popover/popover/popover.d.ts.map +1 -1
  509. package/development/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
  510. package/development/popover/popover-trigger.js +29 -30
  511. package/development/popover/popover.js +358 -303
  512. package/development/radio-button/common/radio-button-common.d.ts +1 -1
  513. package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
  514. package/development/radio-button/common.js +170 -127
  515. package/development/radio-button/radio-button/radio-button.d.ts +2 -6
  516. package/development/radio-button/radio-button/radio-button.d.ts.map +1 -1
  517. package/development/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
  518. package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  519. package/development/radio-button/radio-button-group.js +269 -199
  520. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
  521. package/development/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  522. package/development/radio-button/radio-button-panel.js +60 -48
  523. package/development/radio-button/radio-button.js +54 -40
  524. package/development/screen-reader-only/screen-reader-only.d.ts.map +1 -1
  525. package/development/screen-reader-only.js +22 -21
  526. package/development/select/select.d.ts +17 -9
  527. package/development/select/select.d.ts.map +1 -1
  528. package/development/select.js +557 -524
  529. package/development/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
  530. package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  531. package/development/selection-expansion-panel.js +223 -193
  532. package/development/signet/signet.d.ts +2 -2
  533. package/development/signet/signet.d.ts.map +1 -1
  534. package/development/signet.js +65 -33
  535. package/development/skiplink-list/skiplink-list.d.ts +2 -2
  536. package/development/skiplink-list/skiplink-list.d.ts.map +1 -1
  537. package/development/skiplink-list.js +74 -41
  538. package/development/slider/slider.d.ts +7 -5
  539. package/development/slider/slider.d.ts.map +1 -1
  540. package/development/slider.js +260 -181
  541. package/development/status/status.d.ts +3 -3
  542. package/development/status/status.d.ts.map +1 -1
  543. package/development/status.js +96 -51
  544. package/development/stepper/step/step.d.ts.map +1 -1
  545. package/development/stepper/step-label/step-label.d.ts.map +1 -1
  546. package/development/stepper/step-label.js +86 -90
  547. package/development/stepper/step.js +122 -126
  548. package/development/stepper/stepper/stepper.d.ts +3 -3
  549. package/development/stepper/stepper/stepper.d.ts.map +1 -1
  550. package/development/stepper/stepper.js +291 -241
  551. package/development/table/table-wrapper/table-wrapper.d.ts.map +1 -1
  552. package/development/table/table-wrapper.js +37 -39
  553. package/development/tabs/tab/tab.d.ts.map +1 -1
  554. package/development/tabs/tab-group/tab-group.d.ts +2 -2
  555. package/development/tabs/tab-group/tab-group.d.ts.map +1 -1
  556. package/development/tabs/tab-group.js +296 -279
  557. package/development/tabs/tab-label/tab-label.d.ts +3 -3
  558. package/development/tabs/tab-label/tab-label.d.ts.map +1 -1
  559. package/development/tabs/tab-label.js +83 -37
  560. package/development/tabs/tab.js +40 -39
  561. package/development/tag/tag/tag.d.ts +3 -5
  562. package/development/tag/tag/tag.d.ts.map +1 -1
  563. package/development/tag/tag-group/tag-group.d.ts +3 -3
  564. package/development/tag/tag-group/tag-group.d.ts.map +1 -1
  565. package/development/tag/tag-group.js +143 -88
  566. package/development/tag/tag.js +126 -89
  567. package/development/teaser/teaser.d.ts +4 -4
  568. package/development/teaser/teaser.d.ts.map +1 -1
  569. package/development/teaser-hero/teaser-hero.d.ts +3 -3
  570. package/development/teaser-hero/teaser-hero.d.ts.map +1 -1
  571. package/development/teaser-hero.js +83 -36
  572. package/development/teaser-product/common/teaser-product-common.d.ts +1 -1
  573. package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  574. package/development/teaser-product/common.js +51 -26
  575. package/development/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
  576. package/development/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
  577. package/development/teaser-product/teaser-product-static.js +18 -19
  578. package/development/teaser-product/teaser-product.js +18 -19
  579. package/development/teaser.js +94 -40
  580. package/development/time-input/time-input.d.ts +1 -1
  581. package/development/time-input/time-input.d.ts.map +1 -1
  582. package/development/time-input.js +225 -219
  583. package/development/timetable-occupancy/timetable-occupancy.d.ts +2 -2
  584. package/development/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
  585. package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
  586. package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
  587. package/development/timetable-occupancy-icon.js +78 -57
  588. package/development/timetable-occupancy.js +67 -35
  589. package/development/title/title-base.d.ts +3 -3
  590. package/development/title/title-base.d.ts.map +1 -1
  591. package/development/title/title.d.ts.map +1 -1
  592. package/development/title.js +106 -58
  593. package/development/toast/toast.d.ts +4 -4
  594. package/development/toast/toast.d.ts.map +1 -1
  595. package/development/toast.js +204 -146
  596. package/development/toggle/toggle/toggle.d.ts +3 -5
  597. package/development/toggle/toggle/toggle.d.ts.map +1 -1
  598. package/development/toggle/toggle-option/toggle-option.d.ts +2 -2
  599. package/development/toggle/toggle-option/toggle-option.d.ts.map +1 -1
  600. package/development/toggle/toggle-option.js +127 -93
  601. package/development/toggle/toggle.js +200 -163
  602. package/development/toggle-check/toggle-check.d.ts +4 -3
  603. package/development/toggle-check/toggle-check.d.ts.map +1 -1
  604. package/development/toggle-check.js +87 -49
  605. package/development/train/train/train.d.ts +5 -5
  606. package/development/train/train/train.d.ts.map +1 -1
  607. package/development/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
  608. package/development/train/train-blocked-passage.js +22 -21
  609. package/development/train/train-formation/train-formation.d.ts +2 -2
  610. package/development/train/train-formation/train-formation.d.ts.map +1 -1
  611. package/development/train/train-formation.js +113 -90
  612. package/development/train/train-wagon/train-wagon.d.ts +7 -9
  613. package/development/train/train-wagon/train-wagon.d.ts.map +1 -1
  614. package/development/train/train-wagon.js +166 -87
  615. package/development/train/train.js +142 -75
  616. package/development/visual-checkbox/visual-checkbox.d.ts +3 -3
  617. package/development/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  618. package/development/visual-checkbox.js +79 -36
  619. package/dialog/dialog/dialog.d.ts +1 -1
  620. package/dialog/dialog/dialog.d.ts.map +1 -1
  621. package/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
  622. package/dialog/dialog-actions.js +18 -19
  623. package/dialog/dialog-content/dialog-content.d.ts.map +1 -1
  624. package/dialog/dialog-content.js +17 -18
  625. package/dialog/dialog-title/dialog-title.d.ts +3 -3
  626. package/dialog/dialog-title/dialog-title.d.ts.map +1 -1
  627. package/dialog/dialog-title.js +98 -66
  628. package/dialog/dialog.js +120 -114
  629. package/divider/divider.d.ts +1 -1
  630. package/divider/divider.d.ts.map +1 -1
  631. package/divider.js +41 -30
  632. package/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
  633. package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
  634. package/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
  635. package/expansion-panel/expansion-panel-content.js +20 -22
  636. package/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
  637. package/expansion-panel/expansion-panel-header.js +53 -61
  638. package/expansion-panel/expansion-panel.js +145 -130
  639. package/file-selector/file-selector.d.ts +26 -15
  640. package/file-selector/file-selector.d.ts.map +1 -1
  641. package/file-selector.js +227 -153
  642. package/flip-card/flip-card/flip-card.d.ts +2 -2
  643. package/flip-card/flip-card/flip-card.d.ts.map +1 -1
  644. package/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
  645. package/flip-card/flip-card-details.js +36 -38
  646. package/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
  647. package/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
  648. package/flip-card/flip-card-summary.js +42 -31
  649. package/flip-card/flip-card.js +88 -69
  650. package/footer/footer.d.ts +4 -4
  651. package/footer/footer.d.ts.map +1 -1
  652. package/footer.js +78 -37
  653. package/form-error/form-error.d.ts.map +1 -1
  654. package/form-error.js +24 -25
  655. package/form-field/form-field/form-field.d.ts +10 -10
  656. package/form-field/form-field/form-field.d.ts.map +1 -1
  657. package/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
  658. package/form-field/form-field-clear.js +39 -41
  659. package/form-field/form-field.js +295 -239
  660. package/header/common/header-action-common.d.ts +2 -2
  661. package/header/common/header-action-common.d.ts.map +1 -1
  662. package/header/common.js +36 -21
  663. package/header/header/header.d.ts +4 -4
  664. package/header/header/header.d.ts.map +1 -1
  665. package/header/header-button/header-button.d.ts.map +1 -1
  666. package/header/header-button.js +14 -16
  667. package/header/header-link/header-link.d.ts.map +1 -1
  668. package/header/header-link.js +14 -14
  669. package/header/header.js +138 -109
  670. package/icon/icon-base.d.ts +3 -4
  671. package/icon/icon-base.d.ts.map +1 -1
  672. package/icon/icon-name-mixin.d.ts +1 -1
  673. package/icon/icon-name-mixin.d.ts.map +1 -1
  674. package/icon/icon.d.ts +2 -2
  675. package/icon/icon.d.ts.map +1 -1
  676. package/icon.js +230 -165
  677. package/image/image.d.ts +17 -17
  678. package/image/image.d.ts.map +1 -1
  679. package/image.js +465 -195
  680. package/index.d.ts +3 -1
  681. package/index.js +3 -1
  682. package/journey-header/journey-header.d.ts +5 -5
  683. package/journey-header/journey-header.d.ts.map +1 -1
  684. package/journey-header.js +89 -49
  685. package/lead-container/lead-container.d.ts.map +1 -1
  686. package/lead-container.js +17 -18
  687. package/link/block-link/block-link.d.ts.map +1 -1
  688. package/link/block-link-button/block-link-button.d.ts.map +1 -1
  689. package/link/block-link-button.js +15 -17
  690. package/link/block-link-static/block-link-static.d.ts.map +1 -1
  691. package/link/block-link-static.js +14 -16
  692. package/link/block-link.js +15 -17
  693. package/link/common/block-link-common.d.ts +4 -3
  694. package/link/common/block-link-common.d.ts.map +1 -1
  695. package/link/common/link-common.d.ts +1 -1
  696. package/link/common/link-common.d.ts.map +1 -1
  697. package/link/common.js +64 -46
  698. package/link/link/link.d.ts.map +1 -1
  699. package/link/link-button/link-button.d.ts.map +1 -1
  700. package/link/link-button.js +15 -17
  701. package/link/link-static/link-static.d.ts.map +1 -1
  702. package/link/link-static.js +15 -17
  703. package/link/link.js +15 -17
  704. package/link-list/common/link-list-base.d.ts +3 -3
  705. package/link-list/common/link-list-base.d.ts.map +1 -1
  706. package/link-list/common.js +72 -44
  707. package/link-list/link-list/link-list.d.ts +2 -2
  708. package/link-list/link-list/link-list.d.ts.map +1 -1
  709. package/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
  710. package/link-list/link-list-anchor.js +15 -16
  711. package/link-list/link-list.js +43 -24
  712. package/loading-indicator/loading-indicator.d.ts +3 -3
  713. package/loading-indicator/loading-indicator.d.ts.map +1 -1
  714. package/loading-indicator.js +61 -36
  715. package/logo/logo.d.ts +2 -2
  716. package/logo/logo.d.ts.map +1 -1
  717. package/logo.js +47 -27
  718. package/map-container/map-container.d.ts +2 -2
  719. package/map-container/map-container.d.ts.map +1 -1
  720. package/map-container.js +84 -65
  721. package/menu/common/menu-action-common.d.ts +2 -2
  722. package/menu/common/menu-action-common.d.ts.map +1 -1
  723. package/menu/common.js +37 -22
  724. package/menu/menu/menu.d.ts +1 -1
  725. package/menu/menu/menu.d.ts.map +1 -1
  726. package/menu/menu-button/menu-button.d.ts.map +1 -1
  727. package/menu/menu-button.js +14 -16
  728. package/menu/menu-link/menu-link.d.ts.map +1 -1
  729. package/menu/menu-link.js +15 -17
  730. package/menu/menu.js +175 -170
  731. package/message/message.d.ts +2 -2
  732. package/message/message.d.ts.map +1 -1
  733. package/message.js +47 -27
  734. package/navigation/common/navigation-action-common.d.ts +1 -1
  735. package/navigation/common/navigation-action-common.d.ts.map +1 -1
  736. package/navigation/common.js +38 -33
  737. package/navigation/navigation/navigation.d.ts +2 -2
  738. package/navigation/navigation/navigation.d.ts.map +1 -1
  739. package/navigation/navigation-button/navigation-button.d.ts.map +1 -1
  740. package/navigation/navigation-button.js +14 -16
  741. package/navigation/navigation-link/navigation-link.d.ts.map +1 -1
  742. package/navigation/navigation-link.js +14 -16
  743. package/navigation/navigation-list/navigation-list.d.ts +1 -1
  744. package/navigation/navigation-list/navigation-list.d.ts.map +1 -1
  745. package/navigation/navigation-list.js +48 -35
  746. package/navigation/navigation-marker/navigation-marker.d.ts +1 -1
  747. package/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
  748. package/navigation/navigation-marker.js +77 -69
  749. package/navigation/navigation-section/navigation-section.d.ts +3 -3
  750. package/navigation/navigation-section/navigation-section.d.ts.map +1 -1
  751. package/navigation/navigation-section.js +192 -171
  752. package/navigation/navigation.js +185 -181
  753. package/notification/notification.d.ts +6 -6
  754. package/notification/notification.d.ts.map +1 -1
  755. package/notification.js +147 -116
  756. package/option/optgroup/optgroup-base-element.d.ts +3 -3
  757. package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  758. package/option/optgroup/optgroup.d.ts.map +1 -1
  759. package/option/optgroup.js +131 -112
  760. package/option/option/option-base-element.d.ts +7 -7
  761. package/option/option/option-base-element.d.ts.map +1 -1
  762. package/option/option/option.d.ts.map +1 -1
  763. package/option/option.js +295 -252
  764. package/overlay/overlay-base-element.d.ts +1 -1
  765. package/overlay/overlay-base-element.d.ts.map +1 -1
  766. package/overlay/overlay.d.ts +4 -4
  767. package/overlay/overlay.d.ts.map +1 -1
  768. package/overlay.js +194 -165
  769. package/package.json +19 -3
  770. package/paginator/common/paginator-common.d.ts +26 -0
  771. package/paginator/common/paginator-common.d.ts.map +1 -0
  772. package/paginator/common.d.ts +2 -0
  773. package/paginator/common.d.ts.map +1 -0
  774. package/paginator/common.js +145 -0
  775. package/paginator/compact-paginator/compact-paginator.d.ts +20 -0
  776. package/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
  777. package/paginator/compact-paginator.d.ts +2 -0
  778. package/paginator/compact-paginator.d.ts.map +1 -0
  779. package/paginator/compact-paginator.js +40 -0
  780. package/paginator/paginator/paginator.d.ts +51 -0
  781. package/paginator/paginator/paginator.d.ts.map +1 -0
  782. package/paginator/paginator.d.ts +1 -90
  783. package/paginator/paginator.d.ts.map +1 -1
  784. package/paginator/paginator.js +171 -0
  785. package/paginator.d.ts +2 -0
  786. package/paginator.d.ts.map +1 -1
  787. package/paginator.js +3 -263
  788. package/popover/popover/popover.d.ts +6 -7
  789. package/popover/popover/popover.d.ts.map +1 -1
  790. package/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
  791. package/popover/popover-trigger.js +26 -29
  792. package/popover/popover.js +230 -208
  793. package/radio-button/common/radio-button-common.d.ts +1 -1
  794. package/radio-button/common/radio-button-common.d.ts.map +1 -1
  795. package/radio-button/common.js +67 -43
  796. package/radio-button/radio-button/radio-button.d.ts +2 -6
  797. package/radio-button/radio-button/radio-button.d.ts.map +1 -1
  798. package/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
  799. package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
  800. package/radio-button/radio-button-group.js +192 -156
  801. package/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
  802. package/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
  803. package/radio-button/radio-button-panel.js +49 -45
  804. package/radio-button/radio-button.js +43 -37
  805. package/screen-reader-only/screen-reader-only.d.ts.map +1 -1
  806. package/screen-reader-only.js +17 -18
  807. package/select/select.d.ts +17 -9
  808. package/select/select.d.ts.map +1 -1
  809. package/select.js +377 -373
  810. package/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
  811. package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
  812. package/selection-expansion-panel.js +157 -148
  813. package/signet/signet.d.ts +2 -2
  814. package/signet/signet.d.ts.map +1 -1
  815. package/signet.js +48 -28
  816. package/skiplink-list/skiplink-list.d.ts +2 -2
  817. package/skiplink-list/skiplink-list.d.ts.map +1 -1
  818. package/skiplink-list.js +54 -36
  819. package/slider/slider.d.ts +7 -5
  820. package/slider/slider.d.ts.map +1 -1
  821. package/slider.js +197 -155
  822. package/standard-theme.css +5 -1
  823. package/status/status.d.ts +3 -3
  824. package/status/status.d.ts.map +1 -1
  825. package/status.js +71 -46
  826. package/stepper/step/step.d.ts.map +1 -1
  827. package/stepper/step-label/step-label.d.ts.map +1 -1
  828. package/stepper/step-label.js +69 -75
  829. package/stepper/step.js +99 -104
  830. package/stepper/stepper/stepper.d.ts +3 -3
  831. package/stepper/stepper/stepper.d.ts.map +1 -1
  832. package/stepper/stepper.js +208 -188
  833. package/table/table-wrapper/table-wrapper.d.ts.map +1 -1
  834. package/table/table-wrapper.js +32 -36
  835. package/tabs/tab/tab.d.ts.map +1 -1
  836. package/tabs/tab-group/tab-group.d.ts +2 -2
  837. package/tabs/tab-group/tab-group.d.ts.map +1 -1
  838. package/tabs/tab-group.js +200 -193
  839. package/tabs/tab-label/tab-label.d.ts +3 -3
  840. package/tabs/tab-label/tab-label.d.ts.map +1 -1
  841. package/tabs/tab-label.js +65 -37
  842. package/tabs/tab.js +34 -35
  843. package/tag/tag/tag.d.ts +3 -5
  844. package/tag/tag/tag.d.ts.map +1 -1
  845. package/tag/tag-group/tag-group.d.ts +3 -3
  846. package/tag/tag-group/tag-group.d.ts.map +1 -1
  847. package/tag/tag-group.js +107 -75
  848. package/tag/tag.js +92 -73
  849. package/teaser/teaser.d.ts +4 -4
  850. package/teaser/teaser.d.ts.map +1 -1
  851. package/teaser-hero/teaser-hero.d.ts +3 -3
  852. package/teaser-hero/teaser-hero.d.ts.map +1 -1
  853. package/teaser-hero.js +66 -38
  854. package/teaser-product/common/teaser-product-common.d.ts +1 -1
  855. package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  856. package/teaser-product/common.js +36 -21
  857. package/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
  858. package/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
  859. package/teaser-product/teaser-product-static.js +14 -17
  860. package/teaser-product/teaser-product.js +14 -17
  861. package/teaser.js +69 -37
  862. package/time-input/time-input.d.ts +1 -1
  863. package/time-input/time-input.d.ts.map +1 -1
  864. package/time-input.js +160 -166
  865. package/timetable-occupancy/timetable-occupancy.d.ts +2 -2
  866. package/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
  867. package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
  868. package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
  869. package/timetable-occupancy-icon.js +60 -48
  870. package/timetable-occupancy.js +55 -38
  871. package/title/title-base.d.ts +3 -3
  872. package/title/title-base.d.ts.map +1 -1
  873. package/title/title.d.ts.map +1 -1
  874. package/title.js +81 -53
  875. package/toast/toast.d.ts +4 -4
  876. package/toast/toast.d.ts.map +1 -1
  877. package/toast.js +156 -123
  878. package/toggle/toggle/toggle.d.ts +3 -5
  879. package/toggle/toggle/toggle.d.ts.map +1 -1
  880. package/toggle/toggle-option/toggle-option.d.ts +2 -2
  881. package/toggle/toggle-option/toggle-option.d.ts.map +1 -1
  882. package/toggle/toggle-option.js +89 -72
  883. package/toggle/toggle.js +139 -122
  884. package/toggle-check/toggle-check.d.ts +4 -3
  885. package/toggle-check/toggle-check.d.ts.map +1 -1
  886. package/toggle-check.js +63 -41
  887. package/train/train/train.d.ts +5 -5
  888. package/train/train/train.d.ts.map +1 -1
  889. package/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
  890. package/train/train-blocked-passage.js +17 -18
  891. package/train/train-formation/train-formation.d.ts +2 -2
  892. package/train/train-formation/train-formation.d.ts.map +1 -1
  893. package/train/train-formation.js +96 -87
  894. package/train/train-wagon/train-wagon.d.ts +7 -9
  895. package/train/train-wagon/train-wagon.d.ts.map +1 -1
  896. package/train/train-wagon.js +150 -110
  897. package/train/train.js +108 -71
  898. package/visual-checkbox/visual-checkbox.d.ts +3 -3
  899. package/visual-checkbox/visual-checkbox.d.ts.map +1 -1
  900. package/visual-checkbox.js +59 -32
  901. package/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts +0 -2
  902. package/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts.map +0 -1
  903. package/button/mini-button-group/index.d.ts +0 -2
  904. package/button/mini-button-group/index.d.ts.map +0 -1
  905. package/development/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts +0 -2
  906. package/development/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts.map +0 -1
  907. package/development/button/mini-button-group/index.d.ts +0 -2
  908. package/development/button/mini-button-group/index.d.ts.map +0 -1
  909. package/development/flip-card/flip-card/index.d.ts +0 -2
  910. package/development/flip-card/flip-card/index.d.ts.map +0 -1
  911. package/development/flip-card/flip-card-details/index.d.ts +0 -2
  912. package/development/flip-card/flip-card-details/index.d.ts.map +0 -1
  913. package/development/flip-card/flip-card-summary/index.d.ts +0 -2
  914. package/development/flip-card/flip-card-summary/index.d.ts.map +0 -1
  915. package/development/link-list/link-list-anchor/index.d.ts +0 -2
  916. package/development/link-list/link-list-anchor/index.d.ts.map +0 -1
  917. package/development/paginator/index.d.ts +0 -2
  918. package/development/paginator/index.d.ts.map +0 -1
  919. package/development/radio-button/radio-button-panel/index.d.ts +0 -2
  920. package/development/radio-button/radio-button-panel/index.d.ts.map +0 -1
  921. package/development/tabs/tab/index.d.ts +0 -2
  922. package/development/tabs/tab/index.d.ts.map +0 -1
  923. package/flip-card/flip-card/index.d.ts +0 -2
  924. package/flip-card/flip-card/index.d.ts.map +0 -1
  925. package/flip-card/flip-card-details/index.d.ts +0 -2
  926. package/flip-card/flip-card-details/index.d.ts.map +0 -1
  927. package/flip-card/flip-card-summary/index.d.ts +0 -2
  928. package/flip-card/flip-card-summary/index.d.ts.map +0 -1
  929. package/link-list/link-list-anchor/index.d.ts +0 -2
  930. package/link-list/link-list-anchor/index.d.ts.map +0 -1
  931. package/paginator/index.d.ts +0 -2
  932. package/paginator/index.d.ts.map +0 -1
  933. package/radio-button/radio-button-panel/index.d.ts +0 -2
  934. package/radio-button/radio-button-panel/index.d.ts.map +0 -1
  935. package/tabs/tab/index.d.ts +0 -2
  936. package/tabs/tab/index.d.ts.map +0 -1
@@ -1,15 +1,23 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ import { __esDecorate, __runInitializers } from "tslib";
1
9
  import { MutationController } from "@lit-labs/observers/mutation-controller.js";
2
10
  import { css, html, nothing } from "lit";
3
- import { property, state, customElement } from "lit/decorators.js";
11
+ import { customElement, property, state } from "lit/decorators.js";
4
12
  import { ref } from "lit/directives/ref.js";
5
13
  import { until } from "lit/directives/until.js";
6
14
  import { getNextElementIndex } from "./core/a11y.js";
7
15
  import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
8
16
  import { SbbConnectedAbortController } from "./core/controllers.js";
9
- import { hostAttributes } from "./core/decorators.js";
17
+ import { hostAttributes, forceType } from "./core/decorators.js";
10
18
  import { isNextjs, isSafari } from "./core/dom.js";
11
19
  import { EventEmitter } from "./core/eventing.js";
12
- import { SbbUpdateSchedulerMixin, SbbDisabledMixin, SbbNegativeMixin, SbbHydrationMixin } from "./core/mixins.js";
20
+ import { SbbUpdateSchedulerMixin, SbbDisabledMixin, SbbNegativeMixin, SbbHydrationMixin, SbbRequiredMixin, SbbFormAssociatedMixin } from "./core/mixins.js";
13
21
  import { isEventOnElement, setOverlayPosition, overlayGapFixCorners } from "./core/overlay.js";
14
22
  const style = css`*,
15
23
  ::before,
@@ -293,530 +301,562 @@ const style = css`*,
293
301
  opacity: 0;
294
302
  }
295
303
  }`;
296
- var __defProp = Object.defineProperty;
297
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
298
- var __decorateClass = (decorators, target, key, kind) => {
299
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
300
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
301
- if (decorator = decorators[i])
302
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
303
- if (kind && result) __defProp(target, key, result);
304
- return result;
305
- };
306
304
  const ariaRoleOnHost = isSafari;
307
305
  let nextId = 0;
308
- let SbbSelectElement = class extends SbbUpdateSchedulerMixin(
309
- SbbDisabledMixin(SbbNegativeMixin(SbbHydrationMixin(SbbOpenCloseBaseElement)))
310
- ) {
311
- constructor() {
312
- super();
313
- this.multiple = false;
314
- this.required = false;
315
- this.readonly = false;
316
- this._displayValue = null;
317
- this._didChange = new EventEmitter(this, SbbSelectElement.events.didChange);
318
- this._change = new EventEmitter(this, SbbSelectElement.events.change);
319
- this._input = new EventEmitter(this, SbbSelectElement.events.input);
320
- this._stateChange = new EventEmitter(
321
- this,
322
- SbbSelectElement.events.stateChange,
323
- {
306
+ let SbbSelectElement = (() => {
307
+ var _placeholder_accessor_storage, _multiple_accessor_storage, _readonly_accessor_storage, __displayValue_accessor_storage, _a;
308
+ let _classDecorators = [customElement("sbb-select"), hostAttributes({
309
+ role: ariaRoleOnHost ? "listbox" : null
310
+ })];
311
+ let _classDescriptor;
312
+ let _classExtraInitializers = [];
313
+ let _classThis;
314
+ let _classSuper = SbbUpdateSchedulerMixin(SbbDisabledMixin(SbbNegativeMixin(SbbHydrationMixin(SbbRequiredMixin(SbbFormAssociatedMixin(SbbOpenCloseBaseElement))))));
315
+ let _placeholder_decorators;
316
+ let _placeholder_initializers = [];
317
+ let _placeholder_extraInitializers = [];
318
+ let _multiple_decorators;
319
+ let _multiple_initializers = [];
320
+ let _multiple_extraInitializers = [];
321
+ let _readonly_decorators;
322
+ let _readonly_initializers = [];
323
+ let _readonly_extraInitializers = [];
324
+ let __displayValue_decorators;
325
+ let __displayValue_initializers = [];
326
+ let __displayValue_extraInitializers = [];
327
+ var SbbSelectElement2 = (_a = class extends _classSuper {
328
+ constructor() {
329
+ super();
330
+ __privateAdd(this, _placeholder_accessor_storage);
331
+ __privateAdd(this, _multiple_accessor_storage);
332
+ __privateAdd(this, _readonly_accessor_storage);
333
+ __privateAdd(this, __displayValue_accessor_storage);
334
+ __privateSet(this, _placeholder_accessor_storage, __runInitializers(this, _placeholder_initializers, ""));
335
+ __privateSet(this, _multiple_accessor_storage, (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _multiple_initializers, false)));
336
+ __privateSet(this, _readonly_accessor_storage, (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, _readonly_initializers, false)));
337
+ __privateSet(this, __displayValue_accessor_storage, (__runInitializers(this, _readonly_extraInitializers), __runInitializers(this, __displayValue_initializers, null)));
338
+ this._didChange = (__runInitializers(this, __displayValue_extraInitializers), new EventEmitter(this, SbbSelectElement2.events.didChange));
339
+ this._change = new EventEmitter(this, SbbSelectElement2.events.change);
340
+ this._input = new EventEmitter(this, SbbSelectElement2.events.input);
341
+ this._stateChange = new EventEmitter(this, SbbSelectElement2.events.stateChange, {
324
342
  composed: false
343
+ });
344
+ this._overlayId = `sbb-select-${++nextId}`;
345
+ this._activeItemIndex = -1;
346
+ this._searchString = "";
347
+ this._didLoad = false;
348
+ this._isPointerDownEventOnMenu = false;
349
+ this._abort = new SbbConnectedAbortController(this);
350
+ this._pointerDownListener = (event) => {
351
+ this._isPointerDownEventOnMenu = isEventOnElement(this._overlay, event);
352
+ };
353
+ this._closeOnBackdropClick = (event) => {
354
+ if (!this._isPointerDownEventOnMenu && !isEventOnElement(this._overlay, event)) {
355
+ this.close();
356
+ }
357
+ };
358
+ new MutationController(this, {
359
+ config: { attributeFilter: ["aria-labelledby"] },
360
+ callback: (mutationsList) => this._onSelectAttributesChange(mutationsList)
361
+ });
362
+ }
363
+ /** The placeholder used if no value has been selected. */
364
+ get placeholder() {
365
+ return __privateGet(this, _placeholder_accessor_storage);
366
+ }
367
+ set placeholder(value) {
368
+ __privateSet(this, _placeholder_accessor_storage, value);
369
+ }
370
+ /** Whether the select allows for multiple selection. */
371
+ get multiple() {
372
+ return __privateGet(this, _multiple_accessor_storage);
373
+ }
374
+ set multiple(value) {
375
+ __privateSet(this, _multiple_accessor_storage, value);
376
+ }
377
+ /** Whether the select is readonly. */
378
+ get readonly() {
379
+ return __privateGet(this, _readonly_accessor_storage);
380
+ }
381
+ set readonly(value) {
382
+ __privateSet(this, _readonly_accessor_storage, value);
383
+ }
384
+ /** The value displayed by the component. */
385
+ get _displayValue() {
386
+ return __privateGet(this, __displayValue_accessor_storage);
387
+ }
388
+ set _displayValue(value) {
389
+ __privateSet(this, __displayValue_accessor_storage, value);
390
+ }
391
+ /**
392
+ * The 'combobox' input element
393
+ * @internal
394
+ */
395
+ get inputElement() {
396
+ return this._triggerElement;
397
+ }
398
+ /** Gets all the SbbOptionElement projected in the select. */
399
+ get _options() {
400
+ var _a2;
401
+ return Array.from(((_a2 = this.querySelectorAll) == null ? void 0 : _a2.call(this, "sbb-option")) ?? []);
402
+ }
403
+ get _filteredOptions() {
404
+ return this._options.filter((opt) => !opt.disabled && !opt.hasAttribute("data-group-disabled"));
405
+ }
406
+ /**
407
+ * TODO: Accessibility fix required to correctly read the label;
408
+ * can be possibly removed after the merge of https://github.com/sbb-design-systems/lyne-components/issues/3062
409
+ */
410
+ _onSelectAttributesChange(mutationsList) {
411
+ var _a2;
412
+ for (const mutation of mutationsList) {
413
+ if (mutation.attributeName === "aria-labelledby") {
414
+ (_a2 = this._triggerElement) == null ? void 0 : _a2.setAttribute("aria-labelledby", this.getAttribute("aria-labelledby"));
415
+ }
325
416
  }
326
- );
327
- this._overlayId = `sbb-select-${++nextId}`;
328
- this._activeItemIndex = -1;
329
- this._searchString = "";
330
- this._didLoad = false;
331
- this._isPointerDownEventOnMenu = false;
332
- this._abort = new SbbConnectedAbortController(this);
333
- this._pointerDownListener = (event) => {
334
- this._isPointerDownEventOnMenu = isEventOnElement(this._overlay, event);
335
- };
336
- this._closeOnBackdropClick = (event) => {
337
- if (!this._isPointerDownEventOnMenu && !isEventOnElement(this._overlay, event)) {
338
- this.close();
417
+ }
418
+ /** Opens the selection panel. */
419
+ open() {
420
+ if (this.state !== "closed" || !this._overlay || this._options.length === 0 || this.disabled || this.formDisabled) {
421
+ return;
339
422
  }
340
- };
341
- new MutationController(this, {
342
- config: { attributeFilter: ["aria-labelledby"] },
343
- callback: (mutationsList) => this._onSelectAttributesChange(mutationsList)
344
- });
345
- }
346
- /**
347
- * The 'combobox' input element
348
- * @internal
349
- */
350
- get inputElement() {
351
- return this._triggerElement;
352
- }
353
- /** Gets all the SbbOptionElement projected in the select. */
354
- get _options() {
355
- var _a;
356
- return Array.from(((_a = this.querySelectorAll) == null ? void 0 : _a.call(this, "sbb-option")) ?? []);
357
- }
358
- get _filteredOptions() {
359
- return this._options.filter(
360
- (opt) => !opt.disabled && !opt.hasAttribute("data-group-disabled")
361
- );
362
- }
363
- /**
364
- * TODO: Accessibility fix required to correctly read the label;
365
- * can be possibly removed after the merge of https://github.com/sbb-design-systems/lyne-components/issues/3062
366
- */
367
- _onSelectAttributesChange(mutationsList) {
368
- var _a;
369
- for (const mutation of mutationsList) {
370
- if (mutation.attributeName === "aria-labelledby") {
371
- (_a = this._triggerElement) == null ? void 0 : _a.setAttribute(
372
- "aria-labelledby",
373
- this.getAttribute("aria-labelledby")
374
- );
423
+ if (!this.willOpen.emit()) {
424
+ return;
375
425
  }
426
+ this.state = "opening";
427
+ this._setOverlayPosition();
376
428
  }
377
- }
378
- /** Opens the selection panel. */
379
- open() {
380
- if (this.state !== "closed" || !this._overlay || this._options.length === 0) {
381
- return;
429
+ /** Closes the selection panel. */
430
+ close() {
431
+ if (this.state !== "opened") {
432
+ return;
433
+ }
434
+ if (!this.willClose.emit()) {
435
+ return;
436
+ }
437
+ this.state = "closing";
438
+ this._openPanelEventsController.abort();
439
+ }
440
+ /** Gets the current displayed value. */
441
+ getDisplayValue() {
442
+ return this._displayValue ?? "";
443
+ }
444
+ /** Listens to option changes. */
445
+ _onOptionChanged(event) {
446
+ const target = event.target;
447
+ if (target.selected) {
448
+ this._onOptionSelected(target);
449
+ } else {
450
+ this._onOptionDeselected(target);
451
+ }
382
452
  }
383
- if (!this.willOpen.emit()) {
384
- return;
453
+ _onOptionClick(event) {
454
+ const target = event.target;
455
+ if (target.localName !== "sbb-option" || target.disabled) {
456
+ return;
457
+ }
458
+ if (!this.multiple) {
459
+ this.close();
460
+ }
385
461
  }
386
- this.state = "opening";
387
- this._setOverlayPosition();
388
- }
389
- /** Closes the selection panel. */
390
- close() {
391
- if (this.state !== "opened") {
392
- return;
462
+ /** Sets the _displayValue by checking the internal sbb-options and setting the correct `selected` value on them. */
463
+ _onValueChanged(newValue) {
464
+ const options = this._filteredOptions;
465
+ if (!Array.isArray(newValue)) {
466
+ const optionElement = options.find((o) => (o.value ?? o.getAttribute("value")) === newValue);
467
+ if (optionElement) {
468
+ optionElement.selected = true;
469
+ }
470
+ options.filter((o) => (o.value ?? o.getAttribute("value")) !== newValue).forEach((o) => o.selected = false);
471
+ this._displayValue = (optionElement == null ? void 0 : optionElement.textContent) || null;
472
+ } else {
473
+ options.filter((o) => !newValue.includes(o.value ?? o.getAttribute("value"))).forEach((e) => e.selected = false);
474
+ const selectedOptionElements = options.filter((o) => newValue.includes(o.value ?? o.getAttribute("value")));
475
+ selectedOptionElements.forEach((o) => o.selected = true);
476
+ this._displayValue = selectedOptionElements.map((o) => o.textContent).join(", ") || null;
477
+ }
478
+ this._stateChange.emit({ type: "value", value: newValue });
479
+ }
480
+ firstUpdated(changedProperties) {
481
+ super.firstUpdated(changedProperties);
482
+ this.focus = () => this._triggerElement.focus();
483
+ this.blur = () => this._triggerElement.blur();
484
+ if (!isNextjs()) {
485
+ this.startUpdate();
486
+ this._setupSelect();
487
+ }
393
488
  }
394
- if (!this.willClose.emit()) {
395
- return;
489
+ /**
490
+ * Removes element's first attribute whose qualified name is qualifiedName.
491
+ *
492
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/removeAttribute)
493
+ * @internal We need to override this due to a hydration issue with Next.js.
494
+ */
495
+ removeAttribute(qualifiedName) {
496
+ if (isNextjs() && qualifiedName === "defer-hydration" && !this._didLoad) {
497
+ this.updateComplete.then(() => this._setupSelect());
498
+ }
499
+ super.removeAttribute(qualifiedName);
396
500
  }
397
- this.state = "closing";
398
- this._openPanelEventsController.abort();
399
- }
400
- /** Gets the current displayed value. */
401
- getDisplayValue() {
402
- return this._displayValue ?? "";
403
- }
404
- /** Listens to option changes. */
405
- _onOptionChanged(event) {
406
- const target = event.target;
407
- if (target.selected) {
408
- this._onOptionSelected(target);
409
- } else {
410
- this._onOptionDeselected(target);
501
+ connectedCallback() {
502
+ var _a2, _b;
503
+ super.connectedCallback();
504
+ if (ariaRoleOnHost) {
505
+ this.id || (this.id = this._overlayId);
506
+ }
507
+ const signal = this._abort.signal;
508
+ const formField = ((_a2 = this.closest) == null ? void 0 : _a2.call(this, "sbb-form-field")) ?? ((_b = this.closest) == null ? void 0 : _b.call(this, "[data-form-field]"));
509
+ if (formField) {
510
+ this.negative = formField.hasAttribute("negative");
511
+ }
512
+ this._syncProperties();
513
+ if (this._didLoad) {
514
+ this._setupOrigin();
515
+ this._setupTrigger();
516
+ }
517
+ if (this.value) {
518
+ this._onValueChanged(this.value);
519
+ }
520
+ this.addEventListener("optionSelectionChange", (e) => this._onOptionChanged(e), { signal });
521
+ this.addEventListener("click", (e) => {
522
+ this._onOptionClick(e);
523
+ this._toggleOpening();
524
+ }, { signal });
411
525
  }
412
- }
413
- _onOptionClick(event) {
414
- const target = event.target;
415
- if (target.localName !== "sbb-option" || target.disabled) {
416
- return;
526
+ willUpdate(changedProperties) {
527
+ super.willUpdate(changedProperties);
528
+ if (changedProperties.has("value") && this._didLoad) {
529
+ this._onValueChanged(this.value);
530
+ }
531
+ if (changedProperties.has("negative") || changedProperties.has("multiple")) {
532
+ this._syncProperties();
533
+ }
417
534
  }
418
- if (!this.multiple) {
419
- this.close();
535
+ disconnectedCallback() {
536
+ var _a2;
537
+ super.disconnectedCallback();
538
+ this.prepend(this._triggerElement);
539
+ (_a2 = this._openPanelEventsController) == null ? void 0 : _a2.abort();
540
+ }
541
+ updateFormValue() {
542
+ if (this.multiple && this.value instanceof Array) {
543
+ const data = new FormData();
544
+ this.value.forEach((el) => data.append(this.name, el));
545
+ this.internals.setFormValue(data);
546
+ } else {
547
+ this.internals.setFormValue(this.value);
548
+ }
420
549
  }
421
- }
422
- /** Sets the _displayValue by checking the internal sbb-options and setting the correct `selected` value on them. */
423
- _onValueChanged(newValue) {
424
- const options = this._filteredOptions;
425
- if (!Array.isArray(newValue)) {
426
- const optionElement = options.find((o) => (o.value ?? o.getAttribute("value")) === newValue);
427
- if (optionElement) {
428
- optionElement.selected = true;
429
- }
430
- options.filter((o) => (o.value ?? o.getAttribute("value")) !== newValue).forEach((o) => o.selected = false);
431
- this._displayValue = (optionElement == null ? void 0 : optionElement.textContent) || null;
432
- } else {
433
- options.filter((o) => !newValue.includes(o.value ?? o.getAttribute("value"))).forEach((e) => e.selected = false);
434
- const selectedOptionElements = options.filter(
435
- (o) => newValue.includes(o.value ?? o.getAttribute("value"))
436
- );
437
- selectedOptionElements.forEach((o) => o.selected = true);
438
- this._displayValue = selectedOptionElements.map((o) => o.textContent).join(", ") || null;
439
- }
440
- this._stateChange.emit({ type: "value", value: newValue });
441
- }
442
- firstUpdated(changedProperties) {
443
- super.firstUpdated(changedProperties);
444
- this.focus = () => this._triggerElement.focus();
445
- this.blur = () => this._triggerElement.blur();
446
- if (!isNextjs()) {
447
- this.startUpdate();
448
- this._setupSelect();
550
+ /**
551
+ * The reset value is the attribute value (the setup value), null otherwise.
552
+ * @internal
553
+ */
554
+ formResetCallback() {
555
+ this.value = this.hasAttribute("value") ? this.getAttribute("value") : null;
556
+ }
557
+ /**
558
+ * @internal
559
+ */
560
+ formStateRestoreCallback(state2, _reason) {
561
+ if (!state2) {
562
+ this.value = null;
563
+ return;
564
+ }
565
+ if (this.multiple) {
566
+ this.value = state2.map((entries) => entries[1]);
567
+ } else {
568
+ this.value = state2;
569
+ }
449
570
  }
450
- }
451
- /**
452
- * Removes element's first attribute whose qualified name is qualifiedName.
453
- *
454
- * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/removeAttribute)
455
- * @internal We need to override this due to a hydration issue with Next.js.
456
- */
457
- removeAttribute(qualifiedName) {
458
- if (isNextjs() && qualifiedName === "defer-hydration" && !this._didLoad) {
459
- this.updateComplete.then(() => this._setupSelect());
460
- }
461
- super.removeAttribute(qualifiedName);
462
- }
463
- connectedCallback() {
464
- var _a, _b;
465
- super.connectedCallback();
466
- if (ariaRoleOnHost) {
467
- this.id || (this.id = this._overlayId);
468
- }
469
- const signal = this._abort.signal;
470
- const formField = ((_a = this.closest) == null ? void 0 : _a.call(this, "sbb-form-field")) ?? ((_b = this.closest) == null ? void 0 : _b.call(this, "[data-form-field]"));
471
- if (formField) {
472
- this.negative = formField.hasAttribute("negative");
473
- }
474
- this._syncProperties();
475
- if (this._didLoad) {
571
+ _syncProperties() {
572
+ var _a2, _b;
573
+ (_a2 = this.querySelectorAll) == null ? void 0 : _a2.call(this, "sbb-divider").forEach((element) => element.negative = this.negative);
574
+ (_b = this.querySelectorAll) == null ? void 0 : _b.call(this, "sbb-option, sbb-optgroup").forEach((element) => {
575
+ element.toggleAttribute("data-negative", this.negative);
576
+ element.toggleAttribute("data-multiple", this.multiple);
577
+ });
578
+ }
579
+ _setupSelect() {
476
580
  this._setupOrigin();
477
581
  this._setupTrigger();
582
+ this._didLoad = true;
583
+ this.completeUpdate();
584
+ }
585
+ /** Sets the originElement; if the component is used in a sbb-form-field uses it, otherwise uses the parentElement. */
586
+ _setupOrigin() {
587
+ var _a2, _b, _c, _d;
588
+ const formField = (_a2 = this.closest) == null ? void 0 : _a2.call(this, "sbb-form-field");
589
+ this._originElement = ((_c = (_b = formField == null ? void 0 : formField.shadowRoot) == null ? void 0 : _b.querySelector) == null ? void 0 : _c.call(_b, "#overlay-anchor")) ?? this.parentElement;
590
+ if (this._originElement) {
591
+ this.toggleAttribute("data-option-panel-origin-borderless", !!((_d = formField == null ? void 0 : formField.hasAttribute) == null ? void 0 : _d.call(formField, "borderless")));
592
+ }
478
593
  }
479
- if (this.value) {
480
- this._onValueChanged(this.value);
481
- }
482
- this.addEventListener(
483
- "optionSelectionChange",
484
- (e) => this._onOptionChanged(e),
485
- { signal }
486
- );
487
- this.addEventListener(
488
- "click",
489
- (e) => {
490
- this._onOptionClick(e);
491
- this._toggleOpening();
492
- },
493
- { signal }
494
- );
495
- }
496
- willUpdate(changedProperties) {
497
- super.willUpdate(changedProperties);
498
- if (changedProperties.has("value")) {
499
- this._onValueChanged(this.value);
500
- }
501
- if (changedProperties.has("negative") || changedProperties.has("multiple")) {
502
- this._syncProperties();
503
- }
504
- }
505
- disconnectedCallback() {
506
- var _a;
507
- super.disconnectedCallback();
508
- this.prepend(this._triggerElement);
509
- (_a = this._openPanelEventsController) == null ? void 0 : _a.abort();
510
- }
511
- _syncProperties() {
512
- var _a, _b;
513
- (_a = this.querySelectorAll) == null ? void 0 : _a.call(this, "sbb-divider").forEach((element) => element.negative = this.negative);
514
- (_b = this.querySelectorAll) == null ? void 0 : _b.call(
515
- this,
516
- "sbb-option, sbb-optgroup"
517
- ).forEach((element) => {
518
- element.toggleAttribute("data-negative", this.negative);
519
- element.toggleAttribute("data-multiple", this.multiple);
520
- });
521
- }
522
- _setupSelect() {
523
- this._setupOrigin();
524
- this._setupTrigger();
525
- this._didLoad = true;
526
- this.completeUpdate();
527
- }
528
- /** Sets the originElement; if the component is used in a sbb-form-field uses it, otherwise uses the parentElement. */
529
- _setupOrigin() {
530
- var _a, _b, _c, _d;
531
- const formField = (_a = this.closest) == null ? void 0 : _a.call(this, "sbb-form-field");
532
- this._originElement = ((_c = (_b = formField == null ? void 0 : formField.shadowRoot) == null ? void 0 : _b.querySelector) == null ? void 0 : _c.call(_b, "#overlay-anchor")) ?? this.parentElement;
533
- if (this._originElement) {
534
- this.toggleAttribute(
535
- "data-option-panel-origin-borderless",
536
- !!((_d = formField == null ? void 0 : formField.hasAttribute) == null ? void 0 : _d.call(formField, "borderless"))
537
- );
538
- }
539
- }
540
- /**
541
- * To assess screen-readers problems caused by the interaction between aria patterns and shadow DOM,
542
- * we are forced to move the 'combobox' trigger element to the light DOM
543
- */
544
- _setupTrigger() {
545
- var _a, _b, _c;
546
- (_b = (_a = this.parentElement).insertBefore) == null ? void 0 : _b.call(_a, this._triggerElement, this);
547
- const containerElement = ((_c = this.closest) == null ? void 0 : _c.call(this, "sbb-form-field")) ?? this;
548
- this._triggerElement.style.top = "0px";
549
- this._triggerElement.style.height = `${containerElement.offsetHeight}px`;
550
- this._triggerElement.style.width = `${containerElement.offsetWidth}px`;
551
- }
552
- _setOverlayPosition() {
553
- setOverlayPosition(
554
- this._overlay,
555
- this._originElement,
556
- this._optionContainer,
557
- this.shadowRoot.querySelector(".sbb-select__container"),
558
- this
559
- );
560
- }
561
- // In rare cases it can be that the animationEnd event is triggered twice.
562
- // To avoid entering a corrupt state, exit when state is not expected.
563
- _onAnimationEnd(event) {
564
- if (event.animationName === "open" && this.state === "opening") {
565
- this._onOpenAnimationEnd();
566
- } else if (event.animationName === "close" && this.state === "closing") {
567
- this._onCloseAnimationEnd();
594
+ /**
595
+ * To assess screen-readers problems caused by the interaction between aria patterns and shadow DOM,
596
+ * we are forced to move the 'combobox' trigger element to the light DOM
597
+ */
598
+ _setupTrigger() {
599
+ var _a2, _b, _c;
600
+ (_b = (_a2 = this.parentElement).insertBefore) == null ? void 0 : _b.call(_a2, this._triggerElement, this);
601
+ const containerElement = ((_c = this.closest) == null ? void 0 : _c.call(this, "sbb-form-field")) ?? this;
602
+ this._triggerElement.style.top = "0px";
603
+ this._triggerElement.style.height = `${containerElement.offsetHeight}px`;
604
+ this._triggerElement.style.width = `${containerElement.offsetWidth}px`;
605
+ }
606
+ _setOverlayPosition() {
607
+ setOverlayPosition(this._overlay, this._originElement, this._optionContainer, this.shadowRoot.querySelector(".sbb-select__container"), this);
608
+ }
609
+ // In rare cases it can be that the animationEnd event is triggered twice.
610
+ // To avoid entering a corrupt state, exit when state is not expected.
611
+ _onAnimationEnd(event) {
612
+ if (event.animationName === "open" && this.state === "opening") {
613
+ this._onOpenAnimationEnd();
614
+ } else if (event.animationName === "close" && this.state === "closing") {
615
+ this._onCloseAnimationEnd();
616
+ }
568
617
  }
569
- }
570
- _onOpenAnimationEnd() {
571
- this.state = "opened";
572
- this._attachOpenPanelEvents();
573
- this._triggerElement.setAttribute("aria-expanded", "true");
574
- this.didOpen.emit();
575
- }
576
- _onCloseAnimationEnd() {
577
- this.state = "closed";
578
- this._triggerElement.setAttribute("aria-expanded", "false");
579
- this._resetActiveElement();
580
- this._optionContainer.scrollTop = 0;
581
- this.didClose.emit();
582
- }
583
- /** When an option is selected, updates the displayValue; it also closes the select if not `multiple`. */
584
- _onOptionSelected(optionSelectionChange) {
585
- if (!this.multiple) {
586
- this._filteredOptions.filter((option) => option.id !== optionSelectionChange.id).forEach((option) => option.selected = false);
587
- this.value = optionSelectionChange.value;
588
- } else {
589
- if (!this.value) {
590
- this.value = [optionSelectionChange.value];
591
- } else if (!this.value.includes(optionSelectionChange.value)) {
592
- this.value = [...this.value, optionSelectionChange.value];
593
- }
594
- }
595
- this._input.emit();
596
- this._change.emit();
597
- this._didChange.emit();
598
- }
599
- /** When an option is unselected in `multiple`, removes it from value and updates displayValue. */
600
- _onOptionDeselected(optionSelectionChange) {
601
- if (this.multiple) {
602
- this.value = this.value.filter(
603
- (el) => el !== optionSelectionChange.value
604
- );
618
+ _onOpenAnimationEnd() {
619
+ this.state = "opened";
620
+ this._attachOpenPanelEvents();
621
+ this._triggerElement.setAttribute("aria-expanded", "true");
622
+ this.didOpen.emit();
623
+ }
624
+ _onCloseAnimationEnd() {
625
+ this.state = "closed";
626
+ this._triggerElement.setAttribute("aria-expanded", "false");
627
+ this._resetActiveElement();
628
+ this._optionContainer.scrollTop = 0;
629
+ this.didClose.emit();
630
+ }
631
+ /** When an option is selected, updates the displayValue; it also closes the select if not `multiple`. */
632
+ _onOptionSelected(optionSelectionChange) {
633
+ if (!this.multiple) {
634
+ this._filteredOptions.filter((option) => option.id !== optionSelectionChange.id).forEach((option) => option.selected = false);
635
+ this.value = optionSelectionChange.value;
636
+ } else {
637
+ if (!this.value) {
638
+ this.value = [optionSelectionChange.value];
639
+ } else if (!this.value.includes(optionSelectionChange.value)) {
640
+ this.value = [...this.value, optionSelectionChange.value];
641
+ }
642
+ }
605
643
  this._input.emit();
606
644
  this._change.emit();
607
645
  this._didChange.emit();
608
646
  }
609
- }
610
- _attachOpenPanelEvents() {
611
- this._openPanelEventsController = new AbortController();
612
- document.addEventListener("scroll", () => this._setOverlayPosition(), {
613
- passive: true,
614
- signal: this._openPanelEventsController.signal
615
- });
616
- window.addEventListener("resize", () => this._setOverlayPosition(), {
617
- passive: true,
618
- signal: this._openPanelEventsController.signal
619
- });
620
- window.addEventListener("pointerdown", (ev) => this._pointerDownListener(ev), {
621
- signal: this._openPanelEventsController.signal
622
- });
623
- window.addEventListener("pointerup", (ev) => this._closeOnBackdropClick(ev), {
624
- signal: this._openPanelEventsController.signal
625
- });
626
- }
627
- _onKeyDown(event) {
628
- if (this.disabled || this.readonly) {
629
- return;
630
- }
631
- if (this.state === "opened") {
632
- this._openedPanelKeyboardInteraction(event);
633
- }
634
- if (this.state === "closed") {
635
- this._closedPanelKeyboardInteraction(event);
647
+ /** When an option is unselected in `multiple`, removes it from value and updates displayValue. */
648
+ _onOptionDeselected(optionSelectionChange) {
649
+ if (this.multiple) {
650
+ this.value = this.value.filter((el) => el !== optionSelectionChange.value);
651
+ this._input.emit();
652
+ this._change.emit();
653
+ this._didChange.emit();
654
+ }
636
655
  }
637
- }
638
- _closedPanelKeyboardInteraction(event) {
639
- if (this._checkForLetterSelection(event)) {
640
- return this._setNextActiveOptionByText(event);
641
- }
642
- switch (event.key) {
643
- case "Enter":
644
- case " ":
645
- case "ArrowDown":
646
- case "ArrowUp":
647
- event.preventDefault();
648
- this.open();
649
- break;
656
+ _attachOpenPanelEvents() {
657
+ this._openPanelEventsController = new AbortController();
658
+ document.addEventListener("scroll", () => this._setOverlayPosition(), {
659
+ passive: true,
660
+ signal: this._openPanelEventsController.signal
661
+ });
662
+ window.addEventListener("resize", () => this._setOverlayPosition(), {
663
+ passive: true,
664
+ signal: this._openPanelEventsController.signal
665
+ });
666
+ window.addEventListener("pointerdown", (ev) => this._pointerDownListener(ev), {
667
+ signal: this._openPanelEventsController.signal
668
+ });
669
+ window.addEventListener("pointerup", (ev) => this._closeOnBackdropClick(ev), {
670
+ signal: this._openPanelEventsController.signal
671
+ });
672
+ }
673
+ _onKeyDown(event) {
674
+ if (this.readonly) {
675
+ return;
676
+ }
677
+ if (this.state === "opened") {
678
+ this._openedPanelKeyboardInteraction(event);
679
+ }
680
+ if (this.state === "closed") {
681
+ this._closedPanelKeyboardInteraction(event);
682
+ }
650
683
  }
651
- }
652
- _openedPanelKeyboardInteraction(event) {
653
- if (this.disabled || this.readonly || this.state !== "opened") {
654
- return;
684
+ _closedPanelKeyboardInteraction(event) {
685
+ if (this._checkForLetterSelection(event)) {
686
+ return this._setNextActiveOptionByText(event);
687
+ }
688
+ switch (event.key) {
689
+ case "Enter":
690
+ case " ":
691
+ case "ArrowDown":
692
+ case "ArrowUp":
693
+ event.preventDefault();
694
+ this.open();
695
+ break;
696
+ }
655
697
  }
656
- if (this._checkForLetterSelection(event)) {
657
- return this._setNextActiveOptionByText(event);
698
+ _openedPanelKeyboardInteraction(event) {
699
+ if (this.readonly || this.state !== "opened") {
700
+ return;
701
+ }
702
+ if (this._checkForLetterSelection(event)) {
703
+ return this._setNextActiveOptionByText(event);
704
+ }
705
+ switch (event.key) {
706
+ case "Escape":
707
+ case "Tab":
708
+ this.close();
709
+ break;
710
+ case "Enter":
711
+ case " ":
712
+ event.preventDefault();
713
+ this._selectByKeyboard();
714
+ break;
715
+ case "ArrowDown":
716
+ case "ArrowUp":
717
+ event.preventDefault();
718
+ this._setNextActiveOption(event);
719
+ break;
720
+ case "Home":
721
+ case "PageUp":
722
+ event.preventDefault();
723
+ this._setNextActiveOption(event, 0);
724
+ break;
725
+ case "End":
726
+ case "PageDown":
727
+ event.preventDefault();
728
+ this._setNextActiveOption(event, this._filteredOptions.length - 1);
729
+ break;
730
+ }
658
731
  }
659
- switch (event.key) {
660
- case "Escape":
661
- case "Tab":
662
- this.close();
663
- break;
664
- case "Enter":
665
- case " ":
666
- event.preventDefault();
667
- this._selectByKeyboard();
668
- break;
669
- case "ArrowDown":
670
- case "ArrowUp":
671
- event.preventDefault();
672
- this._setNextActiveOption(event);
673
- break;
674
- case "Home":
675
- case "PageUp":
676
- event.preventDefault();
677
- this._setNextActiveOption(event, 0);
678
- break;
679
- case "End":
680
- case "PageDown":
681
- event.preventDefault();
682
- this._setNextActiveOption(event, this._filteredOptions.length - 1);
683
- break;
732
+ _checkForLetterSelection(event) {
733
+ return event.key === "Backspace" || event.key === "Clear" || event.key.length === 1 && event.key !== " " && !event.altKey && !event.ctrlKey && !event.metaKey;
684
734
  }
685
- }
686
- _checkForLetterSelection(event) {
687
- return event.key === "Backspace" || event.key === "Clear" || event.key.length === 1 && event.key !== " " && !event.altKey && !event.ctrlKey && !event.metaKey;
688
- }
689
- _setNextActiveOptionByText(event) {
690
- if (typeof this._searchTimeout === typeof setTimeout) {
691
- clearTimeout(this._searchTimeout);
692
- }
693
- this._searchTimeout = setTimeout(() => this._searchString = "", 1e3);
694
- this._searchString += event.key;
695
- const indexForSlice = this._activeItemIndex + 1;
696
- const filteredOptionsSorted = [
697
- ...this._filteredOptions.slice(indexForSlice),
698
- ...this._filteredOptions.slice(0, indexForSlice)
699
- ];
700
- const match = filteredOptionsSorted.find(
701
- (option) => {
702
- var _a;
703
- return ((_a = option.textContent) == null ? void 0 : _a.toLowerCase().indexOf(this._searchString.toLowerCase())) === 0;
704
- }
705
- );
706
- if (match) {
707
- this._setNextActiveOption(event, this._filteredOptions.indexOf(match));
708
- } else if (this._searchString.length > 1 && new RegExp(`^${this._searchString.charAt(0)}*$`).test(this._searchString)) {
709
- const firstMatch = filteredOptionsSorted.find(
710
- (option) => {
711
- var _a;
712
- return ((_a = option.textContent) == null ? void 0 : _a.toLowerCase().indexOf(this._searchString[0].toLowerCase())) === 0;
735
+ _setNextActiveOptionByText(event) {
736
+ if (typeof this._searchTimeout === typeof setTimeout) {
737
+ clearTimeout(this._searchTimeout);
738
+ }
739
+ this._searchTimeout = setTimeout(() => this._searchString = "", 1e3);
740
+ this._searchString += event.key;
741
+ const indexForSlice = this._activeItemIndex + 1;
742
+ const filteredOptionsSorted = [
743
+ ...this._filteredOptions.slice(indexForSlice),
744
+ ...this._filteredOptions.slice(0, indexForSlice)
745
+ ];
746
+ const match = filteredOptionsSorted.find((option) => {
747
+ var _a2;
748
+ return ((_a2 = option.textContent) == null ? void 0 : _a2.toLowerCase().indexOf(this._searchString.toLowerCase())) === 0;
749
+ });
750
+ if (match) {
751
+ this._setNextActiveOption(event, this._filteredOptions.indexOf(match));
752
+ } else if (this._searchString.length > 1 && new RegExp(`^${this._searchString.charAt(0)}*$`).test(this._searchString)) {
753
+ const firstMatch = filteredOptionsSorted.find((option) => {
754
+ var _a2;
755
+ return ((_a2 = option.textContent) == null ? void 0 : _a2.toLowerCase().indexOf(this._searchString[0].toLowerCase())) === 0;
756
+ });
757
+ if (firstMatch) {
758
+ this._setNextActiveOption(event, this._filteredOptions.indexOf(firstMatch));
713
759
  }
714
- );
715
- if (firstMatch) {
716
- this._setNextActiveOption(event, this._filteredOptions.indexOf(firstMatch));
760
+ } else {
761
+ clearTimeout(this._searchTimeout);
762
+ this._searchString = "";
717
763
  }
718
- } else {
719
- clearTimeout(this._searchTimeout);
720
- this._searchString = "";
721
764
  }
722
- }
723
- _selectByKeyboard() {
724
- const activeOption = this._filteredOptions[this._activeItemIndex];
725
- if (this.multiple) {
726
- activeOption.setSelectedViaUserInteraction(!activeOption.selected);
727
- } else {
728
- this.close();
729
- }
730
- }
731
- _setNextActiveOption(event, index) {
732
- const nextIndex = index ?? getNextElementIndex(event, this._activeItemIndex, this._filteredOptions.length);
733
- const nextOption = this._filteredOptions[nextIndex];
734
- const activeOption = this._filteredOptions[this._activeItemIndex];
735
- this._setActiveElement(nextOption, activeOption);
736
- if (!this.multiple) {
737
- this._setSelectedElement(nextOption, activeOption);
738
- } else if (event == null ? void 0 : event.shiftKey) {
739
- nextOption.setSelectedViaUserInteraction(!nextOption.selected);
740
- }
741
- this._activeItemIndex = nextIndex;
742
- }
743
- _setActiveElement(nextActiveOption, lastActiveOption = null, setActiveDescendant = true) {
744
- nextActiveOption.setActive(true);
745
- nextActiveOption.scrollIntoView({ block: "nearest" });
746
- if (setActiveDescendant) {
747
- this._triggerElement.setAttribute("aria-activedescendant", nextActiveOption.id);
765
+ _selectByKeyboard() {
766
+ const activeOption = this._filteredOptions[this._activeItemIndex];
767
+ if (this.multiple) {
768
+ activeOption.setSelectedViaUserInteraction(!activeOption.selected);
769
+ } else {
770
+ this.close();
771
+ }
748
772
  }
749
- if (lastActiveOption && lastActiveOption !== nextActiveOption) {
750
- lastActiveOption.setActive(false);
773
+ _setNextActiveOption(event, index) {
774
+ const nextIndex = index ?? getNextElementIndex(event, this._activeItemIndex, this._filteredOptions.length);
775
+ const nextOption = this._filteredOptions[nextIndex];
776
+ const activeOption = this._filteredOptions[this._activeItemIndex];
777
+ this._setActiveElement(nextOption, activeOption);
778
+ if (!this.multiple) {
779
+ this._setSelectedElement(nextOption, activeOption);
780
+ } else if (event == null ? void 0 : event.shiftKey) {
781
+ nextOption.setSelectedViaUserInteraction(!nextOption.selected);
782
+ }
783
+ this._activeItemIndex = nextIndex;
751
784
  }
752
- }
753
- _setSelectedElement(nextActiveOption, lastActiveOption) {
754
- nextActiveOption.setSelectedViaUserInteraction(true);
755
- if (lastActiveOption && lastActiveOption !== nextActiveOption) {
756
- lastActiveOption.setSelectedViaUserInteraction(false);
785
+ _setActiveElement(nextActiveOption, lastActiveOption = null, setActiveDescendant = true) {
786
+ nextActiveOption.setActive(true);
787
+ nextActiveOption.scrollIntoView({ block: "nearest" });
788
+ if (setActiveDescendant) {
789
+ this._triggerElement.setAttribute("aria-activedescendant", nextActiveOption.id);
790
+ }
791
+ if (lastActiveOption && lastActiveOption !== nextActiveOption) {
792
+ lastActiveOption.setActive(false);
793
+ }
757
794
  }
758
- }
759
- _resetActiveElement() {
760
- const activeElement = this._filteredOptions[this._activeItemIndex];
761
- if (activeElement) {
762
- activeElement.setActive(false);
795
+ _setSelectedElement(nextActiveOption, lastActiveOption) {
796
+ nextActiveOption.setSelectedViaUserInteraction(true);
797
+ if (lastActiveOption && lastActiveOption !== nextActiveOption) {
798
+ lastActiveOption.setSelectedViaUserInteraction(false);
799
+ }
763
800
  }
764
- this._activeItemIndex = -1;
765
- this._triggerElement.removeAttribute("aria-activedescendant");
766
- }
767
- _setValueFromSelectedOption() {
768
- if (!this.multiple) {
769
- const selectedOption = this._filteredOptions.find((option) => option.selected);
770
- if (selectedOption) {
771
- this._activeItemIndex = this._filteredOptions.findIndex(
772
- (option) => option === selectedOption
773
- );
774
- this.value = selectedOption.value;
775
- }
776
- } else {
777
- const options = this._filteredOptions.filter((option) => option.selected);
778
- if (options && options.length > 0) {
779
- const value = [];
780
- for (const option of options) {
781
- value.push(option.value);
801
+ _resetActiveElement() {
802
+ const activeElement = this._filteredOptions[this._activeItemIndex];
803
+ if (activeElement) {
804
+ activeElement.setActive(false);
805
+ }
806
+ this._activeItemIndex = -1;
807
+ this._triggerElement.removeAttribute("aria-activedescendant");
808
+ }
809
+ _setValueFromSelectedOption() {
810
+ if (!this.multiple) {
811
+ const selectedOption = this._filteredOptions.find((option) => option.selected);
812
+ if (selectedOption) {
813
+ this._activeItemIndex = this._filteredOptions.findIndex((option) => option === selectedOption);
814
+ this.value = selectedOption.value;
815
+ }
816
+ } else {
817
+ const options = this._filteredOptions.filter((option) => option.selected);
818
+ if (options && options.length > 0) {
819
+ const value = [];
820
+ for (const option of options) {
821
+ value.push(option.value);
822
+ }
823
+ this.value = value;
782
824
  }
783
- this.value = value;
784
825
  }
785
826
  }
786
- }
787
- _toggleOpening() {
788
- var _a;
789
- if (this.disabled || this.readonly) {
790
- return;
791
- }
792
- (_a = this._triggerElement) == null ? void 0 : _a.focus();
793
- switch (this.state) {
794
- case "opened": {
795
- this.close();
796
- break;
827
+ _toggleOpening() {
828
+ var _a2;
829
+ if (this.disabled || this.formDisabled || this.readonly) {
830
+ return;
797
831
  }
798
- case "closed": {
799
- this.open();
800
- break;
832
+ (_a2 = this._triggerElement) == null ? void 0 : _a2.focus();
833
+ switch (this.state) {
834
+ case "opened": {
835
+ this.close();
836
+ break;
837
+ }
838
+ case "closed": {
839
+ this.open();
840
+ break;
841
+ }
801
842
  }
802
843
  }
803
- }
804
- _spreadDeferredDisplayValue(placeholder) {
805
- return [this._deferredDisplayValue(placeholder), placeholder];
806
- }
807
- async _deferredDisplayValue(placeholder) {
808
- if (this.hydrationRequired) {
809
- await this.hydrationComplete;
844
+ _spreadDeferredDisplayValue(placeholder) {
845
+ return [this._deferredDisplayValue(placeholder), placeholder];
810
846
  }
811
- return this._displayValue ? html`${this._displayValue}` : placeholder;
812
- }
813
- render() {
814
- return html`
847
+ async _deferredDisplayValue(placeholder) {
848
+ if (this.hydrationRequired) {
849
+ await this.hydrationComplete;
850
+ }
851
+ return this._displayValue ? html`${this._displayValue}` : placeholder;
852
+ }
853
+ render() {
854
+ return html`
815
855
  <!-- This element is visually hidden and will be appended to the light DOM to allow screen
816
856
  readers to work properly -->
817
857
  <div
818
858
  class="sbb-screen-reader-only"
819
- tabindex=${this.disabled ? nothing : "0"}
859
+ tabindex=${this.disabled || this.formDisabled ? nothing : "0"}
820
860
  role="combobox"
821
861
  aria-haspopup="listbox"
822
862
  aria-expanded="false"
@@ -832,11 +872,7 @@ let SbbSelectElement = class extends SbbUpdateSchedulerMixin(
832
872
 
833
873
  <!-- Visually display the value -->
834
874
  <div class="sbb-select__trigger" aria-hidden="true">
835
- ${until(
836
- ...this._spreadDeferredDisplayValue(
837
- html`<span class="sbb-select__trigger--placeholder">${this.placeholder}</span>`
838
- )
839
- )}
875
+ ${until(...this._spreadDeferredDisplayValue(html`<span class="sbb-select__trigger--placeholder">${this.placeholder}</span>`))}
840
876
  </div>
841
877
 
842
878
  <div class="sbb-select__gap-fix"></div>
@@ -861,44 +897,41 @@ let SbbSelectElement = class extends SbbUpdateSchedulerMixin(
861
897
  </div>
862
898
  </div>
863
899
  `;
864
- }
865
- };
866
- SbbSelectElement.styles = style;
867
- SbbSelectElement.events = {
868
- didChange: "didChange",
869
- change: "change",
870
- input: "input",
871
- stateChange: "stateChange",
872
- willOpen: "willOpen",
873
- didOpen: "didOpen",
874
- willClose: "willClose",
875
- didClose: "didClose"
876
- };
877
- __decorateClass([
878
- property()
879
- ], SbbSelectElement.prototype, "value", 2);
880
- __decorateClass([
881
- property()
882
- ], SbbSelectElement.prototype, "placeholder", 2);
883
- __decorateClass([
884
- property({ type: Boolean, reflect: true })
885
- ], SbbSelectElement.prototype, "multiple", 2);
886
- __decorateClass([
887
- property({ reflect: true, type: Boolean })
888
- ], SbbSelectElement.prototype, "required", 2);
889
- __decorateClass([
890
- property({ type: Boolean })
891
- ], SbbSelectElement.prototype, "readonly", 2);
892
- __decorateClass([
893
- state()
894
- ], SbbSelectElement.prototype, "_displayValue", 2);
895
- SbbSelectElement = __decorateClass([
896
- customElement("sbb-select"),
897
- hostAttributes({
898
- role: ariaRoleOnHost ? "listbox" : null
899
- })
900
- ], SbbSelectElement);
900
+ }
901
+ }, _placeholder_accessor_storage = new WeakMap(), _multiple_accessor_storage = new WeakMap(), _readonly_accessor_storage = new WeakMap(), __displayValue_accessor_storage = new WeakMap(), _classThis = _a, (() => {
902
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
903
+ _placeholder_decorators = [forceType(), property()];
904
+ _multiple_decorators = [forceType(), property({ reflect: true, type: Boolean })];
905
+ _readonly_decorators = [forceType(), property({ type: Boolean })];
906
+ __displayValue_decorators = [state()];
907
+ __esDecorate(_a, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: (obj) => "placeholder" in obj, get: (obj) => obj.placeholder, set: (obj, value) => {
908
+ obj.placeholder = value;
909
+ } }, metadata: _metadata }, _placeholder_initializers, _placeholder_extraInitializers);
910
+ __esDecorate(_a, null, _multiple_decorators, { kind: "accessor", name: "multiple", static: false, private: false, access: { has: (obj) => "multiple" in obj, get: (obj) => obj.multiple, set: (obj, value) => {
911
+ obj.multiple = value;
912
+ } }, metadata: _metadata }, _multiple_initializers, _multiple_extraInitializers);
913
+ __esDecorate(_a, null, _readonly_decorators, { kind: "accessor", name: "readonly", static: false, private: false, access: { has: (obj) => "readonly" in obj, get: (obj) => obj.readonly, set: (obj, value) => {
914
+ obj.readonly = value;
915
+ } }, metadata: _metadata }, _readonly_initializers, _readonly_extraInitializers);
916
+ __esDecorate(_a, null, __displayValue_decorators, { kind: "accessor", name: "_displayValue", static: false, private: false, access: { has: (obj) => "_displayValue" in obj, get: (obj) => obj._displayValue, set: (obj, value) => {
917
+ obj._displayValue = value;
918
+ } }, metadata: _metadata }, __displayValue_initializers, __displayValue_extraInitializers);
919
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
920
+ SbbSelectElement2 = _classThis = _classDescriptor.value;
921
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
922
+ })(), _a.styles = style, _a.events = {
923
+ didChange: "didChange",
924
+ change: "change",
925
+ input: "input",
926
+ stateChange: "stateChange",
927
+ willOpen: "willOpen",
928
+ didOpen: "didOpen",
929
+ willClose: "willClose",
930
+ didClose: "didClose"
931
+ }, __runInitializers(_classThis, _classExtraInitializers), _a);
932
+ return SbbSelectElement2 = _classThis;
933
+ })();
901
934
  export {
902
935
  SbbSelectElement
903
936
  };
904
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2VsZWN0L3NlbGVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdXRhdGlvbkNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL211dGF0aW9uLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJy4uL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgaG9zdEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNOZXh0anMsIGlzU2FmYXJpIH0gZnJvbSAnLi4vY29yZS9kb20uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29yZS9ldmVudGluZy5qcyc7XG5pbXBvcnQge1xuICBTYmJEaXNhYmxlZE1peGluLFxuICBTYmJIeWRyYXRpb25NaXhpbixcbiAgU2JiTmVnYXRpdmVNaXhpbixcbiAgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW4sXG59IGZyb20gJy4uL2NvcmUvbWl4aW5zLmpzJztcbmltcG9ydCB7IGlzRXZlbnRPbkVsZW1lbnQsIG92ZXJsYXlHYXBGaXhDb3JuZXJzLCBzZXRPdmVybGF5UG9zaXRpb24gfSBmcm9tICcuLi9jb3JlL292ZXJsYXkuanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJPcHRHcm91cEVsZW1lbnQsIFNiYk9wdGlvbkVsZW1lbnQgfSBmcm9tICcuLi9vcHRpb24uanMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zZWxlY3Quc2Nzcz9saXQmaW5saW5lJztcblxuLyoqXG4gKiBPbiBTYWZhcmksIHRoZSBhcmlhIHJvbGUgJ2xpc3Rib3gnIG11c3QgYmUgb24gdGhlIGhvc3QgZWxlbWVudCwgb3IgZWxzZSBWb2ljZU92ZXIgd29uJ3Qgd29yayBhdCBhbGwuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCwgSkFXUyBhbmQgTlZEQSBuZWVkIHRoZSByb2xlIHRvIGJlIGFuIFwiaW1tZWRpYXRlIHBhcmVudFwiIHRvIHRoZSBvcHRpb25zLCBvciBlbHNlIG9wdGdyb3VwcyB3b24ndCB3b3JrLlxuICovXG5jb25zdCBhcmlhUm9sZU9uSG9zdCA9IGlzU2FmYXJpO1xuXG5sZXQgbmV4dElkID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RDaGFuZ2Uge1xuICB0eXBlOiAndmFsdWUnO1xuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYSBwYW5lbCB3aXRoIHNlbGVjdGFibGUgb3B0aW9ucy5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBvcHRpb25zLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gZGlkQ2hhbmdlIC0gRGVwcmVjYXRlZC4gdXNlZCBmb3IgUmVhY3QuIFdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBvbmNlIFJlYWN0IDE5IGlzIGF2YWlsYWJsZS5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGNoYW5nZSAtIE5vdGlmaWVzIHRoYXQgdGhlIGNvbXBvbmVudCdzIHZhbHVlIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gaW5wdXQgLSBOb3RpZmllcyB0aGF0IGFuIG9wdGlvbiB2YWx1ZSBoYXMgYmVlbiBzZWxlY3RlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IHdpbGxPcGVuIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItc2VsZWN0YCBzdGFydHMgdGhlIG9wZW5pbmcgdHJhbnNpdGlvbi4gQ2FuIGJlIGNhbmNlbGVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gZGlkT3BlbiAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgaXMgb3BlbmVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gd2lsbENsb3NlIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItc2VsZWN0YCBiZWdpbnMgdGhlIGNsb3NpbmcgdHJhbnNpdGlvbi4gQ2FuIGJlIGNhbmNlbGVkLlxuICogQGV2ZW50IHtDdXN0b21FdmVudDx2b2lkPn0gZGlkQ2xvc2UgLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIGlzIGNsb3NlZC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1zZWxlY3Qtei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5AY3VzdG9tRWxlbWVudCgnc2JiLXNlbGVjdCcpXG5AaG9zdEF0dHJpYnV0ZXMoe1xuICByb2xlOiBhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG51bGwsXG59KVxuZXhwb3J0IGNsYXNzIFNiYlNlbGVjdEVsZW1lbnQgZXh0ZW5kcyBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbihcbiAgU2JiRGlzYWJsZWRNaXhpbihTYmJOZWdhdGl2ZU1peGluKFNiYkh5ZHJhdGlvbk1peGluKFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50KSkpLFxuKSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlO1xuXG4gIC8vIEZJWE1FIHVzaW5nIC4uLnN1cGVyLmV2ZW50cyByZXF1aXJlczogaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWNvbXBvbmVudHMvaXNzdWVzLzI2MDBcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBldmVudHMgPSB7XG4gICAgZGlkQ2hhbmdlOiAnZGlkQ2hhbmdlJyxcbiAgICBjaGFuZ2U6ICdjaGFuZ2UnLFxuICAgIGlucHV0OiAnaW5wdXQnLFxuICAgIHN0YXRlQ2hhbmdlOiAnc3RhdGVDaGFuZ2UnLFxuICAgIHdpbGxPcGVuOiAnd2lsbE9wZW4nLFxuICAgIGRpZE9wZW46ICdkaWRPcGVuJyxcbiAgICB3aWxsQ2xvc2U6ICd3aWxsQ2xvc2UnLFxuICAgIGRpZENsb3NlOiAnZGlkQ2xvc2UnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKiBUaGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBjb21wb25lbnQuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgaXQncyBhbiBhcnJheS4gKi9cbiAgQHByb3BlcnR5KCkgcHVibGljIHZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqIFRoZSBwbGFjZWhvbGRlciB1c2VkIGlmIG5vIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLiAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNlbGVjdCBhbGxvd3MgZm9yIG11bHRpcGxlIHNlbGVjdGlvbi4gKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0aGUgc2VsZWN0IGlzIHJlcXVpcmVkLiAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgcmVhZG9ubHkuICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcHVibGljIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgLyoqIFRoZSB2YWx1ZSBkaXNwbGF5ZWQgYnkgdGhlIGNvbXBvbmVudC4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBfZGlzcGxheVZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgb25seSB1c2VkIGZvciBSZWFjdC4gV2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIG9uY2UgUmVhY3QgMTkgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGlkQ2hhbmdlOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmRpZENoYW5nZSk7XG5cbiAgLyoqIE5vdGlmaWVzIHRoYXQgdGhlIGNvbXBvbmVudCdzIHZhbHVlIGhhcyBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIF9jaGFuZ2U6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIodGhpcywgU2JiU2VsZWN0RWxlbWVudC5ldmVudHMuY2hhbmdlKTtcblxuICAvKiogTm90aWZpZXMgdGhhdCBhbiBvcHRpb24gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIHByaXZhdGUgX2lucHV0OiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmlucHV0KTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX3N0YXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8U2VsZWN0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5zdGF0ZUNoYW5nZSxcbiAgICB7XG4gICAgICBjb21wb3NlZDogZmFsc2UsXG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIF9vdmVybGF5ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX29wdGlvbkNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcmlnaW5FbGVtZW50ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3RyaWdnZXJFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIhOiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX292ZXJsYXlJZCA9IGBzYmItc2VsZWN0LSR7KytuZXh0SWR9YDtcbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gIHByaXZhdGUgX3NlYXJjaFRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfc2VhcmNoU3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2RpZExvYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25NZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2Fib3J0ID0gbmV3IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlcih0aGlzKTtcblxuICAvKipcbiAgICogVGhlICdjb21ib2JveCcgaW5wdXQgZWxlbWVudFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlckVsZW1lbnQ7XG4gIH1cblxuICAvKiogR2V0cyBhbGwgdGhlIFNiYk9wdGlvbkVsZW1lbnQgcHJvamVjdGVkIGluIHRoZSBzZWxlY3QuICovXG4gIHByaXZhdGUgZ2V0IF9vcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPy4oJ3NiYi1vcHRpb24nKSA/PyBbXSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZmlsdGVyZWRPcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZmlsdGVyKFxuICAgICAgKG9wdDogU2JiT3B0aW9uRWxlbWVudCkgPT4gIW9wdC5kaXNhYmxlZCAmJiAhb3B0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1ncm91cC1kaXNhYmxlZCcpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIG5ldyBNdXRhdGlvbkNvbnRyb2xsZXIodGhpcywge1xuICAgICAgY29uZmlnOiB7IGF0dHJpYnV0ZUZpbHRlcjogWydhcmlhLWxhYmVsbGVkYnknXSB9LFxuICAgICAgY2FsbGJhY2s6IChtdXRhdGlvbnNMaXN0OiBNdXRhdGlvblJlY29yZFtdKSA9PiB0aGlzLl9vblNlbGVjdEF0dHJpYnV0ZXNDaGFuZ2UobXV0YXRpb25zTGlzdCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVE9ETzogQWNjZXNzaWJpbGl0eSBmaXggcmVxdWlyZWQgdG8gY29ycmVjdGx5IHJlYWQgdGhlIGxhYmVsO1xuICAgKiBjYW4gYmUgcG9zc2libHkgcmVtb3ZlZCBhZnRlciB0aGUgbWVyZ2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWNvbXBvbmVudHMvaXNzdWVzLzMwNjJcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0QXR0cmlidXRlc0NoYW5nZShtdXRhdGlvbnNMaXN0OiBNdXRhdGlvblJlY29yZFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XG4gICAgICBpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ2FyaWEtbGFiZWxsZWRieScpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JyxcbiAgICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JykhLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgc2VsZWN0aW9uIHBhbmVsLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgfHwgIXRoaXMuX292ZXJsYXkgfHwgdGhpcy5fb3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud2lsbE9wZW4uZW1pdCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG4gIH1cblxuICAvKiogQ2xvc2VzIHRoZSBzZWxlY3Rpb24gcGFuZWwuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud2lsbENsb3NlLmVtaXQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBjdXJyZW50IGRpc3BsYXllZCB2YWx1ZS4gKi9cbiAgcHVibGljIGdldERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5VmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKiogTGlzdGVucyB0byBvcHRpb24gY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25DaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBTYmJPcHRpb25FbGVtZW50O1xuICAgIGlmICh0YXJnZXQuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX29uT3B0aW9uU2VsZWN0ZWQodGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25PcHRpb25EZXNlbGVjdGVkKHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25PcHRpb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBTYmJTZWxlY3RFbGVtZW50IHwgU2JiT3B0aW9uRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSAhPT0gJ3NiYi1vcHRpb24nIHx8IHRhcmdldC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBfZGlzcGxheVZhbHVlIGJ5IGNoZWNraW5nIHRoZSBpbnRlcm5hbCBzYmItb3B0aW9ucyBhbmQgc2V0dGluZyB0aGUgY29ycmVjdCBgc2VsZWN0ZWRgIHZhbHVlIG9uIHRoZW0uICovXG4gIHByaXZhdGUgX29uVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IG9wdGlvbnMuZmluZCgobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpID09PSBuZXdWYWx1ZSk7XG4gICAgICBpZiAob3B0aW9uRWxlbWVudCkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpICE9PSBuZXdWYWx1ZSlcbiAgICAgICAgLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IG9wdGlvbkVsZW1lbnQ/LnRleHRDb250ZW50IHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gIW5ld1ZhbHVlLmluY2x1ZGVzKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpKVxuICAgICAgICAuZm9yRWFjaCgoZSkgPT4gKGUuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25FbGVtZW50cyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PlxuICAgICAgICBuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlID8/IG8uZ2V0QXR0cmlidXRlKCd2YWx1ZScpKSxcbiAgICAgICk7XG4gICAgICBzZWxlY3RlZE9wdGlvbkVsZW1lbnRzLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gc2VsZWN0ZWRPcHRpb25FbGVtZW50cy5tYXAoKG8pID0+IG8udGV4dENvbnRlbnQpLmpvaW4oJywgJykgfHwgbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2UuZW1pdCh7IHR5cGU6ICd2YWx1ZScsIHZhbHVlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGZvY3VzIGJlaGF2aW9yXG4gICAgdGhpcy5mb2N1cyA9ICgpID0+IHRoaXMuX3RyaWdnZXJFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5ibHVyID0gKCkgPT4gdGhpcy5fdHJpZ2dlckVsZW1lbnQuYmx1cigpO1xuXG4gICAgLy8gV2FpdCBmb3Igc3NyIGh5ZHJhdGlvblxuICAgIGlmICghaXNOZXh0anMoKSkge1xuICAgICAgdGhpcy5zdGFydFVwZGF0ZSgpO1xuICAgICAgdGhpcy5fc2V0dXBTZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlbGVtZW50J3MgZmlyc3QgYXR0cmlidXRlIHdob3NlIHF1YWxpZmllZCBuYW1lIGlzIHF1YWxpZmllZE5hbWUuXG4gICAqXG4gICAqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRWxlbWVudC9yZW1vdmVBdHRyaWJ1dGUpXG4gICAqIEBpbnRlcm5hbCBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZHVlIHRvIGEgaHlkcmF0aW9uIGlzc3VlIHdpdGggTmV4dC5qcy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gSW4gTmV4dC5qcyB0aGUgaHlkcmF0aW9uIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIGxpZ2h0IERPTS5cbiAgICAvLyBAbGl0L3JlYWN0IGNhbGxzIHJlbW92ZUF0dHJpYnV0ZSgnZGVmZXItaHlkcmF0aW9uJykgaW4gYSB1c2VMYXlvdXRFZmZlY3QsXG4gICAgLy8gd2hpY2ggaXMgZG9uZSBhZnRlciBoeWRyYXRpb24gaXMgZmluaXNoZWQuIER1ZSB0byB0aGlzIHdlIGludGVyY2VwdCB0aGlzIGNhbGxcbiAgICAvLyBpbiBvdmVycmlkaW5nIHJlbW92ZUF0dHJpYnV0ZSB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIHNiYi1zZWxlY3QuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvYmxvYi9tYWluL3BhY2thZ2VzL3JlYWN0L3NyYy9jcmVhdGUtY29tcG9uZW50LnRzI0wyOTMtTDI5NlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byB3YWl0IGZvciB1cGRhdGUgY29tcGxldGUgaW4gb3JkZXIgdG8gYmUgc3VyZSB0aGF0IHRoZSBzaGFkb3cgRE9NIGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgIGlmIChpc05leHRqcygpICYmIHF1YWxpZmllZE5hbWUgPT09ICdkZWZlci1oeWRyYXRpb24nICYmICF0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5fc2V0dXBTZWxlY3QoKSk7XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKGFyaWFSb2xlT25Ib3N0KSB7XG4gICAgICB0aGlzLmlkIHx8PSB0aGlzLl9vdmVybGF5SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fYWJvcnQuc2lnbmFsO1xuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXMuY2xvc2VzdD8uKCdbZGF0YS1mb3JtLWZpZWxkXScpO1xuXG4gICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IGZvcm1GaWVsZC5oYXNBdHRyaWJ1dGUoJ25lZ2F0aXZlJyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy5fc2V0dXBPcmlnaW4oKTtcbiAgICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fb25WYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ29wdGlvblNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAoZTogQ3VzdG9tRXZlbnQ8dm9pZD4pID0+IHRoaXMuX29uT3B0aW9uQ2hhbmdlZChlKSxcbiAgICAgIHsgc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnY2xpY2snLFxuICAgICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fb25PcHRpb25DbGljayhlKTtcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmluZygpO1xuICAgICAgfSxcbiAgICAgIHsgc2lnbmFsIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygndmFsdWUnKSkge1xuICAgICAgdGhpcy5fb25WYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSEpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCduZWdhdGl2ZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbXVsdGlwbGUnKSkge1xuICAgICAgdGhpcy5fc3luY1Byb3BlcnRpZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnByZXBlbmQodGhpcy5fdHJpZ2dlckVsZW1lbnQpOyAvLyBUYWtlIGJhY2sgdGhlIHRyaWdnZXIgZWxlbWVudCBwcmV2aW91c2x5IG1vdmVkIHRvIHRoZSBsaWdodCBET01cbiAgICB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyPy5hYm9ydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Byb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy4oJ3NiYi1kaXZpZGVyJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gKGVsZW1lbnQubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlKSk7XG5cbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJPcHRpb25FbGVtZW50IHwgU2JiT3B0R3JvdXBFbGVtZW50PihcbiAgICAgICdzYmItb3B0aW9uLCBzYmItb3B0Z3JvdXAnLFxuICAgICkuZm9yRWFjaCgoZWxlbWVudDogU2JiT3B0aW9uRWxlbWVudCB8IFNiYk9wdEdyb3VwRWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtbmVnYXRpdmUnLCB0aGlzLm5lZ2F0aXZlKTtcbiAgICAgIGVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLW11bHRpcGxlJywgdGhpcy5tdWx0aXBsZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIHRoaXMuX2RpZExvYWQgPSB0cnVlO1xuICAgIHRoaXMuY29tcGxldGVVcGRhdGUoKTtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBvcmlnaW5FbGVtZW50OyBpZiB0aGUgY29tcG9uZW50IGlzIHVzZWQgaW4gYSBzYmItZm9ybS1maWVsZCB1c2VzIGl0LCBvdGhlcndpc2UgdXNlcyB0aGUgcGFyZW50RWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBfc2V0dXBPcmlnaW4oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUZpZWxkID0gdGhpcy5jbG9zZXN0Py4oJ3NiYi1mb3JtLWZpZWxkJyk7XG4gICAgdGhpcy5fb3JpZ2luRWxlbWVudCA9XG4gICAgICBmb3JtRmllbGQ/LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I/LignI292ZXJsYXktYW5jaG9yJykgPz8gdGhpcy5wYXJlbnRFbGVtZW50ITtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoXG4gICAgICAgICdkYXRhLW9wdGlvbi1wYW5lbC1vcmlnaW4tYm9yZGVybGVzcycsXG4gICAgICAgICEhZm9ybUZpZWxkPy5oYXNBdHRyaWJ1dGU/LignYm9yZGVybGVzcycpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gYXNzZXNzIHNjcmVlbi1yZWFkZXJzIHByb2JsZW1zIGNhdXNlZCBieSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBhcmlhIHBhdHRlcm5zIGFuZCBzaGFkb3cgRE9NLFxuICAgKiB3ZSBhcmUgZm9yY2VkIHRvIG1vdmUgdGhlICdjb21ib2JveCcgdHJpZ2dlciBlbGVtZW50IHRvIHRoZSBsaWdodCBET01cbiAgICovXG4gIHByaXZhdGUgX3NldHVwVHJpZ2dlcigpOiB2b2lkIHtcbiAgICAvLyBNb3ZlIHRoZSB0cmlnZ2VyIGJlZm9yZSB0aGUgc2JiLXNlbGVjdFxuICAgIHRoaXMucGFyZW50RWxlbWVudCEuaW5zZXJ0QmVmb3JlPy4odGhpcy5fdHJpZ2dlckVsZW1lbnQsIHRoaXMpO1xuXG4gICAgLy8gU2V0IHRoZSBpbnZpc2libGUgdHJpZ2dlciBlbGVtZW50IGRpbWVuc2lvbiB0byBtYXRjaCB0aGUgcGFyZW50IChuZWVkZWQgZm9yIHNjcmVlbiByZWFkZXJzKVxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKSA/PyB0aGlzO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2NvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke2NvbnRhaW5lckVsZW1lbnQub2Zmc2V0V2lkdGh9cHhgO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3ZlcmxheVBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHNldE92ZXJsYXlQb3NpdGlvbihcbiAgICAgIHRoaXMuX292ZXJsYXksXG4gICAgICB0aGlzLl9vcmlnaW5FbGVtZW50LFxuICAgICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJykhLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9XG5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vbkFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5fb25PcGVuQW5pbWF0aW9uRW5kKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5fb25DbG9zZUFuaW1hdGlvbkVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29uT3BlbkFuaW1hdGlvbkVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG4gICAgdGhpcy5fYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcblxuICAgIHRoaXMuZGlkT3Blbi5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNsb3NlQW5pbWF0aW9uRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB0aGlzLl9yZXNldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB0aGlzLl9vcHRpb25Db250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLmRpZENsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZCwgdXBkYXRlcyB0aGUgZGlzcGxheVZhbHVlOyBpdCBhbHNvIGNsb3NlcyB0aGUgc2VsZWN0IGlmIG5vdCBgbXVsdGlwbGVgLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvblNlbGVjdGVkKG9wdGlvblNlbGVjdGlvbkNoYW5nZTogU2JiT3B0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zXG4gICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmlkICE9PSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UuaWQpXG4gICAgICAgIC5mb3JFYWNoKChvcHRpb24pID0+IChvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnZhbHVlLmluY2x1ZGVzKG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSEpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgIHRoaXMuX2NoYW5nZS5lbWl0KCk7XG4gICAgdGhpcy5fZGlkQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyB1bnNlbGVjdGVkIGluIGBtdWx0aXBsZWAsIHJlbW92ZXMgaXQgZnJvbSB2YWx1ZSBhbmQgdXBkYXRlcyBkaXNwbGF5VmFsdWUuICovXG4gIHByaXZhdGUgX29uT3B0aW9uRGVzZWxlY3RlZChvcHRpb25TZWxlY3Rpb25DaGFuZ2U6IFNiYk9wdGlvbkVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIGFzIHN0cmluZ1tdKS5maWx0ZXIoXG4gICAgICAgIChlbDogc3RyaW5nKSA9PiBlbCAhPT0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgICAgdGhpcy5fY2hhbmdlLmVtaXQoKTtcbiAgICAgIHRoaXMuX2RpZENoYW5nZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgb3ZlcmxheSBwb3NpdGlvbiBvbiBzY3JvbGwgYW5kIHdpbmRvdyByZXNpemVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2tcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXYpID0+IHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIoZXYpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCAoZXYpID0+IHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrKGV2KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcpIHtcbiAgICAgIHRoaXMuX29wZW5lZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgdGhpcy5fY2xvc2VkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbG9zZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb3BlbmVkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSB8fCB0aGlzLnN0YXRlICE9PSAnb3BlbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZWxlY3RCeUtleWJvYXJkKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCAwKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnQ2xlYXInIHx8XG4gICAgICAoZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBldmVudC5rZXkgIT09ICcgJyAmJlxuICAgICAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5tZXRhS2V5KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2V0IHRpbWVvdXQgYW5kIHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgIGlmICh0eXBlb2YgdGhpcy5fc2VhcmNoVGltZW91dCA9PT0gdHlwZW9mIHNldFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZWFyY2hUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuX3NlYXJjaFN0cmluZyA9ICcnKSwgMTAwMCk7XG4gICAgdGhpcy5fc2VhcmNoU3RyaW5nICs9IGV2ZW50LmtleTtcblxuICAgIC8vIFJlb3JkZXIgdGhlIF9maWx0ZXJlZE9wdGlvbiBhcnJheSB0byBoYXZlIHRoZSBsYXN0IHNlbGVjdGVkIGVsZW1lbnQgYXQgdGhlIGJvdHRvbS5cbiAgICBjb25zdCBpbmRleEZvclNsaWNlOiBudW1iZXIgPSB0aGlzLl9hY3RpdmVJdGVtSW5kZXggKyAxO1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9uc1NvcnRlZDogU2JiT3B0aW9uRWxlbWVudFtdID0gW1xuICAgICAgLi4udGhpcy5fZmlsdGVyZWRPcHRpb25zLnNsaWNlKGluZGV4Rm9yU2xpY2UpLFxuICAgICAgLi4udGhpcy5fZmlsdGVyZWRPcHRpb25zLnNsaWNlKDAsIGluZGV4Rm9yU2xpY2UpLFxuICAgIF07XG5cbiAgICBjb25zdCBtYXRjaCA9IGZpbHRlcmVkT3B0aW9uc1NvcnRlZC5maW5kKFxuICAgICAgKG9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCkgPT5cbiAgICAgICAgb3B0aW9uLnRleHRDb250ZW50Py50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5fc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpID09PSAwLFxuICAgICk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAvLyBJZiBhbiBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCwgZ28gdG8gdGhhdCBvcHRpb24uXG4gICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuaW5kZXhPZihtYXRjaCkpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLl9zZWFyY2hTdHJpbmcubGVuZ3RoID4gMSAmJlxuICAgICAgbmV3IFJlZ0V4cChgXiR7dGhpcy5fc2VhcmNoU3RyaW5nLmNoYXJBdCgwKX0qJGApLnRlc3QodGhpcy5fc2VhcmNoU3RyaW5nKVxuICAgICkge1xuICAgICAgLy8gSWYgbm8gZXhhY3QgbWF0Y2ggaGFzIGJlZW4gZm91bmQgYnV0IHRoZSBzdHJpbmcgdG8gc2VhcmNoIGlzIG1hZGUgYnkgdGhlIHNhbWUgcmVwZWF0ZWQgbGV0dGVyLFxuICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGVsZW1lbnQsIGlmIGV4aXN0cywgdGhhdCBtYXRjaGVzIHRoZSBsZXR0ZXIuXG4gICAgICBjb25zdCBmaXJzdE1hdGNoID0gZmlsdGVyZWRPcHRpb25zU29ydGVkLmZpbmQoXG4gICAgICAgIChvcHRpb246IFNiYk9wdGlvbkVsZW1lbnQpID0+XG4gICAgICAgICAgb3B0aW9uLnRleHRDb250ZW50Py50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5fc2VhcmNoU3RyaW5nWzBdLnRvTG93ZXJDYXNlKCkpID09PSAwLFxuICAgICAgKTtcbiAgICAgIGlmIChmaXJzdE1hdGNoKSB7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5pbmRleE9mKGZpcnN0TWF0Y2gpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gbWF0Y2ggZm91bmQsIGNsZWFyIHRoZSB0aW1lb3V0IGFuZCB0aGUgc2VhcmNoIHRlcm0uXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2VhcmNoVGltZW91dCk7XG4gICAgICB0aGlzLl9zZWFyY2hTdHJpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RCeUtleWJvYXJkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGFjdGl2ZU9wdGlvbi5zZXRTZWxlY3RlZFZpYVVzZXJJbnRlcmFjdGlvbighYWN0aXZlT3B0aW9uLnNlbGVjdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dEluZGV4ID1cbiAgICAgIGluZGV4ID8/IGdldE5leHRFbGVtZW50SW5kZXgoZXZlbnQsIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmxlbmd0aCk7XG4gICAgY29uc3QgbmV4dE9wdGlvbiA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1tuZXh0SW5kZXhdO1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgdGhpcy5fc2V0QWN0aXZlRWxlbWVudChuZXh0T3B0aW9uLCBhY3RpdmVPcHRpb24pO1xuXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9zZXRTZWxlY3RlZEVsZW1lbnQobmV4dE9wdGlvbiwgYWN0aXZlT3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py5zaGlmdEtleSkge1xuICAgICAgbmV4dE9wdGlvbi5zZXRTZWxlY3RlZFZpYVVzZXJJbnRlcmFjdGlvbighbmV4dE9wdGlvbi5zZWxlY3RlZCk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IG5leHRJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEFjdGl2ZUVsZW1lbnQoXG4gICAgbmV4dEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCxcbiAgICBsYXN0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gICAgc2V0QWN0aXZlRGVzY2VuZGFudCA9IHRydWUsXG4gICk6IHZvaWQge1xuICAgIG5leHRBY3RpdmVPcHRpb24uc2V0QWN0aXZlKHRydWUpO1xuICAgIG5leHRBY3RpdmVPcHRpb24uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuXG4gICAgaWYgKHNldEFjdGl2ZURlc2NlbmRhbnQpIHtcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgbmV4dEFjdGl2ZU9wdGlvbi5pZCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgdGhlIHByZXZpb3VzXG4gICAgaWYgKGxhc3RBY3RpdmVPcHRpb24gJiYgbGFzdEFjdGl2ZU9wdGlvbiAhPT0gbmV4dEFjdGl2ZU9wdGlvbikge1xuICAgICAgbGFzdEFjdGl2ZU9wdGlvbi5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFNlbGVjdGVkRWxlbWVudChcbiAgICBuZXh0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50LFxuICAgIGxhc3RBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQsXG4gICk6IHZvaWQge1xuICAgIG5leHRBY3RpdmVPcHRpb24uc2V0U2VsZWN0ZWRWaWFVc2VySW50ZXJhY3Rpb24odHJ1ZSk7XG5cbiAgICBpZiAobGFzdEFjdGl2ZU9wdGlvbiAmJiBsYXN0QWN0aXZlT3B0aW9uICE9PSBuZXh0QWN0aXZlT3B0aW9uKSB7XG4gICAgICBsYXN0QWN0aXZlT3B0aW9uLnNldFNlbGVjdGVkVmlhVXNlckludGVyYWN0aW9uKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEFjdGl2ZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnQuc2V0QWN0aXZlKGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBwb2ludGVyZG93biBldmVudCB0YXJnZXQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBtZW51LlxuICBwcml2YXRlIF9wb2ludGVyRG93bkxpc3RlbmVyID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICB0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgPSBpc0V2ZW50T25FbGVtZW50KHRoaXMuX292ZXJsYXksIGV2ZW50KTtcbiAgfTtcblxuICAvLyBDbG9zZSBtZW51IG9uIGJhY2tkcm9wIGNsaWNrLlxuICBwcml2YXRlIF9jbG9zZU9uQmFja2Ryb3BDbGljayA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgJiYgIWlzRXZlbnRPbkVsZW1lbnQodGhpcy5fb3ZlcmxheSwgZXZlbnQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3NldFZhbHVlRnJvbVNlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWQpO1xuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uID09PSBzZWxlY3RlZE9wdGlvbixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWQpO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgdmFsdWUucHVzaChvcHRpb24udmFsdWUhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdG9nZ2xlT3BlbmluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuXG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlICdvcGVuZWQnOiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjbG9zZWQnOiB7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKFxuICAgIHBsYWNlaG9sZGVyOiBUZW1wbGF0ZVJlc3VsdCxcbiAgKTogKFRlbXBsYXRlUmVzdWx0IHwgUHJvbWlzZTxUZW1wbGF0ZVJlc3VsdD4pW10ge1xuICAgIHJldHVybiBbdGhpcy5fZGVmZXJyZWREaXNwbGF5VmFsdWUocGxhY2Vob2xkZXIpLCBwbGFjZWhvbGRlcl07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9kZWZlcnJlZERpc3BsYXlWYWx1ZShwbGFjZWhvbGRlcjogVGVtcGxhdGVSZXN1bHQpOiBQcm9taXNlPFRlbXBsYXRlUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaHlkcmF0aW9uQ29tcGxldGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5VmFsdWUgPyBodG1sYCR7dGhpcy5fZGlzcGxheVZhbHVlfWAgOiBwbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPCEtLSBUaGlzIGVsZW1lbnQgaXMgdmlzdWFsbHkgaGlkZGVuIGFuZCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBsaWdodCBET00gdG8gYWxsb3cgc2NyZWVuXG4gICAgICByZWFkZXJzIHRvIHdvcmsgcHJvcGVybHkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiXG4gICAgICAgIHRhYmluZGV4PSR7dGhpcy5kaXNhYmxlZCA/IG5vdGhpbmcgOiAnMCd9XG4gICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgYXJpYS1yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWQudG9TdHJpbmcoKX1cbiAgICAgICAgYXJpYS1jb250cm9scz0ke3RoaXMuX292ZXJsYXlJZH1cbiAgICAgICAgYXJpYS1vd25zPSR7dGhpcy5fb3ZlcmxheUlkfVxuICAgICAgICBAa2V5ZG93bj0ke3RoaXMuX29uS2V5RG93bn1cbiAgICAgICAgQGNsaWNrPSR7dGhpcy5fdG9nZ2xlT3BlbmluZ31cbiAgICAgICAgJHtyZWYoKHJlZikgPT4gKHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gcmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICA+XG4gICAgICAgICR7dW50aWwoLi4udGhpcy5fc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoaHRtbGA8c3Bhbj4ke3RoaXMucGxhY2Vob2xkZXJ9PC9zcGFuPmApKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFZpc3VhbGx5IGRpc3BsYXkgdGhlIHZhbHVlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX3RyaWdnZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgJHt1bnRpbChcbiAgICAgICAgICAuLi50aGlzLl9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItc2VsZWN0X190cmlnZ2VyLS1wbGFjZWhvbGRlclwiPiR7dGhpcy5wbGFjZWhvbGRlcn08L3NwYW4+YCxcbiAgICAgICAgICApLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19nYXAtZml4XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19nYXAtZml4XCI+JHtvdmVybGF5R2FwRml4Q29ybmVycygpfTwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgQGFuaW1hdGlvbmVuZD0ke3RoaXMuX29uQW5pbWF0aW9uRW5kfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlbGVjdF9fcGFuZWxcIlxuICAgICAgICAgICR7cmVmKChkaWFsb2dSZWYpID0+ICh0aGlzLl9vdmVybGF5ID0gZGlhbG9nUmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBpZD0keyFhcmlhUm9sZU9uSG9zdCA/IHRoaXMuX292ZXJsYXlJZCA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2JiLXNlbGVjdF9fb3B0aW9uc1wiXG4gICAgICAgICAgICAgIHJvbGU9JHshYXJpYVJvbGVPbkhvc3QgPyAnbGlzdGJveCcgOiBub3RoaW5nfVxuICAgICAgICAgICAgICA/YXJpYS1tdWx0aXNlbGVjdGFibGU9JHt0aGlzLm11bHRpcGxlfVxuICAgICAgICAgICAgICAke3JlZigoY29udGFpbmVyUmVmKSA9PiAodGhpcy5fb3B0aW9uQ29udGFpbmVyID0gY29udGFpbmVyUmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5fc2V0VmFsdWVGcm9tU2VsZWN0ZWRPcHRpb259Pjwvc2xvdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1zZWxlY3QnOiBTYmJTZWxlY3RFbGVtZW50O1xuICB9XG59XG4iXSwibmFtZXMiOlsicmVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxNQUFNLGlCQUFpQjtBQUV2QixJQUFJLFNBQVM7QUEwQk4sSUFBTSxtQkFBTixjQUErQjtBQUFBLEVBQ3BDLGlCQUFpQixpQkFBaUIsa0JBQWtCLHVCQUF1QixDQUFDLENBQUM7QUFDL0UsRUFBRTtBQUFBLEVBcUZPLGNBQWM7QUFDYjtBQWhFb0MsU0FBTyxXQUFXO0FBR2xCLFNBQU8sV0FBVztBQUdqQyxTQUFPLFdBQVc7QUFHdEMsU0FBUSxnQkFBK0I7QUFLaEQsU0FBUSxhQUEyQixJQUFJLGFBQWEsTUFBTSxpQkFBaUIsT0FBTyxTQUFTO0FBRzNGLFNBQVEsVUFBd0IsSUFBSSxhQUFhLE1BQU0saUJBQWlCLE9BQU8sTUFBTTtBQUdyRixTQUFRLFNBQXVCLElBQUksYUFBYSxNQUFNLGlCQUFpQixPQUFPLEtBQUs7QUFHbkYsU0FBUSxlQUEyQyxJQUFJO0FBQUEsTUFDckQ7QUFBQSxNQUNBLGlCQUFpQixPQUFPO0FBQUEsTUFDeEI7QUFBQSxRQUNFLFVBQVU7QUFBQSxNQUNaO0FBQUEsSUFB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
937
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2VsZWN0L3NlbGVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdXRhdGlvbkNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL211dGF0aW9uLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCwgUHJvcGVydHlWYWx1ZXMsIFRlbXBsYXRlUmVzdWx0IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJy4uL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlLCBob3N0QXR0cmlidXRlcyB9IGZyb20gJy4uL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpc05leHRqcywgaXNTYWZhcmkgfSBmcm9tICcuLi9jb3JlL2RvbS5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybVJlc3RvcmVSZWFzb24sXG4gIHR5cGUgRm9ybVJlc3RvcmVTdGF0ZSxcbiAgU2JiRGlzYWJsZWRNaXhpbixcbiAgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbixcbiAgU2JiSHlkcmF0aW9uTWl4aW4sXG4gIFNiYk5lZ2F0aXZlTWl4aW4sXG4gIFNiYlJlcXVpcmVkTWl4aW4sXG4gIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluLFxufSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5pbXBvcnQgeyBpc0V2ZW50T25FbGVtZW50LCBvdmVybGF5R2FwRml4Q29ybmVycywgc2V0T3ZlcmxheVBvc2l0aW9uIH0gZnJvbSAnLi4vY29yZS9vdmVybGF5LmpzJztcbmltcG9ydCB0eXBlIHsgU2JiT3B0R3JvdXBFbGVtZW50LCBTYmJPcHRpb25FbGVtZW50IH0gZnJvbSAnLi4vb3B0aW9uLmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VsZWN0LnNjc3M/bGl0JmlubGluZSc7XG5cbi8qKlxuICogT24gU2FmYXJpLCB0aGUgYXJpYSByb2xlICdsaXN0Ym94JyBtdXN0IGJlIG9uIHRoZSBob3N0IGVsZW1lbnQsIG9yIGVsc2UgVm9pY2VPdmVyIHdvbid0IHdvcmsgYXQgYWxsLlxuICogT24gdGhlIG90aGVyIGhhbmQsIEpBV1MgYW5kIE5WREEgbmVlZCB0aGUgcm9sZSB0byBiZSBhbiBcImltbWVkaWF0ZSBwYXJlbnRcIiB0byB0aGUgb3B0aW9ucywgb3IgZWxzZSBvcHRncm91cHMgd29uJ3Qgd29yay5cbiAqL1xuY29uc3QgYXJpYVJvbGVPbkhvc3QgPSBpc1NhZmFyaTtcblxubGV0IG5leHRJZCA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0Q2hhbmdlIHtcbiAgdHlwZTogJ3ZhbHVlJztcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgcGFuZWwgd2l0aCBzZWxlY3RhYmxlIG9wdGlvbnMuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgb3B0aW9ucy5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZENoYW5nZSAtIERlcHJlY2F0ZWQuIHVzZWQgZm9yIFJlYWN0LiBXaWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgb25jZSBSZWFjdCAxOSBpcyBhdmFpbGFibGUuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSBjaGFuZ2UgLSBOb3RpZmllcyB0aGF0IHRoZSBjb21wb25lbnQncyB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGlucHV0IC0gTm90aWZpZXMgdGhhdCBhbiBvcHRpb24gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gKiBAZXZlbnQge0N1c3RvbUV2ZW50PHZvaWQ+fSB3aWxsT3BlbiAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgc3RhcnRzIHRoZSBvcGVuaW5nIHRyYW5zaXRpb24uIENhbiBiZSBjYW5jZWxlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZE9wZW4gLSBFbWl0cyB3aGVuZXZlciB0aGUgYHNiYi1zZWxlY3RgIGlzIG9wZW5lZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IHdpbGxDbG9zZSAtIEVtaXRzIHdoZW5ldmVyIHRoZSBgc2JiLXNlbGVjdGAgYmVnaW5zIHRoZSBjbG9zaW5nIHRyYW5zaXRpb24uIENhbiBiZSBjYW5jZWxlZC5cbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8dm9pZD59IGRpZENsb3NlIC0gRW1pdHMgd2hlbmV2ZXIgdGhlIGBzYmItc2VsZWN0YCBpcyBjbG9zZWQuXG4gKiBAY3NzcHJvcCBbLS1zYmItc2VsZWN0LXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqIEBvdmVycmlkZVR5cGUgdmFsdWUgLSBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGxcbiAqL1xuZXhwb3J0XG5AY3VzdG9tRWxlbWVudCgnc2JiLXNlbGVjdCcpXG5AaG9zdEF0dHJpYnV0ZXMoe1xuICByb2xlOiBhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG51bGwsXG59KVxuY2xhc3MgU2JiU2VsZWN0RWxlbWVudCBleHRlbmRzIFNiYlVwZGF0ZVNjaGVkdWxlck1peGluKFxuICBTYmJEaXNhYmxlZE1peGluKFxuICAgIFNiYk5lZ2F0aXZlTWl4aW4oXG4gICAgICBTYmJIeWRyYXRpb25NaXhpbihcbiAgICAgICAgU2JiUmVxdWlyZWRNaXhpbihcbiAgICAgICAgICBTYmJGb3JtQXNzb2NpYXRlZE1peGluPHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCwgc3RyaW5nIHwgc3RyaW5nW10+KFxuICAgICAgICAgICAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbikge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvLyBGSVhNRSB1c2luZyAuLi5zdXBlci5ldmVudHMgcmVxdWlyZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYmItZGVzaWduLXN5c3RlbXMvbHluZS1jb21wb25lbnRzL2lzc3Vlcy8yNjAwXG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRpZENoYW5nZTogJ2RpZENoYW5nZScsXG4gICAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgICBpbnB1dDogJ2lucHV0JyxcbiAgICBzdGF0ZUNoYW5nZTogJ3N0YXRlQ2hhbmdlJyxcbiAgICB3aWxsT3BlbjogJ3dpbGxPcGVuJyxcbiAgICBkaWRPcGVuOiAnZGlkT3BlbicsXG4gICAgd2lsbENsb3NlOiAnd2lsbENsb3NlJyxcbiAgICBkaWRDbG9zZTogJ2RpZENsb3NlJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHBsYWNlaG9sZGVyIHVzZWQgaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgYWxsb3dzIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgcmVhZG9ubHkuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgdmFsdWUgZGlzcGxheWVkIGJ5IHRoZSBjb21wb25lbnQuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2Rpc3BsYXlWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIG9ubHkgdXNlZCBmb3IgUmVhY3QuIFdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBvbmNlIFJlYWN0IDE5IGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgX2RpZENoYW5nZTogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcih0aGlzLCBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5kaWRDaGFuZ2UpO1xuXG4gIC8qKiBOb3RpZmllcyB0aGF0IHRoZSBjb21wb25lbnQncyB2YWx1ZSBoYXMgY2hhbmdlZC4gKi9cbiAgcHJpdmF0ZSBfY2hhbmdlOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKHRoaXMsIFNiYlNlbGVjdEVsZW1lbnQuZXZlbnRzLmNoYW5nZSk7XG5cbiAgLyoqIE5vdGlmaWVzIHRoYXQgYW4gb3B0aW9uIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLiAqL1xuICBwcml2YXRlIF9pbnB1dDogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcih0aGlzLCBTYmJTZWxlY3RFbGVtZW50LmV2ZW50cy5pbnB1dCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9zdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPFNlbGVjdENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKFxuICAgIHRoaXMsXG4gICAgU2JiU2VsZWN0RWxlbWVudC5ldmVudHMuc3RhdGVDaGFuZ2UsXG4gICAge1xuICAgICAgY29tcG9zZWQ6IGZhbHNlLFxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBfb3ZlcmxheSE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcHRpb25Db250YWluZXIhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3JpZ2luRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9vdmVybGF5SWQgPSBgc2JiLXNlbGVjdC0keysrbmV4dElkfWA7XG4gIHByaXZhdGUgX2FjdGl2ZUl0ZW1JbmRleCA9IC0xO1xuICBwcml2YXRlIF9zZWFyY2hUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX3NlYXJjaFN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9kaWRMb2FkID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzUG9pbnRlckRvd25FdmVudE9uTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSAnY29tYm9ib3gnIGlucHV0IGVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJFbGVtZW50O1xuICB9XG5cbiAgLyoqIEdldHMgYWxsIHRoZSBTYmJPcHRpb25FbGVtZW50IHByb2plY3RlZCBpbiB0aGUgc2VsZWN0LiAqL1xuICBwcml2YXRlIGdldCBfb3B0aW9ucygpOiBTYmJPcHRpb25FbGVtZW50W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbD8uKCdzYmItb3B0aW9uJykgPz8gW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2ZpbHRlcmVkT3B0aW9ucygpOiBTYmJPcHRpb25FbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHQ6IFNiYk9wdGlvbkVsZW1lbnQpID0+ICFvcHQuZGlzYWJsZWQgJiYgIW9wdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZ3JvdXAtZGlzYWJsZWQnKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBuZXcgTXV0YXRpb25Db250cm9sbGVyKHRoaXMsIHtcbiAgICAgIGNvbmZpZzogeyBhdHRyaWJ1dGVGaWx0ZXI6IFsnYXJpYS1sYWJlbGxlZGJ5J10gfSxcbiAgICAgIGNhbGxiYWNrOiAobXV0YXRpb25zTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4gdGhpcy5fb25TZWxlY3RBdHRyaWJ1dGVzQ2hhbmdlKG11dGF0aW9uc0xpc3QpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRPRE86IEFjY2Vzc2liaWxpdHkgZml4IHJlcXVpcmVkIHRvIGNvcnJlY3RseSByZWFkIHRoZSBsYWJlbDtcbiAgICogY2FuIGJlIHBvc3NpYmx5IHJlbW92ZWQgYWZ0ZXIgdGhlIG1lcmdlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9zYmItZGVzaWduLXN5c3RlbXMvbHluZS1jb21wb25lbnRzL2lzc3Vlcy8zMDYyXG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdEF0dHJpYnV0ZXNDaGFuZ2UobXV0YXRpb25zTGlzdDogTXV0YXRpb25SZWNvcmRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkge1xuICAgICAgaWYgKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdhcmlhLWxhYmVsbGVkYnknKSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScsXG4gICAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpISxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT3BlbnMgdGhlIHNlbGVjdGlvbiBwYW5lbC4gKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZSAhPT0gJ2Nsb3NlZCcgfHxcbiAgICAgICF0aGlzLl9vdmVybGF5IHx8XG4gICAgICB0aGlzLl9vcHRpb25zLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgdGhpcy5kaXNhYmxlZCB8fFxuICAgICAgdGhpcy5mb3JtRGlzYWJsZWRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud2lsbE9wZW4uZW1pdCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCk7XG4gIH1cblxuICAvKiogQ2xvc2VzIHRoZSBzZWxlY3Rpb24gcGFuZWwuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMud2lsbENsb3NlLmVtaXQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBjdXJyZW50IGRpc3BsYXllZCB2YWx1ZS4gKi9cbiAgcHVibGljIGdldERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5VmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKiogTGlzdGVucyB0byBvcHRpb24gY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25DaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBTYmJPcHRpb25FbGVtZW50O1xuICAgIGlmICh0YXJnZXQuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX29uT3B0aW9uU2VsZWN0ZWQodGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25PcHRpb25EZXNlbGVjdGVkKHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25PcHRpb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBTYmJTZWxlY3RFbGVtZW50IHwgU2JiT3B0aW9uRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSAhPT0gJ3NiYi1vcHRpb24nIHx8IHRhcmdldC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBfZGlzcGxheVZhbHVlIGJ5IGNoZWNraW5nIHRoZSBpbnRlcm5hbCBzYmItb3B0aW9ucyBhbmQgc2V0dGluZyB0aGUgY29ycmVjdCBgc2VsZWN0ZWRgIHZhbHVlIG9uIHRoZW0uICovXG4gIHByaXZhdGUgX29uVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IG9wdGlvbnMuZmluZCgobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpID09PSBuZXdWYWx1ZSk7XG4gICAgICBpZiAob3B0aW9uRWxlbWVudCkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpICE9PSBuZXdWYWx1ZSlcbiAgICAgICAgLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IG9wdGlvbkVsZW1lbnQ/LnRleHRDb250ZW50IHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnNcbiAgICAgICAgLmZpbHRlcigobykgPT4gIW5ld1ZhbHVlLmluY2x1ZGVzKG8udmFsdWUgPz8gby5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpKVxuICAgICAgICAuZm9yRWFjaCgoZSkgPT4gKGUuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25FbGVtZW50cyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PlxuICAgICAgICBuZXdWYWx1ZS5pbmNsdWRlcyhvLnZhbHVlID8/IG8uZ2V0QXR0cmlidXRlKCd2YWx1ZScpKSxcbiAgICAgICk7XG4gICAgICBzZWxlY3RlZE9wdGlvbkVsZW1lbnRzLmZvckVhY2goKG8pID0+IChvLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gc2VsZWN0ZWRPcHRpb25FbGVtZW50cy5tYXAoKG8pID0+IG8udGV4dENvbnRlbnQpLmpvaW4oJywgJykgfHwgbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2UuZW1pdCh7IHR5cGU6ICd2YWx1ZScsIHZhbHVlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGZvY3VzIGJlaGF2aW9yXG4gICAgdGhpcy5mb2N1cyA9ICgpID0+IHRoaXMuX3RyaWdnZXJFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5ibHVyID0gKCkgPT4gdGhpcy5fdHJpZ2dlckVsZW1lbnQuYmx1cigpO1xuXG4gICAgLy8gV2FpdCBmb3Igc3NyIGh5ZHJhdGlvblxuICAgIGlmICghaXNOZXh0anMoKSkge1xuICAgICAgdGhpcy5zdGFydFVwZGF0ZSgpO1xuICAgICAgdGhpcy5fc2V0dXBTZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlbGVtZW50J3MgZmlyc3QgYXR0cmlidXRlIHdob3NlIHF1YWxpZmllZCBuYW1lIGlzIHF1YWxpZmllZE5hbWUuXG4gICAqXG4gICAqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRWxlbWVudC9yZW1vdmVBdHRyaWJ1dGUpXG4gICAqIEBpbnRlcm5hbCBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgZHVlIHRvIGEgaHlkcmF0aW9uIGlzc3VlIHdpdGggTmV4dC5qcy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gSW4gTmV4dC5qcyB0aGUgaHlkcmF0aW9uIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIGxpZ2h0IERPTS5cbiAgICAvLyBAbGl0L3JlYWN0IGNhbGxzIHJlbW92ZUF0dHJpYnV0ZSgnZGVmZXItaHlkcmF0aW9uJykgaW4gYSB1c2VMYXlvdXRFZmZlY3QsXG4gICAgLy8gd2hpY2ggaXMgZG9uZSBhZnRlciBoeWRyYXRpb24gaXMgZmluaXNoZWQuIER1ZSB0byB0aGlzIHdlIGludGVyY2VwdCB0aGlzIGNhbGxcbiAgICAvLyBpbiBvdmVycmlkaW5nIHJlbW92ZUF0dHJpYnV0ZSB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIHNiYi1zZWxlY3QuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvYmxvYi9tYWluL3BhY2thZ2VzL3JlYWN0L3NyYy9jcmVhdGUtY29tcG9uZW50LnRzI0wyOTMtTDI5NlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byB3YWl0IGZvciB1cGRhdGUgY29tcGxldGUgaW4gb3JkZXIgdG8gYmUgc3VyZSB0aGF0IHRoZSBzaGFkb3cgRE9NIGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgIGlmIChpc05leHRqcygpICYmIHF1YWxpZmllZE5hbWUgPT09ICdkZWZlci1oeWRyYXRpb24nICYmICF0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5fc2V0dXBTZWxlY3QoKSk7XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKGFyaWFSb2xlT25Ib3N0KSB7XG4gICAgICB0aGlzLmlkIHx8PSB0aGlzLl9vdmVybGF5SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fYWJvcnQuc2lnbmFsO1xuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXMuY2xvc2VzdD8uKCdbZGF0YS1mb3JtLWZpZWxkXScpO1xuXG4gICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IGZvcm1GaWVsZC5oYXNBdHRyaWJ1dGUoJ25lZ2F0aXZlJyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy5fc2V0dXBPcmlnaW4oKTtcbiAgICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fb25WYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ29wdGlvblNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAoZTogQ3VzdG9tRXZlbnQ8dm9pZD4pID0+IHRoaXMuX29uT3B0aW9uQ2hhbmdlZChlKSxcbiAgICAgIHsgc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnY2xpY2snLFxuICAgICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fb25PcHRpb25DbGljayhlKTtcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmluZygpO1xuICAgICAgfSxcbiAgICAgIHsgc2lnbmFsIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gT24gaW5pdGlhbGl6YXRpb24sIHRoZSAnX29uVmFsdWVDaGFuZ2VkJyBpcyBjYWxsZWQgYnkgdGhlIGNvbm5lY3RlZENhbGxiYWNrXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygndmFsdWUnKSAmJiB0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLl9vblZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlISk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ25lZ2F0aXZlJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdtdWx0aXBsZScpKSB7XG4gICAgICB0aGlzLl9zeW5jUHJvcGVydGllcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucHJlcGVuZCh0aGlzLl90cmlnZ2VyRWxlbWVudCk7IC8vIFRha2UgYmFjayB0aGUgdHJpZ2dlciBlbGVtZW50IHByZXZpb3VzbHkgbW92ZWQgdG8gdGhlIGxpZ2h0IERPTVxuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgKHRoaXMudmFsdWUgYXMgc3RyaW5nW10pLmZvckVhY2goKGVsKSA9PiBkYXRhLmFwcGVuZCh0aGlzLm5hbWUsIGVsKSk7XG4gICAgICB0aGlzLmludGVybmFscy5zZXRGb3JtVmFsdWUoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLnZhbHVlIGFzIHN0cmluZyB8IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzZXQgdmFsdWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAodGhlIHNldHVwIHZhbHVlKSwgbnVsbCBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSA/IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgIF9yZWFzb246IEZvcm1SZXN0b3JlUmVhc29uLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgLy8gaWYgbXVsdGlwbGUsIHRoZSBzdGF0ZSBmb3JtYXQgaXMgWydmaWVsZC1uYW1lJywgJ3ZhbHVlJ11bXVxuICAgICAgdGhpcy52YWx1ZSA9IChzdGF0ZSBhcyBbc3RyaW5nLCBzdHJpbmddW10pLm1hcCgoZW50cmllcykgPT4gZW50cmllc1sxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSBzdGF0ZSBhcyBzdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Byb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy4oJ3NiYi1kaXZpZGVyJykuZm9yRWFjaCgoZWxlbWVudCkgPT4gKGVsZW1lbnQubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlKSk7XG5cbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJPcHRpb25FbGVtZW50IHwgU2JiT3B0R3JvdXBFbGVtZW50PihcbiAgICAgICdzYmItb3B0aW9uLCBzYmItb3B0Z3JvdXAnLFxuICAgICkuZm9yRWFjaCgoZWxlbWVudDogU2JiT3B0aW9uRWxlbWVudCB8IFNiYk9wdEdyb3VwRWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtbmVnYXRpdmUnLCB0aGlzLm5lZ2F0aXZlKTtcbiAgICAgIGVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLW11bHRpcGxlJywgdGhpcy5tdWx0aXBsZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFNlbGVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIHRoaXMuX2RpZExvYWQgPSB0cnVlO1xuICAgIHRoaXMuY29tcGxldGVVcGRhdGUoKTtcbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBvcmlnaW5FbGVtZW50OyBpZiB0aGUgY29tcG9uZW50IGlzIHVzZWQgaW4gYSBzYmItZm9ybS1maWVsZCB1c2VzIGl0LCBvdGhlcndpc2UgdXNlcyB0aGUgcGFyZW50RWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBfc2V0dXBPcmlnaW4oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUZpZWxkID0gdGhpcy5jbG9zZXN0Py4oJ3NiYi1mb3JtLWZpZWxkJyk7XG4gICAgdGhpcy5fb3JpZ2luRWxlbWVudCA9XG4gICAgICBmb3JtRmllbGQ/LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I/LignI292ZXJsYXktYW5jaG9yJykgPz8gdGhpcy5wYXJlbnRFbGVtZW50ITtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoXG4gICAgICAgICdkYXRhLW9wdGlvbi1wYW5lbC1vcmlnaW4tYm9yZGVybGVzcycsXG4gICAgICAgICEhZm9ybUZpZWxkPy5oYXNBdHRyaWJ1dGU/LignYm9yZGVybGVzcycpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gYXNzZXNzIHNjcmVlbi1yZWFkZXJzIHByb2JsZW1zIGNhdXNlZCBieSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBhcmlhIHBhdHRlcm5zIGFuZCBzaGFkb3cgRE9NLFxuICAgKiB3ZSBhcmUgZm9yY2VkIHRvIG1vdmUgdGhlICdjb21ib2JveCcgdHJpZ2dlciBlbGVtZW50IHRvIHRoZSBsaWdodCBET01cbiAgICovXG4gIHByaXZhdGUgX3NldHVwVHJpZ2dlcigpOiB2b2lkIHtcbiAgICAvLyBNb3ZlIHRoZSB0cmlnZ2VyIGJlZm9yZSB0aGUgc2JiLXNlbGVjdFxuICAgIHRoaXMucGFyZW50RWxlbWVudCEuaW5zZXJ0QmVmb3JlPy4odGhpcy5fdHJpZ2dlckVsZW1lbnQsIHRoaXMpO1xuXG4gICAgLy8gU2V0IHRoZSBpbnZpc2libGUgdHJpZ2dlciBlbGVtZW50IGRpbWVuc2lvbiB0byBtYXRjaCB0aGUgcGFyZW50IChuZWVkZWQgZm9yIHNjcmVlbiByZWFkZXJzKVxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKSA/PyB0aGlzO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2NvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0fXB4YDtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke2NvbnRhaW5lckVsZW1lbnQub2Zmc2V0V2lkdGh9cHhgO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3ZlcmxheVBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHNldE92ZXJsYXlQb3NpdGlvbihcbiAgICAgIHRoaXMuX292ZXJsYXksXG4gICAgICB0aGlzLl9vcmlnaW5FbGVtZW50LFxuICAgICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJykhLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9XG5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vbkFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5fb25PcGVuQW5pbWF0aW9uRW5kKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnICYmIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgdGhpcy5fb25DbG9zZUFuaW1hdGlvbkVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29uT3BlbkFuaW1hdGlvbkVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG4gICAgdGhpcy5fYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcblxuICAgIHRoaXMuZGlkT3Blbi5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNsb3NlQW5pbWF0aW9uRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB0aGlzLl9yZXNldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB0aGlzLl9vcHRpb25Db250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLmRpZENsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZCwgdXBkYXRlcyB0aGUgZGlzcGxheVZhbHVlOyBpdCBhbHNvIGNsb3NlcyB0aGUgc2VsZWN0IGlmIG5vdCBgbXVsdGlwbGVgLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvblNlbGVjdGVkKG9wdGlvblNlbGVjdGlvbkNoYW5nZTogU2JiT3B0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zXG4gICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmlkICE9PSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UuaWQpXG4gICAgICAgIC5mb3JFYWNoKChvcHRpb24pID0+IChvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnZhbHVlLmluY2x1ZGVzKG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSEpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgIHRoaXMuX2NoYW5nZS5lbWl0KCk7XG4gICAgdGhpcy5fZGlkQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyB1bnNlbGVjdGVkIGluIGBtdWx0aXBsZWAsIHJlbW92ZXMgaXQgZnJvbSB2YWx1ZSBhbmQgdXBkYXRlcyBkaXNwbGF5VmFsdWUuICovXG4gIHByaXZhdGUgX29uT3B0aW9uRGVzZWxlY3RlZChvcHRpb25TZWxlY3Rpb25DaGFuZ2U6IFNiYk9wdGlvbkVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIGFzIHN0cmluZ1tdKS5maWx0ZXIoXG4gICAgICAgIChlbDogc3RyaW5nKSA9PiBlbCAhPT0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5faW5wdXQuZW1pdCgpO1xuICAgICAgdGhpcy5fY2hhbmdlLmVtaXQoKTtcbiAgICAgIHRoaXMuX2RpZENoYW5nZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgb3ZlcmxheSBwb3NpdGlvbiBvbiBzY3JvbGwgYW5kIHdpbmRvdyByZXNpemVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2tcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCAoZXYpID0+IHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIoZXYpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCAoZXYpID0+IHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrKGV2KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnKSB7XG4gICAgICB0aGlzLl9vcGVuZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHRoaXMuX2Nsb3NlZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29wZW5lZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRvbmx5IHx8IHRoaXMuc3RhdGUgIT09ICdvcGVuZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NoZWNrRm9yTGV0dGVyU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdEJ5S2V5Ym9hcmQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIDApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdDbGVhcicgfHxcbiAgICAgIChldmVudC5rZXkubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGV2ZW50LmtleSAhPT0gJyAnICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldE5leHRBY3RpdmVPcHRpb25CeVRleHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGltZW91dCBhbmQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zZWFyY2hUaW1lb3V0ID09PSB0eXBlb2Ygc2V0VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlYXJjaFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5fc2VhcmNoU3RyaW5nID0gJycpLCAxMDAwKTtcbiAgICB0aGlzLl9zZWFyY2hTdHJpbmcgKz0gZXZlbnQua2V5O1xuXG4gICAgLy8gUmVvcmRlciB0aGUgX2ZpbHRlcmVkT3B0aW9uIGFycmF5IHRvIGhhdmUgdGhlIGxhc3Qgc2VsZWN0ZWQgZWxlbWVudCBhdCB0aGUgYm90dG9tLlxuICAgIGNvbnN0IGluZGV4Rm9yU2xpY2U6IG51bWJlciA9IHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCArIDE7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zU29ydGVkOiBTYmJPcHRpb25FbGVtZW50W10gPSBbXG4gICAgICAuLi50aGlzLl9maWx0ZXJlZE9wdGlvbnMuc2xpY2UoaW5kZXhGb3JTbGljZSksXG4gICAgICAuLi50aGlzLl9maWx0ZXJlZE9wdGlvbnMuc2xpY2UoMCwgaW5kZXhGb3JTbGljZSksXG4gICAgXTtcblxuICAgIGNvbnN0IG1hdGNoID0gZmlsdGVyZWRPcHRpb25zU29ydGVkLmZpbmQoXG4gICAgICAob3B0aW9uOiBTYmJPcHRpb25FbGVtZW50KSA9PlxuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIC8vIElmIGFuIGV4YWN0IG1hdGNoIGhhcyBiZWVuIGZvdW5kLCBnbyB0byB0aGF0IG9wdGlvbi5cbiAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5pbmRleE9mKG1hdGNoKSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZy5sZW5ndGggPiAxICYmXG4gICAgICBuZXcgUmVnRXhwKGBeJHt0aGlzLl9zZWFyY2hTdHJpbmcuY2hhckF0KDApfSokYCkudGVzdCh0aGlzLl9zZWFyY2hTdHJpbmcpXG4gICAgKSB7XG4gICAgICAvLyBJZiBubyBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCBidXQgdGhlIHN0cmluZyB0byBzZWFyY2ggaXMgbWFkZSBieSB0aGUgc2FtZSByZXBlYXRlZCBsZXR0ZXIsXG4gICAgICAvLyBnbyB0byB0aGUgZmlyc3QgZWxlbWVudCwgaWYgZXhpc3RzLCB0aGF0IG1hdGNoZXMgdGhlIGxldHRlci5cbiAgICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQuZmluZChcbiAgICAgICAgKG9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCkgPT5cbiAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmdbMF0udG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgICApO1xuICAgICAgaWYgKGZpcnN0TWF0Y2gpIHtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmluZGV4T2YoZmlyc3RNYXRjaCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBtYXRjaCBmb3VuZCwgY2xlYXIgdGhlIHRpbWVvdXQgYW5kIHRoZSBzZWFyY2ggdGVybS5cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZWFyY2hUaW1lb3V0KTtcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEJ5S2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgYWN0aXZlT3B0aW9uLnNldFNlbGVjdGVkVmlhVXNlckludGVyYWN0aW9uKCFhY3RpdmVPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0SW5kZXggPVxuICAgICAgaW5kZXggPz8gZ2V0TmV4dEVsZW1lbnRJbmRleChldmVudCwgdGhpcy5fYWN0aXZlSXRlbUluZGV4LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMubGVuZ3RoKTtcbiAgICBjb25zdCBuZXh0T3B0aW9uID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW25leHRJbmRleF07XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICB0aGlzLl9zZXRBY3RpdmVFbGVtZW50KG5leHRPcHRpb24sIGFjdGl2ZU9wdGlvbik7XG5cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3NldFNlbGVjdGVkRWxlbWVudChuZXh0T3B0aW9uLCBhY3RpdmVPcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnNoaWZ0S2V5KSB7XG4gICAgICBuZXh0T3B0aW9uLnNldFNlbGVjdGVkVmlhVXNlckludGVyYWN0aW9uKCFuZXh0T3B0aW9uLnNlbGVjdGVkKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gbmV4dEluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0QWN0aXZlRWxlbWVudChcbiAgICBuZXh0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50LFxuICAgIGxhc3RBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgICBzZXRBY3RpdmVEZXNjZW5kYW50ID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG5cbiAgICBpZiAoc2V0QWN0aXZlRGVzY2VuZGFudCkge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCBuZXh0QWN0aXZlT3B0aW9uLmlkKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgcHJldmlvdXNcbiAgICBpZiAobGFzdEFjdGl2ZU9wdGlvbiAmJiBsYXN0QWN0aXZlT3B0aW9uICE9PSBuZXh0QWN0aXZlT3B0aW9uKSB7XG4gICAgICBsYXN0QWN0aXZlT3B0aW9uLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2VsZWN0ZWRFbGVtZW50KFxuICAgIG5leHRBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQsXG4gICAgbGFzdEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudCxcbiAgKTogdm9pZCB7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zZXRTZWxlY3RlZFZpYVVzZXJJbnRlcmFjdGlvbih0cnVlKTtcblxuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb24uc2V0U2VsZWN0ZWRWaWFVc2VySW50ZXJhY3Rpb24oZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0QWN0aXZlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgYWN0aXZlRWxlbWVudC5zZXRBY3RpdmUoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSAtMTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIG1lbnUuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uTWVudSA9IGlzRXZlbnRPbkVsZW1lbnQodGhpcy5fb3ZlcmxheSwgZXZlbnQpO1xuICB9O1xuXG4gIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uTWVudSAmJiAhaXNFdmVudE9uRWxlbWVudCh0aGlzLl9vdmVybGF5LCBldmVudCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfc2V0VmFsdWVGcm9tU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zLmZpbmRJbmRleChcbiAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24gPT09IHNlbGVjdGVkT3B0aW9uLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWRPcHRpb24udmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90b2dnbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmZvY3VzKCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgIGNhc2UgJ29wZW5lZCc6IHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Nsb3NlZCc6IHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoXG4gICAgcGxhY2Vob2xkZXI6IFRlbXBsYXRlUmVzdWx0LFxuICApOiAoVGVtcGxhdGVSZXN1bHQgfCBQcm9taXNlPFRlbXBsYXRlUmVzdWx0PilbXSB7XG4gICAgcmV0dXJuIFt0aGlzLl9kZWZlcnJlZERpc3BsYXlWYWx1ZShwbGFjZWhvbGRlciksIHBsYWNlaG9sZGVyXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2RlZmVycmVkRGlzcGxheVZhbHVlKHBsYWNlaG9sZGVyOiBUZW1wbGF0ZVJlc3VsdCk6IFByb21pc2U8VGVtcGxhdGVSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgYXdhaXQgdGhpcy5oeWRyYXRpb25Db21wbGV0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlWYWx1ZSA/IGh0bWxgJHt0aGlzLl9kaXNwbGF5VmFsdWV9YCA6IHBsYWNlaG9sZGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8IS0tIFRoaXMgZWxlbWVudCBpcyB2aXN1YWxseSBoaWRkZW4gYW5kIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGxpZ2h0IERPTSB0byBhbGxvdyBzY3JlZW5cbiAgICAgIHJlYWRlcnMgdG8gd29yayBwcm9wZXJseSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCJcbiAgICAgICAgdGFiaW5kZXg9JHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkID8gbm90aGluZyA6ICcwJ31cbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICBhcmlhLXJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZC50b1N0cmluZygpfVxuICAgICAgICBhcmlhLWNvbnRyb2xzPSR7dGhpcy5fb3ZlcmxheUlkfVxuICAgICAgICBhcmlhLW93bnM9JHt0aGlzLl9vdmVybGF5SWR9XG4gICAgICAgIEBrZXlkb3duPSR7dGhpcy5fb25LZXlEb3dufVxuICAgICAgICBAY2xpY2s9JHt0aGlzLl90b2dnbGVPcGVuaW5nfVxuICAgICAgICAke3JlZigocmVmKSA9PiAodGhpcy5fdHJpZ2dlckVsZW1lbnQgPSByZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgID5cbiAgICAgICAgJHt1bnRpbCguLi50aGlzLl9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShodG1sYDxzcGFuPiR7dGhpcy5wbGFjZWhvbGRlcn08L3NwYW4+YCkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlzdWFsbHkgZGlzcGxheSB0aGUgdmFsdWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fdHJpZ2dlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAke3VudGlsKFxuICAgICAgICAgIC4uLnRoaXMuX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKFxuICAgICAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz1cInNiYi1zZWxlY3RfX3RyaWdnZXItLXBsYWNlaG9sZGVyXCI+JHt0aGlzLnBsYWNlaG9sZGVyfTwvc3Bhbj5gLFxuICAgICAgICAgICksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj4ke292ZXJsYXlHYXBGaXhDb3JuZXJzKCl9PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25BbmltYXRpb25FbmR9XG4gICAgICAgICAgY2xhc3M9XCJzYmItc2VsZWN0X19wYW5lbFwiXG4gICAgICAgICAgJHtyZWYoKGRpYWxvZ1JlZikgPT4gKHRoaXMuX292ZXJsYXkgPSBkaWFsb2dSZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X193cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGlkPSR7IWFyaWFSb2xlT25Ib3N0ID8gdGhpcy5fb3ZlcmxheUlkIDogbm90aGluZ31cbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc2VsZWN0X19vcHRpb25zXCJcbiAgICAgICAgICAgICAgcm9sZT0keyFhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgID9hcmlhLW11bHRpc2VsZWN0YWJsZT0ke3RoaXMubXVsdGlwbGV9XG4gICAgICAgICAgICAgICR7cmVmKChjb250YWluZXJSZWYpID0+ICh0aGlzLl9vcHRpb25Db250YWluZXIgPSBjb250YWluZXJSZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLl9zZXRWYWx1ZUZyb21TZWxlY3RlZE9wdGlvbn0+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlbGVjdCc6IFNiYlNlbGVjdEVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTYmJTZWxlY3RFbGVtZW50IiwiX2EiLCJzdGF0ZSIsInJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLE1BQU0saUJBQWlCO0FBRXZCLElBQUksU0FBUztJQTRCUCxvQkFBZ0IsTUFBQTs7QUFKckIsTUFBQSxtQkFBQSxDQUFBLGNBQWMsWUFBWSxHQUMxQixlQUFlO0FBQUEsSUFDZCxNQUFNLGlCQUFpQixZQUFZO0FBQUEsRUFBQSxDQUNwQyxDQUFDOzs7O0FBQzZCLE1BQUEsY0FBQSx3QkFDN0IsaUJBQ0UsaUJBQ0Usa0JBQ0UsaUJBQ0UsdUJBQ0UsdUJBQXVCLENBQ3hCLENBQ0YsQ0FDRixDQUNGLENBQ0Y7Ozs7Ozs7Ozs7Ozs7QUFYb0JBLE1BQUFBLHFCQUFBLG1CQUFRLFlBWTlCO0FBQUEsSUFxRkMsY0FBQTs7QUFuRUE7QUFLQTtBQUtBO0FBR1M7QUFiTyx5QkFBQSwrQkFBQSxrQkFBQSxNQUFBLDJCQUFzQixFQUFFO0FBS3hCLHlCQUFBLDZCQUFBLGtCQUFBLE1BQUEsOEJBQUEsR0FBQSxrQkFBQSxNQUFBLHdCQUFvQixLQUFLO0FBS3pCLHlCQUFBLDZCQUFBLGtCQUFBLE1BQUEsMkJBQUEsR0FBQSxrQkFBQSxNQUFBLHdCQUFvQixLQUFLO0FBR2YseUJBQUEsa0NBQUEsa0JBQUEsTUFBQSwyQkFBQSxHQUFBLGtCQUFBLE1BQUEsNkJBQStCLElBQUk7QUFLckQsV0FBQSxjQUEyQixrQkFBQSxNQUFBLGdDQUFBLEdBQUEsSUFBSSxhQUFhLE1BQU1BLGtCQUFpQixPQUFPLFNBQVM7QUFHbkYsV0FBQSxVQUF3QixJQUFJLGFBQWEsTUFBTUEsa0JBQWlCLE9BQU8sTUFBTTtBQUc3RSxXQUFBLFNBQXVCLElBQUksYUFBYSxNQUFNQSxrQkFBaUIsT0FBTyxLQUFLO0FBRzNFLFdBQVksZUFBK0IsSUFBSSxhQUNyRCxNQUNBQSxrQkFBaUIsT0FBTyxhQUN4QjtBQUFBLFFBQ0UsVUFBVTtBQUFBLE1BQUEsQ0FDWDtBQVFLLFdBQUEsYUFBYSxjQUFjLEVBQUUsTUFBTTtBQUNuQyxXQUFnQixtQkFBRztBQUVuQixXQUFhLGdCQUFHO0FBQ2hCLFdBQVEsV0FBRztBQUNYLFdBQXlCLDRCQUFZO0FBQ3JDLFdBQUEsU0FBUyxJQUFJLDRCQUE0QixJQUFJO0FBc2tCN0MsV0FBQSx1QkFBdUIsQ0FBQyxVQUE2QjtBQUMzRCxhQUFLLDRCQUE0QixpQkFBaUIsS0FBSyxVQUFVLEtBQUs7QUFBQSxNQUN4RTtBQUdRLFdBQUEsd0JBQXdCLENBQUMsVUFBNkI7QUFDeEQsWUFBQSxDQUFDLEtBQUssNkJBQTZCLENBQUMsaUJBQWlCLEtBQUssVUFBVSxLQUFLLEdBQUc7QUFDOUUsZUFBSyxNQUFLO0FBQUEsUUFBQTtBQUFBLE1BRWQ7QUF2akJFLFVBQUksbUJBQW1CLE1BQU07QUFBQSxRQUMzQixRQUFRLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUc7QUFBQSxRQUNoRCxVQUFVLENBQUMsa0JBQW9DLEtBQUssMEJBQTBCLGFBQWE7QUFBQSxNQUFBLENBQzVGO0FBQUEsSUFBQTtBQUFBO0FBQUEsSUF6RUgsSUFBZ0IsY0FBeUI7QUFBQSxhQUFBLG1CQUFBO0FBQUEsSUFBQTtBQUFBLElBQXpDLElBQWdCLFlBQXlCLE9BQUE7QUFBQSx5QkFBQSwrQkFBQTtBQUFBLElBQUE7QUFBQTtBQUFBLElBS3pDLElBQWdCLFdBQTBCO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUExQyxJQUFnQixTQUEwQixPQUFBO0FBQUEseUJBQUEsNEJBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQSxJQUsxQyxJQUFnQixXQUEwQjtBQUFBLGFBQUEsbUJBQUE7QUFBQSxJQUFBO0FBQUEsSUFBMUMsSUFBZ0IsU0FBMEIsT0FBQTtBQUFBLHlCQUFBLDRCQUFBO0FBQUEsSUFBQTtBQUFBO0FBQUEsSUFHakMsSUFBaUIsZ0JBQW9DO0FBQUEsYUFBQSxtQkFBQTtBQUFBLElBQUE7QUFBQSxJQUFyRCxJQUFpQixjQUFvQyxPQUFBO0FBQUEseUJBQUEsaUNBQUE7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQXVDOUQsSUFBVyxlQUFZO0FBQ3JCLGFBQU8sS0FBSztBQUFBLElBQUE7QUFBQTtBQUFBLElBSWQsSUFBWSxXQUFROztBQUNsQixhQUFPLE1BQU0sT0FBS0MsTUFBQSxLQUFLLHFCQUFMLGdCQUFBQSxJQUFBLFdBQXdCLGtCQUFpQixFQUFFO0FBQUEsSUFBQTtBQUFBLElBRy9ELElBQVksbUJBQWdCO0FBQzFCLGFBQU8sS0FBSyxTQUFTLE9BQ25CLENBQUMsUUFBMEIsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLGFBQWEscUJBQXFCLENBQUM7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWlCaEYsMEJBQTBCLGVBQStCOztBQUMvRCxpQkFBVyxZQUFZLGVBQWU7QUFDaEMsWUFBQSxTQUFTLGtCQUFrQixtQkFBbUI7QUFDaEQsV0FBQUEsTUFBQSxLQUFLLG9CQUFMLGdCQUFBQSxJQUFzQixhQUNwQixtQkFDQSxLQUFLLGFBQWEsaUJBQWlCO0FBQUEsUUFBRTtBQUFBLE1BRXpDO0FBQUEsSUFDRjtBQUFBO0FBQUEsSUFJSyxPQUFJO0FBQ1QsVUFDRSxLQUFLLFVBQVUsWUFDZixDQUFDLEtBQUssWUFDTixLQUFLLFNBQVMsV0FBVyxLQUN6QixLQUFLLFlBQ0wsS0FBSyxjQUNMO0FBQ0E7QUFBQSxNQUFBO0FBR0YsVUFBSSxDQUFDLEtBQUssU0FBUyxRQUFRO0FBQ3pCO0FBQUEsTUFBQTtBQUVGLFdBQUssUUFBUTtBQUNiLFdBQUssb0JBQW1CO0FBQUEsSUFBQTtBQUFBO0FBQUEsSUFJbkIsUUFBSztBQUNOLFVBQUEsS0FBSyxVQUFVLFVBQVU7QUFDM0I7QUFBQSxNQUFBO0FBR0YsVUFBSSxDQUFDLEtBQUssVUFBVSxRQUFRO0FBQzFCO0FBQUEsTUFBQTtBQUVGLFdBQUssUUFBUTtBQUNiLFdBQUssMkJBQTJCOzs7SUFJM0Isa0JBQWU7QUFDcEIsYUFBTyxLQUFLLGlCQUFpQjtBQUFBLElBQUE7QUFBQTtBQUFBLElBSXZCLGlCQUFpQixPQUFZO0FBQ25DLFlBQU0sU0FBUyxNQUFNO0FBQ3JCLFVBQUksT0FBTyxVQUFVO0FBQ25CLGFBQUssa0JBQWtCLE1BQU07QUFBQSxNQUFBLE9BQ3hCO0FBQ0wsYUFBSyxvQkFBb0IsTUFBTTtBQUFBLE1BQUE7QUFBQSxJQUNqQztBQUFBLElBR00sZUFBZSxPQUFpQjtBQUN0QyxZQUFNLFNBQVMsTUFBTTtBQUNyQixVQUFJLE9BQU8sY0FBYyxnQkFBZ0IsT0FBTyxVQUFVO0FBQ3hEO0FBQUEsTUFBQTtBQUdFLFVBQUEsQ0FBQyxLQUFLLFVBQVU7QUFDbEIsYUFBSyxNQUFLO0FBQUEsTUFBQTtBQUFBLElBQ1o7QUFBQTtBQUFBLElBSU0sZ0JBQWdCLFVBQTJCO0FBQ2pELFlBQU0sVUFBVSxLQUFLO0FBQ3JCLFVBQUksQ0FBQyxNQUFNLFFBQVEsUUFBUSxHQUFHO0FBQ3RCLGNBQUEsZ0JBQWdCLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxPQUFPLE9BQU8sUUFBUTtBQUMzRixZQUFJLGVBQWU7QUFDakIsd0JBQWMsV0FBVztBQUFBLFFBQUE7QUFFM0IsZ0JBQ0csT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxPQUFPLE9BQU8sUUFBUSxFQUMvRCxRQUFRLENBQUMsTUFBTyxFQUFFLFdBQVcsS0FBTTtBQUNqQyxhQUFBLGlCQUFnQiwrQ0FBZSxnQkFBZTtBQUFBLE1BQUEsT0FDOUM7QUFDTCxnQkFDRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLE9BQU8sQ0FBQyxDQUFDLEVBQ3BFLFFBQVEsQ0FBQyxNQUFPLEVBQUUsV0FBVyxLQUFNO0FBQ3RDLGNBQU0seUJBQXlCLFFBQVEsT0FBTyxDQUFDLE1BQzdDLFNBQVMsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLE9BQU8sQ0FBQyxDQUFDO0FBRXZELCtCQUF1QixRQUFRLENBQUMsTUFBTyxFQUFFLFdBQVcsSUFBSztBQUNwRCxhQUFBLGdCQUFnQix1QkFBdUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUFBO0FBRXRGLFdBQUssYUFBYSxLQUFLLEVBQUUsTUFBTSxTQUFTLE9BQU8sVUFBVTtBQUFBLElBQUE7QUFBQSxJQUd4QyxhQUFhLG1CQUF1QztBQUNyRSxZQUFNLGFBQWEsaUJBQWlCO0FBR3BDLFdBQUssUUFBUSxNQUFNLEtBQUssZ0JBQWdCLE1BQUs7QUFDN0MsV0FBSyxPQUFPLE1BQU0sS0FBSyxnQkFBZ0IsS0FBSTtBQUd2QyxVQUFBLENBQUMsWUFBWTtBQUNmLGFBQUssWUFBVztBQUNoQixhQUFLLGFBQVk7QUFBQSxNQUFBO0FBQUEsSUFDbkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVNjLGdCQUFnQixlQUFxQjtBQU9uRCxVQUFJLFNBQWMsS0FBQSxrQkFBa0IscUJBQXFCLENBQUMsS0FBSyxVQUFVO0FBQ3ZFLGFBQUssZUFBZSxLQUFLLE1BQU0sS0FBSyxjQUFjO0FBQUEsTUFBQTtBQUVwRCxZQUFNLGdCQUFnQixhQUFhO0FBQUEsSUFBQTtBQUFBLElBR3JCLG9CQUFpQjs7QUFDL0IsWUFBTSxrQkFBaUI7QUFFdkIsVUFBSSxnQkFBZ0I7QUFDbEIsYUFBSyxPQUFMLEtBQUssS0FBTyxLQUFLO0FBQUEsTUFBQTtBQUdiLFlBQUEsU0FBUyxLQUFLLE9BQU87QUFDM0IsWUFBTSxjQUFZQSxNQUFBLEtBQUssWUFBTCxnQkFBQUEsSUFBQSxXQUFlLHdCQUFxQixVQUFLLFlBQUwsOEJBQWU7QUFFckUsVUFBSSxXQUFXO0FBQ1IsYUFBQSxXQUFXLFVBQVUsYUFBYSxVQUFVO0FBQUEsTUFBQTtBQUVuRCxXQUFLLGdCQUFlO0FBRXBCLFVBQUksS0FBSyxVQUFVO0FBQ2pCLGFBQUssYUFBWTtBQUNqQixhQUFLLGNBQWE7QUFBQSxNQUFBO0FBRXBCLFVBQUksS0FBSyxPQUFPO0FBQ1QsYUFBQSxnQkFBZ0IsS0FBSyxLQUFLO0FBQUEsTUFBQTtBQUc1QixXQUFBLGlCQUNILHlCQUNBLENBQUMsTUFBeUIsS0FBSyxpQkFBaUIsQ0FBQyxHQUNqRCxFQUFFLFFBQVE7QUFFUCxXQUFBLGlCQUNILFNBQ0EsQ0FBQyxNQUFpQjtBQUNoQixhQUFLLGVBQWUsQ0FBQztBQUNyQixhQUFLLGVBQWM7QUFBQSxNQUFBLEdBRXJCLEVBQUUsT0FBQSxDQUFRO0FBQUEsSUFBQTtBQUFBLElBSUssV0FBVyxtQkFBdUM7QUFDbkUsWUFBTSxXQUFXLGlCQUFpQjtBQUdsQyxVQUFJLGtCQUFrQixJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVU7QUFDOUMsYUFBQSxnQkFBZ0IsS0FBSyxLQUFNO0FBQUEsTUFBQTtBQUVsQyxVQUFJLGtCQUFrQixJQUFJLFVBQVUsS0FBSyxrQkFBa0IsSUFBSSxVQUFVLEdBQUc7QUFDMUUsYUFBSyxnQkFBZTtBQUFBLE1BQUE7QUFBQSxJQUN0QjtBQUFBLElBR2MsdUJBQW9COztBQUNsQyxZQUFNLHFCQUFvQjtBQUNyQixXQUFBLFFBQVEsS0FBSyxlQUFlO0FBQ2pDLE9BQUFBLE1BQUEsS0FBSywrQkFBTCxnQkFBQUEsSUFBaUM7QUFBQTtJQUdoQixrQkFBZTtBQUNoQyxVQUFJLEtBQUssWUFBWSxLQUFLLGlCQUFpQixPQUFPO0FBQzFDLGNBQUEsT0FBTyxJQUFJO0FBQ1gsYUFBQSxNQUFtQixRQUFRLENBQUMsT0FBTyxLQUFLLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztBQUM5RCxhQUFBLFVBQVUsYUFBYSxJQUFJO0FBQUEsTUFBQSxPQUMzQjtBQUNBLGFBQUEsVUFBVSxhQUFhLEtBQUssS0FBc0I7QUFBQSxNQUFBO0FBQUEsSUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBT0ssb0JBQWlCO0FBQ2pCLFdBQUEsUUFBUSxLQUFLLGFBQWEsT0FBTyxJQUFJLEtBQUssYUFBYSxPQUFPLElBQUk7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNbEUseUJBQ0xDLFFBQ0EsU0FBMEI7QUFFMUIsVUFBSSxDQUFDQSxRQUFPO0FBQ1YsYUFBSyxRQUFRO0FBQ2I7QUFBQSxNQUFBO0FBR0YsVUFBSSxLQUFLLFVBQVU7QUFFakIsYUFBSyxRQUFTQSxPQUE2QixJQUFJLENBQUMsWUFBWSxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQUEsT0FDakU7QUFDTCxhQUFLLFFBQVFBO0FBQUFBLE1BQUE7QUFBQSxJQUNmO0FBQUEsSUFHTSxrQkFBZTs7QUFDaEIsT0FBQUQsTUFBQSxLQUFBLHFCQUFBLGdCQUFBQSxJQUFBLFdBQW1CLGVBQWUsUUFBUSxDQUFDLFlBQWEsUUFBUSxXQUFXLEtBQUs7QUFFckYsaUJBQUsscUJBQUwsOEJBQ0UsNEJBQ0EsUUFBUSxDQUFDLFlBQWtEO0FBQ25ELGdCQUFBLGdCQUFnQixpQkFBaUIsS0FBSyxRQUFRO0FBQzlDLGdCQUFBLGdCQUFnQixpQkFBaUIsS0FBSyxRQUFRO0FBQUEsTUFBQTtBQUFBLElBQ3ZEO0FBQUEsSUFHSyxlQUFZO0FBQ2xCLFdBQUssYUFBWTtBQUNqQixXQUFLLGNBQWE7QUFDbEIsV0FBSyxXQUFXO0FBQ2hCLFdBQUssZUFBYztBQUFBLElBQUE7QUFBQTtBQUFBLElBSWIsZUFBWTs7QUFDWixZQUFBLGFBQVlBLE1BQUEsS0FBSyxZQUFMLGdCQUFBQSxJQUFBLFdBQWU7QUFDakMsV0FBSyxtQkFDSCxrREFBVyxlQUFYLG1CQUF1QixrQkFBdkIsNEJBQXVDLHVCQUFzQixLQUFLO0FBQ3BFLFVBQUksS0FBSyxnQkFBZ0I7QUFDdkIsYUFBSyxnQkFDSCx1Q0FDQSxDQUFDLEdBQUMsNENBQVcsaUJBQVgsbUNBQTBCLGNBQWE7QUFBQSxNQUFBO0FBQUEsSUFFN0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBT00sZ0JBQWE7O0FBRW5CLGFBQUFBLE1BQUEsS0FBSyxlQUFlLGlCQUFwQix3QkFBQUEsS0FBbUMsS0FBSyxpQkFBaUI7QUFHekQsWUFBTSxxQkFBbUIsVUFBSyxZQUFMLDhCQUFlLHNCQUFxQjtBQUN4RCxXQUFBLGdCQUFnQixNQUFNLE1BQU07QUFDakMsV0FBSyxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLFlBQVk7QUFDcEUsV0FBSyxnQkFBZ0IsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLFdBQVc7QUFBQSxJQUFBO0FBQUEsSUFHNUQsc0JBQW1CO0FBRXZCLHlCQUFBLEtBQUssVUFDTCxLQUFLLGdCQUNMLEtBQUssa0JBQ0wsS0FBSyxXQUFZLGNBQWMsd0JBQXdCLEdBQ3ZELElBQUk7QUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBLElBTUEsZ0JBQWdCLE9BQXFCO0FBQzNDLFVBQUksTUFBTSxrQkFBa0IsVUFBVSxLQUFLLFVBQVUsV0FBVztBQUM5RCxhQUFLLG9CQUFtQjtBQUFBLE1BQUEsV0FDZixNQUFNLGtCQUFrQixXQUFXLEtBQUssVUFBVSxXQUFXO0FBQ3RFLGFBQUsscUJBQW9CO0FBQUEsTUFBQTtBQUFBLElBQzNCO0FBQUEsSUFHTSxzQkFBbUI7QUFDekIsV0FBSyxRQUFRO0FBQ2IsV0FBSyx1QkFBc0I7QUFDdEIsV0FBQSxnQkFBZ0IsYUFBYSxpQkFBaUIsTUFBTTtBQUV6RCxXQUFLLFFBQVE7O0lBR1AsdUJBQW9CO0FBQzFCLFdBQUssUUFBUTtBQUNSLFdBQUEsZ0JBQWdCLGFBQWEsaUJBQWlCLE9BQU87QUFDMUQsV0FBSyxvQkFBbUI7QUFDeEIsV0FBSyxpQkFBaUIsWUFBWTtBQUNsQyxXQUFLLFNBQVM7OztJQUlSLGtCQUFrQix1QkFBdUM7QUFDM0QsVUFBQSxDQUFDLEtBQUssVUFBVTtBQUNsQixhQUFLLGlCQUNGLE9BQU8sQ0FBQyxXQUFXLE9BQU8sT0FBTyxzQkFBc0IsRUFBRSxFQUN6RCxRQUFRLENBQUMsV0FBWSxPQUFPLFdBQVcsS0FBTTtBQUNoRCxhQUFLLFFBQVEsc0JBQXNCO0FBQUEsTUFBQSxPQUM5QjtBQUNELFlBQUEsQ0FBQyxLQUFLLE9BQU87QUFDVixlQUFBLFFBQVEsQ0FBQyxzQkFBc0IsS0FBTTtBQUFBLFFBQUEsV0FDakMsQ0FBQyxLQUFLLE1BQU0sU0FBUyxzQkFBc0IsS0FBTSxHQUFHO0FBQzdELGVBQUssUUFBUSxDQUFDLEdBQUcsS0FBSyxPQUFPLHNCQUFzQixLQUFNO0FBQUEsUUFBQTtBQUFBLE1BQzNEO0FBR0YsV0FBSyxPQUFPO0FBQ1osV0FBSyxRQUFRO0FBQ2IsV0FBSyxXQUFXOzs7SUFJVixvQkFBb0IsdUJBQXVDO0FBQ2pFLFVBQUksS0FBSyxVQUFVO0FBQ1osYUFBQSxRQUFTLEtBQUssTUFBbUIsT0FDcEMsQ0FBQyxPQUFlLE9BQU8sc0JBQXNCLEtBQUs7QUFHcEQsYUFBSyxPQUFPO0FBQ1osYUFBSyxRQUFRO0FBQ2IsYUFBSyxXQUFXOztJQUNsQjtBQUFBLElBR00seUJBQXNCO0FBQ3ZCLFdBQUEsNkJBQTZCLElBQUk7QUFHdEMsZUFBUyxpQkFBaUIsVUFBVSxNQUFNLEtBQUssdUJBQXVCO0FBQUEsUUFDcEUsU0FBUztBQUFBLFFBQ1QsUUFBUSxLQUFLLDJCQUEyQjtBQUFBLE1BQUEsQ0FDekM7QUFDRCxhQUFPLGlCQUFpQixVQUFVLE1BQU0sS0FBSyx1QkFBdUI7QUFBQSxRQUNsRSxTQUFTO0FBQUEsUUFDVCxRQUFRLEtBQUssMkJBQTJCO0FBQUEsTUFBQSxDQUN6QztBQUdELGFBQU8saUJBQWlCLGVBQWUsQ0FBQyxPQUFPLEtBQUsscUJBQXFCLEVBQUUsR0FBRztBQUFBLFFBQzVFLFFBQVEsS0FBSywyQkFBMkI7QUFBQSxNQUFBLENBQ3pDO0FBQ0QsYUFBTyxpQkFBaUIsYUFBYSxDQUFDLE9BQU8sS0FBSyxzQkFBc0IsRUFBRSxHQUFHO0FBQUEsUUFDM0UsUUFBUSxLQUFLLDJCQUEyQjtBQUFBLE1BQUEsQ0FDekM7QUFBQSxJQUFBO0FBQUEsSUFHSyxXQUFXLE9BQW9CO0FBQ3JDLFVBQUksS0FBSyxVQUFVO0FBQ2pCO0FBQUEsTUFBQTtBQUdFLFVBQUEsS0FBSyxVQUFVLFVBQVU7QUFDM0IsYUFBSyxnQ0FBZ0MsS0FBSztBQUFBLE1BQUE7QUFFeEMsVUFBQSxLQUFLLFVBQVUsVUFBVTtBQUMzQixhQUFLLGdDQUFnQyxLQUFLO0FBQUEsTUFBQTtBQUFBLElBQzVDO0FBQUEsSUFHTSxnQ0FBZ0MsT0FBb0I7QUFDdEQsVUFBQSxLQUFLLHlCQUF5QixLQUFLLEdBQUc7QUFDakMsZUFBQSxLQUFLLDJCQUEyQixLQUFLO0FBQUEsTUFBQTtBQUc5QyxjQUFRLE1BQU0sS0FBSztBQUFBLFFBQ2pCLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDSCxnQkFBTSxlQUFjO0FBQ3BCLGVBQUssS0FBSTtBQUNUO0FBQUEsTUFBQTtBQUFBLElBQ0o7QUFBQSxJQUdNLGdDQUFnQyxPQUFvQjtBQUMxRCxVQUFJLEtBQUssWUFBWSxLQUFLLFVBQVUsVUFBVTtBQUM1QztBQUFBLE1BQUE7QUFHRSxVQUFBLEtBQUsseUJBQXlCLEtBQUssR0FBRztBQUNqQyxlQUFBLEtBQUssMkJBQTJCLEtBQUs7QUFBQSxNQUFBO0FBRzlDLGNBQVEsTUFBTSxLQUFLO0FBQUEsUUFDakIsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNILGVBQUssTUFBSztBQUNWO0FBQUEsUUFFRixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQ0gsZ0JBQU0sZUFBYztBQUNwQixlQUFLLGtCQUFpQjtBQUN0QjtBQUFBLFFBRUYsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNILGdCQUFNLGVBQWM7QUFDcEIsZUFBSyxxQkFBcUIsS0FBSztBQUMvQjtBQUFBLFFBRUYsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNILGdCQUFNLGVBQWM7QUFDZixlQUFBLHFCQUFxQixPQUFPLENBQUM7QUFDbEM7QUFBQSxRQUVGLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDSCxnQkFBTSxlQUFjO0FBQ3BCLGVBQUsscUJBQXFCLE9BQU8sS0FBSyxpQkFBaUIsU0FBUyxDQUFDO0FBQ2pFO0FBQUEsTUFBQTtBQUFBLElBQ0o7QUFBQSxJQUdNLHlCQUF5QixPQUFvQjtBQUVqRCxhQUFBLE1BQU0sUUFBUSxlQUNkLE1BQU0sUUFBUSxXQUNiLE1BQU0sSUFBSSxXQUFXLEtBQ3BCLE1BQU0sUUFBUSxPQUNkLENBQUMsTUFBTSxVQUNQLENBQUMsTUFBTSxXQUNQLENBQUMsTUFBTTtBQUFBLElBQUE7QUFBQSxJQUlMLDJCQUEyQixPQUFvQjtBQUVyRCxVQUFJLE9BQU8sS0FBSyxtQkFBbUIsT0FBTyxZQUFZO0FBQ3BELHFCQUFhLEtBQUssY0FBYztBQUFBLE1BQUE7QUFFbEMsV0FBSyxpQkFBaUIsV0FBVyxNQUFPLEtBQUssZ0JBQWdCLElBQUssR0FBSTtBQUN0RSxXQUFLLGlCQUFpQixNQUFNO0FBR3RCLFlBQUEsZ0JBQXdCLEtBQUssbUJBQW1CO0FBQ3RELFlBQU0sd0JBQTRDO0FBQUEsUUFDaEQsR0FBRyxLQUFLLGlCQUFpQixNQUFNLGFBQWE7QUFBQSxRQUM1QyxHQUFHLEtBQUssaUJBQWlCLE1BQU0sR0FBRyxhQUFhO0FBQUE7QUFHakQsWUFBTSxRQUFRLHNCQUFzQixLQUNsQyxDQUFDOztBQUNDLGlCQUFBQSxNQUFBLE9BQU8sZ0JBQVAsZ0JBQUFBLElBQW9CLGNBQWMsUUFBUSxLQUFLLGNBQWMsWUFBYSxRQUFNO0FBQUEsT0FBQztBQUVyRixVQUFJLE9BQU87QUFFVCxhQUFLLHFCQUFxQixPQUFPLEtBQUssaUJBQWlCLFFBQVEsS0FBSyxDQUFDO0FBQUEsTUFBQSxXQUVyRSxLQUFLLGNBQWMsU0FBUyxLQUM1QixJQUFJLE9BQU8sSUFBSSxLQUFLLGNBQWMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssS0FBSyxhQUFhLEdBQ3hFO0FBR0EsY0FBTSxhQUFhLHNCQUFzQixLQUN2QyxDQUFDLFdBQUE7O0FBQ0MsbUJBQUFBLE1BQUEsT0FBTyxnQkFBUCxnQkFBQUEsSUFBb0IsY0FBYyxRQUFRLEtBQUssY0FBYyxDQUFDLEVBQUUsWUFBYSxRQUFNO0FBQUEsU0FBQztBQUV4RixZQUFJLFlBQVk7QUFDZCxlQUFLLHFCQUFxQixPQUFPLEtBQUssaUJBQWlCLFFBQVEsVUFBVSxDQUFDO0FBQUEsUUFBQTtBQUFBLE1BQzVFLE9BQ0s7QUFFTCxxQkFBYSxLQUFLLGNBQWM7QUFDaEMsYUFBSyxnQkFBZ0I7QUFBQSxNQUFBO0FBQUEsSUFDdkI7QUFBQSxJQUdNLG9CQUFpQjtBQUN2QixZQUFNLGVBQWlDLEtBQUssaUJBQWlCLEtBQUssZ0JBQWdCO0FBRWxGLFVBQUksS0FBSyxVQUFVO0FBQ0oscUJBQUEsOEJBQThCLENBQUMsYUFBYSxRQUFRO0FBQUEsTUFBQSxPQUM1RDtBQUNMLGFBQUssTUFBSztBQUFBLE1BQUE7QUFBQSxJQUNaO0FBQUEsSUFHTSxxQkFBcUIsT0FBc0IsT0FBYztBQUN6RCxZQUFBLFlBQ0osU0FBUyxvQkFBb0IsT0FBTyxLQUFLLGtCQUFrQixLQUFLLGlCQUFpQixNQUFNO0FBQ25GLFlBQUEsYUFBYSxLQUFLLGlCQUFpQixTQUFTO0FBQ2xELFlBQU0sZUFBZSxLQUFLLGlCQUFpQixLQUFLLGdCQUFnQjtBQUUzRCxXQUFBLGtCQUFrQixZQUFZLFlBQVk7QUFFM0MsVUFBQSxDQUFDLEtBQUssVUFBVTtBQUNiLGFBQUEsb0JBQW9CLFlBQVksWUFBWTtBQUFBLE1BQUEsV0FDeEMsK0JBQU8sVUFBVTtBQUNmLG1CQUFBLDhCQUE4QixDQUFDLFdBQVcsUUFBUTtBQUFBLE1BQUE7QUFFL0QsV0FBSyxtQkFBbUI7QUFBQSxJQUFBO0FBQUEsSUFHbEIsa0JBQ04sa0JBQ0EsbUJBQTRDLE1BQzVDLHNCQUFzQixNQUFJO0FBRTFCLHVCQUFpQixVQUFVLElBQUk7QUFDL0IsdUJBQWlCLGVBQWUsRUFBRSxPQUFPLFVBQUEsQ0FBVztBQUVwRCxVQUFJLHFCQUFxQjtBQUN2QixhQUFLLGdCQUFnQixhQUFhLHlCQUF5QixpQkFBaUIsRUFBRTtBQUFBLE1BQUE7QUFJNUUsVUFBQSxvQkFBb0IscUJBQXFCLGtCQUFrQjtBQUM3RCx5QkFBaUIsVUFBVSxLQUFLO0FBQUEsTUFBQTtBQUFBLElBQ2xDO0FBQUEsSUFHTSxvQkFDTixrQkFDQSxrQkFBa0M7QUFFbEMsdUJBQWlCLDhCQUE4QixJQUFJO0FBRS9DLFVBQUEsb0JBQW9CLHFCQUFxQixrQkFBa0I7QUFDN0QseUJBQWlCLDhCQUE4QixLQUFLO0FBQUEsTUFBQTtBQUFBLElBQ3REO0FBQUEsSUFHTSxzQkFBbUI7QUFDekIsWUFBTSxnQkFBZ0IsS0FBSyxpQkFBaUIsS0FBSyxnQkFBZ0I7QUFFakUsVUFBSSxlQUFlO0FBQ2pCLHNCQUFjLFVBQVUsS0FBSztBQUFBLE1BQUE7QUFFL0IsV0FBSyxtQkFBbUI7QUFDbkIsV0FBQSxnQkFBZ0IsZ0JBQWdCLHVCQUF1QjtBQUFBLElBQUE7QUFBQSxJQWV0RCw4QkFBMkI7QUFDN0IsVUFBQSxDQUFDLEtBQUssVUFBVTtBQUNsQixjQUFNLGlCQUFpQixLQUFLLGlCQUFpQixLQUFLLENBQUMsV0FBVyxPQUFPLFFBQVE7QUFDN0UsWUFBSSxnQkFBZ0I7QUFDbEIsZUFBSyxtQkFBbUIsS0FBSyxpQkFBaUIsVUFDNUMsQ0FBQyxXQUFXLFdBQVcsY0FBYztBQUV2QyxlQUFLLFFBQVEsZUFBZTtBQUFBLFFBQUE7QUFBQSxNQUM5QixPQUNLO0FBQ0wsY0FBTSxVQUFVLEtBQUssaUJBQWlCLE9BQU8sQ0FBQyxXQUFXLE9BQU8sUUFBUTtBQUNwRSxZQUFBLFdBQVcsUUFBUSxTQUFTLEdBQUc7QUFDakMsZ0JBQU0sUUFBa0IsQ0FBQTtBQUN4QixxQkFBVyxVQUFVLFNBQVM7QUFDdEIsa0JBQUEsS0FBSyxPQUFPLEtBQU07QUFBQSxVQUFBO0FBRTFCLGVBQUssUUFBUTtBQUFBLFFBQUE7QUFBQSxNQUNmO0FBQUEsSUFDRjtBQUFBLElBR00saUJBQWM7O0FBQ3BCLFVBQUksS0FBSyxZQUFZLEtBQUssZ0JBQWdCLEtBQUssVUFBVTtBQUN2RDtBQUFBLE1BQUE7QUFFRixPQUFBQSxNQUFBLEtBQUssb0JBQUwsZ0JBQUFBLElBQXNCO0FBRXRCLGNBQVEsS0FBSyxPQUFPO0FBQUEsUUFDbEIsS0FBSyxVQUFVO0FBQ2IsZUFBSyxNQUFLO0FBQ1Y7QUFBQSxRQUFBO0FBQUEsUUFFRixLQUFLLFVBQVU7QUFDYixlQUFLLEtBQUk7QUFDVDtBQUFBLFFBQUE7QUFBQSxNQUdBO0FBQUEsSUFDSjtBQUFBLElBR00sNEJBQ04sYUFBMkI7QUFFM0IsYUFBTyxDQUFDLEtBQUssc0JBQXNCLFdBQVcsR0FBRyxXQUFXO0FBQUEsSUFBQTtBQUFBLElBR3RELE1BQU0sc0JBQXNCLGFBQTJCO0FBQzdELFVBQUksS0FBSyxtQkFBbUI7QUFDMUIsY0FBTSxLQUFLO0FBQUEsTUFBQTtBQUViLGFBQU8sS0FBSyxnQkFBZ0IsT0FBTyxLQUFLLGFBQWEsS0FBSztBQUFBLElBQUE7QUFBQSxJQUd6QyxTQUFNO0FBQ2hCLGFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUtRLEtBQUssWUFBWSxLQUFLLGVBQWUsVUFBVSxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBSTdDLEtBQUssU0FBUyxTQUFVLENBQUE7QUFBQSx3QkFDeEIsS0FBSyxVQUFVO0FBQUEsb0JBQ25CLEtBQUssVUFBVTtBQUFBLG1CQUNoQixLQUFLLFVBQVU7QUFBQSxpQkFDakIsS0FBSyxjQUFjO0FBQUEsVUFDMUIsSUFBSSxDQUFDRSxTQUFTLEtBQUssa0JBQWtCQSxJQUFtQixDQUFDO0FBQUE7QUFBQSxVQUV6RCxNQUFNLEdBQUcsS0FBSyw0QkFBNEIsYUFBYSxLQUFLLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBS2xGLE1BQ0EsR0FBRyxLQUFLLDRCQUNOLHNEQUFzRCxLQUFLLFdBQVcsU0FBUyxDQUNoRixDQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwyQ0FLa0Msc0JBQXNCO0FBQUE7QUFBQSwwQkFFdkMsS0FBSyxlQUFlO0FBQUE7QUFBQSxZQUVsQyxJQUFJLENBQUMsY0FBZSxLQUFLLFdBQVcsU0FBeUIsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUl2RCxDQUFDLGlCQUFpQixLQUFLLGFBQWEsT0FBTztBQUFBO0FBQUEscUJBRXpDLENBQUMsaUJBQWlCLFlBQVksT0FBTztBQUFBLHNDQUNwQixLQUFLLFFBQVE7QUFBQSxnQkFDbkMsSUFBSSxDQUFDLGlCQUFrQixLQUFLLG1CQUFtQixZQUE0QixDQUFDO0FBQUE7QUFBQSxrQ0FFMUQsS0FBSywyQkFBMkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQTtBQUFBLEtBbHVCaEUsK0NBS0EsNENBS0EsNENBR1M7OytCQWZSLGFBQ0EsVUFBVTtBQUlWLDJCQUFBLENBQUEsVUFBVyxHQUNYLFNBQVMsRUFBRSxTQUFTLE1BQU0sTUFBTSxTQUFTLENBQUM7NEJBSTFDLGFBQ0EsU0FBUyxFQUFFLE1BQU0sUUFBQSxDQUFTLENBQUM7QUFJM0IsZ0NBQUEsQ0FBQSxPQUFPO0FBYlEsaUJBQUEsSUFBQSxNQUFBLHlCQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUEsZUFBQSxRQUFBLE9BQUEsU0FBQSxPQUFBLFFBQUEsRUFBQSxLQUFBLENBQUEsUUFBQSxpQkFBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEsYUFBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBQSxjQUF5QjtBQUFBLFNBQUEsVUFBQSxhQUFBLDJCQUFBLDhCQUFBO0FBS3pCLGlCQUFBLElBQUEsTUFBQSxzQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLFlBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsY0FBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEsVUFBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBQSxXQUEwQjtBQUFBLFNBQUEsVUFBQSxhQUFBLHdCQUFBLDJCQUFBO0FBSzFCLGlCQUFBLElBQUEsTUFBQSxzQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLFlBQUEsUUFBQSxPQUFBLFNBQUEsT0FBQSxRQUFBLEVBQUEsS0FBQSxDQUFBLFFBQUEsY0FBQSxLQUFBLEtBQUEsQ0FBQSxRQUFBLElBQUEsVUFBQSxLQUFBLENBQUEsS0FBQSxVQUFBO0FBQUEsVUFBQSxXQUEwQjtBQUFBLFNBQUEsVUFBQSxhQUFBLHdCQUFBLDJCQUFBO0FBR2hCLGlCQUFBLElBQUEsTUFBQSwyQkFBQSxFQUFBLE1BQUEsWUFBQSxNQUFBLGlCQUFBLFFBQUEsT0FBQSxTQUFBLE9BQUEsUUFBQSxFQUFBLEtBQUEsQ0FBQSxRQUFBLG1CQUFBLEtBQUEsS0FBQSxDQUFBLFFBQUEsSUFBQSxlQUFBLEtBQUEsQ0FBQSxLQUFBLFVBQUE7QUFBQSxVQUFBLGdCQUFvQztBQUFBLFNBQUEsVUFBQSxhQUFBLDZCQUFBLGdDQUFBO0FBM0NoRSxpQkF1d0JDLE1BQUEsbUJBQUEsRUFBQSxPQUFBLFdBQUEsR0FBQSxrQkFBQSxFQUFBLE1BQUEsU0FBQSxNQUFBLFdBQUEsTUFBQSxVQUFBLFVBQUEsR0FBQSxNQUFBLHVCQUFBOzs7UUExdkJ3QixHQUFNLFNBQW1CLE9BR2hCLEdBQUEsU0FBUztBQUFBLElBQ3ZDLFdBQVc7QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLGFBQWE7QUFBQSxJQUNiLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFVBQVU7QUFBQSxFQUNGLEdBekJOLGtCQUFnQixZQUFBLHVCQUFBLEdBQUM7OzsifQ==