@angular/material 14.0.0-next.7 → 14.0.0-rc.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 (963) hide show
  1. package/_index.scss +20 -1
  2. package/autocomplete/index.d.ts +436 -6
  3. package/autocomplete/testing/index.d.ts +71 -8
  4. package/badge/_badge-theme.scss +3 -2
  5. package/badge/index.d.ts +107 -8
  6. package/badge/testing/index.d.ts +36 -8
  7. package/bottom-sheet/index.d.ts +266 -6
  8. package/bottom-sheet/testing/index.d.ts +27 -8
  9. package/button/index.d.ts +77 -6
  10. package/button/testing/index.d.ts +44 -8
  11. package/button-toggle/index.d.ts +245 -6
  12. package/button-toggle/testing/index.d.ts +91 -8
  13. package/card/index.d.ts +165 -5
  14. package/card/testing/index.d.ts +44 -8
  15. package/checkbox/index.d.ts +246 -6
  16. package/checkbox/testing/index.d.ts +91 -8
  17. package/chips/index.d.ts +650 -5
  18. package/chips/testing/index.d.ts +256 -8
  19. package/core/_core.scss +5 -7
  20. package/core/index.d.ts +1079 -5
  21. package/core/ripple/_ripple.scss +2 -2
  22. package/core/style/_menu-common.scss +3 -2
  23. package/core/style/_private.scss +5 -14
  24. package/core/style/_vendor-prefixes.scss +1 -17
  25. package/core/testing/index.d.ts +64 -8
  26. package/core/theming/_theming.scss +2 -2
  27. package/core/typography/_typography.scss +51 -14
  28. package/datepicker/index.d.ts +1782 -6
  29. package/datepicker/testing/index.d.ts +307 -8
  30. package/dialog/index.d.ts +489 -6
  31. package/dialog/testing/index.d.ts +97 -8
  32. package/divider/index.d.ts +30 -8
  33. package/divider/testing/index.d.ts +16 -8
  34. package/esm2020/autocomplete/autocomplete-module.mjs +5 -5
  35. package/esm2020/autocomplete/autocomplete-origin.mjs +7 -7
  36. package/esm2020/autocomplete/autocomplete-trigger.mjs +38 -20
  37. package/esm2020/autocomplete/autocomplete.mjs +9 -9
  38. package/esm2020/autocomplete/testing/autocomplete-harness.mjs +5 -1
  39. package/esm2020/badge/badge-module.mjs +5 -5
  40. package/esm2020/badge/badge.mjs +4 -4
  41. package/esm2020/bottom-sheet/bottom-sheet-container.mjs +12 -7
  42. package/esm2020/bottom-sheet/bottom-sheet-module.mjs +5 -5
  43. package/esm2020/bottom-sheet/bottom-sheet.mjs +4 -4
  44. package/esm2020/button/button-module.mjs +5 -5
  45. package/esm2020/button/button.mjs +9 -9
  46. package/esm2020/button-toggle/button-toggle-module.mjs +5 -5
  47. package/esm2020/button-toggle/button-toggle.mjs +8 -8
  48. package/esm2020/card/card-module.mjs +5 -5
  49. package/esm2020/card/card.mjs +44 -44
  50. package/esm2020/checkbox/checkbox-module.mjs +9 -9
  51. package/esm2020/checkbox/checkbox-required-validator.mjs +4 -4
  52. package/esm2020/checkbox/checkbox.mjs +23 -21
  53. package/esm2020/checkbox/testing/checkbox-harness-filters.mjs +1 -1
  54. package/esm2020/checkbox/testing/checkbox-harness.mjs +3 -2
  55. package/esm2020/chips/chip-input.mjs +4 -4
  56. package/esm2020/chips/chip-list.mjs +5 -5
  57. package/esm2020/chips/chip.mjs +15 -16
  58. package/esm2020/chips/chips-module.mjs +6 -6
  59. package/esm2020/core/common-behaviors/common-module.mjs +5 -5
  60. package/esm2020/core/common-behaviors/error-state.mjs +1 -1
  61. package/esm2020/core/datetime/index.mjs +9 -9
  62. package/esm2020/core/datetime/native-date-adapter.mjs +4 -4
  63. package/esm2020/core/error/error-options.mjs +7 -7
  64. package/esm2020/core/line/line.mjs +8 -8
  65. package/esm2020/core/option/index.mjs +5 -5
  66. package/esm2020/core/option/optgroup.mjs +8 -8
  67. package/esm2020/core/option/option.mjs +10 -10
  68. package/esm2020/core/ripple/index.mjs +5 -5
  69. package/esm2020/core/ripple/ripple-ref.mjs +2 -2
  70. package/esm2020/core/ripple/ripple-renderer.mjs +36 -19
  71. package/esm2020/core/ripple/ripple.mjs +4 -4
  72. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox-module.mjs +5 -5
  73. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +5 -5
  74. package/esm2020/core/version.mjs +1 -1
  75. package/esm2020/datepicker/calendar-body.mjs +5 -5
  76. package/esm2020/datepicker/calendar.mjs +26 -15
  77. package/esm2020/datepicker/date-range-input-parts.mjs +10 -10
  78. package/esm2020/datepicker/date-range-input.mjs +6 -6
  79. package/esm2020/datepicker/date-range-picker.mjs +4 -4
  80. package/esm2020/datepicker/date-range-selection-strategy.mjs +4 -4
  81. package/esm2020/datepicker/date-selection-model.mjs +10 -10
  82. package/esm2020/datepicker/datepicker-actions.mjs +12 -12
  83. package/esm2020/datepicker/datepicker-base.mjs +11 -11
  84. package/esm2020/datepicker/datepicker-input-base.mjs +6 -7
  85. package/esm2020/datepicker/datepicker-input.mjs +4 -4
  86. package/esm2020/datepicker/datepicker-intl.mjs +4 -4
  87. package/esm2020/datepicker/datepicker-module.mjs +10 -12
  88. package/esm2020/datepicker/datepicker-toggle.mjs +10 -10
  89. package/esm2020/datepicker/datepicker.mjs +4 -4
  90. package/esm2020/datepicker/month-view.mjs +6 -6
  91. package/esm2020/datepicker/multi-year-view.mjs +4 -4
  92. package/esm2020/datepicker/testing/calendar-harness.mjs +4 -4
  93. package/esm2020/datepicker/year-view.mjs +4 -4
  94. package/esm2020/dialog/dialog-config.mjs +1 -1
  95. package/esm2020/dialog/dialog-container.mjs +42 -215
  96. package/esm2020/dialog/dialog-content-directives.mjs +14 -14
  97. package/esm2020/dialog/dialog-module.mjs +8 -7
  98. package/esm2020/dialog/dialog-ref.mjs +28 -60
  99. package/esm2020/dialog/dialog.mjs +74 -197
  100. package/esm2020/dialog/testing/dialog-harness.mjs +4 -4
  101. package/esm2020/divider/divider-module.mjs +5 -5
  102. package/esm2020/divider/divider.mjs +5 -5
  103. package/esm2020/expansion/accordion.mjs +4 -4
  104. package/esm2020/expansion/expansion-module.mjs +5 -5
  105. package/esm2020/expansion/expansion-panel-content.mjs +4 -4
  106. package/esm2020/expansion/expansion-panel-header.mjs +11 -11
  107. package/esm2020/expansion/expansion-panel.mjs +9 -9
  108. package/esm2020/expansion/testing/expansion-harness.mjs +6 -6
  109. package/esm2020/form-field/error.mjs +4 -4
  110. package/esm2020/form-field/form-field-control.mjs +4 -4
  111. package/esm2020/form-field/form-field-module.mjs +5 -5
  112. package/esm2020/form-field/form-field.mjs +11 -8
  113. package/esm2020/form-field/hint.mjs +4 -4
  114. package/esm2020/form-field/label.mjs +4 -4
  115. package/esm2020/form-field/placeholder.mjs +4 -4
  116. package/esm2020/form-field/prefix.mjs +4 -4
  117. package/esm2020/form-field/suffix.mjs +4 -4
  118. package/esm2020/form-field/testing/public-api.mjs +4 -4
  119. package/esm2020/grid-list/grid-list-module.mjs +5 -5
  120. package/esm2020/grid-list/grid-list.mjs +6 -6
  121. package/esm2020/grid-list/grid-tile.mjs +17 -17
  122. package/esm2020/grid-list/testing/grid-tile-harness.mjs +3 -3
  123. package/esm2020/icon/icon-module.mjs +5 -5
  124. package/esm2020/icon/icon-registry.mjs +4 -4
  125. package/esm2020/icon/icon.mjs +5 -12
  126. package/esm2020/icon/testing/fake-icon-registry.mjs +8 -8
  127. package/esm2020/icon/testing/icon-harness.mjs +3 -3
  128. package/esm2020/input/input-module.mjs +5 -5
  129. package/esm2020/input/input.mjs +29 -22
  130. package/esm2020/list/list-module.mjs +5 -5
  131. package/esm2020/list/list.mjs +21 -21
  132. package/esm2020/list/selection-list.mjs +9 -9
  133. package/esm2020/menu/menu-content.mjs +7 -7
  134. package/esm2020/menu/menu-item.mjs +6 -6
  135. package/esm2020/menu/menu-module.mjs +5 -5
  136. package/esm2020/menu/menu-trigger.mjs +7 -7
  137. package/esm2020/menu/menu.mjs +28 -40
  138. package/esm2020/paginator/paginator-intl.mjs +4 -4
  139. package/esm2020/paginator/paginator-module.mjs +5 -5
  140. package/esm2020/paginator/paginator.mjs +13 -13
  141. package/esm2020/paginator/testing/paginator-harness.mjs +11 -1
  142. package/esm2020/progress-bar/progress-bar-module.mjs +5 -5
  143. package/esm2020/progress-bar/progress-bar.mjs +8 -5
  144. package/esm2020/progress-spinner/progress-spinner-module.mjs +5 -5
  145. package/esm2020/progress-spinner/progress-spinner.mjs +5 -5
  146. package/esm2020/radio/radio-module.mjs +5 -5
  147. package/esm2020/radio/radio.mjs +42 -14
  148. package/esm2020/radio/testing/radio-harness-filters.mjs +1 -1
  149. package/esm2020/radio/testing/radio-harness.mjs +3 -2
  150. package/esm2020/select/select-module.mjs +5 -5
  151. package/esm2020/select/select.mjs +44 -28
  152. package/esm2020/sidenav/drawer.mjs +19 -14
  153. package/esm2020/sidenav/sidenav-module.mjs +5 -5
  154. package/esm2020/sidenav/sidenav.mjs +12 -12
  155. package/esm2020/slide-toggle/slide-toggle-module.mjs +12 -14
  156. package/esm2020/slide-toggle/slide-toggle-required-validator.mjs +4 -4
  157. package/esm2020/slide-toggle/slide-toggle.mjs +5 -5
  158. package/esm2020/slide-toggle/testing/slide-toggle-harness-filters.mjs +1 -1
  159. package/esm2020/slide-toggle/testing/slide-toggle-harness.mjs +4 -2
  160. package/esm2020/slider/slider-module.mjs +5 -5
  161. package/esm2020/slider/slider.mjs +5 -5
  162. package/esm2020/snack-bar/simple-snack-bar.mjs +7 -7
  163. package/esm2020/snack-bar/snack-bar-container.mjs +24 -18
  164. package/esm2020/snack-bar/snack-bar-module.mjs +5 -5
  165. package/esm2020/snack-bar/snack-bar-ref.mjs +2 -3
  166. package/esm2020/snack-bar/snack-bar.mjs +7 -7
  167. package/esm2020/sort/sort-header-intl.mjs +4 -4
  168. package/esm2020/sort/sort-header.mjs +5 -5
  169. package/esm2020/sort/sort-module.mjs +5 -5
  170. package/esm2020/sort/sort.mjs +4 -4
  171. package/esm2020/stepper/step-content.mjs +4 -4
  172. package/esm2020/stepper/step-header.mjs +8 -8
  173. package/esm2020/stepper/step-label.mjs +4 -4
  174. package/esm2020/stepper/stepper-button.mjs +7 -7
  175. package/esm2020/stepper/stepper-icon.mjs +4 -4
  176. package/esm2020/stepper/stepper-intl.mjs +4 -4
  177. package/esm2020/stepper/stepper-module.mjs +11 -13
  178. package/esm2020/stepper/stepper.mjs +11 -11
  179. package/esm2020/stepper/testing/stepper-harness.mjs +3 -3
  180. package/esm2020/table/cell.mjs +22 -22
  181. package/esm2020/table/row.mjs +22 -22
  182. package/esm2020/table/table-data-source.mjs +1 -1
  183. package/esm2020/table/table-module.mjs +5 -5
  184. package/esm2020/table/table.mjs +9 -9
  185. package/esm2020/table/text-column.mjs +5 -5
  186. package/esm2020/tabs/ink-bar.mjs +4 -4
  187. package/esm2020/tabs/paginated-tab-header.mjs +11 -5
  188. package/esm2020/tabs/tab-body.mjs +11 -11
  189. package/esm2020/tabs/tab-content.mjs +4 -4
  190. package/esm2020/tabs/tab-group.mjs +35 -18
  191. package/esm2020/tabs/tab-header.mjs +8 -8
  192. package/esm2020/tabs/tab-label-wrapper.mjs +4 -4
  193. package/esm2020/tabs/tab-label.mjs +4 -4
  194. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +17 -17
  195. package/esm2020/tabs/tab.mjs +4 -4
  196. package/esm2020/tabs/tabs-module.mjs +10 -12
  197. package/esm2020/toolbar/testing/toolbar-harness.mjs +2 -2
  198. package/esm2020/toolbar/toolbar-module.mjs +5 -5
  199. package/esm2020/toolbar/toolbar.mjs +8 -8
  200. package/esm2020/tooltip/tooltip-module.mjs +5 -5
  201. package/esm2020/tooltip/tooltip.mjs +14 -14
  202. package/esm2020/tree/node.mjs +10 -10
  203. package/esm2020/tree/outlet.mjs +4 -4
  204. package/esm2020/tree/padding.mjs +4 -4
  205. package/esm2020/tree/toggle.mjs +4 -4
  206. package/esm2020/tree/tree-module.mjs +5 -5
  207. package/esm2020/tree/tree.mjs +5 -5
  208. package/expansion/index.d.ts +343 -5
  209. package/expansion/testing/index.d.ts +106 -8
  210. package/fesm2015/autocomplete/testing.mjs +6 -0
  211. package/fesm2015/autocomplete/testing.mjs.map +1 -1
  212. package/fesm2015/autocomplete.mjs +55 -37
  213. package/fesm2015/autocomplete.mjs.map +1 -1
  214. package/fesm2015/badge.mjs +7 -7
  215. package/fesm2015/badge.mjs.map +1 -1
  216. package/fesm2015/bottom-sheet.mjs +18 -13
  217. package/fesm2015/bottom-sheet.mjs.map +1 -1
  218. package/fesm2015/button-toggle.mjs +11 -11
  219. package/fesm2015/button-toggle.mjs.map +1 -1
  220. package/fesm2015/button.mjs +12 -12
  221. package/fesm2015/button.mjs.map +1 -1
  222. package/fesm2015/card.mjs +47 -47
  223. package/fesm2015/card.mjs.map +1 -1
  224. package/fesm2015/checkbox/testing.mjs +2 -1
  225. package/fesm2015/checkbox/testing.mjs.map +1 -1
  226. package/fesm2015/checkbox.mjs +33 -31
  227. package/fesm2015/checkbox.mjs.map +1 -1
  228. package/fesm2015/chips.mjs +26 -27
  229. package/fesm2015/chips.mjs.map +1 -1
  230. package/fesm2015/core.mjs +99 -81
  231. package/fesm2015/core.mjs.map +1 -1
  232. package/fesm2015/datepicker/testing.mjs +3 -3
  233. package/fesm2015/datepicker/testing.mjs.map +1 -1
  234. package/fesm2015/datepicker.mjs +111 -103
  235. package/fesm2015/datepicker.mjs.map +1 -1
  236. package/fesm2015/dialog/testing.mjs +3 -3
  237. package/fesm2015/dialog/testing.mjs.map +1 -1
  238. package/fesm2015/dialog.mjs +152 -485
  239. package/fesm2015/dialog.mjs.map +1 -1
  240. package/fesm2015/divider.mjs +8 -8
  241. package/fesm2015/divider.mjs.map +1 -1
  242. package/fesm2015/expansion/testing.mjs +5 -5
  243. package/fesm2015/expansion/testing.mjs.map +1 -1
  244. package/fesm2015/expansion.mjs +28 -28
  245. package/fesm2015/expansion.mjs.map +1 -1
  246. package/fesm2015/form-field/testing.mjs +1 -1
  247. package/fesm2015/form-field/testing.mjs.map +1 -1
  248. package/fesm2015/form-field.mjs +35 -32
  249. package/fesm2015/form-field.mjs.map +1 -1
  250. package/fesm2015/grid-list/testing.mjs +2 -2
  251. package/fesm2015/grid-list/testing.mjs.map +1 -1
  252. package/fesm2015/grid-list.mjs +25 -25
  253. package/fesm2015/grid-list.mjs.map +1 -1
  254. package/fesm2015/icon/testing.mjs +9 -9
  255. package/fesm2015/icon/testing.mjs.map +1 -1
  256. package/fesm2015/icon.mjs +11 -18
  257. package/fesm2015/icon.mjs.map +1 -1
  258. package/fesm2015/input.mjs +33 -26
  259. package/fesm2015/input.mjs.map +1 -1
  260. package/fesm2015/list.mjs +32 -32
  261. package/fesm2015/list.mjs.map +1 -1
  262. package/fesm2015/menu.mjs +48 -60
  263. package/fesm2015/menu.mjs.map +1 -1
  264. package/fesm2015/paginator/testing.mjs +14 -0
  265. package/fesm2015/paginator/testing.mjs.map +1 -1
  266. package/fesm2015/paginator.mjs +19 -19
  267. package/fesm2015/paginator.mjs.map +1 -1
  268. package/fesm2015/progress-bar.mjs +11 -8
  269. package/fesm2015/progress-bar.mjs.map +1 -1
  270. package/fesm2015/progress-spinner.mjs +8 -8
  271. package/fesm2015/progress-spinner.mjs.map +1 -1
  272. package/fesm2015/radio/testing.mjs +2 -1
  273. package/fesm2015/radio/testing.mjs.map +1 -1
  274. package/fesm2015/radio.mjs +46 -17
  275. package/fesm2015/radio.mjs.map +1 -1
  276. package/fesm2015/select.mjs +48 -32
  277. package/fesm2015/select.mjs.map +1 -1
  278. package/fesm2015/sidenav.mjs +33 -28
  279. package/fesm2015/sidenav.mjs.map +1 -1
  280. package/fesm2015/slide-toggle/testing.mjs +3 -1
  281. package/fesm2015/slide-toggle/testing.mjs.map +1 -1
  282. package/fesm2015/slide-toggle.mjs +18 -20
  283. package/fesm2015/slide-toggle.mjs.map +1 -1
  284. package/fesm2015/slider.mjs +8 -8
  285. package/fesm2015/slider.mjs.map +1 -1
  286. package/fesm2015/snack-bar.mjs +40 -35
  287. package/fesm2015/snack-bar.mjs.map +1 -1
  288. package/fesm2015/sort.mjs +14 -14
  289. package/fesm2015/sort.mjs.map +1 -1
  290. package/fesm2015/stepper/testing.mjs +2 -2
  291. package/fesm2015/stepper/testing.mjs.map +1 -1
  292. package/fesm2015/stepper.mjs +42 -44
  293. package/fesm2015/stepper.mjs.map +1 -1
  294. package/fesm2015/table.mjs +58 -58
  295. package/fesm2015/table.mjs.map +1 -1
  296. package/fesm2015/tabs.mjs +97 -75
  297. package/fesm2015/tabs.mjs.map +1 -1
  298. package/fesm2015/toolbar/testing.mjs +1 -1
  299. package/fesm2015/toolbar/testing.mjs.map +1 -1
  300. package/fesm2015/toolbar.mjs +11 -11
  301. package/fesm2015/toolbar.mjs.map +1 -1
  302. package/fesm2015/tooltip.mjs +17 -17
  303. package/fesm2015/tooltip.mjs.map +1 -1
  304. package/fesm2015/tree.mjs +26 -26
  305. package/fesm2015/tree.mjs.map +1 -1
  306. package/fesm2020/autocomplete/testing.mjs +4 -0
  307. package/fesm2020/autocomplete/testing.mjs.map +1 -1
  308. package/fesm2020/autocomplete.mjs +55 -37
  309. package/fesm2020/autocomplete.mjs.map +1 -1
  310. package/fesm2020/badge.mjs +7 -7
  311. package/fesm2020/badge.mjs.map +1 -1
  312. package/fesm2020/bottom-sheet.mjs +18 -13
  313. package/fesm2020/bottom-sheet.mjs.map +1 -1
  314. package/fesm2020/button-toggle.mjs +11 -11
  315. package/fesm2020/button-toggle.mjs.map +1 -1
  316. package/fesm2020/button.mjs +12 -12
  317. package/fesm2020/button.mjs.map +1 -1
  318. package/fesm2020/card.mjs +47 -47
  319. package/fesm2020/card.mjs.map +1 -1
  320. package/fesm2020/checkbox/testing.mjs +2 -1
  321. package/fesm2020/checkbox/testing.mjs.map +1 -1
  322. package/fesm2020/checkbox.mjs +33 -31
  323. package/fesm2020/checkbox.mjs.map +1 -1
  324. package/fesm2020/chips.mjs +26 -27
  325. package/fesm2020/chips.mjs.map +1 -1
  326. package/fesm2020/core.mjs +98 -81
  327. package/fesm2020/core.mjs.map +1 -1
  328. package/fesm2020/datepicker/testing.mjs +3 -3
  329. package/fesm2020/datepicker/testing.mjs.map +1 -1
  330. package/fesm2020/datepicker.mjs +111 -103
  331. package/fesm2020/datepicker.mjs.map +1 -1
  332. package/fesm2020/dialog/testing.mjs +3 -3
  333. package/fesm2020/dialog/testing.mjs.map +1 -1
  334. package/fesm2020/dialog.mjs +155 -484
  335. package/fesm2020/dialog.mjs.map +1 -1
  336. package/fesm2020/divider.mjs +8 -8
  337. package/fesm2020/divider.mjs.map +1 -1
  338. package/fesm2020/expansion/testing.mjs +5 -5
  339. package/fesm2020/expansion/testing.mjs.map +1 -1
  340. package/fesm2020/expansion.mjs +28 -28
  341. package/fesm2020/expansion.mjs.map +1 -1
  342. package/fesm2020/form-field/testing.mjs +1 -1
  343. package/fesm2020/form-field/testing.mjs.map +1 -1
  344. package/fesm2020/form-field.mjs +35 -32
  345. package/fesm2020/form-field.mjs.map +1 -1
  346. package/fesm2020/grid-list/testing.mjs +2 -2
  347. package/fesm2020/grid-list/testing.mjs.map +1 -1
  348. package/fesm2020/grid-list.mjs +25 -25
  349. package/fesm2020/grid-list.mjs.map +1 -1
  350. package/fesm2020/icon/testing.mjs +9 -9
  351. package/fesm2020/icon/testing.mjs.map +1 -1
  352. package/fesm2020/icon.mjs +11 -18
  353. package/fesm2020/icon.mjs.map +1 -1
  354. package/fesm2020/input.mjs +32 -25
  355. package/fesm2020/input.mjs.map +1 -1
  356. package/fesm2020/list.mjs +32 -32
  357. package/fesm2020/list.mjs.map +1 -1
  358. package/fesm2020/menu.mjs +48 -60
  359. package/fesm2020/menu.mjs.map +1 -1
  360. package/fesm2020/paginator/testing.mjs +10 -0
  361. package/fesm2020/paginator/testing.mjs.map +1 -1
  362. package/fesm2020/paginator.mjs +19 -19
  363. package/fesm2020/paginator.mjs.map +1 -1
  364. package/fesm2020/progress-bar.mjs +11 -8
  365. package/fesm2020/progress-bar.mjs.map +1 -1
  366. package/fesm2020/progress-spinner.mjs +8 -8
  367. package/fesm2020/progress-spinner.mjs.map +1 -1
  368. package/fesm2020/radio/testing.mjs +2 -1
  369. package/fesm2020/radio/testing.mjs.map +1 -1
  370. package/fesm2020/radio.mjs +45 -17
  371. package/fesm2020/radio.mjs.map +1 -1
  372. package/fesm2020/select.mjs +48 -32
  373. package/fesm2020/select.mjs.map +1 -1
  374. package/fesm2020/sidenav.mjs +33 -28
  375. package/fesm2020/sidenav.mjs.map +1 -1
  376. package/fesm2020/slide-toggle/testing.mjs +3 -1
  377. package/fesm2020/slide-toggle/testing.mjs.map +1 -1
  378. package/fesm2020/slide-toggle.mjs +18 -20
  379. package/fesm2020/slide-toggle.mjs.map +1 -1
  380. package/fesm2020/slider.mjs +8 -8
  381. package/fesm2020/slider.mjs.map +1 -1
  382. package/fesm2020/snack-bar.mjs +40 -35
  383. package/fesm2020/snack-bar.mjs.map +1 -1
  384. package/fesm2020/sort.mjs +14 -14
  385. package/fesm2020/sort.mjs.map +1 -1
  386. package/fesm2020/stepper/testing.mjs +2 -2
  387. package/fesm2020/stepper/testing.mjs.map +1 -1
  388. package/fesm2020/stepper.mjs +42 -44
  389. package/fesm2020/stepper.mjs.map +1 -1
  390. package/fesm2020/table.mjs +58 -58
  391. package/fesm2020/table.mjs.map +1 -1
  392. package/fesm2020/tabs.mjs +96 -75
  393. package/fesm2020/tabs.mjs.map +1 -1
  394. package/fesm2020/toolbar/testing.mjs +1 -1
  395. package/fesm2020/toolbar/testing.mjs.map +1 -1
  396. package/fesm2020/toolbar.mjs +11 -11
  397. package/fesm2020/toolbar.mjs.map +1 -1
  398. package/fesm2020/tooltip.mjs +17 -17
  399. package/fesm2020/tooltip.mjs.map +1 -1
  400. package/fesm2020/tree.mjs +26 -26
  401. package/fesm2020/tree.mjs.map +1 -1
  402. package/form-field/index.d.ts +401 -5
  403. package/form-field/testing/control/index.d.ts +8 -6
  404. package/form-field/testing/index.d.ts +127 -8
  405. package/grid-list/index.d.ts +232 -5
  406. package/grid-list/testing/index.d.ts +86 -8
  407. package/icon/index.d.ts +443 -5
  408. package/icon/testing/index.d.ts +81 -6
  409. package/index.d.ts +3 -7
  410. package/input/index.d.ts +209 -6
  411. package/input/testing/index.d.ts +129 -8
  412. package/list/index.d.ts +369 -6
  413. package/list/testing/index.d.ts +329 -6
  414. package/menu/index.d.ts +613 -6
  415. package/menu/testing/index.d.ts +115 -8
  416. package/package.json +38 -38
  417. package/paginator/index.d.ts +224 -6
  418. package/paginator/testing/index.d.ts +65 -8
  419. package/prebuilt-themes/deeppurple-amber.css +1 -1
  420. package/prebuilt-themes/indigo-pink.css +1 -1
  421. package/prebuilt-themes/pink-bluegrey.css +1 -1
  422. package/prebuilt-themes/purple-green.css +1 -1
  423. package/progress-bar/index.d.ts +147 -6
  424. package/progress-bar/testing/index.d.ts +26 -8
  425. package/progress-spinner/index.d.ts +138 -6
  426. package/progress-spinner/testing/index.d.ts +27 -8
  427. package/radio/index.d.ts +305 -6
  428. package/radio/testing/index.d.ts +130 -8
  429. package/schematics/collection.json +4 -2
  430. package/schematics/ng-add/index.js +1 -1
  431. package/schematics/ng-add/index.mjs +1 -1
  432. package/schematics/ng-update/migrations/hammer-gestures-v9/gesture-config.template +1 -1
  433. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.js +5 -5
  434. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.mjs +5 -5
  435. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.js +23 -32
  436. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.mjs +23 -32
  437. package/select/index.d.ts +534 -5
  438. package/select/testing/index.d.ts +79 -8
  439. package/sidenav/index.d.ts +395 -5
  440. package/sidenav/testing/index.d.ts +124 -6
  441. package/slide-toggle/index.d.ts +173 -5
  442. package/slide-toggle/testing/index.d.ts +77 -8
  443. package/slider/index.d.ts +289 -6
  444. package/slider/testing/index.d.ts +60 -8
  445. package/snack-bar/index.d.ts +372 -6
  446. package/snack-bar/testing/index.d.ts +72 -8
  447. package/sort/index.d.ts +326 -5
  448. package/sort/testing/index.d.ts +50 -8
  449. package/stepper/index.d.ts +288 -6
  450. package/stepper/testing/index.d.ts +142 -6
  451. package/table/index.d.ts +382 -5
  452. package/table/testing/index.d.ts +178 -8
  453. package/tabs/_tabs-common.scss +6 -5
  454. package/tabs/index.d.ts +963 -5
  455. package/tabs/testing/index.d.ts +153 -8
  456. package/toolbar/index.d.ts +56 -6
  457. package/toolbar/testing/index.d.ts +35 -8
  458. package/tooltip/index.d.ts +362 -5
  459. package/tooltip/testing/index.d.ts +42 -8
  460. package/tree/index.d.ts +243 -5
  461. package/tree/testing/index.d.ts +122 -8
  462. package/autocomplete/autocomplete-module.d.ts +0 -13
  463. package/autocomplete/autocomplete-origin.d.ts +0 -27
  464. package/autocomplete/autocomplete-trigger.d.ts +0 -211
  465. package/autocomplete/autocomplete.d.ts +0 -150
  466. package/autocomplete/autocomplete_public_index.d.ts +0 -4
  467. package/autocomplete/package.json +0 -9
  468. package/autocomplete/public-api.d.ts +0 -11
  469. package/autocomplete/testing/autocomplete-harness-filters.d.ts +0 -13
  470. package/autocomplete/testing/autocomplete-harness.d.ts +0 -61
  471. package/autocomplete/testing/package.json +0 -9
  472. package/autocomplete/testing/public-api.d.ts +0 -9
  473. package/badge/badge-module.d.ts +0 -9
  474. package/badge/badge.d.ts +0 -86
  475. package/badge/badge_public_index.d.ts +0 -4
  476. package/badge/package.json +0 -9
  477. package/badge/public-api.d.ts +0 -9
  478. package/badge/testing/badge-harness-filters.d.ts +0 -11
  479. package/badge/testing/badge-harness.d.ts +0 -34
  480. package/badge/testing/package.json +0 -9
  481. package/badge/testing/public-api.d.ts +0 -9
  482. package/bottom-sheet/bottom-sheet-animations.d.ts +0 -12
  483. package/bottom-sheet/bottom-sheet-config.d.ts +0 -54
  484. package/bottom-sheet/bottom-sheet-container.d.ts +0 -87
  485. package/bottom-sheet/bottom-sheet-module.d.ts +0 -10
  486. package/bottom-sheet/bottom-sheet-ref.d.ts +0 -51
  487. package/bottom-sheet/bottom-sheet.d.ts +0 -59
  488. package/bottom-sheet/bottom-sheet_public_index.d.ts +0 -4
  489. package/bottom-sheet/package.json +0 -9
  490. package/bottom-sheet/public-api.d.ts +0 -13
  491. package/bottom-sheet/testing/bottom-sheet-harness-filters.d.ts +0 -10
  492. package/bottom-sheet/testing/bottom-sheet-harness.d.ts +0 -27
  493. package/bottom-sheet/testing/package.json +0 -9
  494. package/bottom-sheet/testing/public-api.d.ts +0 -9
  495. package/button/button-module.d.ts +0 -8
  496. package/button/button.d.ts +0 -58
  497. package/button/button_public_index.d.ts +0 -4
  498. package/button/package.json +0 -9
  499. package/button/public-api.d.ts +0 -9
  500. package/button/testing/button-harness-filters.d.ts +0 -13
  501. package/button/testing/button-harness.d.ts +0 -41
  502. package/button/testing/package.json +0 -9
  503. package/button/testing/public-api.d.ts +0 -9
  504. package/button-toggle/button-toggle-module.d.ts +0 -8
  505. package/button-toggle/button-toggle.d.ts +0 -212
  506. package/button-toggle/button-toggle_public_index.d.ts +0 -4
  507. package/button-toggle/package.json +0 -9
  508. package/button-toggle/public-api.d.ts +0 -9
  509. package/button-toggle/testing/button-toggle-group-harness-filters.d.ts +0 -11
  510. package/button-toggle/testing/button-toggle-group-harness.d.ts +0 -35
  511. package/button-toggle/testing/button-toggle-harness-filters.d.ts +0 -17
  512. package/button-toggle/testing/button-toggle-harness.d.ts +0 -56
  513. package/button-toggle/testing/package.json +0 -9
  514. package/button-toggle/testing/public-api.d.ts +0 -11
  515. package/card/card-module.d.ts +0 -8
  516. package/card/card.d.ts +0 -126
  517. package/card/card_public_index.d.ts +0 -4
  518. package/card/package.json +0 -9
  519. package/card/public-api.d.ts +0 -9
  520. package/card/testing/card-harness-filters.d.ts +0 -17
  521. package/card/testing/card-harness.d.ts +0 -36
  522. package/card/testing/package.json +0 -9
  523. package/card/testing/public-api.d.ts +0 -9
  524. package/checkbox/checkbox-config.d.ts +0 -28
  525. package/checkbox/checkbox-module.d.ts +0 -16
  526. package/checkbox/checkbox-required-validator.d.ts +0 -20
  527. package/checkbox/checkbox.d.ts +0 -166
  528. package/checkbox/checkbox_public_index.d.ts +0 -4
  529. package/checkbox/package.json +0 -9
  530. package/checkbox/public-api.d.ts +0 -11
  531. package/checkbox/testing/checkbox-harness-filters.d.ts +0 -15
  532. package/checkbox/testing/checkbox-harness.d.ts +0 -81
  533. package/checkbox/testing/package.json +0 -9
  534. package/checkbox/testing/public-api.d.ts +0 -9
  535. package/chips/chip-default-options.d.ts +0 -15
  536. package/chips/chip-input.d.ts +0 -91
  537. package/chips/chip-list.d.ts +0 -289
  538. package/chips/chip-text-control.d.ts +0 -20
  539. package/chips/chip.d.ts +0 -210
  540. package/chips/chips-module.d.ts +0 -10
  541. package/chips/chips_public_index.d.ts +0 -4
  542. package/chips/package.json +0 -9
  543. package/chips/public-api.d.ts +0 -12
  544. package/chips/testing/chip-avatar-harness.d.ts +0 -20
  545. package/chips/testing/chip-harness-filters.d.ts +0 -43
  546. package/chips/testing/chip-harness.d.ts +0 -63
  547. package/chips/testing/chip-input-harness.d.ts +0 -47
  548. package/chips/testing/chip-list-harness.d.ts +0 -54
  549. package/chips/testing/chip-listbox-harness.d.ts +0 -34
  550. package/chips/testing/chip-option-harness.d.ts +0 -29
  551. package/chips/testing/chip-remove-harness.d.ts +0 -22
  552. package/chips/testing/package.json +0 -9
  553. package/chips/testing/public-api.d.ts +0 -14
  554. package/core/animation/animation.d.ts +0 -20
  555. package/core/common-behaviors/color.d.ts +0 -26
  556. package/core/common-behaviors/common-module.d.ts +0 -44
  557. package/core/common-behaviors/constructor.d.ts +0 -14
  558. package/core/common-behaviors/disable-ripple.d.ts +0 -17
  559. package/core/common-behaviors/disabled.d.ts +0 -17
  560. package/core/common-behaviors/error-state.d.ts +0 -35
  561. package/core/common-behaviors/index.d.ts +0 -15
  562. package/core/common-behaviors/initialized.d.ts +0 -30
  563. package/core/common-behaviors/tabindex.d.ts +0 -20
  564. package/core/core_public_index.d.ts +0 -4
  565. package/core/datetime/date-adapter.d.ts +0 -215
  566. package/core/datetime/date-formats.d.ts +0 -21
  567. package/core/datetime/index.d.ts +0 -15
  568. package/core/datetime/native-date-adapter.d.ts +0 -74
  569. package/core/datetime/native-date-formats.d.ts +0 -9
  570. package/core/error/error-options.d.ts +0 -14
  571. package/core/line/line.d.ts +0 -29
  572. package/core/option/index.d.ts +0 -15
  573. package/core/option/optgroup.d.ts +0 -40
  574. package/core/option/option-parent.d.ts +0 -22
  575. package/core/option/option.d.ts +0 -135
  576. package/core/package.json +0 -9
  577. package/core/public-api.d.ts +0 -16
  578. package/core/ripple/index.d.ts +0 -11
  579. package/core/ripple/ripple-ref.d.ts +0 -54
  580. package/core/ripple/ripple-renderer.d.ts +0 -99
  581. package/core/ripple/ripple.d.ts +0 -113
  582. package/core/selection/index.d.ts +0 -9
  583. package/core/selection/pseudo-checkbox/pseudo-checkbox-module.d.ts +0 -8
  584. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +0 -29
  585. package/core/testing/optgroup-harness-filters.d.ts +0 -11
  586. package/core/testing/optgroup-harness.d.ts +0 -33
  587. package/core/testing/option-harness-filters.d.ts +0 -12
  588. package/core/testing/option-harness.d.ts +0 -35
  589. package/core/testing/package.json +0 -9
  590. package/core/testing/public-api.d.ts +0 -11
  591. package/core/version.d.ts +0 -10
  592. package/datepicker/calendar-body.d.ts +0 -176
  593. package/datepicker/calendar.d.ts +0 -156
  594. package/datepicker/date-range-input-parts.d.ts +0 -108
  595. package/datepicker/date-range-input.d.ts +0 -133
  596. package/datepicker/date-range-picker.d.ts +0 -17
  597. package/datepicker/date-range-selection-strategy.d.ts +0 -48
  598. package/datepicker/date-selection-model.d.ts +0 -139
  599. package/datepicker/datepicker-actions.d.ts +0 -40
  600. package/datepicker/datepicker-animations.d.ts +0 -16
  601. package/datepicker/datepicker-base.d.ts +0 -272
  602. package/datepicker/datepicker-errors.d.ts +0 -9
  603. package/datepicker/datepicker-input-base.d.ts +0 -136
  604. package/datepicker/datepicker-input.d.ts +0 -67
  605. package/datepicker/datepicker-intl.d.ts +0 -36
  606. package/datepicker/datepicker-module.d.ts +0 -26
  607. package/datepicker/datepicker-toggle.d.ts +0 -47
  608. package/datepicker/datepicker.d.ts +0 -7
  609. package/datepicker/datepicker_public_index.d.ts +0 -4
  610. package/datepicker/month-view.d.ts +0 -139
  611. package/datepicker/multi-year-view.d.ts +0 -103
  612. package/datepicker/package.json +0 -9
  613. package/datepicker/public-api.d.ts +0 -26
  614. package/datepicker/testing/calendar-cell-harness.d.ts +0 -64
  615. package/datepicker/testing/calendar-harness.d.ts +0 -53
  616. package/datepicker/testing/date-range-input-harness.d.ts +0 -59
  617. package/datepicker/testing/datepicker-harness-filters.d.ts +0 -45
  618. package/datepicker/testing/datepicker-input-harness-base.d.ts +0 -44
  619. package/datepicker/testing/datepicker-input-harness.d.ts +0 -36
  620. package/datepicker/testing/datepicker-toggle-harness.d.ts +0 -28
  621. package/datepicker/testing/datepicker-trigger-harness-base.d.ts +0 -44
  622. package/datepicker/testing/package.json +0 -9
  623. package/datepicker/testing/public-api.d.ts +0 -13
  624. package/datepicker/year-view.d.ts +0 -114
  625. package/dialog/dialog-animations.d.ts +0 -25
  626. package/dialog/dialog-config.d.ts +0 -100
  627. package/dialog/dialog-container.d.ts +0 -133
  628. package/dialog/dialog-content-directives.d.ts +0 -76
  629. package/dialog/dialog-module.d.ts +0 -11
  630. package/dialog/dialog-ref.d.ts +0 -101
  631. package/dialog/dialog.d.ts +0 -154
  632. package/dialog/dialog_public_index.d.ts +0 -4
  633. package/dialog/package.json +0 -9
  634. package/dialog/public-api.d.ts +0 -14
  635. package/dialog/testing/dialog-harness-filters.d.ts +0 -11
  636. package/dialog/testing/dialog-harness.d.ts +0 -58
  637. package/dialog/testing/dialog-opener.d.ts +0 -33
  638. package/dialog/testing/package.json +0 -9
  639. package/dialog/testing/public-api.d.ts +0 -10
  640. package/divider/divider-module.d.ts +0 -8
  641. package/divider/divider.d.ts +0 -14
  642. package/divider/divider_public_index.d.ts +0 -4
  643. package/divider/package.json +0 -9
  644. package/divider/public-api.d.ts +0 -9
  645. package/divider/testing/divider-harness-filters.d.ts +0 -10
  646. package/divider/testing/divider-harness.d.ts +0 -16
  647. package/divider/testing/package.json +0 -9
  648. package/divider/testing/public-api.d.ts +0 -9
  649. package/expansion/accordion-base.d.ts +0 -34
  650. package/expansion/accordion.d.ts +0 -45
  651. package/expansion/expansion-animations.d.ts +0 -36
  652. package/expansion/expansion-module.d.ts +0 -14
  653. package/expansion/expansion-panel-base.d.ts +0 -22
  654. package/expansion/expansion-panel-content.d.ts +0 -21
  655. package/expansion/expansion-panel-header.d.ts +0 -83
  656. package/expansion/expansion-panel.d.ts +0 -96
  657. package/expansion/expansion_public_index.d.ts +0 -4
  658. package/expansion/package.json +0 -9
  659. package/expansion/public-api.d.ts +0 -15
  660. package/expansion/testing/accordion-harness.d.ts +0 -25
  661. package/expansion/testing/expansion-harness-filters.d.ts +0 -17
  662. package/expansion/testing/expansion-harness.d.ts +0 -79
  663. package/expansion/testing/package.json +0 -9
  664. package/expansion/testing/public-api.d.ts +0 -10
  665. package/form-field/error.d.ts +0 -22
  666. package/form-field/form-field-animations.d.ts +0 -15
  667. package/form-field/form-field-control.d.ts +0 -60
  668. package/form-field/form-field-errors.d.ts +0 -13
  669. package/form-field/form-field-module.d.ts +0 -16
  670. package/form-field/form-field.d.ts +0 -186
  671. package/form-field/form-field_public_index.d.ts +0 -4
  672. package/form-field/hint.d.ts +0 -27
  673. package/form-field/label.d.ts +0 -6
  674. package/form-field/package.json +0 -9
  675. package/form-field/placeholder.d.ts +0 -11
  676. package/form-field/prefix.d.ts +0 -20
  677. package/form-field/public-api.d.ts +0 -18
  678. package/form-field/suffix.d.ts +0 -20
  679. package/form-field/testing/control/form-field-control-harness.d.ts +0 -14
  680. package/form-field/testing/control/package.json +0 -9
  681. package/form-field/testing/form-field-harness-filters.d.ts +0 -15
  682. package/form-field/testing/form-field-harness.d.ts +0 -114
  683. package/form-field/testing/package.json +0 -9
  684. package/form-field/testing/public-api.d.ts +0 -10
  685. package/grid-list/grid-list-base.d.ts +0 -22
  686. package/grid-list/grid-list-module.d.ts +0 -9
  687. package/grid-list/grid-list.d.ts +0 -63
  688. package/grid-list/grid-list_public_index.d.ts +0 -4
  689. package/grid-list/grid-tile.d.ts +0 -64
  690. package/grid-list/package.json +0 -9
  691. package/grid-list/public-api.d.ts +0 -12
  692. package/grid-list/testing/grid-list-harness-filters.d.ts +0 -18
  693. package/grid-list/testing/grid-list-harness.d.ts +0 -41
  694. package/grid-list/testing/grid-tile-harness.d.ts +0 -43
  695. package/grid-list/testing/package.json +0 -9
  696. package/grid-list/testing/public-api.d.ts +0 -10
  697. package/grid-list/tile-coordinator.d.ts +0 -79
  698. package/grid-list/tile-styler.d.ts +0 -134
  699. package/icon/fake-svgs.d.ts +0 -23
  700. package/icon/icon-module.d.ts +0 -8
  701. package/icon/icon-registry.d.ts +0 -262
  702. package/icon/icon.d.ts +0 -147
  703. package/icon/icon_public_index.d.ts +0 -4
  704. package/icon/package.json +0 -9
  705. package/icon/public-api.d.ts +0 -10
  706. package/icon/testing/fake-icon-registry.d.ts +0 -46
  707. package/icon/testing/icon-harness-filters.d.ts +0 -22
  708. package/icon/testing/icon-harness.d.ts +0 -29
  709. package/icon/testing/package.json +0 -9
  710. package/icon/testing/public-api.d.ts +0 -10
  711. package/icon/testing/testing_public_index.d.ts +0 -4
  712. package/icon/trusted-types.d.ts +0 -37
  713. package/input/input-errors.d.ts +0 -9
  714. package/input/input-module.d.ts +0 -10
  715. package/input/input-value-accessor.d.ts +0 -17
  716. package/input/input.d.ts +0 -173
  717. package/input/input_public_index.d.ts +0 -4
  718. package/input/package.json +0 -9
  719. package/input/public-api.d.ts +0 -11
  720. package/input/testing/input-harness-filters.d.ts +0 -15
  721. package/input/testing/input-harness.d.ts +0 -57
  722. package/input/testing/native-option-harness.d.ts +0 -29
  723. package/input/testing/native-select-harness-filters.d.ts +0 -17
  724. package/input/testing/native-select-harness.d.ts +0 -45
  725. package/input/testing/package.json +0 -9
  726. package/input/testing/public-api.d.ts +0 -12
  727. package/list/list-module.d.ts +0 -11
  728. package/list/list.d.ts +0 -99
  729. package/list/list_public_index.d.ts +0 -4
  730. package/list/package.json +0 -9
  731. package/list/public-api.d.ts +0 -10
  732. package/list/selection-list.d.ts +0 -226
  733. package/list/testing/action-list-harness.d.ts +0 -44
  734. package/list/testing/list-harness-base.d.ts +0 -100
  735. package/list/testing/list-harness-filters.d.ts +0 -32
  736. package/list/testing/list-harness.d.ts +0 -36
  737. package/list/testing/list-item-harness-base.d.ts +0 -48
  738. package/list/testing/nav-list-harness.d.ts +0 -46
  739. package/list/testing/package.json +0 -9
  740. package/list/testing/public-api.d.ts +0 -13
  741. package/list/testing/selection-list-harness.d.ts +0 -74
  742. package/menu/menu-animations.d.ts +0 -30
  743. package/menu/menu-content.d.ts +0 -47
  744. package/menu/menu-errors.d.ts +0 -25
  745. package/menu/menu-item.d.ts +0 -61
  746. package/menu/menu-module.d.ts +0 -14
  747. package/menu/menu-panel.d.ts +0 -49
  748. package/menu/menu-positions.d.ts +0 -9
  749. package/menu/menu-trigger.d.ts +0 -180
  750. package/menu/menu.d.ts +0 -207
  751. package/menu/menu_public_index.d.ts +0 -4
  752. package/menu/package.json +0 -9
  753. package/menu/public-api.d.ts +0 -15
  754. package/menu/testing/menu-harness-filters.d.ts +0 -20
  755. package/menu/testing/menu-harness.d.ts +0 -98
  756. package/menu/testing/package.json +0 -9
  757. package/menu/testing/public-api.d.ts +0 -9
  758. package/paginator/package.json +0 -9
  759. package/paginator/paginator-intl.d.ts +0 -43
  760. package/paginator/paginator-module.d.ts +0 -12
  761. package/paginator/paginator.d.ts +0 -157
  762. package/paginator/paginator_public_index.d.ts +0 -4
  763. package/paginator/public-api.d.ts +0 -10
  764. package/paginator/testing/package.json +0 -9
  765. package/paginator/testing/paginator-harness-filters.d.ts +0 -11
  766. package/paginator/testing/paginator-harness.d.ts +0 -58
  767. package/paginator/testing/public-api.d.ts +0 -9
  768. package/progress-bar/package.json +0 -9
  769. package/progress-bar/progress-bar-module.d.ts +0 -9
  770. package/progress-bar/progress-bar.d.ts +0 -116
  771. package/progress-bar/progress-bar_public_index.d.ts +0 -4
  772. package/progress-bar/public-api.d.ts +0 -9
  773. package/progress-bar/testing/package.json +0 -9
  774. package/progress-bar/testing/progress-bar-harness-filters.d.ts +0 -11
  775. package/progress-bar/testing/progress-bar-harness.d.ts +0 -25
  776. package/progress-bar/testing/public-api.d.ts +0 -9
  777. package/progress-spinner/package.json +0 -9
  778. package/progress-spinner/progress-spinner-module.d.ts +0 -9
  779. package/progress-spinner/progress-spinner.d.ts +0 -107
  780. package/progress-spinner/progress-spinner_public_index.d.ts +0 -4
  781. package/progress-spinner/public-api.d.ts +0 -16
  782. package/progress-spinner/testing/package.json +0 -9
  783. package/progress-spinner/testing/progress-spinner-harness-filters.d.ts +0 -11
  784. package/progress-spinner/testing/progress-spinner-harness.d.ts +0 -26
  785. package/progress-spinner/testing/public-api.d.ts +0 -9
  786. package/radio/package.json +0 -9
  787. package/radio/public-api.d.ts +0 -9
  788. package/radio/radio-module.d.ts +0 -8
  789. package/radio/radio.d.ts +0 -260
  790. package/radio/radio_public_index.d.ts +0 -4
  791. package/radio/testing/package.json +0 -9
  792. package/radio/testing/public-api.d.ts +0 -9
  793. package/radio/testing/radio-harness-filters.d.ts +0 -20
  794. package/radio/testing/radio-harness.d.ts +0 -111
  795. package/select/package.json +0 -9
  796. package/select/public-api.d.ts +0 -10
  797. package/select/select-animations.d.ts +0 -19
  798. package/select/select-errors.d.ts +0 -26
  799. package/select/select-module.d.ts +0 -12
  800. package/select/select.d.ts +0 -450
  801. package/select/select_public_index.d.ts +0 -4
  802. package/select/testing/package.json +0 -9
  803. package/select/testing/public-api.d.ts +0 -9
  804. package/select/testing/select-harness-filters.d.ts +0 -11
  805. package/select/testing/select-harness.d.ts +0 -73
  806. package/sidenav/drawer-animations.d.ts +0 -15
  807. package/sidenav/drawer.d.ts +0 -299
  808. package/sidenav/package.json +0 -9
  809. package/sidenav/public-api.d.ts +0 -11
  810. package/sidenav/sidenav-module.d.ts +0 -11
  811. package/sidenav/sidenav.d.ts +0 -45
  812. package/sidenav/sidenav_public_index.d.ts +0 -4
  813. package/sidenav/testing/drawer-container-harness.d.ts +0 -30
  814. package/sidenav/testing/drawer-content-harness.d.ts +0 -21
  815. package/sidenav/testing/drawer-harness-filters.d.ts +0 -19
  816. package/sidenav/testing/drawer-harness.d.ts +0 -33
  817. package/sidenav/testing/package.json +0 -9
  818. package/sidenav/testing/public-api.d.ts +0 -14
  819. package/sidenav/testing/sidenav-container-harness.d.ts +0 -30
  820. package/sidenav/testing/sidenav-content-harness.d.ts +0 -21
  821. package/sidenav/testing/sidenav-harness.d.ts +0 -24
  822. package/slide-toggle/package.json +0 -9
  823. package/slide-toggle/public-api.d.ts +0 -11
  824. package/slide-toggle/slide-toggle-config.d.ts +0 -18
  825. package/slide-toggle/slide-toggle-module.d.ts +0 -16
  826. package/slide-toggle/slide-toggle-required-validator.d.ts +0 -23
  827. package/slide-toggle/slide-toggle.d.ts +0 -109
  828. package/slide-toggle/slide-toggle_public_index.d.ts +0 -4
  829. package/slide-toggle/testing/package.json +0 -9
  830. package/slide-toggle/testing/public-api.d.ts +0 -9
  831. package/slide-toggle/testing/slide-toggle-harness-filters.d.ts +0 -15
  832. package/slide-toggle/testing/slide-toggle-harness.d.ts +0 -65
  833. package/slider/package.json +0 -9
  834. package/slider/public-api.d.ts +0 -9
  835. package/slider/slider-module.d.ts +0 -9
  836. package/slider/slider.d.ts +0 -267
  837. package/slider/slider_public_index.d.ts +0 -4
  838. package/slider/testing/package.json +0 -9
  839. package/slider/testing/public-api.d.ts +0 -9
  840. package/slider/testing/slider-harness-filters.d.ts +0 -11
  841. package/slider/testing/slider-harness.d.ts +0 -59
  842. package/snack-bar/package.json +0 -9
  843. package/snack-bar/public-api.d.ts +0 -14
  844. package/snack-bar/simple-snack-bar.d.ts +0 -33
  845. package/snack-bar/snack-bar-animations.d.ts +0 -15
  846. package/snack-bar/snack-bar-config.d.ts +0 -45
  847. package/snack-bar/snack-bar-container.d.ts +0 -101
  848. package/snack-bar/snack-bar-module.d.ts +0 -13
  849. package/snack-bar/snack-bar-ref.d.ts +0 -64
  850. package/snack-bar/snack-bar.d.ts +0 -107
  851. package/snack-bar/snack-bar_public_index.d.ts +0 -4
  852. package/snack-bar/testing/package.json +0 -9
  853. package/snack-bar/testing/public-api.d.ts +0 -9
  854. package/snack-bar/testing/snack-bar-harness-filters.d.ts +0 -11
  855. package/snack-bar/testing/snack-bar-harness.d.ts +0 -71
  856. package/sort/package.json +0 -9
  857. package/sort/public-api.d.ts +0 -13
  858. package/sort/sort-animations.d.ts +0 -20
  859. package/sort/sort-direction.d.ts +0 -8
  860. package/sort/sort-errors.d.ts +0 -15
  861. package/sort/sort-header-intl.d.ts +0 -31
  862. package/sort/sort-header.d.ts +0 -166
  863. package/sort/sort-module.d.ts +0 -10
  864. package/sort/sort.d.ts +0 -93
  865. package/sort/sort_public_index.d.ts +0 -4
  866. package/sort/testing/package.json +0 -9
  867. package/sort/testing/public-api.d.ts +0 -10
  868. package/sort/testing/sort-harness-filters.d.ts +0 -15
  869. package/sort/testing/sort-harness.d.ts +0 -24
  870. package/sort/testing/sort-header-harness.d.ts +0 -30
  871. package/stepper/package.json +0 -9
  872. package/stepper/public-api.d.ts +0 -17
  873. package/stepper/step-content.d.ts +0 -18
  874. package/stepper/step-header.d.ts +0 -66
  875. package/stepper/step-label.d.ts +0 -6
  876. package/stepper/stepper-animations.d.ts +0 -18
  877. package/stepper/stepper-button.d.ts +0 -19
  878. package/stepper/stepper-icon.d.ts +0 -30
  879. package/stepper/stepper-intl.d.ts +0 -34
  880. package/stepper/stepper-module.d.ts +0 -18
  881. package/stepper/stepper.d.ts +0 -80
  882. package/stepper/stepper_public_index.d.ts +0 -4
  883. package/stepper/testing/package.json +0 -9
  884. package/stepper/testing/public-api.d.ts +0 -11
  885. package/stepper/testing/step-harness-filters.d.ts +0 -37
  886. package/stepper/testing/step-harness.d.ts +0 -52
  887. package/stepper/testing/stepper-button-harnesses.d.ts +0 -41
  888. package/stepper/testing/stepper-harness.d.ts +0 -35
  889. package/table/cell.d.ts +0 -59
  890. package/table/package.json +0 -9
  891. package/table/public-api.d.ts +0 -13
  892. package/table/row.d.ts +0 -55
  893. package/table/table-data-source.d.ts +0 -169
  894. package/table/table-module.d.ts +0 -12
  895. package/table/table.d.ts +0 -28
  896. package/table/table_public_index.d.ts +0 -4
  897. package/table/testing/cell-harness.d.ts +0 -49
  898. package/table/testing/package.json +0 -9
  899. package/table/testing/public-api.d.ts +0 -11
  900. package/table/testing/row-harness.d.ts +0 -66
  901. package/table/testing/table-harness-filters.d.ts +0 -21
  902. package/table/testing/table-harness.d.ts +0 -58
  903. package/table/text-column.d.ts +0 -22
  904. package/tabs/ink-bar.d.ts +0 -49
  905. package/tabs/package.json +0 -9
  906. package/tabs/paginated-tab-header.d.ts +0 -196
  907. package/tabs/public-api.d.ts +0 -20
  908. package/tabs/tab-body.d.ts +0 -116
  909. package/tabs/tab-config.d.ts +0 -35
  910. package/tabs/tab-content.d.ts +0 -22
  911. package/tabs/tab-group.d.ts +0 -181
  912. package/tabs/tab-header.d.ts +0 -49
  913. package/tabs/tab-label-wrapper.d.ts +0 -29
  914. package/tabs/tab-label.d.ts +0 -28
  915. package/tabs/tab-nav-bar/index.d.ts +0 -8
  916. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +0 -134
  917. package/tabs/tab.d.ts +0 -89
  918. package/tabs/tabs-animations.d.ts +0 -15
  919. package/tabs/tabs-module.d.ts +0 -20
  920. package/tabs/tabs_public_index.d.ts +0 -4
  921. package/tabs/testing/package.json +0 -9
  922. package/tabs/testing/public-api.d.ts +0 -12
  923. package/tabs/testing/tab-group-harness.d.ts +0 -35
  924. package/tabs/testing/tab-harness-filters.d.ts +0 -29
  925. package/tabs/testing/tab-harness.d.ts +0 -38
  926. package/tabs/testing/tab-link-harness.d.ts +0 -29
  927. package/tabs/testing/tab-nav-bar-harness.d.ts +0 -38
  928. package/tabs/testing/tab-nav-panel-harness.d.ts +0 -23
  929. package/toolbar/package.json +0 -9
  930. package/toolbar/public-api.d.ts +0 -9
  931. package/toolbar/testing/package.json +0 -9
  932. package/toolbar/testing/public-api.d.ts +0 -9
  933. package/toolbar/testing/toolbar-harness-filters.d.ts +0 -13
  934. package/toolbar/testing/toolbar-harness.d.ts +0 -31
  935. package/toolbar/toolbar-module.d.ts +0 -8
  936. package/toolbar/toolbar.d.ts +0 -41
  937. package/toolbar/toolbar_public_index.d.ts +0 -4
  938. package/tooltip/package.json +0 -9
  939. package/tooltip/public-api.d.ts +0 -10
  940. package/tooltip/testing/package.json +0 -9
  941. package/tooltip/testing/public-api.d.ts +0 -9
  942. package/tooltip/testing/tooltip-harness-filters.d.ts +0 -11
  943. package/tooltip/testing/tooltip-harness.d.ts +0 -38
  944. package/tooltip/tooltip-animations.d.ts +0 -15
  945. package/tooltip/tooltip-module.d.ts +0 -12
  946. package/tooltip/tooltip.d.ts +0 -299
  947. package/tooltip/tooltip_public_index.d.ts +0 -4
  948. package/tree/data-source/flat-data-source.d.ts +0 -83
  949. package/tree/data-source/nested-data-source.d.ts +0 -25
  950. package/tree/node.d.ts +0 -53
  951. package/tree/outlet.d.ts +0 -21
  952. package/tree/package.json +0 -9
  953. package/tree/padding.d.ts +0 -23
  954. package/tree/public-api.d.ts +0 -15
  955. package/tree/testing/node-harness.d.ts +0 -35
  956. package/tree/testing/package.json +0 -9
  957. package/tree/testing/public-api.d.ts +0 -10
  958. package/tree/testing/tree-harness-filters.d.ts +0 -22
  959. package/tree/testing/tree-harness.d.ts +0 -79
  960. package/tree/toggle.d.ts +0 -16
  961. package/tree/tree-module.d.ts +0 -13
  962. package/tree/tree.d.ts +0 -18
  963. package/tree/tree_public_index.d.ts +0 -4
@@ -12,8 +12,6 @@ const path_1 = require("path");
12
12
  const ts = require("typescript");
13
13
  /** Checks whether an analyzed import has the given import flag set. */
14
14
  const hasFlag = (data, flag) => (data.state & flag) !== 0;
15
- /** Parsed version of TypeScript that can be used for comparisons. */
16
- const PARSED_TS_VERSION = parseFloat(ts.versionMajorMinor);
17
15
  /**
18
16
  * Import manager that can be used to add or remove TypeScript imports within source
19
17
  * files. The manager ensures that multiple transformations are applied properly
@@ -47,7 +45,7 @@ class ImportManager {
47
45
  // Handles side-effect imports which do neither have a name or
48
46
  // specifiers. e.g. `import "my-package";`
49
47
  if (!node.importClause) {
50
- result.push({ moduleName, node, state: 0 /* UNMODIFIED */ });
48
+ result.push({ moduleName, node, state: 0 /* ImportState.UNMODIFIED */ });
51
49
  continue;
52
50
  }
53
51
  // Handles imports resolving to default exports of a module.
@@ -57,7 +55,7 @@ class ImportManager {
57
55
  moduleName,
58
56
  node,
59
57
  name: node.importClause.name,
60
- state: 0 /* UNMODIFIED */,
58
+ state: 0 /* ImportState.UNMODIFIED */,
61
59
  });
62
60
  continue;
63
61
  }
@@ -71,7 +69,7 @@ class ImportManager {
71
69
  name: el.name,
72
70
  propertyName: el.propertyName,
73
71
  })),
74
- state: 0 /* UNMODIFIED */,
72
+ state: 0 /* ImportState.UNMODIFIED */,
75
73
  });
76
74
  }
77
75
  else {
@@ -81,7 +79,7 @@ class ImportManager {
81
79
  node,
82
80
  name: node.importClause.namedBindings.name,
83
81
  namespace: true,
84
- state: 0 /* UNMODIFIED */,
82
+ state: 0 /* ImportState.UNMODIFIED */,
85
83
  });
86
84
  }
87
85
  }
@@ -113,10 +111,10 @@ class ImportManager {
113
111
  // given symbol, we can just mark the whole import for deletion. Otherwise, we mark
114
112
  // it as modified so that it will be re-printed.
115
113
  if (importData.specifiers.length === 0) {
116
- importData.state |= 8 /* DELETED */;
114
+ importData.state |= 8 /* ImportState.DELETED */;
117
115
  }
118
116
  else {
119
- importData.state |= 2 /* MODIFIED */;
117
+ importData.state |= 2 /* ImportState.MODIFIED */;
120
118
  }
121
119
  }
122
120
  }
@@ -126,7 +124,7 @@ class ImportManager {
126
124
  const fileImports = this._analyzeImportsIfNeeded(declaration.getSourceFile());
127
125
  for (let importData of fileImports) {
128
126
  if (importData.node === declaration) {
129
- importData.state |= 8 /* DELETED */;
127
+ importData.state |= 8 /* ImportState.DELETED */;
130
128
  }
131
129
  }
132
130
  }
@@ -186,11 +184,11 @@ class ImportManager {
186
184
  name: importName,
187
185
  propertyName: needsGeneratedUniqueName ? propertyIdentifier : undefined,
188
186
  });
189
- existingImport.state |= 2 /* MODIFIED */;
190
- if (hasFlag(existingImport, 8 /* DELETED */)) {
187
+ existingImport.state |= 2 /* ImportState.MODIFIED */;
188
+ if (hasFlag(existingImport, 8 /* ImportState.DELETED */)) {
191
189
  // unset the deleted flag if the import is pending deletion, but
192
190
  // can now be used for the new imported symbol.
193
- existingImport.state &= ~8 /* DELETED */;
191
+ existingImport.state &= ~8 /* ImportState.DELETED */;
194
192
  }
195
193
  return importName;
196
194
  }
@@ -211,7 +209,7 @@ class ImportManager {
211
209
  name: identifier,
212
210
  },
213
211
  ],
214
- state: 4 /* ADDED */,
212
+ state: 4 /* ImportState.ADDED */,
215
213
  };
216
214
  }
217
215
  else {
@@ -221,7 +219,7 @@ class ImportManager {
221
219
  moduleName,
222
220
  node: newImportDecl,
223
221
  name: identifier,
224
- state: 4 /* ADDED */,
222
+ state: 4 /* ImportState.ADDED */,
225
223
  };
226
224
  }
227
225
  fileImports.push(newImport);
@@ -237,44 +235,44 @@ class ImportManager {
237
235
  const recorder = this._fileSystem.edit(this._fileSystem.resolve(sourceFile.fileName));
238
236
  const lastUnmodifiedImport = fileImports
239
237
  .reverse()
240
- .find(i => i.state === 0 /* UNMODIFIED */);
238
+ .find(i => i.state === 0 /* ImportState.UNMODIFIED */);
241
239
  const importStartIndex = lastUnmodifiedImport
242
240
  ? this._getEndPositionOfNode(lastUnmodifiedImport.node)
243
241
  : 0;
244
242
  fileImports.forEach(importData => {
245
- if (importData.state === 0 /* UNMODIFIED */) {
243
+ if (importData.state === 0 /* ImportState.UNMODIFIED */) {
246
244
  return;
247
245
  }
248
- if (hasFlag(importData, 8 /* DELETED */)) {
246
+ if (hasFlag(importData, 8 /* ImportState.DELETED */)) {
249
247
  // Imports which do not exist in source file, can be just skipped as
250
248
  // we do not need any replacement to delete the import.
251
- if (!hasFlag(importData, 4 /* ADDED */)) {
249
+ if (!hasFlag(importData, 4 /* ImportState.ADDED */)) {
252
250
  recorder.remove(importData.node.getFullStart(), importData.node.getFullWidth());
253
251
  }
254
252
  return;
255
253
  }
256
254
  if (importData.specifiers) {
257
255
  const namedBindings = importData.node.importClause.namedBindings;
258
- const importSpecifiers = importData.specifiers.map(s => createImportSpecifier(s.propertyName, s.name));
256
+ const importSpecifiers = importData.specifiers.map(s => ts.factory.createImportSpecifier(false, s.propertyName, s.name));
259
257
  const updatedBindings = ts.factory.updateNamedImports(namedBindings, importSpecifiers);
260
258
  // In case an import has been added newly, we need to print the whole import
261
259
  // declaration and insert it at the import start index. Otherwise, we just
262
260
  // update the named bindings to not re-print the whole import (which could
263
261
  // cause unnecessary formatting changes)
264
- if (hasFlag(importData, 4 /* ADDED */)) {
262
+ if (hasFlag(importData, 4 /* ImportState.ADDED */)) {
265
263
  const updatedImport = ts.factory.updateImportDeclaration(importData.node, undefined, undefined, ts.factory.createImportClause(false, undefined, updatedBindings), ts.factory.createStringLiteral(importData.moduleName), undefined);
266
264
  const newImportText = this._printer.printNode(ts.EmitHint.Unspecified, updatedImport, sourceFile);
267
265
  recorder.insertLeft(importStartIndex, importStartIndex === 0 ? `${newImportText}\n` : `\n${newImportText}`);
268
266
  return;
269
267
  }
270
- else if (hasFlag(importData, 2 /* MODIFIED */)) {
268
+ else if (hasFlag(importData, 2 /* ImportState.MODIFIED */)) {
271
269
  const newNamedBindingsText = this._printer.printNode(ts.EmitHint.Unspecified, updatedBindings, sourceFile);
272
270
  recorder.remove(namedBindings.getStart(), namedBindings.getWidth());
273
271
  recorder.insertRight(namedBindings.getStart(), newNamedBindingsText);
274
272
  return;
275
273
  }
276
274
  }
277
- else if (hasFlag(importData, 4 /* ADDED */)) {
275
+ else if (hasFlag(importData, 4 /* ImportState.ADDED */)) {
278
276
  const newImportText = this._printer.printNode(ts.EmitHint.Unspecified, importData.node, sourceFile);
279
277
  recorder.insertLeft(importStartIndex, importStartIndex === 0 ? `${newImportText}\n` : `\n${newImportText}`);
280
278
  return;
@@ -305,10 +303,10 @@ class ImportManager {
305
303
  const fullEnd = importData.node.getFullStart() + importData.node.getFullWidth();
306
304
  // Subtract or add lines based on whether an import has been deleted or removed
307
305
  // before the actual node offset.
308
- if (offset > fullEnd && hasFlag(importData, 8 /* DELETED */)) {
306
+ if (offset > fullEnd && hasFlag(importData, 8 /* ImportState.DELETED */)) {
309
307
  newPosition.line--;
310
308
  }
311
- else if (offset > fullEnd && hasFlag(importData, 4 /* ADDED */)) {
309
+ else if (offset > fullEnd && hasFlag(importData, 4 /* ImportState.ADDED */)) {
312
310
  newPosition.line++;
313
311
  }
314
312
  }
@@ -383,11 +381,4 @@ class ImportManager {
383
381
  }
384
382
  }
385
383
  exports.ImportManager = ImportManager;
386
- // TODO(crisbeto): backwards-compatibility layer that allows us to support both TS 4.4 and 4.5.
387
- // Should be removed once we don't have to support 4.4 anymore.
388
- function createImportSpecifier(propertyName, name) {
389
- return PARSED_TS_VERSION > 4.4
390
- ? ts.factory.createImportSpecifier(false, propertyName, name)
391
- : ts.createImportSpecifier(propertyName, name);
392
- }
393
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc2NoZW1hdGljcy9uZy11cGRhdGUvbWlncmF0aW9ucy9oYW1tZXItZ2VzdHVyZXMtdjkvaW1wb3J0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gsK0JBQXNDO0FBQ3RDLGlDQUFpQztBQTRCakMsdUVBQXVFO0FBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBb0IsRUFBRSxJQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZGLHFFQUFxRTtBQUNyRSxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBYSxhQUFhO0lBT3hCLFlBQW9CLFdBQXVCLEVBQVUsUUFBb0I7UUFBckQsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBTnpFLHNFQUFzRTtRQUM5RCx5QkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztRQUVsRSxzREFBc0Q7UUFDOUMsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQztJQUVVLENBQUM7SUFFN0U7Ozs7O09BS0c7SUFDSyx1QkFBdUIsQ0FBQyxVQUF5QjtRQUN2RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFFLENBQUM7U0FDM0M7UUFFRCxNQUFNLE1BQU0sR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLEtBQUssSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRTtZQUN0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QkFBcUIsQ0FBQyxVQUF5QixFQUFFLGNBQXNCO1FBQzdFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQzNCLFVBQVUsRUFDVixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFCQUFxQixDQUFDLElBQWE7UUFDekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQzNDLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsQ0FBQyxHQUFHLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBL2RELHNDQStkQztBQUVELCtGQUErRjtBQUMvRiwrREFBK0Q7QUFDL0QsU0FBUyxxQkFBcUIsQ0FDNUIsWUFBdUMsRUFDdkMsSUFBbUI7SUFFbkIsT0FBTyxpQkFBaUIsR0FBRyxHQUFHO1FBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDO1FBQzdELENBQUMsQ0FBRSxFQUFFLENBQUMscUJBQTZCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtGaWxlU3lzdGVtfSBmcm9tICdAYW5ndWxhci9jZGsvc2NoZW1hdGljcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcblxuLyoqIEVudW0gZGVzY3JpYmluZyB0aGUgcG9zc2libGUgc3RhdGVzIG9mIGFuIGFuYWx5emVkIGltcG9ydC4gKi9cbmNvbnN0IGVudW0gSW1wb3J0U3RhdGUge1xuICBVTk1PRElGSUVEID0gMGIwLFxuICBNT0RJRklFRCA9IDBiMTAsXG4gIEFEREVEID0gMGIxMDAsXG4gIERFTEVURUQgPSAwYjEwMDAsXG59XG5cbi8qKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhbiBpbXBvcnQgc3BlY2lmaWVyLiAqL1xuaW50ZXJmYWNlIEltcG9ydFNwZWNpZmllciB7XG4gIG5hbWU6IHRzLklkZW50aWZpZXI7XG4gIHByb3BlcnR5TmFtZT86IHRzLklkZW50aWZpZXI7XG59XG5cbi8qKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhbiBhbmFseXplZCBpbXBvcnQuICovXG5pbnRlcmZhY2UgQW5hbHl6ZWRJbXBvcnQge1xuICBub2RlOiB0cy5JbXBvcnREZWNsYXJhdGlvbjtcbiAgbW9kdWxlTmFtZTogc3RyaW5nO1xuICBuYW1lPzogdHMuSWRlbnRpZmllcjtcbiAgc3BlY2lmaWVycz86IEltcG9ydFNwZWNpZmllcltdO1xuICBuYW1lc3BhY2U/OiBib29sZWFuO1xuICBzdGF0ZTogSW1wb3J0U3RhdGU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciBhbiBhbmFseXplZCBpbXBvcnQgaGFzIHRoZSBnaXZlbiBpbXBvcnQgZmxhZyBzZXQuICovXG5jb25zdCBoYXNGbGFnID0gKGRhdGE6IEFuYWx5emVkSW1wb3J0LCBmbGFnOiBJbXBvcnRTdGF0ZSkgPT4gKGRhdGEuc3RhdGUgJiBmbGFnKSAhPT0gMDtcblxuLyoqIFBhcnNlZCB2ZXJzaW9uIG9mIFR5cGVTY3JpcHQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY29tcGFyaXNvbnMuICovXG5jb25zdCBQQVJTRURfVFNfVkVSU0lPTiA9IHBhcnNlRmxvYXQodHMudmVyc2lvbk1ham9yTWlub3IpO1xuXG4vKipcbiAqIEltcG9ydCBtYW5hZ2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIG9yIHJlbW92ZSBUeXBlU2NyaXB0IGltcG9ydHMgd2l0aGluIHNvdXJjZVxuICogZmlsZXMuIFRoZSBtYW5hZ2VyIGVuc3VyZXMgdGhhdCBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQgcHJvcGVybHlcbiAqIHdpdGhvdXQgc2hpZnRlZCBvZmZzZXRzIGFuZCB0aGF0IGV4aXN0aW5nIGltcG9ydHMgYXJlIHJlLXVzZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbXBvcnRNYW5hZ2VyIHtcbiAgLyoqIE1hcCBvZiBzb3VyY2UtZmlsZXMgYW5kIHRoZWlyIHByZXZpb3VzbHkgdXNlZCBpZGVudGlmaWVyIG5hbWVzLiAqL1xuICBwcml2YXRlIF91c2VkSWRlbnRpZmllck5hbWVzID0gbmV3IE1hcDx0cy5Tb3VyY2VGaWxlLCBzdHJpbmdbXT4oKTtcblxuICAvKiogTWFwIG9mIHNvdXJjZSBmaWxlcyBhbmQgdGhlaXIgYW5hbHl6ZWQgaW1wb3J0cy4gKi9cbiAgcHJpdmF0ZSBfaW1wb3J0Q2FjaGUgPSBuZXcgTWFwPHRzLlNvdXJjZUZpbGUsIEFuYWx5emVkSW1wb3J0W10+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZmlsZVN5c3RlbTogRmlsZVN5c3RlbSwgcHJpdmF0ZSBfcHJpbnRlcjogdHMuUHJpbnRlcikge31cblxuICAvKipcbiAgICogQW5hbHl6ZXMgdGhlIGltcG9ydCBvZiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlIGlmIG5lZWRlZC4gSW4gb3JkZXIgdG8gcGVyZm9ybVxuICAgKiBtb2RpZmljYXRpb25zIHRvIGltcG9ydHMgb2YgYSBzb3VyY2UgZmlsZSwgd2Ugc3RvcmUgYWxsIGltcG9ydHMgaW4gbWVtb3J5IGFuZFxuICAgKiB1cGRhdGUgdGhlIHNvdXJjZSBmaWxlIG9uY2UgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUuIFRoaXMgaXMgZXNzZW50aWFsIHRvXG4gICAqIGVuc3VyZSB0aGF0IHdlIGNhbiByZS11c2UgbmV3bHkgYWRkZWQgaW1wb3J0cyBhbmQgbm90IGJyZWFrIGZpbGUgb2Zmc2V0cy5cbiAgICovXG4gIHByaXZhdGUgX2FuYWx5emVJbXBvcnRzSWZOZWVkZWQoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IEFuYWx5emVkSW1wb3J0W10ge1xuICAgIGlmICh0aGlzLl9pbXBvcnRDYWNoZS5oYXMoc291cmNlRmlsZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbXBvcnRDYWNoZS5nZXQoc291cmNlRmlsZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogQW5hbHl6ZWRJbXBvcnRbXSA9IFtdO1xuICAgIGZvciAobGV0IG5vZGUgb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICBpZiAoIXRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkgfHwgIXRzLmlzU3RyaW5nTGl0ZXJhbChub2RlLm1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBub2RlLm1vZHVsZVNwZWNpZmllci50ZXh0O1xuXG4gICAgICAvLyBIYW5kbGVzIHNpZGUtZWZmZWN0IGltcG9ydHMgd2hpY2ggZG8gbmVpdGhlciBoYXZlIGEgbmFtZSBvclxuICAgICAgLy8gc3BlY2lmaWVycy4gZS5nLiBgaW1wb3J0IFwibXktcGFja2FnZVwiO2BcbiAgICAgIGlmICghbm9kZS5pbXBvcnRDbGF1c2UpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe21vZHVsZU5hbWUsIG5vZGUsIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVEfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGVzIGltcG9ydHMgcmVzb2x2aW5nIHRvIGRlZmF1bHQgZXhwb3J0cyBvZiBhIG1vZHVsZS5cbiAgICAgIC8vIGUuZy4gYGltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO2BcbiAgICAgIGlmICghbm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncykge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG5hbWU6IG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWUsXG4gICAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlcyBpbXBvcnRzIHdpdGggaW5kaXZpZHVhbCBzeW1ib2wgc3BlY2lmaWVycy5cbiAgICAgIC8vIGUuZy4gYGltcG9ydCB7QSwgQiwgQ30gZnJvbSBcIm15LW1vZHVsZVwiO2BcbiAgICAgIGlmICh0cy5pc05hbWVkSW1wb3J0cyhub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHNwZWNpZmllcnM6IG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MuZWxlbWVudHMubWFwKGVsID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBlbC5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVELFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZXMgbmFtZXNwYWNlZCBpbXBvcnRzLiBlLmcuIGBpbXBvcnQgKiBhcyBjb3JlIGZyb20gXCJteS1wa2dcIjtgXG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgbmFtZTogbm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncy5uYW1lLFxuICAgICAgICAgIG5hbWVzcGFjZTogdHJ1ZSxcbiAgICAgICAgICBzdGF0ZTogSW1wb3J0U3RhdGUuVU5NT0RJRklFRCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ltcG9ydENhY2hlLnNldChzb3VyY2VGaWxlLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHNwZWNpZmllciwgd2hpY2ggY2FuIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHBhdGgsXG4gICAqIG1hdGNoZXMgdGhlIHBhc3NlZCBtb2R1bGUgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgX2lzTW9kdWxlU3BlY2lmaWVyTWF0Y2hpbmcoXG4gICAgYmFzZVBhdGg6IHN0cmluZyxcbiAgICBzcGVjaWZpZXI6IHN0cmluZyxcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpXG4gICAgICA/IHJlc29sdmUoYmFzZVBhdGgsIHNwZWNpZmllcikgPT09IHJlc29sdmUoYmFzZVBhdGgsIG1vZHVsZU5hbWUpXG4gICAgICA6IHNwZWNpZmllciA9PT0gbW9kdWxlTmFtZTtcbiAgfVxuXG4gIC8qKiBEZWxldGVzIGEgZ2l2ZW4gbmFtZWQgYmluZGluZyBpbXBvcnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlLiAqL1xuICBkZWxldGVOYW1lZEJpbmRpbmdJbXBvcnQoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgc3ltYm9sTmFtZTogc3RyaW5nLCBtb2R1bGVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBkaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChzb3VyY2VGaWxlKTtcblxuICAgIGZvciAobGV0IGltcG9ydERhdGEgb2YgZmlsZUltcG9ydHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuX2lzTW9kdWxlU3BlY2lmaWVyTWF0Y2hpbmcoc291cmNlRGlyLCBpbXBvcnREYXRhLm1vZHVsZU5hbWUsIG1vZHVsZU5hbWUpIHx8XG4gICAgICAgICFpbXBvcnREYXRhLnNwZWNpZmllcnNcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWVySW5kZXggPSBpbXBvcnREYXRhLnNwZWNpZmllcnMuZmluZEluZGV4KFxuICAgICAgICBkID0+IChkLnByb3BlcnR5TmFtZSB8fCBkLm5hbWUpLnRleHQgPT09IHN5bWJvbE5hbWUsXG4gICAgICApO1xuICAgICAgaWYgKHNwZWNpZmllckluZGV4ICE9PSAtMSkge1xuICAgICAgICBpbXBvcnREYXRhLnNwZWNpZmllcnMuc3BsaWNlKHNwZWNpZmllckluZGV4LCAxKTtcbiAgICAgICAgLy8gaWYgdGhlIGltcG9ydCBkb2VzIG5vIGxvbmdlciBjb250YWluIGFueSBzcGVjaWZpZXJzIGFmdGVyIHRoZSByZW1vdmFsIG9mIHRoZVxuICAgICAgICAvLyBnaXZlbiBzeW1ib2wsIHdlIGNhbiBqdXN0IG1hcmsgdGhlIHdob2xlIGltcG9ydCBmb3IgZGVsZXRpb24uIE90aGVyd2lzZSwgd2UgbWFya1xuICAgICAgICAvLyBpdCBhcyBtb2RpZmllZCBzbyB0aGF0IGl0IHdpbGwgYmUgcmUtcHJpbnRlZC5cbiAgICAgICAgaWYgKGltcG9ydERhdGEuc3BlY2lmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpbXBvcnREYXRhLnN0YXRlIHw9IEltcG9ydFN0YXRlLkRFTEVURUQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1wb3J0RGF0YS5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5NT0RJRklFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBEZWxldGVzIHRoZSBpbXBvcnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBpbXBvcnQgZGVjbGFyYXRpb24gaWYgZm91bmQuICovXG4gIGRlbGV0ZUltcG9ydEJ5RGVjbGFyYXRpb24oZGVjbGFyYXRpb246IHRzLkltcG9ydERlY2xhcmF0aW9uKSB7XG4gICAgY29uc3QgZmlsZUltcG9ydHMgPSB0aGlzLl9hbmFseXplSW1wb3J0c0lmTmVlZGVkKGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKSk7XG4gICAgZm9yIChsZXQgaW1wb3J0RGF0YSBvZiBmaWxlSW1wb3J0cykge1xuICAgICAgaWYgKGltcG9ydERhdGEubm9kZSA9PT0gZGVjbGFyYXRpb24pIHtcbiAgICAgICAgaW1wb3J0RGF0YS5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5ERUxFVEVEO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGltcG9ydCB0byB0aGUgZ2l2ZW4gc291cmNlIGZpbGUgYW5kIHJldHVybnMgdGhlIFR5cGVTY3JpcHQgZXhwcmVzc2lvbiB0aGF0XG4gICAqIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgbmV3bHkgaW1wb3J0ZWQgc3ltYm9sLlxuICAgKlxuICAgKiBXaGVuZXZlciBhbiBpbXBvcnQgaXMgYWRkZWQgdG8gYSBzb3VyY2UgZmlsZSwgaXQncyByZWNvbW1lbmRlZCB0aGF0IHRoZSByZXR1cm5lZFxuICAgKiBleHByZXNzaW9uIGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoIHN5bWJvbC4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgc3ltYm9sXG4gICAqIGNvdWxkIGJlIGFsaWFzZWQgaWYgaXQgd291bGQgY29sbGlkZSB3aXRoIGV4aXN0aW5nIGltcG9ydHMgaW4gc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIHRvIHdoaWNoIHRoZSBpbXBvcnQgc2hvdWxkIGJlIGFkZGVkLlxuICAgKiBAcGFyYW0gc3ltYm9sTmFtZSBOYW1lIG9mIHRoZSBzeW1ib2wgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIENhbiBiZSBudWxsIGlmXG4gICAqICAgIHRoZSBkZWZhdWx0IGV4cG9ydCBpcyByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSBtb2R1bGVOYW1lIE5hbWUgb2YgdGhlIG1vZHVsZSBvZiB3aGljaCB0aGUgc3ltYm9sIHNob3VsZCBiZSBpbXBvcnRlZC5cbiAgICogQHBhcmFtIHR5cGVJbXBvcnQgV2hldGhlciB0aGUgc3ltYm9sIGlzIGEgdHlwZS5cbiAgICogQHBhcmFtIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zIExpc3Qgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIGlnbm9yZWQgd2hlblxuICAgKiAgICB0aGUgaW1wb3J0IG1hbmFnZXIgY2hlY2tzIGZvciBpbXBvcnQgY29sbGlzaW9ucy5cbiAgICovXG4gIGFkZEltcG9ydFRvU291cmNlRmlsZShcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIHN5bWJvbE5hbWU6IHN0cmluZyB8IG51bGwsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICAgIHR5cGVJbXBvcnQgPSBmYWxzZSxcbiAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9uczogdHMuSWRlbnRpZmllcltdID0gW10sXG4gICk6IHRzLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHNvdXJjZURpciA9IGRpcm5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgY29uc3QgZmlsZUltcG9ydHMgPSB0aGlzLl9hbmFseXplSW1wb3J0c0lmTmVlZGVkKHNvdXJjZUZpbGUpO1xuXG4gICAgbGV0IGV4aXN0aW5nSW1wb3J0OiBBbmFseXplZEltcG9ydCB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IGltcG9ydERhdGEgb2YgZmlsZUltcG9ydHMpIHtcbiAgICAgIGlmICghdGhpcy5faXNNb2R1bGVTcGVjaWZpZXJNYXRjaGluZyhzb3VyY2VEaXIsIGltcG9ydERhdGEubW9kdWxlTmFtZSwgbW9kdWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIHN5bWJvbCBuYW1lIGhhcyBiZWVuIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaW1wb3J0IGlzIHJlcXVlc3RlZC4gSW4gdGhhdFxuICAgICAgLy8gY2FzZSB3ZSBzZWFyY2ggZm9yIG5vbi1uYW1lc3BhY2UgYW5kIG5vbi1zcGVjaWZpZXIgaW1wb3J0cy5cbiAgICAgIGlmICghc3ltYm9sTmFtZSAmJiAhaW1wb3J0RGF0YS5uYW1lc3BhY2UgJiYgIWltcG9ydERhdGEuc3BlY2lmaWVycykge1xuICAgICAgICByZXR1cm4gdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKGltcG9ydERhdGEubmFtZSEudGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGNhc2UgYSBcIlR5cGVcIiBzeW1ib2wgaXMgaW1wb3J0ZWQsIHdlIGNhbid0IHVzZSBuYW1lc3BhY2UgaW1wb3J0c1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBvbmx5IGV4cG9ydCBzeW1ib2xzIGF2YWlsYWJsZSBhdCBydW50aW1lIChubyB0eXBlcylcbiAgICAgIGlmIChpbXBvcnREYXRhLm5hbWVzcGFjZSAmJiAhdHlwZUltcG9ydCkge1xuICAgICAgICByZXR1cm4gdHMuZmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24oXG4gICAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKGltcG9ydERhdGEubmFtZSEudGV4dCksXG4gICAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKHN5bWJvbE5hbWUgfHwgJ2RlZmF1bHQnKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaW1wb3J0RGF0YS5zcGVjaWZpZXJzICYmIHN5bWJvbE5hbWUpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBpbXBvcnREYXRhLnNwZWNpZmllcnMuZmluZChzID0+XG4gICAgICAgICAgcy5wcm9wZXJ0eU5hbWUgPyBzLnByb3BlcnR5TmFtZS50ZXh0ID09PSBzeW1ib2xOYW1lIDogcy5uYW1lLnRleHQgPT09IHN5bWJvbE5hbWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nU3BlY2lmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihleGlzdGluZ1NwZWNpZmllci5uYW1lLnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gY2FzZSB0aGUgc3ltYm9sIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBhbiBleGlzdGluZyBpbXBvcnQsIHdlXG4gICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGltcG9ydCBkZWNsYXJhdGlvbiBhcyBpdCBjYW4gYmUgdXBkYXRlZCB0byBpbmNsdWRlXG4gICAgICAgIC8vIHRoZSBzcGVjaWZpZWQgc3ltYm9sIG5hbWUgd2l0aG91dCBoYXZpbmcgdG8gY3JlYXRlIGEgbmV3IGltcG9ydC5cbiAgICAgICAgZXhpc3RpbmdJbXBvcnQgPSBpbXBvcnREYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGltcG9ydCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtb2R1bGUsIHdlXG4gICAgLy8ganVzdCB1cGRhdGUgdGhlIGltcG9ydCBzcGVjaWZpZXJzIHRvIGFsc28gaW1wb3J0IHRoZSByZXF1ZXN0ZWQgc3ltYm9sLlxuICAgIGlmIChleGlzdGluZ0ltcG9ydCkge1xuICAgICAgY29uc3QgcHJvcGVydHlJZGVudGlmaWVyID0gdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKHN5bWJvbE5hbWUhKTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIgPSB0aGlzLl9nZXRVbmlxdWVJZGVudGlmaWVyKFxuICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICBzeW1ib2xOYW1lISxcbiAgICAgICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID0gZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllci50ZXh0ICE9PSBzeW1ib2xOYW1lO1xuICAgICAgY29uc3QgaW1wb3J0TmFtZSA9IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA/IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIgOiBwcm9wZXJ0eUlkZW50aWZpZXI7XG5cbiAgICAgIGV4aXN0aW5nSW1wb3J0LnNwZWNpZmllcnMhLnB1c2goe1xuICAgICAgICBuYW1lOiBpbXBvcnROYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA/IHByb3BlcnR5SWRlbnRpZmllciA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgZXhpc3RpbmdJbXBvcnQuc3RhdGUgfD0gSW1wb3J0U3RhdGUuTU9ESUZJRUQ7XG5cbiAgICAgIGlmIChoYXNGbGFnKGV4aXN0aW5nSW1wb3J0LCBJbXBvcnRTdGF0ZS5ERUxFVEVEKSkge1xuICAgICAgICAvLyB1bnNldCB0aGUgZGVsZXRlZCBmbGFnIGlmIHRoZSBpbXBvcnQgaXMgcGVuZGluZyBkZWxldGlvbiwgYnV0XG4gICAgICAgIC8vIGNhbiBub3cgYmUgdXNlZCBmb3IgdGhlIG5ldyBpbXBvcnRlZCBzeW1ib2wuXG4gICAgICAgIGV4aXN0aW5nSW1wb3J0LnN0YXRlICY9IH5JbXBvcnRTdGF0ZS5ERUxFVEVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW1wb3J0TmFtZTtcbiAgICB9XG5cbiAgICBsZXQgaWRlbnRpZmllcjogdHMuSWRlbnRpZmllciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBuZXdJbXBvcnQ6IEFuYWx5emVkSW1wb3J0IHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAoc3ltYm9sTmFtZSkge1xuICAgICAgY29uc3QgcHJvcGVydHlJZGVudGlmaWVyID0gdHMuZmFjdG9yeS5jcmVhdGVJZGVudGlmaWVyKHN5bWJvbE5hbWUpO1xuICAgICAgY29uc3QgZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllciA9IHRoaXMuX2dldFVuaXF1ZUlkZW50aWZpZXIoXG4gICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgIHN5bWJvbE5hbWUsXG4gICAgICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA9IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIudGV4dCAhPT0gc3ltYm9sTmFtZTtcbiAgICAgIGlkZW50aWZpZXIgPSBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyIDogcHJvcGVydHlJZGVudGlmaWVyO1xuXG4gICAgICBjb25zdCBuZXdJbXBvcnREZWNsID0gdHMuZmFjdG9yeS5jcmVhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0Q2xhdXNlKGZhbHNlLCB1bmRlZmluZWQsIHRzLmZhY3RvcnkuY3JlYXRlTmFtZWRJbXBvcnRzKFtdKSksXG4gICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlU3RyaW5nTGl0ZXJhbChtb2R1bGVOYW1lKSxcbiAgICAgICk7XG5cbiAgICAgIG5ld0ltcG9ydCA9IHtcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgbm9kZTogbmV3SW1wb3J0RGVjbCxcbiAgICAgICAgc3BlY2lmaWVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gcHJvcGVydHlJZGVudGlmaWVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFtZTogaWRlbnRpZmllcixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBzdGF0ZTogSW1wb3J0U3RhdGUuQURERUQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZGVudGlmaWVyID0gdGhpcy5fZ2V0VW5pcXVlSWRlbnRpZmllcihcbiAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgJ2RlZmF1bHRFeHBvcnQnLFxuICAgICAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdJbXBvcnREZWNsID0gdHMuZmFjdG9yeS5jcmVhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0Q2xhdXNlKGZhbHNlLCBpZGVudGlmaWVyLCB1bmRlZmluZWQpLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZVN0cmluZ0xpdGVyYWwobW9kdWxlTmFtZSksXG4gICAgICApO1xuICAgICAgbmV3SW1wb3J0ID0ge1xuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICBub2RlOiBuZXdJbXBvcnREZWNsLFxuICAgICAgICBuYW1lOiBpZGVudGlmaWVyLFxuICAgICAgICBzdGF0ZTogSW1wb3J0U3RhdGUuQURERUQsXG4gICAgICB9O1xuICAgIH1cbiAgICBmaWxlSW1wb3J0cy5wdXNoKG5ld0ltcG9ydCk7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgcmVjb3JkZWQgY2hhbmdlcyBpbiB0aGUgdXBkYXRlIHJlY29yZGVycyBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZXMuXG4gICAqIFRoZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHNlcGFyYXRlbHkgYWZ0ZXIgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIHJlY29yZGVkIGJlY2F1c2Ugb3RoZXJ3aXNlXG4gICAqIGZpbGUgb2Zmc2V0cyB3aWxsIGNoYW5nZSBhbmQgdGhlIHNvdXJjZSBmaWxlcyB3b3VsZCBuZWVkIHRvIGJlIHJlLXBhcnNlZCBhZnRlciBlYWNoIGNoYW5nZS5cbiAgICovXG4gIHJlY29yZENoYW5nZXMoKSB7XG4gICAgdGhpcy5faW1wb3J0Q2FjaGUuZm9yRWFjaCgoZmlsZUltcG9ydHMsIHNvdXJjZUZpbGUpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5fZmlsZVN5c3RlbS5lZGl0KHRoaXMuX2ZpbGVTeXN0ZW0ucmVzb2x2ZShzb3VyY2VGaWxlLmZpbGVOYW1lKSk7XG4gICAgICBjb25zdCBsYXN0VW5tb2RpZmllZEltcG9ydCA9IGZpbGVJbXBvcnRzXG4gICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgLmZpbmQoaSA9PiBpLnN0YXRlID09PSBJbXBvcnRTdGF0ZS5VTk1PRElGSUVEKTtcbiAgICAgIGNvbnN0IGltcG9ydFN0YXJ0SW5kZXggPSBsYXN0VW5tb2RpZmllZEltcG9ydFxuICAgICAgICA/IHRoaXMuX2dldEVuZFBvc2l0aW9uT2ZOb2RlKGxhc3RVbm1vZGlmaWVkSW1wb3J0Lm5vZGUpXG4gICAgICAgIDogMDtcblxuICAgICAgZmlsZUltcG9ydHMuZm9yRWFjaChpbXBvcnREYXRhID0+IHtcbiAgICAgICAgaWYgKGltcG9ydERhdGEuc3RhdGUgPT09IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5ERUxFVEVEKSkge1xuICAgICAgICAgIC8vIEltcG9ydHMgd2hpY2ggZG8gbm90IGV4aXN0IGluIHNvdXJjZSBmaWxlLCBjYW4gYmUganVzdCBza2lwcGVkIGFzXG4gICAgICAgICAgLy8gd2UgZG8gbm90IG5lZWQgYW55IHJlcGxhY2VtZW50IHRvIGRlbGV0ZSB0aGUgaW1wb3J0LlxuICAgICAgICAgIGlmICghaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5BRERFRCkpIHtcbiAgICAgICAgICAgIHJlY29yZGVyLnJlbW92ZShpbXBvcnREYXRhLm5vZGUuZ2V0RnVsbFN0YXJ0KCksIGltcG9ydERhdGEubm9kZS5nZXRGdWxsV2lkdGgoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbXBvcnREYXRhLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICBjb25zdCBuYW1lZEJpbmRpbmdzID0gaW1wb3J0RGF0YS5ub2RlLmltcG9ydENsYXVzZSEubmFtZWRCaW5kaW5ncyBhcyB0cy5OYW1lZEltcG9ydHM7XG4gICAgICAgICAgY29uc3QgaW1wb3J0U3BlY2lmaWVycyA9IGltcG9ydERhdGEuc3BlY2lmaWVycy5tYXAocyA9PlxuICAgICAgICAgICAgY3JlYXRlSW1wb3J0U3BlY2lmaWVyKHMucHJvcGVydHlOYW1lLCBzLm5hbWUpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEJpbmRpbmdzID0gdHMuZmFjdG9yeS51cGRhdGVOYW1lZEltcG9ydHMobmFtZWRCaW5kaW5ncywgaW1wb3J0U3BlY2lmaWVycyk7XG5cbiAgICAgICAgICAvLyBJbiBjYXNlIGFuIGltcG9ydCBoYXMgYmVlbiBhZGRlZCBuZXdseSwgd2UgbmVlZCB0byBwcmludCB0aGUgd2hvbGUgaW1wb3J0XG4gICAgICAgICAgLy8gZGVjbGFyYXRpb24gYW5kIGluc2VydCBpdCBhdCB0aGUgaW1wb3J0IHN0YXJ0IGluZGV4LiBPdGhlcndpc2UsIHdlIGp1c3RcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIG5hbWVkIGJpbmRpbmdzIHRvIG5vdCByZS1wcmludCB0aGUgd2hvbGUgaW1wb3J0ICh3aGljaCBjb3VsZFxuICAgICAgICAgIC8vIGNhdXNlIHVubmVjZXNzYXJ5IGZvcm1hdHRpbmcgY2hhbmdlcylcbiAgICAgICAgICBpZiAoaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5BRERFRCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJbXBvcnQgPSB0cy5mYWN0b3J5LnVwZGF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICBpbXBvcnREYXRhLm5vZGUsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydENsYXVzZShmYWxzZSwgdW5kZWZpbmVkLCB1cGRhdGVkQmluZGluZ3MpLFxuICAgICAgICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZVN0cmluZ0xpdGVyYWwoaW1wb3J0RGF0YS5tb2R1bGVOYW1lKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ltcG9ydFRleHQgPSB0aGlzLl9wcmludGVyLnByaW50Tm9kZShcbiAgICAgICAgICAgICAgdHMuRW1pdEhpbnQuVW5zcGVjaWZpZWQsXG4gICAgICAgICAgICAgIHVwZGF0ZWRJbXBvcnQsXG4gICAgICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVjb3JkZXIuaW5zZXJ0TGVmdChcbiAgICAgICAgICAgICAgaW1wb3J0U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgaW1wb3J0U3RhcnRJbmRleCA9PT0gMCA/IGAke25ld0ltcG9ydFRleHR9XFxuYCA6IGBcXG4ke25ld0ltcG9ydFRleHR9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLk1PRElGSUVEKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3TmFtZWRCaW5kaW5nc1RleHQgPSB0aGlzLl9wcmludGVyLnByaW50Tm9kZShcbiAgICAgICAgICAgICAgdHMuRW1pdEhpbnQuVW5zcGVjaWZpZWQsXG4gICAgICAgICAgICAgIHVwZGF0ZWRCaW5kaW5ncyxcbiAgICAgICAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZWNvcmRlci5yZW1vdmUobmFtZWRCaW5kaW5ncy5nZXRTdGFydCgpLCBuYW1lZEJpbmRpbmdzLmdldFdpZHRoKCkpO1xuICAgICAgICAgICAgcmVjb3JkZXIuaW5zZXJ0UmlnaHQobmFtZWRCaW5kaW5ncy5nZXRTdGFydCgpLCBuZXdOYW1lZEJpbmRpbmdzVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgICAgY29uc3QgbmV3SW1wb3J0VGV4dCA9IHRoaXMuX3ByaW50ZXIucHJpbnROb2RlKFxuICAgICAgICAgICAgdHMuRW1pdEhpbnQuVW5zcGVjaWZpZWQsXG4gICAgICAgICAgICBpbXBvcnREYXRhLm5vZGUsXG4gICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVjb3JkZXIuaW5zZXJ0TGVmdChcbiAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4ID09PSAwID8gYCR7bmV3SW1wb3J0VGV4dH1cXG5gIDogYFxcbiR7bmV3SW1wb3J0VGV4dH1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2Ugc2hvdWxkIG5ldmVyIGhpdCB0aGlzLCBidXQgd2UgcmF0aGVyIHdhbnQgdG8gcHJpbnQgYSBjdXN0b20gZXhjZXB0aW9uXG4gICAgICAgIC8vIGluc3RlYWQgb2YganVzdCBza2lwcGluZyBpbXBvcnRzIHNpbGVudGx5LlxuICAgICAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBpbXBvcnQgbW9kaWZpY2F0aW9uLicpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29ycmVjdHMgdGhlIGxpbmUgYW5kIGNoYXJhY3RlciBwb3NpdGlvbiBvZiBhIGdpdmVuIG5vZGUuIFNpbmNlIG5vZGVzIG9mXG4gICAqIHNvdXJjZSBmaWxlcyBhcmUgaW1tdXRhYmxlIGFuZCB3ZSBzb21ldGltZXMgbWFrZSBjaGFuZ2VzIHRvIHRoZSBjb250YWluaW5nXG4gICAqIHNvdXJjZSBmaWxlLCB0aGUgbm9kZSBwb3NpdGlvbiBtaWdodCBzaGlmdCAoZS5nLiBpZiB3ZSBhZGQgYSBuZXcgaW1wb3J0IGJlZm9yZSkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgY29ycmVjdGVkIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBub2RlLiBUaGlzXG4gICAqIGlzIGhlbHBmdWwgd2hlbiBwcmludGluZyBvdXQgZXJyb3IgbWVzc2FnZXMgd2hpY2ggc2hvdWxkIHJlZmxlY3QgdGhlIG5ldyBzdGF0ZSBvZlxuICAgKiBzb3VyY2UgZmlsZXMuXG4gICAqL1xuICBjb3JyZWN0Tm9kZVBvc2l0aW9uKG5vZGU6IHRzLk5vZGUsIG9mZnNldDogbnVtYmVyLCBwb3NpdGlvbjogdHMuTGluZUFuZENoYXJhY3Rlcikge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcblxuICAgIGlmICghdGhpcy5faW1wb3J0Q2FjaGUuaGFzKHNvdXJjZUZpbGUpKSB7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UG9zaXRpb246IHRzLkxpbmVBbmRDaGFyYWN0ZXIgPSB7Li4ucG9zaXRpb259O1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5faW1wb3J0Q2FjaGUuZ2V0KHNvdXJjZUZpbGUpITtcblxuICAgIGZvciAobGV0IGltcG9ydERhdGEgb2YgZmlsZUltcG9ydHMpIHtcbiAgICAgIGNvbnN0IGZ1bGxFbmQgPSBpbXBvcnREYXRhLm5vZGUuZ2V0RnVsbFN0YXJ0KCkgKyBpbXBvcnREYXRhLm5vZGUuZ2V0RnVsbFdpZHRoKCk7XG4gICAgICAvLyBTdWJ0cmFjdCBvciBhZGQgbGluZXMgYmFzZWQgb24gd2hldGhlciBhbiBpbXBvcnQgaGFzIGJlZW4gZGVsZXRlZCBvciByZW1vdmVkXG4gICAgICAvLyBiZWZvcmUgdGhlIGFjdHVhbCBub2RlIG9mZnNldC5cbiAgICAgIGlmIChvZmZzZXQgPiBmdWxsRW5kICYmIGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuREVMRVRFRCkpIHtcbiAgICAgICAgbmV3UG9zaXRpb24ubGluZS0tO1xuICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPiBmdWxsRW5kICYmIGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgIG5ld1Bvc2l0aW9uLmxpbmUrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gdW5pcXVlIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBzeW1ib2wgbmFtZS5cbiAgICogQHBhcmFtIHNvdXJjZUZpbGUgU291cmNlIGZpbGUgdG8gY2hlY2sgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucy5cbiAgICogQHBhcmFtIHN5bWJvbE5hbWUgTmFtZSBvZiB0aGUgc3ltYm9sIGZvciB3aGljaCB3ZSB3YW50IHRvIGdlbmVyYXRlIGFuIHVuaXF1ZSBuYW1lLlxuICAgKiBAcGFyYW0gaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMgTGlzdCBvZiBpZGVudGlmaWVycyB3aGljaCBzaG91bGQgYmUgaWdub3JlZCB3aGVuXG4gICAqICAgIGNoZWNraW5nIGZvciBpZGVudGlmaWVyIGNvbGxpc2lvbnMgaW4gdGhlIGdpdmVuIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VW5pcXVlSWRlbnRpZmllcihcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIHN5bWJvbE5hbWU6IHN0cmluZyxcbiAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9uczogdHMuSWRlbnRpZmllcltdLFxuICApOiB0cy5JZGVudGlmaWVyIHtcbiAgICBpZiAodGhpcy5faXNVbmlxdWVJZGVudGlmaWVyTmFtZShzb3VyY2VGaWxlLCBzeW1ib2xOYW1lLCBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucykpIHtcbiAgICAgIHRoaXMuX3JlY29yZFVzZWRJZGVudGlmaWVyKHNvdXJjZUZpbGUsIHN5bWJvbE5hbWUpO1xuICAgICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lKTtcbiAgICB9XG5cbiAgICBsZXQgbmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgIGRvIHtcbiAgICAgIG5hbWUgPSBgJHtzeW1ib2xOYW1lfV8ke2NvdW50ZXIrK31gO1xuICAgIH0gd2hpbGUgKCF0aGlzLl9pc1VuaXF1ZUlkZW50aWZpZXJOYW1lKHNvdXJjZUZpbGUsIG5hbWUsIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zKSk7XG5cbiAgICB0aGlzLl9yZWNvcmRVc2VkSWRlbnRpZmllcihzb3VyY2VGaWxlLCBuYW1lISk7XG4gICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihuYW1lISk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIG5hbWUgaXMgdXNlZCB3aXRoaW4gdGhlIGdpdmVuIHNvdXJjZSBmaWxlLlxuICAgKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byBjaGVjayBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zLlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpZGVudGlmaWVyIHdoaWNoIGlzIGNoZWNrZWQgZm9yIGl0cyB1bmlxdWVuZXNzLlxuICAgKiBAcGFyYW0gaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMgTGlzdCBvZiBpZGVudGlmaWVycyB3aGljaCBzaG91bGQgYmUgaWdub3JlZCB3aGVuXG4gICAqICAgIGNoZWNraW5nIGZvciBpZGVudGlmaWVyIGNvbGxpc2lvbnMgaW4gdGhlIGdpdmVuIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNVbmlxdWVJZGVudGlmaWVyTmFtZShcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9uczogdHMuSWRlbnRpZmllcltdLFxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl91c2VkSWRlbnRpZmllck5hbWVzLmhhcyhzb3VyY2VGaWxlKSAmJlxuICAgICAgdGhpcy5fdXNlZElkZW50aWZpZXJOYW1lcy5nZXQoc291cmNlRmlsZSkhLmluZGV4T2YobmFtZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzb3VyY2UgZmlsZSBhbmQgc2VhcmNoIGZvciBhbiBpZGVudGlmaWVyIG1hdGNoaW5nXG4gICAgLy8gdGhlIGdpdmVuIG5hbWUuIEluIHRoYXQgY2FzZSwgaXQncyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoaXMgbmFtZVxuICAgIC8vIGlzIHVuaXF1ZSBpbiB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gc2NvcGUgYW5kIHdlIGp1c3QgcmV0dXJuIGZhbHNlLlxuICAgIGNvbnN0IG5vZGVRdWV1ZTogdHMuTm9kZVtdID0gW3NvdXJjZUZpbGVdO1xuICAgIHdoaWxlIChub2RlUXVldWUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZVF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgaWYgKFxuICAgICAgICB0cy5pc0lkZW50aWZpZXIobm9kZSkgJiZcbiAgICAgICAgbm9kZS50ZXh0ID09PSBuYW1lICYmXG4gICAgICAgICFpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucy5pbmNsdWRlcyhub2RlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG5vZGVRdWV1ZS5wdXNoKC4uLm5vZGUuZ2V0Q2hpbGRyZW4oKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgdGhhdCB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyB1c2VkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlLiBUaGlzXG4gICAqIGlzIG5lY2Vzc2FyeSBzaW5jZSB3ZSBkbyBub3QgYXBwbHkgY2hhbmdlcyB0byBzb3VyY2UgZmlsZXMgcGVyIGNoYW5nZSwgYnV0IHN0aWxsXG4gICAqIHdhbnQgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbmV3bHkgaW1wb3J0ZWQgc3ltYm9scy5cbiAgICovXG4gIHByaXZhdGUgX3JlY29yZFVzZWRJZGVudGlmaWVyKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIGlkZW50aWZpZXJOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl91c2VkSWRlbnRpZmllck5hbWVzLnNldChcbiAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAodGhpcy5fdXNlZElkZW50aWZpZXJOYW1lcy5nZXQoc291cmNlRmlsZSkgfHwgW10pLmNvbmNhdChpZGVudGlmaWVyTmFtZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBmdWxsIGVuZCBvZiBhIGdpdmVuIG5vZGUuIEJ5IGRlZmF1bHQgdGhlIGVuZCBwb3NpdGlvbiBvZiBhIG5vZGUgaXNcbiAgICogYmVmb3JlIGFsbCB0cmFpbGluZyBjb21tZW50cy4gVGhpcyBjb3VsZCBtZWFuIHRoYXQgZ2VuZXJhdGVkIGltcG9ydHMgc2hpZnQgY29tbWVudHMuXG4gICAqL1xuICBwcml2YXRlIF9nZXRFbmRQb3NpdGlvbk9mTm9kZShub2RlOiB0cy5Ob2RlKSB7XG4gICAgY29uc3Qgbm9kZUVuZFBvcyA9IG5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgY29tbWVudFJhbmdlcyA9IHRzLmdldFRyYWlsaW5nQ29tbWVudFJhbmdlcyhub2RlLmdldFNvdXJjZUZpbGUoKS50ZXh0LCBub2RlRW5kUG9zKTtcbiAgICBpZiAoIWNvbW1lbnRSYW5nZXMgfHwgIWNvbW1lbnRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbm9kZUVuZFBvcztcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1lbnRSYW5nZXNbY29tbWVudFJhbmdlcy5sZW5ndGggLSAxXSEuZW5kO1xuICB9XG59XG5cbi8vIFRPRE8oY3Jpc2JldG8pOiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBsYXllciB0aGF0IGFsbG93cyB1cyB0byBzdXBwb3J0IGJvdGggVFMgNC40IGFuZCA0LjUuXG4vLyBTaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHdlIGRvbid0IGhhdmUgdG8gc3VwcG9ydCA0LjQgYW55bW9yZS5cbmZ1bmN0aW9uIGNyZWF0ZUltcG9ydFNwZWNpZmllcihcbiAgcHJvcGVydHlOYW1lOiB0cy5JZGVudGlmaWVyIHwgdW5kZWZpbmVkLFxuICBuYW1lOiB0cy5JZGVudGlmaWVyLFxuKTogdHMuSW1wb3J0U3BlY2lmaWVyIHtcbiAgcmV0dXJuIFBBUlNFRF9UU19WRVJTSU9OID4gNC40XG4gICAgPyB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydFNwZWNpZmllcihmYWxzZSwgcHJvcGVydHlOYW1lLCBuYW1lKVxuICAgIDogKHRzLmNyZWF0ZUltcG9ydFNwZWNpZmllciBhcyBhbnkpKHByb3BlcnR5TmFtZSwgbmFtZSk7XG59XG4iXX0=
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc2NoZW1hdGljcy9uZy11cGRhdGUvbWlncmF0aW9ucy9oYW1tZXItZ2VzdHVyZXMtdjkvaW1wb3J0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gsK0JBQXNDO0FBQ3RDLGlDQUFpQztBQTRCakMsdUVBQXVFO0FBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBb0IsRUFBRSxJQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZGOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWE7SUFPeEIsWUFBb0IsV0FBdUIsRUFBVSxRQUFvQjtRQUFyRCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVk7UUFOekUsc0VBQXNFO1FBQzlELHlCQUFvQixHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1FBRWxFLHNEQUFzRDtRQUM5QyxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBRVUsQ0FBQztJQUU3RTs7Ozs7T0FLRztJQUNLLHVCQUF1QixDQUFDLFVBQXlCO1FBQ3ZELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUUsQ0FBQztTQUMzQztRQUVELE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFD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QUMsb0JBQW9CLENBQUMsR0FBRyxDQUMzQixVQUFVLEVBQ1YsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUIsQ0FBQyxJQUFhO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUMzQyxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUNELE9BQU8sYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFFLENBQUMsR0FBRyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQS9kRCxzQ0ErZEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtGaWxlU3lzdGVtfSBmcm9tICdAYW5ndWxhci9jZGsvc2NoZW1hdGljcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcblxuLyoqIEVudW0gZGVzY3JpYmluZyB0aGUgcG9zc2libGUgc3RhdGVzIG9mIGFuIGFuYWx5emVkIGltcG9ydC4gKi9cbmNvbnN0IGVudW0gSW1wb3J0U3RhdGUge1xuICBVTk1PRElGSUVEID0gMGIwLFxuICBNT0RJRklFRCA9IDBiMTAsXG4gIEFEREVEID0gMGIxMDAsXG4gIERFTEVURUQgPSAwYjEwMDAsXG59XG5cbi8qKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhbiBpbXBvcnQgc3BlY2lmaWVyLiAqL1xuaW50ZXJmYWNlIEltcG9ydFNwZWNpZmllciB7XG4gIG5hbWU6IHRzLklkZW50aWZpZXI7XG4gIHByb3BlcnR5TmFtZT86IHRzLklkZW50aWZpZXI7XG59XG5cbi8qKiBJbnRlcmZhY2UgZGVzY3JpYmluZyBhbiBhbmFseXplZCBpbXBvcnQuICovXG5pbnRlcmZhY2UgQW5hbHl6ZWRJbXBvcnQge1xuICBub2RlOiB0cy5JbXBvcnREZWNsYXJhdGlvbjtcbiAgbW9kdWxlTmFtZTogc3RyaW5nO1xuICBuYW1lPzogdHMuSWRlbnRpZmllcjtcbiAgc3BlY2lmaWVycz86IEltcG9ydFNwZWNpZmllcltdO1xuICBuYW1lc3BhY2U/OiBib29sZWFuO1xuICBzdGF0ZTogSW1wb3J0U3RhdGU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciBhbiBhbmFseXplZCBpbXBvcnQgaGFzIHRoZSBnaXZlbiBpbXBvcnQgZmxhZyBzZXQuICovXG5jb25zdCBoYXNGbGFnID0gKGRhdGE6IEFuYWx5emVkSW1wb3J0LCBmbGFnOiBJbXBvcnRTdGF0ZSkgPT4gKGRhdGEuc3RhdGUgJiBmbGFnKSAhPT0gMDtcblxuLyoqXG4gKiBJbXBvcnQgbWFuYWdlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBvciByZW1vdmUgVHlwZVNjcmlwdCBpbXBvcnRzIHdpdGhpbiBzb3VyY2VcbiAqIGZpbGVzLiBUaGUgbWFuYWdlciBlbnN1cmVzIHRoYXQgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb25zIGFyZSBhcHBsaWVkIHByb3Blcmx5XG4gKiB3aXRob3V0IHNoaWZ0ZWQgb2Zmc2V0cyBhbmQgdGhhdCBleGlzdGluZyBpbXBvcnRzIGFyZSByZS11c2VkLlxuICovXG5leHBvcnQgY2xhc3MgSW1wb3J0TWFuYWdlciB7XG4gIC8qKiBNYXAgb2Ygc291cmNlLWZpbGVzIGFuZCB0aGVpciBwcmV2aW91c2x5IHVzZWQgaWRlbnRpZmllciBuYW1lcy4gKi9cbiAgcHJpdmF0ZSBfdXNlZElkZW50aWZpZXJOYW1lcyA9IG5ldyBNYXA8dHMuU291cmNlRmlsZSwgc3RyaW5nW10+KCk7XG5cbiAgLyoqIE1hcCBvZiBzb3VyY2UgZmlsZXMgYW5kIHRoZWlyIGFuYWx5emVkIGltcG9ydHMuICovXG4gIHByaXZhdGUgX2ltcG9ydENhY2hlID0gbmV3IE1hcDx0cy5Tb3VyY2VGaWxlLCBBbmFseXplZEltcG9ydFtdPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbGVTeXN0ZW06IEZpbGVTeXN0ZW0sIHByaXZhdGUgX3ByaW50ZXI6IHRzLlByaW50ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEFuYWx5emVzIHRoZSBpbXBvcnQgb2YgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZSBpZiBuZWVkZWQuIEluIG9yZGVyIHRvIHBlcmZvcm1cbiAgICogbW9kaWZpY2F0aW9ucyB0byBpbXBvcnRzIG9mIGEgc291cmNlIGZpbGUsIHdlIHN0b3JlIGFsbCBpbXBvcnRzIGluIG1lbW9yeSBhbmRcbiAgICogdXBkYXRlIHRoZSBzb3VyY2UgZmlsZSBvbmNlIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLiBUaGlzIGlzIGVzc2VudGlhbCB0b1xuICAgKiBlbnN1cmUgdGhhdCB3ZSBjYW4gcmUtdXNlIG5ld2x5IGFkZGVkIGltcG9ydHMgYW5kIG5vdCBicmVhayBmaWxlIG9mZnNldHMuXG4gICAqL1xuICBwcml2YXRlIF9hbmFseXplSW1wb3J0c0lmTmVlZGVkKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBBbmFseXplZEltcG9ydFtdIHtcbiAgICBpZiAodGhpcy5faW1wb3J0Q2FjaGUuaGFzKHNvdXJjZUZpbGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW1wb3J0Q2FjaGUuZ2V0KHNvdXJjZUZpbGUpITtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IEFuYWx5emVkSW1wb3J0W10gPSBbXTtcbiAgICBmb3IgKGxldCBub2RlIG9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cykge1xuICAgICAgaWYgKCF0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHx8ICF0cy5pc1N0cmluZ0xpdGVyYWwobm9kZS5tb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2R1bGVOYW1lID0gbm9kZS5tb2R1bGVTcGVjaWZpZXIudGV4dDtcblxuICAgICAgLy8gSGFuZGxlcyBzaWRlLWVmZmVjdCBpbXBvcnRzIHdoaWNoIGRvIG5laXRoZXIgaGF2ZSBhIG5hbWUgb3JcbiAgICAgIC8vIHNwZWNpZmllcnMuIGUuZy4gYGltcG9ydCBcIm15LXBhY2thZ2VcIjtgXG4gICAgICBpZiAoIW5vZGUuaW1wb3J0Q2xhdXNlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHttb2R1bGVOYW1lLCBub2RlLCBzdGF0ZTogSW1wb3J0U3RhdGUuVU5NT0RJRklFRH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlcyBpbXBvcnRzIHJlc29sdmluZyB0byBkZWZhdWx0IGV4cG9ydHMgb2YgYSBtb2R1bGUuXG4gICAgICAvLyBlLmcuIGBpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtgXG4gICAgICBpZiAoIW5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBuYW1lOiBub2RlLmltcG9ydENsYXVzZS5uYW1lLFxuICAgICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVELFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZXMgaW1wb3J0cyB3aXRoIGluZGl2aWR1YWwgc3ltYm9sIHNwZWNpZmllcnMuXG4gICAgICAvLyBlLmcuIGBpbXBvcnQge0EsIEIsIEN9IGZyb20gXCJteS1tb2R1bGVcIjtgXG4gICAgICBpZiAodHMuaXNOYW1lZEltcG9ydHMobm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBzcGVjaWZpZXJzOiBub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzLmVsZW1lbnRzLm1hcChlbCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogZWwucHJvcGVydHlOYW1lLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdGF0ZTogSW1wb3J0U3RhdGUuVU5NT0RJRklFRCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGVzIG5hbWVzcGFjZWQgaW1wb3J0cy4gZS5nLiBgaW1wb3J0ICogYXMgY29yZSBmcm9tIFwibXktcGtnXCI7YFxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG5hbWU6IG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MubmFtZSxcbiAgICAgICAgICBuYW1lc3BhY2U6IHRydWUsXG4gICAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbXBvcnRDYWNoZS5zZXQoc291cmNlRmlsZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzcGVjaWZpZXIsIHdoaWNoIGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBwYXRoLFxuICAgKiBtYXRjaGVzIHRoZSBwYXNzZWQgbW9kdWxlIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIF9pc01vZHVsZVNwZWNpZmllck1hdGNoaW5nKFxuICAgIGJhc2VQYXRoOiBzdHJpbmcsXG4gICAgc3BlY2lmaWVyOiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgPyByZXNvbHZlKGJhc2VQYXRoLCBzcGVjaWZpZXIpID09PSByZXNvbHZlKGJhc2VQYXRoLCBtb2R1bGVOYW1lKVxuICAgICAgOiBzcGVjaWZpZXIgPT09IG1vZHVsZU5hbWU7XG4gIH1cblxuICAvKiogRGVsZXRlcyBhIGdpdmVuIG5hbWVkIGJpbmRpbmcgaW1wb3J0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZS4gKi9cbiAgZGVsZXRlTmFtZWRCaW5kaW5nSW1wb3J0KHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHN5bWJvbE5hbWU6IHN0cmluZywgbW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gZGlybmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2FuYWx5emVJbXBvcnRzSWZOZWVkZWQoc291cmNlRmlsZSk7XG5cbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLl9pc01vZHVsZVNwZWNpZmllck1hdGNoaW5nKHNvdXJjZURpciwgaW1wb3J0RGF0YS5tb2R1bGVOYW1lLCBtb2R1bGVOYW1lKSB8fFxuICAgICAgICAhaW1wb3J0RGF0YS5zcGVjaWZpZXJzXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmllckluZGV4ID0gaW1wb3J0RGF0YS5zcGVjaWZpZXJzLmZpbmRJbmRleChcbiAgICAgICAgZCA9PiAoZC5wcm9wZXJ0eU5hbWUgfHwgZC5uYW1lKS50ZXh0ID09PSBzeW1ib2xOYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChzcGVjaWZpZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgaW1wb3J0RGF0YS5zcGVjaWZpZXJzLnNwbGljZShzcGVjaWZpZXJJbmRleCwgMSk7XG4gICAgICAgIC8vIGlmIHRoZSBpbXBvcnQgZG9lcyBubyBsb25nZXIgY29udGFpbiBhbnkgc3BlY2lmaWVycyBhZnRlciB0aGUgcmVtb3ZhbCBvZiB0aGVcbiAgICAgICAgLy8gZ2l2ZW4gc3ltYm9sLCB3ZSBjYW4ganVzdCBtYXJrIHRoZSB3aG9sZSBpbXBvcnQgZm9yIGRlbGV0aW9uLiBPdGhlcndpc2UsIHdlIG1hcmtcbiAgICAgICAgLy8gaXQgYXMgbW9kaWZpZWQgc28gdGhhdCBpdCB3aWxsIGJlIHJlLXByaW50ZWQuXG4gICAgICAgIGlmIChpbXBvcnREYXRhLnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaW1wb3J0RGF0YS5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5ERUxFVEVEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuTU9ESUZJRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVsZXRlcyB0aGUgaW1wb3J0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaW1wb3J0IGRlY2xhcmF0aW9uIGlmIGZvdW5kLiAqL1xuICBkZWxldGVJbXBvcnRCeURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiB0cy5JbXBvcnREZWNsYXJhdGlvbikge1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCkpO1xuICAgIGZvciAobGV0IGltcG9ydERhdGEgb2YgZmlsZUltcG9ydHMpIHtcbiAgICAgIGlmIChpbXBvcnREYXRhLm5vZGUgPT09IGRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuREVMRVRFRDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpbXBvcnQgdG8gdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGFuZCByZXR1cm5zIHRoZSBUeXBlU2NyaXB0IGV4cHJlc3Npb24gdGhhdFxuICAgKiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIG5ld2x5IGltcG9ydGVkIHN5bWJvbC5cbiAgICpcbiAgICogV2hlbmV2ZXIgYW4gaW1wb3J0IGlzIGFkZGVkIHRvIGEgc291cmNlIGZpbGUsIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB0aGUgcmV0dXJuZWRcbiAgICogZXhwcmVzc2lvbiBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aCBzeW1ib2wuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHN5bWJvbFxuICAgKiBjb3VsZCBiZSBhbGlhc2VkIGlmIGl0IHdvdWxkIGNvbGxpZGUgd2l0aCBleGlzdGluZyBpbXBvcnRzIGluIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byB3aGljaCB0aGUgaW1wb3J0IHNob3VsZCBiZSBhZGRlZC5cbiAgICogQHBhcmFtIHN5bWJvbE5hbWUgTmFtZSBvZiB0aGUgc3ltYm9sIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBDYW4gYmUgbnVsbCBpZlxuICAgKiAgICB0aGUgZGVmYXVsdCBleHBvcnQgaXMgcmVxdWVzdGVkLlxuICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBOYW1lIG9mIHRoZSBtb2R1bGUgb2Ygd2hpY2ggdGhlIHN5bWJvbCBzaG91bGQgYmUgaW1wb3J0ZWQuXG4gICAqIEBwYXJhbSB0eXBlSW1wb3J0IFdoZXRoZXIgdGhlIHN5bWJvbCBpcyBhIHR5cGUuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgdGhlIGltcG9ydCBtYW5hZ2VyIGNoZWNrcyBmb3IgaW1wb3J0IGNvbGxpc2lvbnMuXG4gICAqL1xuICBhZGRJbXBvcnRUb1NvdXJjZUZpbGUoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICBzeW1ib2xOYW1lOiBzdHJpbmcgfCBudWxsLFxuICAgIG1vZHVsZU5hbWU6IHN0cmluZyxcbiAgICB0eXBlSW1wb3J0ID0gZmFsc2UsXG4gICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSA9IFtdLFxuICApOiB0cy5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBkaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChzb3VyY2VGaWxlKTtcblxuICAgIGxldCBleGlzdGluZ0ltcG9ydDogQW5hbHl6ZWRJbXBvcnQgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzTW9kdWxlU3BlY2lmaWVyTWF0Y2hpbmcoc291cmNlRGlyLCBpbXBvcnREYXRhLm1vZHVsZU5hbWUsIG1vZHVsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBzeW1ib2wgbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGltcG9ydCBpcyByZXF1ZXN0ZWQuIEluIHRoYXRcbiAgICAgIC8vIGNhc2Ugd2Ugc2VhcmNoIGZvciBub24tbmFtZXNwYWNlIGFuZCBub24tc3BlY2lmaWVyIGltcG9ydHMuXG4gICAgICBpZiAoIXN5bWJvbE5hbWUgJiYgIWltcG9ydERhdGEubmFtZXNwYWNlICYmICFpbXBvcnREYXRhLnNwZWNpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihpbXBvcnREYXRhLm5hbWUhLnRleHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiBjYXNlIGEgXCJUeXBlXCIgc3ltYm9sIGlzIGltcG9ydGVkLCB3ZSBjYW4ndCB1c2UgbmFtZXNwYWNlIGltcG9ydHNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2Ugb25seSBleHBvcnQgc3ltYm9scyBhdmFpbGFibGUgYXQgcnVudGltZSAobm8gdHlwZXMpXG4gICAgICBpZiAoaW1wb3J0RGF0YS5uYW1lc3BhY2UgJiYgIXR5cGVJbXBvcnQpIHtcbiAgICAgICAgcmV0dXJuIHRzLmZhY3RvcnkuY3JlYXRlUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKFxuICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihpbXBvcnREYXRhLm5hbWUhLnRleHQpLFxuICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lIHx8ICdkZWZhdWx0JyksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGltcG9ydERhdGEuc3BlY2lmaWVycyAmJiBzeW1ib2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gaW1wb3J0RGF0YS5zcGVjaWZpZXJzLmZpbmQocyA9PlxuICAgICAgICAgIHMucHJvcGVydHlOYW1lID8gcy5wcm9wZXJ0eU5hbWUudGV4dCA9PT0gc3ltYm9sTmFtZSA6IHMubmFtZS50ZXh0ID09PSBzeW1ib2xOYW1lLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChleGlzdGluZ1NwZWNpZmllcikge1xuICAgICAgICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoZXhpc3RpbmdTcGVjaWZpZXIubmFtZS50ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluIGNhc2UgdGhlIHN5bWJvbCBjb3VsZCBub3QgYmUgZm91bmQgaW4gYW4gZXhpc3RpbmcgaW1wb3J0LCB3ZVxuICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24gYXMgaXQgY2FuIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZVxuICAgICAgICAvLyB0aGUgc3BlY2lmaWVkIHN5bWJvbCBuYW1lIHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZSBhIG5ldyBpbXBvcnQuXG4gICAgICAgIGV4aXN0aW5nSW1wb3J0ID0gaW1wb3J0RGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBpbXBvcnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbW9kdWxlLCB3ZVxuICAgIC8vIGp1c3QgdXBkYXRlIHRoZSBpbXBvcnQgc3BlY2lmaWVycyB0byBhbHNvIGltcG9ydCB0aGUgcmVxdWVzdGVkIHN5bWJvbC5cbiAgICBpZiAoZXhpc3RpbmdJbXBvcnQpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5SWRlbnRpZmllciA9IHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lISk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyID0gdGhpcy5fZ2V0VW5pcXVlSWRlbnRpZmllcihcbiAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgc3ltYm9sTmFtZSEsXG4gICAgICAgIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA9IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIudGV4dCAhPT0gc3ltYm9sTmFtZTtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWUgPSBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyIDogcHJvcGVydHlJZGVudGlmaWVyO1xuXG4gICAgICBleGlzdGluZ0ltcG9ydC5zcGVjaWZpZXJzIS5wdXNoKHtcbiAgICAgICAgbmFtZTogaW1wb3J0TmFtZSxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBwcm9wZXJ0eUlkZW50aWZpZXIgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIGV4aXN0aW5nSW1wb3J0LnN0YXRlIHw9IEltcG9ydFN0YXRlLk1PRElGSUVEO1xuXG4gICAgICBpZiAoaGFzRmxhZyhleGlzdGluZ0ltcG9ydCwgSW1wb3J0U3RhdGUuREVMRVRFRCkpIHtcbiAgICAgICAgLy8gdW5zZXQgdGhlIGRlbGV0ZWQgZmxhZyBpZiB0aGUgaW1wb3J0IGlzIHBlbmRpbmcgZGVsZXRpb24sIGJ1dFxuICAgICAgICAvLyBjYW4gbm93IGJlIHVzZWQgZm9yIHRoZSBuZXcgaW1wb3J0ZWQgc3ltYm9sLlxuICAgICAgICBleGlzdGluZ0ltcG9ydC5zdGF0ZSAmPSB+SW1wb3J0U3RhdGUuREVMRVRFRDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltcG9ydE5hbWU7XG4gICAgfVxuXG4gICAgbGV0IGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbmV3SW1wb3J0OiBBbmFseXplZEltcG9ydCB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKHN5bWJvbE5hbWUpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5SWRlbnRpZmllciA9IHRzLmZhY3RvcnkuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lKTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIgPSB0aGlzLl9nZXRVbmlxdWVJZGVudGlmaWVyKFxuICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICBzeW1ib2xOYW1lLFxuICAgICAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPSBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyLnRleHQgIT09IHN5bWJvbE5hbWU7XG4gICAgICBpZGVudGlmaWVyID0gbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllciA6IHByb3BlcnR5SWRlbnRpZmllcjtcblxuICAgICAgY29uc3QgbmV3SW1wb3J0RGVjbCA9IHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydENsYXVzZShmYWxzZSwgdW5kZWZpbmVkLCB0cy5mYWN0b3J5LmNyZWF0ZU5hbWVkSW1wb3J0cyhbXSkpLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZVN0cmluZ0xpdGVyYWwobW9kdWxlTmFtZSksXG4gICAgICApO1xuXG4gICAgICBuZXdJbXBvcnQgPSB7XG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIG5vZGU6IG5ld0ltcG9ydERlY2wsXG4gICAgICAgIHNwZWNpZmllcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA/IHByb3BlcnR5SWRlbnRpZmllciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5hbWU6IGlkZW50aWZpZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLkFEREVELFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRlbnRpZmllciA9IHRoaXMuX2dldFVuaXF1ZUlkZW50aWZpZXIoXG4gICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICdkZWZhdWx0RXhwb3J0JyxcbiAgICAgICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMsXG4gICAgICApO1xuICAgICAgY29uc3QgbmV3SW1wb3J0RGVjbCA9IHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0cy5mYWN0b3J5LmNyZWF0ZUltcG9ydENsYXVzZShmYWxzZSwgaWRlbnRpZmllciwgdW5kZWZpbmVkKSxcbiAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVTdHJpbmdMaXRlcmFsKG1vZHVsZU5hbWUpLFxuICAgICAgKTtcbiAgICAgIG5ld0ltcG9ydCA9IHtcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICAgbm9kZTogbmV3SW1wb3J0RGVjbCxcbiAgICAgICAgbmFtZTogaWRlbnRpZmllcixcbiAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLkFEREVELFxuICAgICAgfTtcbiAgICB9XG4gICAgZmlsZUltcG9ydHMucHVzaChuZXdJbXBvcnQpO1xuICAgIHJldHVybiBpZGVudGlmaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIHJlY29yZGVkIGNoYW5nZXMgaW4gdGhlIHVwZGF0ZSByZWNvcmRlcnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzLlxuICAgKiBUaGUgY2hhbmdlcyBhcmUgYXBwbGllZCBzZXBhcmF0ZWx5IGFmdGVyIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiByZWNvcmRlZCBiZWNhdXNlIG90aGVyd2lzZVxuICAgKiBmaWxlIG9mZnNldHMgd2lsbCBjaGFuZ2UgYW5kIHRoZSBzb3VyY2UgZmlsZXMgd291bGQgbmVlZCB0byBiZSByZS1wYXJzZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UuXG4gICAqL1xuICByZWNvcmRDaGFuZ2VzKCkge1xuICAgIHRoaXMuX2ltcG9ydENhY2hlLmZvckVhY2goKGZpbGVJbXBvcnRzLCBzb3VyY2VGaWxlKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuX2ZpbGVTeXN0ZW0uZWRpdCh0aGlzLl9maWxlU3lzdGVtLnJlc29sdmUoc291cmNlRmlsZS5maWxlTmFtZSkpO1xuICAgICAgY29uc3QgbGFzdFVubW9kaWZpZWRJbXBvcnQgPSBmaWxlSW1wb3J0c1xuICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgIC5maW5kKGkgPT4gaS5zdGF0ZSA9PT0gSW1wb3J0U3RhdGUuVU5NT0RJRklFRCk7XG4gICAgICBjb25zdCBpbXBvcnRTdGFydEluZGV4ID0gbGFzdFVubW9kaWZpZWRJbXBvcnRcbiAgICAgICAgPyB0aGlzLl9nZXRFbmRQb3NpdGlvbk9mTm9kZShsYXN0VW5tb2RpZmllZEltcG9ydC5ub2RlKVxuICAgICAgICA6IDA7XG5cbiAgICAgIGZpbGVJbXBvcnRzLmZvckVhY2goaW1wb3J0RGF0YSA9PiB7XG4gICAgICAgIGlmIChpbXBvcnREYXRhLnN0YXRlID09PSBJbXBvcnRTdGF0ZS5VTk1PRElGSUVEKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuREVMRVRFRCkpIHtcbiAgICAgICAgICAvLyBJbXBvcnRzIHdoaWNoIGRvIG5vdCBleGlzdCBpbiBzb3VyY2UgZmlsZSwgY2FuIGJlIGp1c3Qgc2tpcHBlZCBhc1xuICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIGFueSByZXBsYWNlbWVudCB0byBkZWxldGUgdGhlIGltcG9ydC5cbiAgICAgICAgICBpZiAoIWhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgICAgICByZWNvcmRlci5yZW1vdmUoaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxTdGFydCgpLCBpbXBvcnREYXRhLm5vZGUuZ2V0RnVsbFdpZHRoKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1wb3J0RGF0YS5zcGVjaWZpZXJzKSB7XG4gICAgICAgICAgY29uc3QgbmFtZWRCaW5kaW5ncyA9IGltcG9ydERhdGEubm9kZS5pbXBvcnRDbGF1c2UhLm5hbWVkQmluZGluZ3MgYXMgdHMuTmFtZWRJbXBvcnRzO1xuICAgICAgICAgIGNvbnN0IGltcG9ydFNwZWNpZmllcnMgPSBpbXBvcnREYXRhLnNwZWNpZmllcnMubWFwKHMgPT5cbiAgICAgICAgICAgIHRzLmZhY3RvcnkuY3JlYXRlSW1wb3J0U3BlY2lmaWVyKGZhbHNlLCBzLnByb3BlcnR5TmFtZSwgcy5uYW1lKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRCaW5kaW5ncyA9IHRzLmZhY3RvcnkudXBkYXRlTmFtZWRJbXBvcnRzKG5hbWVkQmluZGluZ3MsIGltcG9ydFNwZWNpZmllcnMpO1xuXG4gICAgICAgICAgLy8gSW4gY2FzZSBhbiBpbXBvcnQgaGFzIGJlZW4gYWRkZWQgbmV3bHksIHdlIG5lZWQgdG8gcHJpbnQgdGhlIHdob2xlIGltcG9ydFxuICAgICAgICAgIC8vIGRlY2xhcmF0aW9uIGFuZCBpbnNlcnQgaXQgYXQgdGhlIGltcG9ydCBzdGFydCBpbmRleC4gT3RoZXJ3aXNlLCB3ZSBqdXN0XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lZCBiaW5kaW5ncyB0byBub3QgcmUtcHJpbnQgdGhlIHdob2xlIGltcG9ydCAod2hpY2ggY291bGRcbiAgICAgICAgICAvLyBjYXVzZSB1bm5lY2Vzc2FyeSBmb3JtYXR0aW5nIGNoYW5nZXMpXG4gICAgICAgICAgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSW1wb3J0ID0gdHMuZmFjdG9yeS51cGRhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgaW1wb3J0RGF0YS5ub2RlLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVJbXBvcnRDbGF1c2UoZmFsc2UsIHVuZGVmaW5lZCwgdXBkYXRlZEJpbmRpbmdzKSxcbiAgICAgICAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVTdHJpbmdMaXRlcmFsKGltcG9ydERhdGEubW9kdWxlTmFtZSksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBuZXdJbXBvcnRUZXh0ID0gdGhpcy5fcHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgICB1cGRhdGVkSW1wb3J0LFxuICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlY29yZGVyLmluc2VydExlZnQoXG4gICAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXggPT09IDAgPyBgJHtuZXdJbXBvcnRUZXh0fVxcbmAgOiBgXFxuJHtuZXdJbXBvcnRUZXh0fWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5NT0RJRklFRCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld05hbWVkQmluZGluZ3NUZXh0ID0gdGhpcy5fcHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgICB1cGRhdGVkQmluZGluZ3MsXG4gICAgICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVjb3JkZXIucmVtb3ZlKG5hbWVkQmluZGluZ3MuZ2V0U3RhcnQoKSwgbmFtZWRCaW5kaW5ncy5nZXRXaWR0aCgpKTtcbiAgICAgICAgICAgIHJlY29yZGVyLmluc2VydFJpZ2h0KG5hbWVkQmluZGluZ3MuZ2V0U3RhcnQoKSwgbmV3TmFtZWRCaW5kaW5nc1RleHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ltcG9ydFRleHQgPSB0aGlzLl9wcmludGVyLnByaW50Tm9kZShcbiAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgaW1wb3J0RGF0YS5ub2RlLFxuICAgICAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlY29yZGVyLmluc2VydExlZnQoXG4gICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4LFxuICAgICAgICAgICAgaW1wb3J0U3RhcnRJbmRleCA9PT0gMCA/IGAke25ld0ltcG9ydFRleHR9XFxuYCA6IGBcXG4ke25ld0ltcG9ydFRleHR9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIHNob3VsZCBuZXZlciBoaXQgdGhpcywgYnV0IHdlIHJhdGhlciB3YW50IHRvIHByaW50IGEgY3VzdG9tIGV4Y2VwdGlvblxuICAgICAgICAvLyBpbnN0ZWFkIG9mIGp1c3Qgc2tpcHBpbmcgaW1wb3J0cyBzaWxlbnRseS5cbiAgICAgICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgaW1wb3J0IG1vZGlmaWNhdGlvbi4nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcnJlY3RzIHRoZSBsaW5lIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgYSBnaXZlbiBub2RlLiBTaW5jZSBub2RlcyBvZlxuICAgKiBzb3VyY2UgZmlsZXMgYXJlIGltbXV0YWJsZSBhbmQgd2Ugc29tZXRpbWVzIG1ha2UgY2hhbmdlcyB0byB0aGUgY29udGFpbmluZ1xuICAgKiBzb3VyY2UgZmlsZSwgdGhlIG5vZGUgcG9zaXRpb24gbWlnaHQgc2hpZnQgKGUuZy4gaWYgd2UgYWRkIGEgbmV3IGltcG9ydCBiZWZvcmUpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGNvcnJlY3RlZCBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gbm9kZS4gVGhpc1xuICAgKiBpcyBoZWxwZnVsIHdoZW4gcHJpbnRpbmcgb3V0IGVycm9yIG1lc3NhZ2VzIHdoaWNoIHNob3VsZCByZWZsZWN0IHRoZSBuZXcgc3RhdGUgb2ZcbiAgICogc291cmNlIGZpbGVzLlxuICAgKi9cbiAgY29ycmVjdE5vZGVQb3NpdGlvbihub2RlOiB0cy5Ob2RlLCBvZmZzZXQ6IG51bWJlciwgcG9zaXRpb246IHRzLkxpbmVBbmRDaGFyYWN0ZXIpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG5cbiAgICBpZiAoIXRoaXMuX2ltcG9ydENhY2hlLmhhcyhzb3VyY2VGaWxlKSkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1Bvc2l0aW9uOiB0cy5MaW5lQW5kQ2hhcmFjdGVyID0gey4uLnBvc2l0aW9ufTtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2ltcG9ydENhY2hlLmdldChzb3VyY2VGaWxlKSE7XG5cbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBjb25zdCBmdWxsRW5kID0gaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxTdGFydCgpICsgaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxXaWR0aCgpO1xuICAgICAgLy8gU3VidHJhY3Qgb3IgYWRkIGxpbmVzIGJhc2VkIG9uIHdoZXRoZXIgYW4gaW1wb3J0IGhhcyBiZWVuIGRlbGV0ZWQgb3IgcmVtb3ZlZFxuICAgICAgLy8gYmVmb3JlIHRoZSBhY3R1YWwgbm9kZSBvZmZzZXQuXG4gICAgICBpZiAob2Zmc2V0ID4gZnVsbEVuZCAmJiBoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkRFTEVURUQpKSB7XG4gICAgICAgIG5ld1Bvc2l0aW9uLmxpbmUtLTtcbiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID4gZnVsbEVuZCAmJiBoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICBuZXdQb3NpdGlvbi5saW5lKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdQb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIHVuaXF1ZSBpZGVudGlmaWVyIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgc3ltYm9sIG5hbWUuXG4gICAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIHRvIGNoZWNrIGZvciBpZGVudGlmaWVyIGNvbGxpc2lvbnMuXG4gICAqIEBwYXJhbSBzeW1ib2xOYW1lIE5hbWUgb2YgdGhlIHN5bWJvbCBmb3Igd2hpY2ggd2Ugd2FudCB0byBnZW5lcmF0ZSBhbiB1bmlxdWUgbmFtZS5cbiAgICogQHBhcmFtIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zIExpc3Qgb2YgaWRlbnRpZmllcnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgd2hlblxuICAgKiAgICBjaGVja2luZyBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zIGluIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgX2dldFVuaXF1ZUlkZW50aWZpZXIoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICBzeW1ib2xOYW1lOiBzdHJpbmcsXG4gICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSxcbiAgKTogdHMuSWRlbnRpZmllciB7XG4gICAgaWYgKHRoaXMuX2lzVW5pcXVlSWRlbnRpZmllck5hbWUoc291cmNlRmlsZSwgc3ltYm9sTmFtZSwgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMpKSB7XG4gICAgICB0aGlzLl9yZWNvcmRVc2VkSWRlbnRpZmllcihzb3VyY2VGaWxlLCBzeW1ib2xOYW1lKTtcbiAgICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIoc3ltYm9sTmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb3VudGVyID0gMTtcbiAgICBkbyB7XG4gICAgICBuYW1lID0gYCR7c3ltYm9sTmFtZX1fJHtjb3VudGVyKyt9YDtcbiAgICB9IHdoaWxlICghdGhpcy5faXNVbmlxdWVJZGVudGlmaWVyTmFtZShzb3VyY2VGaWxlLCBuYW1lLCBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucykpO1xuXG4gICAgdGhpcy5fcmVjb3JkVXNlZElkZW50aWZpZXIoc291cmNlRmlsZSwgbmFtZSEpO1xuICAgIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUlkZW50aWZpZXIobmFtZSEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBuYW1lIGlzIHVzZWQgd2l0aGluIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS5cbiAgICogQHBhcmFtIHNvdXJjZUZpbGUgU291cmNlIGZpbGUgdG8gY2hlY2sgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucy5cbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaWRlbnRpZmllciB3aGljaCBpcyBjaGVja2VkIGZvciBpdHMgdW5pcXVlbmVzcy5cbiAgICogQHBhcmFtIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zIExpc3Qgb2YgaWRlbnRpZmllcnMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgd2hlblxuICAgKiAgICBjaGVja2luZyBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zIGluIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgX2lzVW5pcXVlSWRlbnRpZmllck5hbWUoXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fdXNlZElkZW50aWZpZXJOYW1lcy5oYXMoc291cmNlRmlsZSkgJiZcbiAgICAgIHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuZ2V0KHNvdXJjZUZpbGUpIS5pbmRleE9mKG5hbWUpICE9PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc291cmNlIGZpbGUgYW5kIHNlYXJjaCBmb3IgYW4gaWRlbnRpZmllciBtYXRjaGluZ1xuICAgIC8vIHRoZSBnaXZlbiBuYW1lLiBJbiB0aGF0IGNhc2UsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG5hbWVcbiAgICAvLyBpcyB1bmlxdWUgaW4gdGhlIGdpdmVuIGRlY2xhcmF0aW9uIHNjb3BlIGFuZCB3ZSBqdXN0IHJldHVybiBmYWxzZS5cbiAgICBjb25zdCBub2RlUXVldWU6IHRzLk5vZGVbXSA9IFtzb3VyY2VGaWxlXTtcbiAgICB3aGlsZSAobm9kZVF1ZXVlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVRdWV1ZS5zaGlmdCgpITtcbiAgICAgIGlmIChcbiAgICAgICAgdHMuaXNJZGVudGlmaWVyKG5vZGUpICYmXG4gICAgICAgIG5vZGUudGV4dCA9PT0gbmFtZSAmJlxuICAgICAgICAhaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnMuaW5jbHVkZXMobm9kZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBub2RlUXVldWUucHVzaCguLi5ub2RlLmdldENoaWxkcmVuKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoYXQgdGhlIGdpdmVuIGlkZW50aWZpZXIgaXMgdXNlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZS4gVGhpc1xuICAgKiBpcyBuZWNlc3Nhcnkgc2luY2Ugd2UgZG8gbm90IGFwcGx5IGNoYW5nZXMgdG8gc291cmNlIGZpbGVzIHBlciBjaGFuZ2UsIGJ1dCBzdGlsbFxuICAgKiB3YW50IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG5ld2x5IGltcG9ydGVkIHN5bWJvbHMuXG4gICAqL1xuICBwcml2YXRlIF9yZWNvcmRVc2VkSWRlbnRpZmllcihzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBpZGVudGlmaWVyTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXNlZElkZW50aWZpZXJOYW1lcy5zZXQoXG4gICAgICBzb3VyY2VGaWxlLFxuICAgICAgKHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuZ2V0KHNvdXJjZUZpbGUpIHx8IFtdKS5jb25jYXQoaWRlbnRpZmllck5hbWUpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgZnVsbCBlbmQgb2YgYSBnaXZlbiBub2RlLiBCeSBkZWZhdWx0IHRoZSBlbmQgcG9zaXRpb24gb2YgYSBub2RlIGlzXG4gICAqIGJlZm9yZSBhbGwgdHJhaWxpbmcgY29tbWVudHMuIFRoaXMgY291bGQgbWVhbiB0aGF0IGdlbmVyYXRlZCBpbXBvcnRzIHNoaWZ0IGNvbW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RW5kUG9zaXRpb25PZk5vZGUobm9kZTogdHMuTm9kZSkge1xuICAgIGNvbnN0IG5vZGVFbmRQb3MgPSBub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSB0cy5nZXRUcmFpbGluZ0NvbW1lbnRSYW5nZXMobm9kZS5nZXRTb3VyY2VGaWxlKCkudGV4dCwgbm9kZUVuZFBvcyk7XG4gICAgaWYgKCFjb21tZW50UmFuZ2VzIHx8ICFjb21tZW50UmFuZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5vZGVFbmRQb3M7XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50UmFuZ2VzW2NvbW1lbnRSYW5nZXMubGVuZ3RoIC0gMV0hLmVuZDtcbiAgfVxufVxuIl19