cmat 0.0.13 → 0.0.15

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 (291) hide show
  1. package/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.d.ts +0 -1
  2. package/components/cascade/cascade-list/cascade-list.component.d.ts +3 -3
  3. package/components/cascade/cascade-menu/cascade-menu.component.d.ts +0 -1
  4. package/components/cascade/options.interface.d.ts +1 -1
  5. package/components/chip-input/chip-input.component.d.ts +0 -1
  6. package/components/custom-formly/public-api.d.ts +1 -0
  7. package/components/custom-formly/types/multicheckbox/multicheckbox.component.d.ts +0 -1
  8. package/components/custom-formly/types/quill/quill.component.d.ts +42 -0
  9. package/components/custom-formly/types/radio/radio.component.d.ts +0 -1
  10. package/components/custom-formly/types/repeat/repeat.component.d.ts +0 -1
  11. package/components/custom-formly/types/select/select.component.d.ts +0 -1
  12. package/components/custom-formly/types/stepper/horizontal/stepper.component.d.ts +0 -1
  13. package/components/custom-formly/types/stepper/vertical/stepper.component.d.ts +0 -1
  14. package/components/custom-formly/types/table/table.component.d.ts +2 -3
  15. package/components/custom-formly/types/tabs/tab.component.d.ts +0 -1
  16. package/components/custom-formly/types/tags/tags.component.d.ts +0 -1
  17. package/components/material-color-picker/material-color-picker.component.d.ts +0 -1
  18. package/components/material-datetimepicker/calendar-body.d.ts +0 -1
  19. package/components/material-datetimepicker/calendar.d.ts +3 -4
  20. package/components/material-datetimepicker/clock.d.ts +2 -3
  21. package/components/material-datetimepicker/datetimepicker.d.ts +3 -4
  22. package/components/material-datetimepicker/month-view.d.ts +0 -1
  23. package/components/navigation/navigation.types.d.ts +1 -1
  24. package/components/pagination/pagination.component.d.ts +0 -1
  25. package/components/password-strength/mat-password-strength-validator.d.ts +1 -1
  26. package/components/popover/popover.component.d.ts +4 -7
  27. package/components/popover/popover.interfaces.d.ts +1 -2
  28. package/components/select-tree/select-tree.component.d.ts +0 -1
  29. package/components/timeline/timeline.component.d.ts +4 -6
  30. package/components/transfer-picker/filter/filter.component.d.ts +1 -2
  31. package/components/transfer-picker/interface.d.ts +4 -4
  32. package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.d.ts +2 -2
  33. package/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.d.ts +1 -2
  34. package/components/transfer-picker/transfer-picker.component.d.ts +5 -5
  35. package/components/transfer-picker/transfer-picker.service.d.ts +6 -6
  36. package/components/upload/upload-queue/upload-queue.component.d.ts +1 -1
  37. package/directives/digit-only/mask.directive.d.ts +2 -0
  38. package/directives/equal-validator/equal-validator.directive.d.ts +1 -3
  39. package/esm2022/components/adapter/datetime-adapter.mjs +1 -1
  40. package/esm2022/components/adapter/dayjs-date-adapter.mjs +5 -5
  41. package/esm2022/components/adapter/dayjs-datetime-adapter.mjs +4 -4
  42. package/esm2022/components/adapter/native-datetime-adapter.mjs +4 -4
  43. package/esm2022/components/breadcrumb/breadcrumb-item.directive.mjs +3 -3
  44. package/esm2022/components/breadcrumb/breadcrumb.component.mjs +6 -6
  45. package/esm2022/components/breadcrumb/breadcrumb.service.mjs +9 -12
  46. package/esm2022/components/card/card.component.mjs +4 -4
  47. package/esm2022/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.mjs +5 -8
  48. package/esm2022/components/cascade/cascade-list/cascade-list.component.mjs +12 -10
  49. package/esm2022/components/cascade/cascade-menu/cascade-menu.component.mjs +5 -8
  50. package/esm2022/components/cascade/options.interface.mjs +1 -1
  51. package/esm2022/components/chip-input/chip-input.component.mjs +10 -11
  52. package/esm2022/components/custom-formly/extension/addons.extension.mjs +2 -2
  53. package/esm2022/components/custom-formly/public-api.mjs +2 -1
  54. package/esm2022/components/custom-formly/types/button/button.component.mjs +4 -4
  55. package/esm2022/components/custom-formly/types/cascade/cascade.component.mjs +4 -4
  56. package/esm2022/components/custom-formly/types/checklist/checklist.component.mjs +5 -5
  57. package/esm2022/components/custom-formly/types/chips/chips.component.mjs +5 -5
  58. package/esm2022/components/custom-formly/types/color-picker/color-picker.component.mjs +3 -3
  59. package/esm2022/components/custom-formly/types/date-range/date-range.component.mjs +3 -3
  60. package/esm2022/components/custom-formly/types/datepicker/datepicker.component.mjs +5 -5
  61. package/esm2022/components/custom-formly/types/multicheckbox/multicheckbox.component.mjs +4 -5
  62. package/esm2022/components/custom-formly/types/number/number.component.mjs +5 -5
  63. package/esm2022/components/custom-formly/types/quill/quill.component.mjs +171 -0
  64. package/esm2022/components/custom-formly/types/radio/radio.component.mjs +5 -6
  65. package/esm2022/components/custom-formly/types/rating/rating.component.mjs +3 -3
  66. package/esm2022/components/custom-formly/types/repeat/repeat.component.mjs +5 -8
  67. package/esm2022/components/custom-formly/types/select/select.component.mjs +5 -8
  68. package/esm2022/components/custom-formly/types/select-tree/select-tree.component.mjs +4 -4
  69. package/esm2022/components/custom-formly/types/stepper/horizontal/stepper.component.mjs +5 -8
  70. package/esm2022/components/custom-formly/types/stepper/vertical/stepper.component.mjs +5 -8
  71. package/esm2022/components/custom-formly/types/table/table.component.mjs +5 -8
  72. package/esm2022/components/custom-formly/types/tabs/tab.component.mjs +5 -8
  73. package/esm2022/components/custom-formly/types/tags/tags.component.mjs +7 -10
  74. package/esm2022/components/custom-formly/types/textarea/textarea.component.mjs +3 -3
  75. package/esm2022/components/custom-formly/types/upload/upload.component.mjs +4 -4
  76. package/esm2022/components/custom-formly/wrappers/addons/addons.component.mjs +4 -4
  77. package/esm2022/components/custom-formly/wrappers/card/card.component.mjs +3 -3
  78. package/esm2022/components/custom-formly/wrappers/expansion/expansion.component.mjs +5 -5
  79. package/esm2022/components/custom-formly/wrappers/panel/panel.component.mjs +3 -3
  80. package/esm2022/components/date-range/date-range.component.mjs +20 -15
  81. package/esm2022/components/drawer/drawer.component.mjs +4 -4
  82. package/esm2022/components/drawer/drawer.service.mjs +3 -3
  83. package/esm2022/components/fullscreen/fullscreen.component.mjs +5 -5
  84. package/esm2022/components/highlight/highlight.component.mjs +4 -4
  85. package/esm2022/components/highlight/highlight.service.mjs +4 -4
  86. package/esm2022/components/json-editor/json-editor.component.mjs +10 -10
  87. package/esm2022/components/masonry/masonry.component.mjs +4 -4
  88. package/esm2022/components/material-color-picker/material-color-picker.component.mjs +7 -8
  89. package/esm2022/components/material-datetimepicker/calendar-body.mjs +6 -9
  90. package/esm2022/components/material-datetimepicker/calendar.mjs +9 -15
  91. package/esm2022/components/material-datetimepicker/clock.mjs +5 -8
  92. package/esm2022/components/material-datetimepicker/datetimepicker-input.mjs +7 -5
  93. package/esm2022/components/material-datetimepicker/datetimepicker-intl.mjs +3 -3
  94. package/esm2022/components/material-datetimepicker/datetimepicker-toggle.mjs +9 -9
  95. package/esm2022/components/material-datetimepicker/datetimepicker.mjs +14 -15
  96. package/esm2022/components/material-datetimepicker/month-view.mjs +5 -8
  97. package/esm2022/components/material-datetimepicker/multi-year-view.mjs +5 -5
  98. package/esm2022/components/material-datetimepicker/time.mjs +10 -10
  99. package/esm2022/components/material-datetimepicker/year-view.mjs +5 -5
  100. package/esm2022/components/navigation/horizontal/components/basic/basic.component.mjs +5 -5
  101. package/esm2022/components/navigation/horizontal/components/branch/branch.component.mjs +5 -5
  102. package/esm2022/components/navigation/horizontal/components/divider/divider.component.mjs +3 -3
  103. package/esm2022/components/navigation/horizontal/components/spacer/spacer.component.mjs +3 -3
  104. package/esm2022/components/navigation/horizontal/horizontal.component.mjs +5 -5
  105. package/esm2022/components/navigation/navigation.service.mjs +4 -4
  106. package/esm2022/components/navigation/navigation.types.mjs +1 -1
  107. package/esm2022/components/navigation/vertical/components/aside/aside.component.mjs +5 -5
  108. package/esm2022/components/navigation/vertical/components/basic/basic.component.mjs +3 -3
  109. package/esm2022/components/navigation/vertical/components/collapsable/collapsable.component.mjs +5 -5
  110. package/esm2022/components/navigation/vertical/components/divider/divider.component.mjs +3 -3
  111. package/esm2022/components/navigation/vertical/components/group/group.component.mjs +5 -5
  112. package/esm2022/components/navigation/vertical/components/spacer/spacer.component.mjs +5 -5
  113. package/esm2022/components/navigation/vertical/vertical.component.mjs +5 -5
  114. package/esm2022/components/pagination/pagination.component.mjs +5 -8
  115. package/esm2022/components/pagination/pagination.directive.mjs +4 -4
  116. package/esm2022/components/pagination/pagination.pipe.mjs +5 -5
  117. package/esm2022/components/pagination/pagination.service.mjs +4 -4
  118. package/esm2022/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.mjs +5 -5
  119. package/esm2022/components/password-strength/mat-password-strength/mat-password-strength.component.mjs +6 -6
  120. package/esm2022/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.mjs +5 -5
  121. package/esm2022/components/password-strength/mat-password-strength-validator.mjs +2 -2
  122. package/esm2022/components/popover/popover-trigger.mjs +6 -8
  123. package/esm2022/components/popover/popover.component.mjs +8 -9
  124. package/esm2022/components/popover/popover.interfaces.mjs +1 -1
  125. package/esm2022/components/popover/popover.target.mjs +3 -3
  126. package/esm2022/components/progress-bar/progress-bar.component.mjs +4 -4
  127. package/esm2022/components/rating/rating.component.mjs +11 -7
  128. package/esm2022/components/select-search/select-no-entries-found.directive.mjs +3 -3
  129. package/esm2022/components/select-search/select-search-clear.directive.mjs +3 -3
  130. package/esm2022/components/select-search/select-search.component.mjs +9 -9
  131. package/esm2022/components/select-tree/select-tree.component.mjs +10 -11
  132. package/esm2022/components/timeline/timeline-item/timeline-item.component.mjs +11 -11
  133. package/esm2022/components/timeline/timeline.component.mjs +8 -15
  134. package/esm2022/components/toast/toast-modal.component.mjs +5 -5
  135. package/esm2022/components/toast/toast.component.mjs +6 -6
  136. package/esm2022/components/toast/toast.service.mjs +10 -10
  137. package/esm2022/components/transfer-picker/filter/filter.component.mjs +6 -9
  138. package/esm2022/components/transfer-picker/interface.mjs +1 -1
  139. package/esm2022/components/transfer-picker/search/search.component.mjs +3 -3
  140. package/esm2022/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.mjs +4 -4
  141. package/esm2022/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.mjs +5 -8
  142. package/esm2022/components/transfer-picker/transfer-picker.component.mjs +4 -4
  143. package/esm2022/components/transfer-picker/transfer-picker.service.mjs +8 -8
  144. package/esm2022/components/upload/files.util.service.mjs +4 -4
  145. package/esm2022/components/upload/upload-queue/upload-queue.component.mjs +8 -8
  146. package/esm2022/components/upload/upload.component.mjs +5 -5
  147. package/esm2022/directives/animate-on-scroll/animate-on-scroll.directive.mjs +4 -4
  148. package/esm2022/directives/animate-on-scroll/scroll.service.mjs +3 -3
  149. package/esm2022/directives/autofocus/autofocus.directive.mjs +3 -3
  150. package/esm2022/directives/debounce/abstract-debounce.directive.mjs +3 -3
  151. package/esm2022/directives/debounce/debounce-click.directive.mjs +3 -3
  152. package/esm2022/directives/debounce/debounce-keyup.directive.mjs +3 -3
  153. package/esm2022/directives/digit-only/digit-only.directive.mjs +6 -6
  154. package/esm2022/directives/digit-only/mask.directive.mjs +20 -5
  155. package/esm2022/directives/equal-validator/equal-validator.directive.mjs +4 -4
  156. package/esm2022/lib/mock-api/mock-api.interceptor.mjs +4 -4
  157. package/esm2022/lib/mock-api/mock-api.request-handler.mjs +1 -1
  158. package/esm2022/lib/mock-api/mock-api.service.mjs +4 -4
  159. package/esm2022/lib/mock-api/mock-api.types.mjs +1 -1
  160. package/esm2022/lib/mock-api/mock-api.utils.mjs +1 -2
  161. package/esm2022/pipes/bytes/bytes.pipe.mjs +4 -4
  162. package/esm2022/pipes/date-format/date-format.pipe.mjs +3 -3
  163. package/esm2022/pipes/find-by-key/find-by-key.pipe.mjs +4 -4
  164. package/esm2022/pipes/group-by/group-by.pipe.mjs +4 -4
  165. package/esm2022/pipes/keys/keys.pipe.mjs +4 -4
  166. package/esm2022/pipes/secure/secure-pipe.mjs +3 -3
  167. package/esm2022/pipes/uppercase/uppercase.pipe.mjs +3 -3
  168. package/esm2022/public-api.mjs +1 -1
  169. package/esm2022/services/alert/alert.service.mjs +11 -10
  170. package/esm2022/services/config/config.service.mjs +3 -3
  171. package/esm2022/services/config/urlStateConfig.service.mjs +5 -5
  172. package/esm2022/services/confirmation/confirmation.service.mjs +3 -3
  173. package/esm2022/services/confirmation/dialog/dialog.component.mjs +3 -3
  174. package/esm2022/services/data/data.service.mjs +4 -4
  175. package/esm2022/services/loading/loading.interceptor.mjs +4 -4
  176. package/esm2022/services/loading/loading.service.mjs +4 -4
  177. package/esm2022/services/local-storage/local-storage.service.mjs +3 -3
  178. package/esm2022/services/media-watcher/media-watcher.service.mjs +4 -4
  179. package/esm2022/services/platform/platform.service.mjs +4 -4
  180. package/esm2022/services/splash-screen/splash-screen.service.mjs +3 -3
  181. package/esm2022/services/title/title.service.mjs +4 -4
  182. package/esm2022/services/translation/translation.service.mjs +4 -4
  183. package/esm2022/services/utils/utils.service.mjs +9 -11
  184. package/esm2022/validators/validators.mjs +1 -1
  185. package/fesm2022/cmat-animations.mjs +1 -1
  186. package/fesm2022/cmat-components-adapter.mjs +10 -10
  187. package/fesm2022/cmat-components-adapter.mjs.map +1 -1
  188. package/fesm2022/cmat-components-breadcrumb.mjs +16 -19
  189. package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -1
  190. package/fesm2022/cmat-components-card.mjs +3 -3
  191. package/fesm2022/cmat-components-card.mjs.map +1 -1
  192. package/fesm2022/cmat-components-cascade.mjs +19 -23
  193. package/fesm2022/cmat-components-cascade.mjs.map +1 -1
  194. package/fesm2022/cmat-components-chip-input.mjs +9 -10
  195. package/fesm2022/cmat-components-chip-input.mjs.map +1 -1
  196. package/fesm2022/cmat-components-custom-formly.mjs +257 -115
  197. package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
  198. package/fesm2022/cmat-components-date-range.mjs +20 -15
  199. package/fesm2022/cmat-components-date-range.mjs.map +1 -1
  200. package/fesm2022/cmat-components-drawer.mjs +7 -7
  201. package/fesm2022/cmat-components-drawer.mjs.map +1 -1
  202. package/fesm2022/cmat-components-fullscreen.mjs +4 -4
  203. package/fesm2022/cmat-components-fullscreen.mjs.map +1 -1
  204. package/fesm2022/cmat-components-highlight.mjs +6 -6
  205. package/fesm2022/cmat-components-highlight.mjs.map +1 -1
  206. package/fesm2022/cmat-components-json-editor.mjs +9 -9
  207. package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
  208. package/fesm2022/cmat-components-masonry.mjs +3 -3
  209. package/fesm2022/cmat-components-masonry.mjs.map +1 -1
  210. package/fesm2022/cmat-components-material-color-picker.mjs +6 -7
  211. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
  212. package/fesm2022/cmat-components-material-datetimepicker.mjs +70 -83
  213. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
  214. package/fesm2022/cmat-components-navigation.mjs +48 -48
  215. package/fesm2022/cmat-components-navigation.mjs.map +1 -1
  216. package/fesm2022/cmat-components-pagination.mjs +14 -17
  217. package/fesm2022/cmat-components-pagination.mjs.map +1 -1
  218. package/fesm2022/cmat-components-password-strength.mjs +15 -15
  219. package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
  220. package/fesm2022/cmat-components-popover.mjs +15 -18
  221. package/fesm2022/cmat-components-popover.mjs.map +1 -1
  222. package/fesm2022/cmat-components-progress-bar.mjs +3 -3
  223. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
  224. package/fesm2022/cmat-components-rating.mjs +9 -5
  225. package/fesm2022/cmat-components-rating.mjs.map +1 -1
  226. package/fesm2022/cmat-components-select-search.mjs +15 -15
  227. package/fesm2022/cmat-components-select-search.mjs.map +1 -1
  228. package/fesm2022/cmat-components-select-tree.mjs +9 -10
  229. package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
  230. package/fesm2022/cmat-components-timeline.mjs +17 -24
  231. package/fesm2022/cmat-components-timeline.mjs.map +1 -1
  232. package/fesm2022/cmat-components-toast.mjs +18 -18
  233. package/fesm2022/cmat-components-toast.mjs.map +1 -1
  234. package/fesm2022/cmat-components-transfer-picker.mjs +25 -31
  235. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
  236. package/fesm2022/cmat-components-upload.mjs +14 -14
  237. package/fesm2022/cmat-components-upload.mjs.map +1 -1
  238. package/fesm2022/cmat-directives-animate-on-scroll.mjs +6 -6
  239. package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -1
  240. package/fesm2022/cmat-directives-autofocus.mjs +3 -3
  241. package/fesm2022/cmat-directives-debounce.mjs +9 -9
  242. package/fesm2022/cmat-directives-digit-only.mjs +24 -9
  243. package/fesm2022/cmat-directives-digit-only.mjs.map +1 -1
  244. package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
  245. package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -1
  246. package/fesm2022/cmat-lib-mock-api.mjs +7 -8
  247. package/fesm2022/cmat-lib-mock-api.mjs.map +1 -1
  248. package/fesm2022/cmat-pipes-bytes.mjs +3 -3
  249. package/fesm2022/cmat-pipes-bytes.mjs.map +1 -1
  250. package/fesm2022/cmat-pipes-date-format.mjs +3 -3
  251. package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
  252. package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -1
  253. package/fesm2022/cmat-pipes-group-by.mjs +3 -3
  254. package/fesm2022/cmat-pipes-group-by.mjs.map +1 -1
  255. package/fesm2022/cmat-pipes-keys.mjs +3 -3
  256. package/fesm2022/cmat-pipes-keys.mjs.map +1 -1
  257. package/fesm2022/cmat-pipes-secure.mjs +3 -3
  258. package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
  259. package/fesm2022/cmat-services-alert.mjs +10 -9
  260. package/fesm2022/cmat-services-alert.mjs.map +1 -1
  261. package/fesm2022/cmat-services-config.mjs +7 -7
  262. package/fesm2022/cmat-services-config.mjs.map +1 -1
  263. package/fesm2022/cmat-services-confirmation.mjs +6 -6
  264. package/fesm2022/cmat-services-data.mjs +3 -3
  265. package/fesm2022/cmat-services-data.mjs.map +1 -1
  266. package/fesm2022/cmat-services-loading.mjs +6 -6
  267. package/fesm2022/cmat-services-loading.mjs.map +1 -1
  268. package/fesm2022/cmat-services-local-storage.mjs +3 -3
  269. package/fesm2022/cmat-services-media-watcher.mjs +3 -3
  270. package/fesm2022/cmat-services-media-watcher.mjs.map +1 -1
  271. package/fesm2022/cmat-services-platform.mjs +3 -3
  272. package/fesm2022/cmat-services-platform.mjs.map +1 -1
  273. package/fesm2022/cmat-services-splash-screen.mjs +3 -3
  274. package/fesm2022/cmat-services-title.mjs +3 -3
  275. package/fesm2022/cmat-services-title.mjs.map +1 -1
  276. package/fesm2022/cmat-services-translation.mjs +3 -3
  277. package/fesm2022/cmat-services-translation.mjs.map +1 -1
  278. package/fesm2022/cmat-services-utils.mjs +8 -10
  279. package/fesm2022/cmat-services-utils.mjs.map +1 -1
  280. package/fesm2022/cmat-validators.mjs.map +1 -1
  281. package/lib/mock-api/mock-api.request-handler.d.ts +1 -3
  282. package/lib/mock-api/mock-api.service.d.ts +1 -3
  283. package/lib/mock-api/mock-api.types.d.ts +2 -4
  284. package/package.json +76 -67
  285. package/pipes/group-by/group-by.pipe.d.ts +1 -1
  286. package/services/config/urlStateConfig.service.d.ts +0 -1
  287. package/services/translation/translation.service.d.ts +2 -2
  288. package/services/utils/utils.service.d.ts +5 -7
  289. package/styles/overrides/angular-material.scss +0 -1
  290. package/styles/overrides/quill.scss +102 -0
  291. package/styles/themes.scss +19 -19
@@ -72,7 +72,9 @@ export class CmatSelectTreeComponent {
72
72
  this._placeholder = '';
73
73
  this._required = false;
74
74
  this._disabled = false;
75
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
75
76
  this._onModelChange = () => { };
77
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
76
78
  this._onTouchedChange = () => { };
77
79
  if (this.ngControl != null) {
78
80
  this.ngControl.valueAccessor = this;
@@ -221,7 +223,7 @@ export class CmatSelectTreeComponent {
221
223
  this.stateChanges.next();
222
224
  }
223
225
  get disabled() {
224
- if (this.ngControl && this.ngControl.disabled !== null) {
226
+ if (!isNil(this.ngControl?.disabled)) {
225
227
  return this.ngControl.disabled;
226
228
  }
227
229
  return this._disabled;
@@ -363,9 +365,6 @@ export class CmatSelectTreeComponent {
363
365
  compareObjects(o1, o2) {
364
366
  return o1 && o2 ? o1?.name === o2?.name && o1?.id === o2?.id : o1 === o2;
365
367
  }
366
- trackByFn(index, item) {
367
- return index || item;
368
- }
369
368
  _init(v) {
370
369
  if (this.dataSource.length > 0 && this.treeControl.dataNodes && this._matSelect) {
371
370
  if (this.expandable) {
@@ -488,7 +487,7 @@ export class CmatSelectTreeComponent {
488
487
  }
489
488
  _applyColumnLevelFilters(node, filter) {
490
489
  let result = false;
491
- if (node && node.children && node.children.length > 0) {
490
+ if (node?.children && node.children.length > 0) {
492
491
  for (let i = node.children.length - 1; i >= 0; i--) {
493
492
  const resultTemp = this._applyColumnLevelFilters(node.children[i], filter);
494
493
  if (!resultTemp) {
@@ -497,7 +496,7 @@ export class CmatSelectTreeComponent {
497
496
  result = resultTemp || result;
498
497
  }
499
498
  }
500
- if (node && node.children && node.children.length === 0) {
499
+ if (node?.children && node.children.length === 0) {
501
500
  node.children = null;
502
501
  }
503
502
  const cellValue = node['name'].toLowerCase();
@@ -512,13 +511,13 @@ export class CmatSelectTreeComponent {
512
511
  this.isChecked = this.checkCount === this.treeControl.dataNodes.length && this.checkCount > 0;
513
512
  }
514
513
  }
515
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CmatSelectTreeComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.9", type: CmatSelectTreeComponent, isStandalone: true, selector: "cmat-select-tree", inputs: { id: "id", dataSource: "dataSource", noEntriesFoundLabel: "noEntriesFoundLabel", showNoFoundLabel: "showNoFoundLabel", multiple: "multiple", overallSearchEnabled: "overallSearchEnabled", canNull: "canNull", customTriggerLabelFn: "customTriggerLabelFn", customTriggerLabelTemplate: "customTriggerLabelTemplate", expandable: "expandable", showToggleAllCheckbox: "showToggleAllCheckbox", placeholder: "placeholder", value: "value", required: "required", disabled: "disabled" }, host: { listeners: { "document:click": "clickedOut()" }, properties: { "attr.id": "this.id" } }, providers: [{ provide: MatFormFieldControl, useExisting: CmatSelectTreeComponent }], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["componentSelect"], descendants: true }], exportAs: ["cmatSelectTree"], usesOnChanges: true, ngImport: i0, template: "@if(multiple){\n<mat-select #componentSelect [placeholder]=\"placeholder\" multiple [required]=\"required\" [formControl]=\"selectControl\"\n [compareWith]=\"compareObjects\" (focusin)=\"onFocusIn()\"\n panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n (toggleAll)=\"toggleSelectAll($event)\" [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option (click)=\"clearSelection()\" class=\"pl-10\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track trackByFn($index, selectData)) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox [checked]=\"descendantsAllSelected(node)\" [color]=\"'primary'\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" class=\"text-current\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}\n@else {\n<mat-select #componentSelect [placeholder]=\"placeholder\" [required]=\"required\" [formControl]=\"selectControl\"\n [compareWith]=\"compareObjects\" (focusin)=\"onFocusIn()\"\n panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n (toggleAll)=\"toggleSelectAll($event)\" [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option (click)=\"clearSelection()\" class=\"pl-10\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track trackByFn($index, selectData)) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox [checked]=\"descendantsAllSelected(node)\" [color]=\"'primary'\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" class=\"text-current\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}", styles: ["cmat-select-tree{display:block;width:100%;z-index:101}cmat-select-tree.hidden{display:none}cmat-select-tree .cmat-select-search-inner{overflow:hidden;position:fixed;line-height:45px;display:flex;flex-direction:row}cmat-select-tree .cmat-select-search-inner span{display:flex;place-items:center}cmat-select-tree .cmat-select-search-no-entries-found{width:100%;text-align:center;border-radius:.25rem;box-shadow:0 2px 8px #00000059}cmat-select-tree .cmat-select-search-input{padding-top:0;padding-bottom:0;height:48px;line-height:48px}cmat-select-tree .cmat-select-search-clear{top:3px;margin:0 10px}cmat-select-tree .cmat-select-search-icon{margin-right:0;margin-left:10px}cmat-select-tree .mat-mdc-option-pseudo-checkbox{display:none}cmat-select-tree .mat-tree-node{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i3.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: CmatSelectSearchComponent, selector: "cmat-select-search", inputs: ["placeholderLabel", "type", "noEntriesFoundLabel", "showNoFoundLabel", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toggleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"], exportAs: ["cmatSelectSearch"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i5.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i5.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i5.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i5.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i5.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
514
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CmatSelectTreeComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
515
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: CmatSelectTreeComponent, isStandalone: true, selector: "cmat-select-tree", inputs: { id: "id", dataSource: "dataSource", noEntriesFoundLabel: "noEntriesFoundLabel", showNoFoundLabel: "showNoFoundLabel", multiple: "multiple", overallSearchEnabled: "overallSearchEnabled", canNull: "canNull", customTriggerLabelFn: "customTriggerLabelFn", customTriggerLabelTemplate: "customTriggerLabelTemplate", expandable: "expandable", showToggleAllCheckbox: "showToggleAllCheckbox", placeholder: "placeholder", value: "value", required: "required", disabled: "disabled" }, host: { listeners: { "document:click": "clickedOut()" }, properties: { "attr.id": "this.id" } }, providers: [{ provide: MatFormFieldControl, useExisting: CmatSelectTreeComponent }], viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["componentSelect"], descendants: true }], exportAs: ["cmatSelectTree"], usesOnChanges: true, ngImport: i0, template: "@if(multiple){\n<mat-select #componentSelect multiple panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\" [placeholder]=\"placeholder\" [required]=\"required\"\n [formControl]=\"selectControl\" [compareWith]=\"compareObjects\"\n (focusin)=\"onFocusIn()\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\" (toggleAll)=\"toggleSelectAll($event)\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option class=\"pl-10\" (click)=\"clearSelection()\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track $index) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox class=\"text-current\" [checked]=\"descendantsAllSelected(node)\"\n [color]=\"'primary'\" [indeterminate]=\"descendantsPartiallySelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}\n@else {\n<mat-select #componentSelect panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\" [placeholder]=\"placeholder\" [required]=\"required\"\n [formControl]=\"selectControl\" [compareWith]=\"compareObjects\"\n (focusin)=\"onFocusIn()\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\" (toggleAll)=\"toggleSelectAll($event)\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option class=\"pl-10\" (click)=\"clearSelection()\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track $index) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox class=\"text-current\" [checked]=\"descendantsAllSelected(node)\"\n [color]=\"'primary'\" [indeterminate]=\"descendantsPartiallySelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}", styles: ["cmat-select-tree{display:block;width:100%;z-index:101}cmat-select-tree.hidden{display:none}cmat-select-tree .cmat-select-search-inner{overflow:hidden;position:fixed;line-height:45px;display:flex;flex-direction:row}cmat-select-tree .cmat-select-search-inner span{display:flex;place-items:center}cmat-select-tree .cmat-select-search-no-entries-found{width:100%;text-align:center;border-radius:.25rem;box-shadow:0 2px 8px #00000059}cmat-select-tree .cmat-select-search-input{padding-top:0;padding-bottom:0;height:48px;line-height:48px}cmat-select-tree .cmat-select-search-clear{top:3px;margin:0 10px}cmat-select-tree .cmat-select-search-icon{margin-right:0;margin-left:10px}cmat-select-tree .mat-mdc-option-pseudo-checkbox{display:none}cmat-select-tree .mat-tree-node{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i3.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: CmatSelectSearchComponent, selector: "cmat-select-search", inputs: ["placeholderLabel", "type", "noEntriesFoundLabel", "showNoFoundLabel", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toggleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"], exportAs: ["cmatSelectSearch"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i5.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i5.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i5.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i5.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i5.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
517
516
  }
518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CmatSelectTreeComponent, decorators: [{
517
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CmatSelectTreeComponent, decorators: [{
519
518
  type: Component,
520
519
  args: [{ selector: 'cmat-select-tree', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [{ provide: MatFormFieldControl, useExisting: CmatSelectTreeComponent }], exportAs: 'cmatSelectTree', standalone: true, imports: [MatIconModule, MatSelectModule, CmatSelectSearchComponent,
521
- ReactiveFormsModule, MatTreeModule, NgClass, MatButtonModule, MatCheckboxModule, AsyncPipe, NgStyle], template: "@if(multiple){\n<mat-select #componentSelect [placeholder]=\"placeholder\" multiple [required]=\"required\" [formControl]=\"selectControl\"\n [compareWith]=\"compareObjects\" (focusin)=\"onFocusIn()\"\n panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n (toggleAll)=\"toggleSelectAll($event)\" [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option (click)=\"clearSelection()\" class=\"pl-10\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track trackByFn($index, selectData)) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox [checked]=\"descendantsAllSelected(node)\" [color]=\"'primary'\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" class=\"text-current\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}\n@else {\n<mat-select #componentSelect [placeholder]=\"placeholder\" [required]=\"required\" [formControl]=\"selectControl\"\n [compareWith]=\"compareObjects\" (focusin)=\"onFocusIn()\"\n panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n (toggleAll)=\"toggleSelectAll($event)\" [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option (click)=\"clearSelection()\" class=\"pl-10\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track trackByFn($index, selectData)) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox [checked]=\"descendantsAllSelected(node)\" [color]=\"'primary'\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" class=\"text-current\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}", styles: ["cmat-select-tree{display:block;width:100%;z-index:101}cmat-select-tree.hidden{display:none}cmat-select-tree .cmat-select-search-inner{overflow:hidden;position:fixed;line-height:45px;display:flex;flex-direction:row}cmat-select-tree .cmat-select-search-inner span{display:flex;place-items:center}cmat-select-tree .cmat-select-search-no-entries-found{width:100%;text-align:center;border-radius:.25rem;box-shadow:0 2px 8px #00000059}cmat-select-tree .cmat-select-search-input{padding-top:0;padding-bottom:0;height:48px;line-height:48px}cmat-select-tree .cmat-select-search-clear{top:3px;margin:0 10px}cmat-select-tree .cmat-select-search-icon{margin-right:0;margin-left:10px}cmat-select-tree .mat-mdc-option-pseudo-checkbox{display:none}cmat-select-tree .mat-tree-node{cursor:pointer}\n"] }]
520
+ ReactiveFormsModule, MatTreeModule, NgClass, MatButtonModule, MatCheckboxModule, AsyncPipe, NgStyle], template: "@if(multiple){\n<mat-select #componentSelect multiple panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\" [placeholder]=\"placeholder\" [required]=\"required\"\n [formControl]=\"selectControl\" [compareWith]=\"compareObjects\"\n (focusin)=\"onFocusIn()\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\" (toggleAll)=\"toggleSelectAll($event)\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option class=\"pl-10\" (click)=\"clearSelection()\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track $index) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox class=\"text-current\" [checked]=\"descendantsAllSelected(node)\"\n [color]=\"'primary'\" [indeterminate]=\"descendantsPartiallySelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}\n@else {\n<mat-select #componentSelect panelClass=\"overflow-y-auto lg:overflow-y-hidden lg:hover:overflow-y-auto scrollbar-custom\" [placeholder]=\"placeholder\" [required]=\"required\"\n [formControl]=\"selectControl\" [compareWith]=\"compareObjects\"\n (focusin)=\"onFocusIn()\">\n <mat-select-trigger>\n @if (!customTriggerLabelFn) {\n {{simpleTriggerLabelFn(checklistSelection.selected)}}\n }\n @else{\n {{customTriggerLabelFn}}\n }\n </mat-select-trigger>\n\n <div (focusout)=\"onFocusOut($event)\">\n @if (overallSearchEnabled) {\n <mat-option>\n <cmat-select-search [showNoFoundLabel]=\"showNoFoundLabel\" [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\n [formControl]=\"overallFilterControl\" [clearSearchInput]=\"true\"\n [toggleAllCheckboxIndeterminate]=\"isIndeterminate\" [toggleAllCheckboxChecked]=\"isChecked\"\n [showToggleAllCheckbox]=\"showToggleAllCheckbox&&multiple\" (toggleAll)=\"toggleSelectAll($event)\">\n </cmat-select-search>\n </mat-option>\n }\n @if (canNull&&treeDataSource.data.length!==0) {\n <mat-option class=\"pl-10\" (click)=\"clearSelection()\">\u7A7A</mat-option>\n }\n @for (selectData of matSelectData | async ; track $index) {\n <mat-option class=\"hidden\" [value]=\"selectData\">{{selectData.name}}</mat-option>\n }\n\n <mat-tree [dataSource]=\"treeDataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\"\n (click)=\"todoLeafItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button disabled>\n\n </button>\n @if (multiple) {\n <mat-checkbox class=\"checklist-leaf-node text-current\" [color]=\"'primary'\"\n [checked]=\"checklistSelection.isSelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else{\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [ngClass]=\"checklistSelection.isSelected(node)?'selected':''\" (click)=\"todoItemSelectionToggle($event,node)\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\n <mat-icon class=\"mat-icon-rtl-mirror\"\n [svgIcon]=\"treeControl.isExpanded(node) ? 'mat_outline:expand_more' : 'mat_outline:chevron_right'\">\n </mat-icon>\n </button>\n @if (multiple) {\n <mat-checkbox class=\"text-current\" [checked]=\"descendantsAllSelected(node)\"\n [color]=\"'primary'\" [indeterminate]=\"descendantsPartiallySelected(node)\">{{node.name}}</mat-checkbox>\n }\n @else {\n <span class=\"text-current\">{{node.name}}</span>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-select>\n}", styles: ["cmat-select-tree{display:block;width:100%;z-index:101}cmat-select-tree.hidden{display:none}cmat-select-tree .cmat-select-search-inner{overflow:hidden;position:fixed;line-height:45px;display:flex;flex-direction:row}cmat-select-tree .cmat-select-search-inner span{display:flex;place-items:center}cmat-select-tree .cmat-select-search-no-entries-found{width:100%;text-align:center;border-radius:.25rem;box-shadow:0 2px 8px #00000059}cmat-select-tree .cmat-select-search-input{padding-top:0;padding-bottom:0;height:48px;line-height:48px}cmat-select-tree .cmat-select-search-clear{top:3px;margin:0 10px}cmat-select-tree .cmat-select-search-icon{margin-right:0;margin-left:10px}cmat-select-tree .mat-mdc-option-pseudo-checkbox{display:none}cmat-select-tree .mat-tree-node{cursor:pointer}\n"] }]
522
521
  }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
523
522
  type: Optional
524
523
  }, {
@@ -563,4 +562,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
563
562
  }], disabled: [{
564
563
  type: Input
565
564
  }] } });
566
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY21hdC9jb21wb25lbnRzL3NlbGVjdC10cmVlL3NlbGVjdC10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NtYXQvY29tcG9uZW50cy9zZWxlY3QtdHJlZS9zZWxlY3QtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLElBQUksRUFFSixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLG1CQUFtQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGdCQUFn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QyxTQUFTO3NCQUE3RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFVL0MsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGdCQUFnQjtnQkE0STFCLFdBQVc7c0JBRGQsS0FBSztnQkFXRixLQUFLO3NCQURSLEtBQUs7Z0JBK0JGLFFBQVE7c0JBRFgsS0FBSztnQkFTRixRQUFRO3NCQURYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nICovXHJcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgQm9vbGVhbklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XHJcbmltcG9ydCB7IE5nQ2xhc3MsIEFzeW5jUGlwZSwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEhvc3RCaW5kaW5nLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPcHRpb25hbCxcclxuICAgIFNlbGYsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0LCBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRUcmVlRmxhdERhdGFTb3VyY2UsIE1hdFRyZWVGbGF0dGVuZXIsIE1hdFRyZWVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90cmVlJztcclxuaW1wb3J0IHsgaXNOaWwsIGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoLWVzJztcclxuaW1wb3J0IHsgbWVyZ2UsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENtYXRTZWxlY3RTZWFyY2hDb21wb25lbnQgfSBmcm9tICdjbWF0L2NvbXBvbmVudHMvc2VsZWN0LXNlYXJjaCc7XHJcbmltcG9ydCB7IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUgfSBmcm9tICcuL3NlbGVjdC10cmVlLmZsYXRub2RlJztcclxuaW1wb3J0IHsgQ21hdFNlbGVjdFRyZWVOb2RlIH0gZnJvbSAnLi9zZWxlY3QtdHJlZS5ub2RlJztcclxuXHJcbmxldCBORVhUX0lEID0gMDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjbWF0LXNlbGVjdC10cmVlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QtdHJlZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9zZWxlY3QtdHJlZS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogQ21hdFNlbGVjdFRyZWVDb21wb25lbnQgfV0sXHJcbiAgICBleHBvcnRBczogJ2NtYXRTZWxlY3RUcmVlJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbTWF0SWNvbk1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBDbWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50LFxyXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1hdFRyZWVNb2R1bGUsIE5nQ2xhc3MsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIEFzeW5jUGlwZSwgTmdTdHlsZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENtYXRTZWxlY3RUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgTWF0Rm9ybUZpZWxkQ29udHJvbDxhbnk+LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaWQgPSBgY21hdC1zZWxlY3QtdHJlZS0ke05FWFRfSUQrK31gO1xyXG5cclxuICAgIEBJbnB1dCgpIGRhdGFTb3VyY2U6IENtYXRTZWxlY3RUcmVlTm9kZVtdO1xyXG5cclxuICAgIEBJbnB1dCgpIG5vRW50cmllc0ZvdW5kTGFiZWwgPSAn5peg57uT5p6cJztcclxuXHJcbiAgICBASW5wdXQoKSBzaG93Tm9Gb3VuZExhYmVsID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpIG92ZXJhbGxTZWFyY2hFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBjYW5OdWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tVHJpZ2dlckxhYmVsRm46ICh2YWx1ZTogQ21hdFNlbGVjdFRyZWVOb2RlW10pID0+IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBjdXN0b21UcmlnZ2VyTGFiZWxUZW1wbGF0ZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGV4cGFuZGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KCkgc2hvd1RvZ2dsZUFsbENoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZmxhdE5vZGVNYXAgPSBuZXcgTWFwPENtYXRTZWxlY3RUcmVlRmxhdE5vZGUsIENtYXRTZWxlY3RUcmVlTm9kZT4oKTtcclxuXHJcbiAgICBuZXN0ZWROb2RlTWFwID0gbmV3IE1hcDxDbWF0U2VsZWN0VHJlZU5vZGUsIENtYXRTZWxlY3RUcmVlRmxhdE5vZGU+KCk7XHJcblxyXG4gICAgc2VsZWN0ZWRQYXJlbnQ6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICB0cmVlQ29udHJvbDogRmxhdFRyZWVDb250cm9sPENtYXRTZWxlY3RUcmVlRmxhdE5vZGU+O1xyXG5cclxuICAgIHRyZWVGbGF0dGVuZXI6IE1hdFRyZWVGbGF0dGVuZXI8Q21hdFNlbGVjdFRyZWVOb2RlLCBDbWF0U2VsZWN0VHJlZUZsYXROb2RlPjtcclxuXHJcbiAgICBjaGVja2xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8Q21hdFNlbGVjdFRyZWVGbGF0Tm9kZT4odHJ1ZSk7XHJcblxyXG4gICAgdHJlZURhdGFTb3VyY2U6IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxDbWF0U2VsZWN0VHJlZU5vZGUsIENtYXRTZWxlY3RUcmVlRmxhdE5vZGU+O1xyXG5cclxuICAgIG92ZXJhbGxGaWx0ZXJDb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG5cclxuICAgIGlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgaXNDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgY2hlY2tDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBzZWxlY3RDb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gICAgbWF0U2VsZWN0RGF0YTogUmVwbGF5U3ViamVjdDxhbnlbXT4gPSBuZXcgUmVwbGF5U3ViamVjdDxhbnlbXT4oMSk7XHJcblxyXG4gICAgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHRvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnY21hdC1zZWxlY3QtdHJlZSc7XHJcblxyXG4gICAgcHJpdmF0ZSBfbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XHJcbiAgICBwcml2YXRlIF91bnN1YnNjcmliZUFsbDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIodGhpcy50cmFuc2Zvcm1lciwgdGhpcy5nZXRMZXZlbCxcclxuICAgICAgICAgICAgdGhpcy5pc0V4cGFuZGFibGUsIHRoaXMuZ2V0Q2hpbGRyZW4pO1xyXG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPENtYXRTZWxlY3RUcmVlRmxhdE5vZGU+KHRoaXMuZ2V0TGV2ZWwsIHRoaXMuaXNFeHBhbmRhYmxlKTtcclxuICAgICAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSh0aGlzLnRyZWVDb250cm9sLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudFNlbGVjdCcsIHsgc3RhdGljOiBmYWxzZSB9KSBzZXQgbWF0U2VsZWN0KG06IE1hdFNlbGVjdCkge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0c1NlbGVjdCA9ICFpc1VuZGVmaW5lZCh0aGlzLl9tYXRTZWxlY3QpO1xyXG4gICAgICAgIHRoaXMuX21hdFNlbGVjdCA9IG07XHJcblxyXG4gICAgICAgIGlmICghZXhpc3RzU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICAgIGNsaWNrZWRPdXQoKTp2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX21hdFNlbGVjdD8ucGFuZWxPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldExldmVsID0gKG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiBudW1iZXIgPT4gbm9kZS5sZXZlbDtcclxuXHJcbiAgICBpc0V4cGFuZGFibGUgPSAobm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IGJvb2xlYW4gPT4gbm9kZS5leHBhbmRhYmxlO1xyXG5cclxuICAgIGdldENoaWxkcmVuID0gKG5vZGU6IENtYXRTZWxlY3RUcmVlTm9kZSk6IENtYXRTZWxlY3RUcmVlTm9kZVtdIHwgbnVsbCA9PiBub2RlLmNoaWxkcmVuO1xyXG5cclxuICAgIGhhc0NoaWxkID0gKF86IG51bWJlciwgX25vZGVEYXRhOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogYm9vbGVhbiA9PiBfbm9kZURhdGEuZXhwYW5kYWJsZTtcclxuXHJcbiAgICBoYXNOb0NvbnRlbnQgPSAoXzogbnVtYmVyLCBfbm9kZURhdGE6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiBib29sZWFuID0+IF9ub2RlRGF0YS5uYW1lID09PSAnJztcclxuXHJcbiAgICB0cmFuc2Zvcm1lciA9IChub2RlOiBDbWF0U2VsZWN0VHJlZU5vZGUsIGxldmVsOiBudW1iZXIpOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlID0+IHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ05vZGUgPSB0aGlzLm5lc3RlZE5vZGVNYXAuZ2V0KG5vZGUpO1xyXG4gICAgICAgIGNvbnN0IGZsYXROb2RlID0gZXhpc3RpbmdOb2RlICYmIGV4aXN0aW5nTm9kZS5uYW1lID09PSBub2RlLm5hbWVcclxuICAgICAgICAgICAgPyBleGlzdGluZ05vZGVcclxuICAgICAgICAgICAgOiBuZXcgQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSgpO1xyXG4gICAgICAgIGZsYXROb2RlLmlkID0gbm9kZS5pZDtcclxuICAgICAgICBmbGF0Tm9kZS5uYW1lID0gbm9kZS5uYW1lO1xyXG4gICAgICAgIGZsYXROb2RlLmxldmVsID0gbGV2ZWw7XHJcbiAgICAgICAgZmxhdE5vZGUuZXhwYW5kYWJsZSA9ICEhbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgdGhpcy5mbGF0Tm9kZU1hcC5zZXQoZmxhdE5vZGUsIG5vZGUpO1xyXG4gICAgICAgIHRoaXMubmVzdGVkTm9kZU1hcC5zZXQobm9kZSwgZmxhdE5vZGUpO1xyXG4gICAgICAgIHJldHVybiBmbGF0Tm9kZTtcclxuICAgIH07XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzWydkYXRhU291cmNlJ10pIHtcclxuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLm1hdFNlbGVjdERhdGEubmV4dCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBwYW5lbENsYXNzOiBzdHJpbmcgPSAnJztcclxuICAgICAgICBpZiAoIXRoaXMub3ZlcmFsbFNlYXJjaEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgcGFuZWxDbGFzcyA9ICdjbWF0LXNlbGVjdC1zZWFyY2gtcGFuZWwgb3ZlcmZsb3cteS1hdXRvIGxnOm92ZXJmbG93LXktaGlkZGVuIGxnOmhvdmVyOm92ZXJmbG93LXktYXV0byBzY3JvbGxiYXItY3VzdG9tJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcykge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcykpIHtcclxuICAgICAgICAgICAgICAgICh0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcyBhcyBzdHJpbmdbXSkucHVzaChwYW5lbENsYXNzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcyA9IFt0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcywgcGFuZWxDbGFzc107XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX21hdFNlbGVjdC5wYW5lbENsYXNzID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MuZW50cmllc1twYW5lbENsYXNzXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcyA9IHBhbmVsQ2xhc3M7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdGhpcy5fbWF0U2VsZWN0Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmVBbGwpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcGVuZWQgJiYgdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KC4uLmRlc2NlbmRhbnRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghb3BlbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOaWwodGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5kT3V0Tm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fZ2V0UGFyZW50Tm9kZShub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChwYXJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZE91dE5vZGUucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kT3V0Tm9kZS5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCAmJiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZFswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0LndyaXRlVmFsdWUodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3QuX29uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG1lcmdlKHRoaXMub3ZlcmFsbEZpbHRlckNvbnRyb2wudmFsdWVDaGFuZ2VzKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmVBbGwpLCBkZWJvdW5jZVRpbWUoMjAwKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0U2VsZWN0LnBhbmVsT3Blbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFDbG9uZTogQ21hdFNlbGVjdFRyZWVOb2RlW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFsuLi50aGlzLmRhdGFTb3VyY2VdKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycjogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGRhdGFDbG9uZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2FwcGx5Q29sdW1uTGV2ZWxGaWx0ZXJzKGRhdGFDbG9uZVtpXSwgdGhpcy5vdmVyYWxsRmlsdGVyQ29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLmZvckVhY2goKHYpID0+IHsgZGF0YUNsb25lLnNwbGljZSh2LCAxKTsgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZURhdGFTb3VyY2UuZGF0YSA9IGRhdGFDbG9uZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdFNlbGVjdERhdGEubmV4dCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZEFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0KHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLm5leHQodm9pZCAwKTtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fb25Nb2RlbENoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF92YWx1ZTogYW55O1xyXG5cclxuICAgIGdldCBlbXB0eSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlcnJvclN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiAodGhpcy50b3VjaGVkICYmIHRoaXMubmdDb250cm9sPy5pbnZhbGlkKSA/PyBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZXF1aXJlZDsgfVxyXG4gICAgc2V0IHJlcXVpcmVkKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmRpc2FibGVkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5nQ29udHJvbC5kaXNhYmxlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcclxuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25Nb2RlbENoYW5nZSA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWRDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXRTZWxlY3Q/LnNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21hdFNlbGVjdD8uc2V0RGVzY3JpYmVkQnlJZHMoaWRzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNvbnRhaW5lckNsaWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hdFNlbGVjdD8uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb2N1c0luKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb2N1c091dChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5fbWF0U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBFbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faW5pdCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2ltcGxlVHJpZ2dlckxhYmVsRm4odmFsdWU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGVbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgobm9kZSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTmlsKG5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzTmlsKHRoaXMuY3VzdG9tVHJpZ2dlckxhYmVsVGVtcGxhdGUpXHJcbiAgICAgICAgICAgICAgICB8fCB0eXBlb2YgdGhpcy5jdXN0b21UcmlnZ2VyTGFiZWxUZW1wbGF0ZSAhPT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgIHx8IHRoaXMuY3VzdG9tVHJpZ2dlckxhYmVsVGVtcGxhdGUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke25vZGUuaWR9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgYXRMZWFzdFBhcnRpYWxTdWJzdGl0dXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uOiBzdHJpbmcgPSB0aGlzLmN1c3RvbVRyaWdnZXJMYWJlbFRlbXBsYXRlLnJlcGxhY2UoL1skXVt7XShbXn1dKylbfV0vZywgKF8sIGtleSkgPT5cclxuICAgICAgICAgICAgICAgICFpc05pbCgobm9kZSBhcyBhbnkpW2tleV0pICYmIChhdExlYXN0UGFydGlhbFN1YnN0aXR1dGlvbiA9IHRydWUpID8gKG5vZGUgYXMgYW55KVtrZXldIDogJycpO1xyXG4gICAgICAgICAgICBpZiAoYXRMZWFzdFBhcnRpYWxTdWJzdGl0dXRpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7bm9kZS5pZH1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24udHJpbSgpO1xyXG4gICAgICAgIH0pLmpvaW4oJywgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFdoZXRoZXIgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgbm9kZSBhcmUgc2VsZWN0ZWQuICovXHJcbiAgICBkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzLmV2ZXJ5KGNoaWxkID0+XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogV2hldGhlciBwYXJ0IG9mIHRoZSBkZXNjZW5kYW50cyBhcmUgc2VsZWN0ZWQgKi9cclxuICAgIGRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBkZXNjZW5kYW50cy5zb21lKGNoaWxkID0+IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0ICYmICFkZXNjZW5kYW50cy5ldmVyeShjaGlsZCA9PiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGNoaWxkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRvZ2dsZSB0aGUgdG8tZG8gaXRlbSBzZWxlY3Rpb24uIFNlbGVjdC9kZXNlbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnRzIG5vZGUgKi9cclxuICAgIHRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKGV2ZW50OiBhbnksIG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmZDb3VudCA9IGRlc2NlbmRhbnRzLmZpbHRlcihjaGlsZCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZClcclxuICAgICAgICAgICAgKS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KC4uLmRlc2NlbmRhbnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSB0aGlzLmNoZWNrQ291bnQgKyAxICsgZGVzY2VuZGFudHMubGVuZ3RoIC0gZGlmZkNvdW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoLi4uZGVzY2VuZGFudHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IHRoaXMuY2hlY2tDb3VudCAtIDEgLSBkZXNjZW5kYW50cy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrQWxsUGFyZW50c1NlbGVjdGlvbihub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoZWNrU3RhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3QuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRvZ2dsZSBhIGxlYWYgdG8tZG8gaXRlbSBzZWxlY3Rpb24uIENoZWNrIGFsbCB0aGUgcGFyZW50cyB0byBzZWUgaWYgdGhleSBjaGFuZ2VkICovXHJcbiAgICB0b2RvTGVhZkl0ZW1TZWxlY3Rpb25Ub2dnbGUoZXZlbnQ6IGFueSwgbm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkgPyB0aGlzLmNoZWNrQ291bnQgKz0gMSA6IHRoaXMuY2hlY2tDb3VudCAtPSAxO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2hlY2tTdGF0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21hdFNlbGVjdC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuaXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbWF0U2VsZWN0LndyaXRlVmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5fbWF0U2VsZWN0Ll9vbkNoYW5nZShudWxsKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgdG9nZ2xlU2VsZWN0QWxsKHNlbGVjdEFsbFZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHNlbGVjdEFsbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcGFyZU9iamVjdHMobzE6IGFueSwgbzI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBvMSAmJiBvMiA/IG8xPy5uYW1lID09PSBvMj8ubmFtZSAmJiBvMT8uaWQgPT09IG8yPy5pZCA6IG8xID09PSBvMjtcclxuICAgIH1cclxuICAgIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiBpbmRleCB8fCBpdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX29uTW9kZWxDaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4geyB9O1xyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2hhbmdlOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2luaXQodjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPiAwICYmIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzICYmIHRoaXMuX21hdFNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5leHBhbmRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZEFsbCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzTmlsKHYpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDaGVja2xpc3RTZWxlY3Rpb24odik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodiAmJiB2Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRPdXROb2RlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlW10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9nZXRQYXJlbnROb2RlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKHBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kT3V0Tm9kZS5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRPdXROb2RlLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3Qobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0Ll9vbkNoYW5nZSh0aGlzLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoZWNrU3RhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qIENoZWNrcyBhbGwgdGhlIHBhcmVudHMgd2hlbiBhIGxlYWYgbm9kZSBpcyBzZWxlY3RlZC91bnNlbGVjdGVkICovXHJcbiAgICBwcml2YXRlIF9jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBwYXJlbnQ6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUgfCBudWxsID0gdGhpcy5fZ2V0UGFyZW50Tm9kZShub2RlKTtcclxuICAgICAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5leHBhbmRhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQocGFyZW50KTtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tSb290Tm9kZVNlbGVjdGlvbihwYXJlbnQpO1xyXG4gICAgICAgICAgICBwYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnROb2RlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDaGVjayByb290IG5vZGUgY2hlY2tlZCBzdGF0ZSBhbmQgY2hhbmdlIGl0IGFjY29yZGluZ2x5ICovXHJcbiAgICBwcml2YXRlIF9jaGVja1Jvb3ROb2RlU2VsZWN0aW9uKG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBub2RlU2VsZWN0ZWQgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG4gICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgICAgICBjb25zdCBkZXNjQWxsU2VsZWN0ZWQgPSBkZXNjZW5kYW50cy5ldmVyeShjaGlsZCA9PlxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGNoaWxkKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG5vZGVTZWxlY3RlZCAmJiAhZGVzY0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50IC09IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmICghbm9kZVNlbGVjdGVkICYmIChkZXNjQWxsU2VsZWN0ZWQgfHwgZGVzY2VuZGFudHMubGVuZ3RoID09PSAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgKz0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyogR2V0IHRoZSBwYXJlbnQgbm9kZSBvZiBhIG5vZGUgKi9cclxuICAgIHByaXZhdGUgX2dldFBhcmVudE5vZGUobm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldExldmVsKG5vZGUpO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudExldmVsIDwgMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5pbmRleE9mKG5vZGUpIC0gMTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRMZXZlbChjdXJyZW50Tm9kZSkgPCBjdXJyZW50TGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF91cGRhdGVDaGVja2xpc3RTZWxlY3Rpb24odmFsdWU6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICBpZiAoIWlzTmlsKHZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFycmF5OiBhbnlbXSA9ICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IFt2YWx1ZV0gOiB2YWx1ZTtcclxuICAgICAgICAgICAgdmFsdWVBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRm91bmQgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gaXRlbS5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOaWwobm9kZUZvdW5kKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlRm91bmQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0KHZhbHVlOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaXNOaWwodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXJyYXk6IGFueVtdID0gIUFycmF5LmlzQXJyYXkodmFsdWUpID8gW3ZhbHVlXSA6IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJhbGxTZWFyY2hFbmFibGVkKS8v5pyJ5pCc57Si5Yqf6IO977yM6L2s5YyW6YCJ5Lit6IqC54K55Li65b2T5YmN5pWw5o2u5rqQ6IqC54K5XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlQXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVGb3VuZCA9IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOaWwobm9kZUZvdW5kKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgKz0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoaXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlRm91bmQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoZWNrU3RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYXBwbHlDb2x1bW5MZXZlbEZpbHRlcnMobm9kZTogQ21hdFNlbGVjdFRyZWVOb2RlLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFRlbXAgPSB0aGlzLl9hcHBseUNvbHVtbkxldmVsRmlsdGVycyhub2RlLmNoaWxkcmVuW2ldLCBmaWx0ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0VGVtcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFRlbXAgfHwgcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobm9kZSAmJiBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gbm9kZVsnbmFtZSddLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGNlbGxWYWx1ZS5pbmRleE9mKGZpbHRlcikgPiAtMSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUNoZWNrU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1RvZ2dsZUFsbENoZWNrYm94ICYmIHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gdGhpcy5jaGVja0NvdW50IDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoICYmIHRoaXMuY2hlY2tDb3VudCA+IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gdGhpcy5jaGVja0NvdW50ID09PSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGggJiYgdGhpcy5jaGVja0NvdW50ID4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiQGlmKG11bHRpcGxlKXtcbjxtYXQtc2VsZWN0ICNjb21wb25lbnRTZWxlY3QgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgbXVsdGlwbGUgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdENvbnRyb2xcIlxuICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZU9iamVjdHNcIiAoZm9jdXNpbik9XCJvbkZvY3VzSW4oKVwiXG4gIHBhbmVsQ2xhc3M9XCJvdmVyZmxvdy15LWF1dG8gbGc6b3ZlcmZsb3cteS1oaWRkZW4gbGc6aG92ZXI6b3ZlcmZsb3cteS1hdXRvIHNjcm9sbGJhci1jdXN0b21cIj5cbiAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICBAaWYgKCFjdXN0b21UcmlnZ2VyTGFiZWxGbikge1xuICAgIHt7c2ltcGxlVHJpZ2dlckxhYmVsRm4oY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKX19XG4gICAgfVxuICAgIEBlbHNle1xuICAgIHt7Y3VzdG9tVHJpZ2dlckxhYmVsRm59fVxuICAgIH1cbiAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG5cbiAgPGRpdiAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCI+XG4gICAgQGlmIChvdmVyYWxsU2VhcmNoRW5hYmxlZCkge1xuICAgIDxtYXQtb3B0aW9uPlxuICAgICAgPGNtYXQtc2VsZWN0LXNlYXJjaCBbc2hvd05vRm91bmRMYWJlbF09XCJzaG93Tm9Gb3VuZExhYmVsXCIgW25vRW50cmllc0ZvdW5kTGFiZWxdPVwibm9FbnRyaWVzRm91bmRMYWJlbFwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJvdmVyYWxsRmlsdGVyQ29udHJvbFwiIFtjbGVhclNlYXJjaElucHV0XT1cInRydWVcIlxuICAgICAgICBbdG9nZ2xlQWxsQ2hlY2tib3hJbmRldGVybWluYXRlXT1cImlzSW5kZXRlcm1pbmF0ZVwiIFt0b2dnbGVBbGxDaGVja2JveENoZWNrZWRdPVwiaXNDaGVja2VkXCJcbiAgICAgICAgKHRvZ2dsZUFsbCk9XCJ0b2dnbGVTZWxlY3RBbGwoJGV2ZW50KVwiIFtzaG93VG9nZ2xlQWxsQ2hlY2tib3hdPVwic2hvd1RvZ2dsZUFsbENoZWNrYm94JiZtdWx0aXBsZVwiPlxuICAgICAgPC9jbWF0LXNlbGVjdC1zZWFyY2g+XG4gICAgPC9tYXQtb3B0aW9uPlxuICAgIH1cbiAgICBAaWYgKGNhbk51bGwmJnRyZWVEYXRhU291cmNlLmRhdGEubGVuZ3RoIT09MCkge1xuICAgIDxtYXQtb3B0aW9uIChjbGljayk9XCJjbGVhclNlbGVjdGlvbigpXCIgY2xhc3M9XCJwbC0xMFwiPuepujwvbWF0LW9wdGlvbj5cbiAgICB9XG4gICAgQGZvciAoc2VsZWN0RGF0YSBvZiBtYXRTZWxlY3REYXRhIHwgYXN5bmMgOyB0cmFjayB0cmFja0J5Rm4oJGluZGV4LCBzZWxlY3REYXRhKSkge1xuICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaGlkZGVuXCIgW3ZhbHVlXT1cInNlbGVjdERhdGFcIj57e3NlbGVjdERhdGEubmFtZX19PC9tYXQtb3B0aW9uPlxuICAgIH1cblxuICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJ0cmVlRGF0YVNvdXJjZVwiIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbFwiPlxuICAgICAgPG1hdC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIiBtYXRUcmVlTm9kZVRvZ2dsZSBtYXRUcmVlTm9kZVBhZGRpbmdcbiAgICAgICAgW25nQ2xhc3NdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk/J3NlbGVjdGVkJzonJ1wiXG4gICAgICAgIChjbGljayk9XCJ0b2RvTGVhZkl0ZW1TZWxlY3Rpb25Ub2dnbGUoJGV2ZW50LG5vZGUpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBkaXNhYmxlZD5cblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwiY2hlY2tsaXN0LWxlYWYtbm9kZSB0ZXh0LWN1cnJlbnRcIiBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiPnt7bm9kZS5uYW1lfX08L21hdC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZXtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWN1cnJlbnRcIj57e25vZGUubmFtZX19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L21hdC10cmVlLW5vZGU+XG5cbiAgICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBoYXNDaGlsZFwiIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgICBbbmdDbGFzc109XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKT8nc2VsZWN0ZWQnOicnXCIgKGNsaWNrKT1cInRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKCRldmVudCxub2RlKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VHJlZU5vZGVUb2dnbGUgW2F0dHIuYXJpYS1sYWJlbF09XCIndG9nZ2xlICcgKyBub2RlLm5hbWVcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCJcbiAgICAgICAgICAgIFtzdmdJY29uXT1cInRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnbWF0X291dGxpbmU6ZXhwYW5kX21vcmUnIDogJ21hdF9vdXRsaW5lOmNoZXZyb25fcmlnaHQnXCI+XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpXCIgW2NvbG9yXT1cIidwcmltYXJ5J1wiXG4gICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlKVwiIGNsYXNzPVwidGV4dC1jdXJyZW50XCI+e3tub2RlLm5hbWV9fTwvbWF0LWNoZWNrYm94PlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWN1cnJlbnRcIj57e25vZGUubmFtZX19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L21hdC10cmVlLW5vZGU+XG4gICAgPC9tYXQtdHJlZT5cbiAgPC9kaXY+XG48L21hdC1zZWxlY3Q+XG59XG5AZWxzZSB7XG48bWF0LXNlbGVjdCAjY29tcG9uZW50U2VsZWN0IFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RDb250cm9sXCJcbiAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVPYmplY3RzXCIgKGZvY3VzaW4pPVwib25Gb2N1c0luKClcIlxuICBwYW5lbENsYXNzPVwib3ZlcmZsb3cteS1hdXRvIGxnOm92ZXJmbG93LXktaGlkZGVuIGxnOmhvdmVyOm92ZXJmbG93LXktYXV0byBzY3JvbGxiYXItY3VzdG9tXCI+XG4gIDxtYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgQGlmICghY3VzdG9tVHJpZ2dlckxhYmVsRm4pIHtcbiAgICB7e3NpbXBsZVRyaWdnZXJMYWJlbEZuKGNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCl9fVxuICAgIH1cbiAgICBAZWxzZXtcbiAgICB7e2N1c3RvbVRyaWdnZXJMYWJlbEZufX1cbiAgICB9XG4gIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuXG4gIDxkaXYgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoJGV2ZW50KVwiPlxuICAgIEBpZiAob3ZlcmFsbFNlYXJjaEVuYWJsZWQpIHtcbiAgICA8bWF0LW9wdGlvbj5cbiAgICAgIDxjbWF0LXNlbGVjdC1zZWFyY2ggW3Nob3dOb0ZvdW5kTGFiZWxdPVwic2hvd05vRm91bmRMYWJlbFwiIFtub0VudHJpZXNGb3VuZExhYmVsXT1cIm5vRW50cmllc0ZvdW5kTGFiZWxcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwib3ZlcmFsbEZpbHRlckNvbnRyb2xcIiBbY2xlYXJTZWFyY2hJbnB1dF09XCJ0cnVlXCJcbiAgICAgICAgW3RvZ2dsZUFsbENoZWNrYm94SW5kZXRlcm1pbmF0ZV09XCJpc0luZGV0ZXJtaW5hdGVcIiBbdG9nZ2xlQWxsQ2hlY2tib3hDaGVja2VkXT1cImlzQ2hlY2tlZFwiXG4gICAgICAgICh0b2dnbGVBbGwpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIiBbc2hvd1RvZ2dsZUFsbENoZWNrYm94XT1cInNob3dUb2dnbGVBbGxDaGVja2JveCYmbXVsdGlwbGVcIj5cbiAgICAgIDwvY21hdC1zZWxlY3Qtc2VhcmNoPlxuICAgIDwvbWF0LW9wdGlvbj5cbiAgICB9XG4gICAgQGlmIChjYW5OdWxsJiZ0cmVlRGF0YVNvdXJjZS5kYXRhLmxlbmd0aCE9PTApIHtcbiAgICA8bWF0LW9wdGlvbiAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oKVwiIGNsYXNzPVwicGwtMTBcIj7nqbo8L21hdC1vcHRpb24+XG4gICAgfVxuICAgIEBmb3IgKHNlbGVjdERhdGEgb2YgbWF0U2VsZWN0RGF0YSB8IGFzeW5jIDsgdHJhY2sgdHJhY2tCeUZuKCRpbmRleCwgc2VsZWN0RGF0YSkpIHtcbiAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImhpZGRlblwiIFt2YWx1ZV09XCJzZWxlY3REYXRhXCI+e3tzZWxlY3REYXRhLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICB9XG5cbiAgICA8bWF0LXRyZWUgW2RhdGFTb3VyY2VdPVwidHJlZURhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIj5cbiAgICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCIgbWF0VHJlZU5vZGVUb2dnbGUgbWF0VHJlZU5vZGVQYWRkaW5nXG4gICAgICAgIFtuZ0NsYXNzXT1cImNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpPydzZWxlY3RlZCc6JydcIlxuICAgICAgICAoY2xpY2spPVwidG9kb0xlYWZJdGVtU2VsZWN0aW9uVG9nZ2xlKCRldmVudCxub2RlKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gZGlzYWJsZWQ+XG5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cImNoZWNrbGlzdC1sZWFmLW5vZGUgdGV4dC1jdXJyZW50XCIgW2NvbG9yXT1cIidwcmltYXJ5J1wiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIj57e25vZGUubmFtZX19PC9tYXQtY2hlY2tib3g+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2V7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1jdXJyZW50XCI+e3tub2RlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9tYXQtdHJlZS1ub2RlPlxuXG4gICAgICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIiBtYXRUcmVlTm9kZVBhZGRpbmdcbiAgICAgICAgW25nQ2xhc3NdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk/J3NlbGVjdGVkJzonJ1wiIChjbGljayk9XCJ0b2RvSXRlbVNlbGVjdGlvblRvZ2dsZSgkZXZlbnQsbm9kZSlcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRyZWVOb2RlVG9nZ2xlIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3RvZ2dsZSAnICsgbm9kZS5uYW1lXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiXG4gICAgICAgICAgICBbc3ZnSWNvbl09XCJ0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ21hdF9vdXRsaW5lOmV4cGFuZF9tb3JlJyA6ICdtYXRfb3V0bGluZTpjaGV2cm9uX3JpZ2h0J1wiPlxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKVwiIFtjb2xvcl09XCIncHJpbWFyeSdcIlxuICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZSlcIiBjbGFzcz1cInRleHQtY3VycmVudFwiPnt7bm9kZS5uYW1lfX08L21hdC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1jdXJyZW50XCI+e3tub2RlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9tYXQtdHJlZS1ub2RlPlxuICAgIDwvbWF0LXRyZWU+XG4gIDwvZGl2PlxuPC9tYXQtc2VsZWN0PlxufSJdfQ==
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY21hdC9jb21wb25lbnRzL3NlbGVjdC10cmVlL3NlbGVjdC10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NtYXQvY29tcG9uZW50cy9zZWxlY3QtdHJlZS9zZWxlY3QtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLElBQUksRUFFSixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLG1CQUFtQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGdCQUFn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RSxTQUFTOzsyRkFFckYsdUJBQXVCO2tCQVpuQyxTQUFTOytCQUNJLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyx5QkFBeUIsRUFBRSxDQUFDLFlBQ3pFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUseUJBQXlCO3dCQUMvRCxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDOzswQkEyRDNGLFFBQVE7OzBCQUFJLElBQUk7eUVBdER0QixFQUFFO3NCQUZSLFdBQVc7dUJBQUMsU0FBUzs7c0JBQ3JCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUcsMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQTZDK0MsU0FBUztzQkFBN0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBVS9DLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBNEkxQixXQUFXO3NCQURkLEtBQUs7Z0JBV0YsS0FBSztzQkFEUixLQUFLO2dCQStCRixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsUUFBUTtzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZyAqL1xyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgRmxhdFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBBc3luY1BpcGUsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBIb3N0QmluZGluZyxcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT3B0aW9uYWwsXHJcbiAgICBTZWxmLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdCwgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0VHJlZUZsYXREYXRhU291cmNlLCBNYXRUcmVlRmxhdHRlbmVyLCBNYXRUcmVlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XHJcbmltcG9ydCB7IGlzTmlsLCBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCB7IG1lcmdlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDbWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnY21hdC9jb21wb25lbnRzL3NlbGVjdC1zZWFyY2gnO1xyXG5pbXBvcnQgeyBDbWF0U2VsZWN0VHJlZUZsYXROb2RlIH0gZnJvbSAnLi9zZWxlY3QtdHJlZS5mbGF0bm9kZSc7XHJcbmltcG9ydCB7IENtYXRTZWxlY3RUcmVlTm9kZSB9IGZyb20gJy4vc2VsZWN0LXRyZWUubm9kZSc7XHJcblxyXG5sZXQgTkVYVF9JRCA9IDA7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY21hdC1zZWxlY3QtdHJlZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LXRyZWUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LXRyZWUuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IENtYXRTZWxlY3RUcmVlQ29tcG9uZW50IH1dLFxyXG4gICAgZXhwb3J0QXM6ICdjbWF0U2VsZWN0VHJlZScsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW01hdEljb25Nb2R1bGUsIE1hdFNlbGVjdE1vZHVsZSwgQ21hdFNlbGVjdFNlYXJjaENvbXBvbmVudCxcclxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBNYXRUcmVlTW9kdWxlLCBOZ0NsYXNzLCBNYXRCdXR0b25Nb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBBc3luY1BpcGUsIE5nU3R5bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbWF0U2VsZWN0VHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PiwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlkID0gYGNtYXQtc2VsZWN0LXRyZWUtJHtORVhUX0lEKyt9YDtcclxuXHJcbiAgICBASW5wdXQoKSBkYXRhU291cmNlOiBDbWF0U2VsZWN0VHJlZU5vZGVbXTtcclxuXHJcbiAgICBASW5wdXQoKSBub0VudHJpZXNGb3VuZExhYmVsID0gJ+aXoOe7k+aenCc7XHJcblxyXG4gICAgQElucHV0KCkgc2hvd05vRm91bmRMYWJlbCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKSBvdmVyYWxsU2VhcmNoRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgY2FuTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1c3RvbVRyaWdnZXJMYWJlbEZuOiAodmFsdWU6IENtYXRTZWxlY3RUcmVlTm9kZVtdKSA9PiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tVHJpZ2dlckxhYmVsVGVtcGxhdGU6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBleHBhbmRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpIHNob3dUb2dnbGVBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGZsYXROb2RlTWFwID0gbmV3IE1hcDxDbWF0U2VsZWN0VHJlZUZsYXROb2RlLCBDbWF0U2VsZWN0VHJlZU5vZGU+KCk7XHJcblxyXG4gICAgbmVzdGVkTm9kZU1hcCA9IG5ldyBNYXA8Q21hdFNlbGVjdFRyZWVOb2RlLCBDbWF0U2VsZWN0VHJlZUZsYXROb2RlPigpO1xyXG5cclxuICAgIHNlbGVjdGVkUGFyZW50OiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgdHJlZUNvbnRyb2w6IEZsYXRUcmVlQ29udHJvbDxDbWF0U2VsZWN0VHJlZUZsYXROb2RlPjtcclxuXHJcbiAgICB0cmVlRmxhdHRlbmVyOiBNYXRUcmVlRmxhdHRlbmVyPENtYXRTZWxlY3RUcmVlTm9kZSwgQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZT47XHJcblxyXG4gICAgY2hlY2tsaXN0U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPENtYXRTZWxlY3RUcmVlRmxhdE5vZGU+KHRydWUpO1xyXG5cclxuICAgIHRyZWVEYXRhU291cmNlOiBNYXRUcmVlRmxhdERhdGFTb3VyY2U8Q21hdFNlbGVjdFRyZWVOb2RlLCBDbWF0U2VsZWN0VHJlZUZsYXROb2RlPjtcclxuXHJcbiAgICBvdmVyYWxsRmlsdGVyQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuXHJcbiAgICBpc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIGlzQ2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNoZWNrQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgc2VsZWN0Q29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICAgIG1hdFNlbGVjdERhdGE6IFJlcGxheVN1YmplY3Q8YW55W10+ID0gbmV3IFJlcGxheVN1YmplY3Q8YW55W10+KDEpO1xyXG5cclxuICAgIHJlYWRvbmx5IHN0YXRlQ2hhbmdlczogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICB0b3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb250cm9sVHlwZTogc3RyaW5nID0gJ2NtYXQtc2VsZWN0LXRyZWUnO1xyXG5cclxuICAgIHByaXZhdGUgX21hdFNlbGVjdDogTWF0U2VsZWN0O1xyXG4gICAgcHJpdmF0ZSBfdW5zdWJzY3JpYmVBbGw6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudHJlZUZsYXR0ZW5lciA9IG5ldyBNYXRUcmVlRmxhdHRlbmVyKHRoaXMudHJhbnNmb3JtZXIsIHRoaXMuZ2V0TGV2ZWwsXHJcbiAgICAgICAgICAgIHRoaXMuaXNFeHBhbmRhYmxlLCB0aGlzLmdldENoaWxkcmVuKTtcclxuICAgICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxDbWF0U2VsZWN0VHJlZUZsYXROb2RlPih0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSk7XHJcbiAgICAgICAgdGhpcy50cmVlRGF0YVNvdXJjZSA9IG5ldyBNYXRUcmVlRmxhdERhdGFTb3VyY2UodGhpcy50cmVlQ29udHJvbCwgdGhpcy50cmVlRmxhdHRlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkKCdjb21wb25lbnRTZWxlY3QnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IG1hdFNlbGVjdChtOiBNYXRTZWxlY3QpIHtcclxuICAgICAgICBjb25zdCBleGlzdHNTZWxlY3QgPSAhaXNVbmRlZmluZWQodGhpcy5fbWF0U2VsZWN0KTtcclxuICAgICAgICB0aGlzLl9tYXRTZWxlY3QgPSBtO1xyXG5cclxuICAgICAgICBpZiAoIWV4aXN0c1NlbGVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXHJcbiAgICBjbGlja2VkT3V0KCk6dm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9tYXRTZWxlY3Q/LnBhbmVsT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRMZXZlbCA9IChub2RlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogbnVtYmVyID0+IG5vZGUubGV2ZWw7XHJcblxyXG4gICAgaXNFeHBhbmRhYmxlID0gKG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiBib29sZWFuID0+IG5vZGUuZXhwYW5kYWJsZTtcclxuXHJcbiAgICBnZXRDaGlsZHJlbiA9IChub2RlOiBDbWF0U2VsZWN0VHJlZU5vZGUpOiBDbWF0U2VsZWN0VHJlZU5vZGVbXSB8IG51bGwgPT4gbm9kZS5jaGlsZHJlbjtcclxuXHJcbiAgICBoYXNDaGlsZCA9IChfOiBudW1iZXIsIF9ub2RlRGF0YTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IGJvb2xlYW4gPT4gX25vZGVEYXRhLmV4cGFuZGFibGU7XHJcblxyXG4gICAgaGFzTm9Db250ZW50ID0gKF86IG51bWJlciwgX25vZGVEYXRhOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogYm9vbGVhbiA9PiBfbm9kZURhdGEubmFtZSA9PT0gJyc7XHJcblxyXG4gICAgdHJhbnNmb3JtZXIgPSAobm9kZTogQ21hdFNlbGVjdFRyZWVOb2RlLCBsZXZlbDogbnVtYmVyKTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdOb2RlID0gdGhpcy5uZXN0ZWROb2RlTWFwLmdldChub2RlKTtcclxuICAgICAgICBjb25zdCBmbGF0Tm9kZSA9IGV4aXN0aW5nTm9kZSAmJiBleGlzdGluZ05vZGUubmFtZSA9PT0gbm9kZS5uYW1lXHJcbiAgICAgICAgICAgID8gZXhpc3RpbmdOb2RlXHJcbiAgICAgICAgICAgIDogbmV3IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUoKTtcclxuICAgICAgICBmbGF0Tm9kZS5pZCA9IG5vZGUuaWQ7XHJcbiAgICAgICAgZmxhdE5vZGUubmFtZSA9IG5vZGUubmFtZTtcclxuICAgICAgICBmbGF0Tm9kZS5sZXZlbCA9IGxldmVsO1xyXG4gICAgICAgIGZsYXROb2RlLmV4cGFuZGFibGUgPSAhIW5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwO1xyXG4gICAgICAgIHRoaXMuZmxhdE5vZGVNYXAuc2V0KGZsYXROb2RlLCBub2RlKTtcclxuICAgICAgICB0aGlzLm5lc3RlZE5vZGVNYXAuc2V0KG5vZGUsIGZsYXROb2RlKTtcclxuICAgICAgICByZXR1cm4gZmxhdE5vZGU7XHJcbiAgICB9O1xyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY2hhbmdlc1snZGF0YVNvdXJjZSddKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVNvdXJjZTtcclxuICAgICAgICAgICAgdGhpcy5tYXRTZWxlY3REYXRhLm5leHQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBsZXQgcGFuZWxDbGFzczogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKCF0aGlzLm92ZXJhbGxTZWFyY2hFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHBhbmVsQ2xhc3MgPSAnY21hdC1zZWxlY3Qtc2VhcmNoLXBhbmVsIG92ZXJmbG93LXktYXV0byBsZzpvdmVyZmxvdy15LWhpZGRlbiBsZzpob3ZlcjpvdmVyZmxvdy15LWF1dG8gc2Nyb2xsYmFyLWN1c3RvbSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAodGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MgYXMgc3RyaW5nW10pLnB1c2gocGFuZWxDbGFzcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX21hdFNlbGVjdC5wYW5lbENsYXNzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSBbdGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MsIHBhbmVsQ2xhc3NdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9tYXRTZWxlY3QucGFuZWxDbGFzcyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21hdFNlbGVjdC5wYW5lbENsYXNzLmVudHJpZXNbcGFuZWxDbGFzc10gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0LnBhbmVsQ2xhc3MgPSBwYW5lbENsYXNzO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHRoaXMuX21hdFNlbGVjdC5vcGVuZWRDaGFuZ2VcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlQWxsKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgob3BlbmVkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3BlbmVkICYmIHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cGFuZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmlsKHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZE91dE5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGVbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX2dldFBhcmVudE5vZGUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICYmIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQocGFyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPdXROb2RlLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZE91dE5vZGUuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQgJiYgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWRbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdFNlbGVjdC53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0Ll9vbkNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBtZXJnZSh0aGlzLm92ZXJhbGxGaWx0ZXJDb250cm9sLnZhbHVlQ2hhbmdlcylcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlQWxsKSwgZGVib3VuY2VUaW1lKDIwMCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hdFNlbGVjdC5wYW5lbE9wZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhQ2xvbmU6IENtYXRTZWxlY3RUcmVlTm9kZVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShbLi4udGhpcy5kYXRhU291cmNlXSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnI6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBkYXRhQ2xvbmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9hcHBseUNvbHVtbkxldmVsRmlsdGVycyhkYXRhQ2xvbmVbaV0sIHRoaXMub3ZlcmFsbEZpbHRlckNvbnRyb2wudmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGFyci5mb3JFYWNoKCh2KSA9PiB7IGRhdGFDbG9uZS5zcGxpY2UodiwgMSk7IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVEYXRhU291cmNlLmRhdGEgPSBkYXRhQ2xvbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRTZWxlY3REYXRhLm5leHQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cGFuZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmRBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdCh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5uZXh0KHZvaWQgMCk7XHJcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbGwuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xyXG4gICAgfVxyXG4gICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX29uTW9kZWxDaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfdmFsdWU6IGFueTtcclxuXHJcbiAgICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLl92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gKHRoaXMudG91Y2hlZCAmJiB0aGlzLm5nQ29udHJvbD8uaW52YWxpZCkgPz8gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNob3VsZExhYmVsRmxvYXQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7IH1cclxuICAgIHNldCByZXF1aXJlZCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfcmVxdWlyZWQgPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghaXNOaWwodGhpcy5uZ0NvbnRyb2w/LmRpc2FibGVkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICAgIH1cclxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uTW9kZWxDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2hhbmdlID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbWF0U2VsZWN0Py5zZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXRTZWxlY3Q/LnNldERlc2NyaWJlZEJ5SWRzKGlkcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db250YWluZXJDbGljaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3Q/LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRm9jdXNJbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRm9jdXNPdXQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX21hdFNlbGVjdC5wYW5lbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZENoYW5nZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2luaXQodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNpbXBsZVRyaWdnZXJMYWJlbEZuKHZhbHVlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlW10pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKG5vZGUpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc05pbChub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc05pbCh0aGlzLmN1c3RvbVRyaWdnZXJMYWJlbFRlbXBsYXRlKVxyXG4gICAgICAgICAgICAgICAgfHwgdHlwZW9mIHRoaXMuY3VzdG9tVHJpZ2dlckxhYmVsVGVtcGxhdGUgIT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgICAgICB8fCB0aGlzLmN1c3RvbVRyaWdnZXJMYWJlbFRlbXBsYXRlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtub2RlLmlkfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGF0TGVhc3RQYXJ0aWFsU3Vic3RpdHV0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbjogc3RyaW5nID0gdGhpcy5jdXN0b21UcmlnZ2VyTGFiZWxUZW1wbGF0ZS5yZXBsYWNlKC9bJF1be10oW159XSspW31dL2csIChfLCBrZXkpID0+XHJcbiAgICAgICAgICAgICAgICAhaXNOaWwoKG5vZGUgYXMgYW55KVtrZXldKSAmJiAoYXRMZWFzdFBhcnRpYWxTdWJzdGl0dXRpb24gPSB0cnVlKSA/IChub2RlIGFzIGFueSlba2V5XSA6ICcnKTtcclxuICAgICAgICAgICAgaWYgKGF0TGVhc3RQYXJ0aWFsU3Vic3RpdHV0aW9uID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke25vZGUuaWR9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnRyaW0oKTtcclxuICAgICAgICB9KS5qb2luKCcsICcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBXaGV0aGVyIGFsbCB0aGUgZGVzY2VuZGFudHMgb2YgdGhlIG5vZGUgYXJlIHNlbGVjdGVkLiAqL1xyXG4gICAgZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cy5ldmVyeShjaGlsZCA9PlxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGNoaWxkKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFdoZXRoZXIgcGFydCBvZiB0aGUgZGVzY2VuZGFudHMgYXJlIHNlbGVjdGVkICovXHJcbiAgICBkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVzY2VuZGFudHMuc29tZShjaGlsZCA9PiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGNoaWxkKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiAhZGVzY2VuZGFudHMuZXZlcnkoY2hpbGQgPT4gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUb2dnbGUgdGhlIHRvLWRvIGl0ZW0gc2VsZWN0aW9uLiBTZWxlY3QvZGVzZWxlY3QgYWxsIHRoZSBkZXNjZW5kYW50cyBub2RlICovXHJcbiAgICB0b2RvSXRlbVNlbGVjdGlvblRvZ2dsZShldmVudDogYW55LCBub2RlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24udG9nZ2xlKG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBkaWZmQ291bnQgPSBkZXNjZW5kYW50cy5maWx0ZXIoY2hpbGQgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpXHJcbiAgICAgICAgICAgICkubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gdGhpcy5jaGVja0NvdW50ICsgMSArIGRlc2NlbmRhbnRzLmxlbmd0aCAtIGRpZmZDb3VudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KC4uLmRlc2NlbmRhbnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSB0aGlzLmNoZWNrQ291bnQgLSAxIC0gZGVzY2VuZGFudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDaGVja1N0YXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWF0U2VsZWN0LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUb2dnbGUgYSBsZWFmIHRvLWRvIGl0ZW0gc2VsZWN0aW9uLiBDaGVjayBhbGwgdGhlIHBhcmVudHMgdG8gc2VlIGlmIHRoZXkgY2hhbmdlZCAqL1xyXG4gICAgdG9kb0xlYWZJdGVtU2VsZWN0aW9uVG9nZ2xlKGV2ZW50OiBhbnksIG5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpID8gdGhpcy5jaGVja0NvdW50ICs9IDEgOiB0aGlzLmNoZWNrQ291bnQgLT0gMTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrQWxsUGFyZW50c1NlbGVjdGlvbihub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoZWNrU3RhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3QuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX21hdFNlbGVjdC53cml0ZVZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuX21hdFNlbGVjdC5fb25DaGFuZ2UobnVsbCk7ICAgICAgICBcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHRvZ2dsZVNlbGVjdEFsbChzZWxlY3RBbGxWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmIChzZWxlY3RBbGxWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBhcmVPYmplY3RzKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbzEgJiYgbzIgPyBvMT8ubmFtZSA9PT0gbzI/Lm5hbWUgJiYgbzE/LmlkID09PSBvMj8uaWQgOiBvMSA9PT0gbzI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxyXG4gICAgcHJpdmF0ZSBfb25Nb2RlbENoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgICBwcml2YXRlIF9vblRvdWNoZWRDaGFuZ2U6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaW5pdCh2OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlLmxlbmd0aCA+IDAgJiYgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgJiYgdGhpcy5fbWF0U2VsZWN0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cGFuZGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kQWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghaXNOaWwodikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoZWNrbGlzdFNlbGVjdGlvbih2KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2ICYmIHYubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZE91dE5vZGU6IENtYXRTZWxlY3RUcmVlRmxhdE5vZGVbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX2dldFBhcmVudE5vZGUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICYmIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQocGFyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPdXROb2RlLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZmluZE91dE5vZGUuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHY7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX21hdFNlbGVjdC53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXRTZWxlY3QuX29uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2hlY2tTdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyogQ2hlY2tzIGFsbCB0aGUgcGFyZW50cyB3aGVuIGEgbGVhZiBub2RlIGlzIHNlbGVjdGVkL3Vuc2VsZWN0ZWQgKi9cclxuICAgIHByaXZhdGUgX2NoZWNrQWxsUGFyZW50c1NlbGVjdGlvbihub2RlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHBhcmVudDogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSB8IG51bGwgPSB0aGlzLl9nZXRQYXJlbnROb2RlKG5vZGUpO1xyXG4gICAgICAgIHdoaWxlIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgcGFyZW50LmV4cGFuZGFibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChwYXJlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1Jvb3ROb2RlU2VsZWN0aW9uKHBhcmVudCk7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMuX2dldFBhcmVudE5vZGUocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENoZWNrIHJvb3Qgbm9kZSBjaGVja2VkIHN0YXRlIGFuZCBjaGFuZ2UgaXQgYWNjb3JkaW5nbHkgKi9cclxuICAgIHByaXZhdGUgX2NoZWNrUm9vdE5vZGVTZWxlY3Rpb24obm9kZTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5vZGVTZWxlY3RlZCA9IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk7XHJcbiAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICAgIGNvbnN0IGRlc2NBbGxTZWxlY3RlZCA9IGRlc2NlbmRhbnRzLmV2ZXJ5KGNoaWxkID0+XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAobm9kZVNlbGVjdGVkICYmICFkZXNjQWxsU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3Qobm9kZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgLT0gMTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFub2RlU2VsZWN0ZWQgJiYgKGRlc2NBbGxTZWxlY3RlZCB8fCBkZXNjZW5kYW50cy5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCArPSAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiBHZXQgdGhlIHBhcmVudCBub2RlIG9mIGEgbm9kZSAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0UGFyZW50Tm9kZShub2RlOiBDbWF0U2VsZWN0VHJlZUZsYXROb2RlKTogQ21hdFNlbGVjdFRyZWVGbGF0Tm9kZSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0TGV2ZWwobm9kZSk7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50TGV2ZWwgPCAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmluZGV4T2Yobm9kZSkgLSAxO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKGN1cnJlbnROb2RlKSA8IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUNoZWNrbGlzdFNlbGVjdGlvbih2YWx1ZTogYW55W10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgIGlmICghaXNOaWwodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXJyYXk6IGFueVtdID0gIUFycmF5LmlzQXJyYXkodmFsdWUpID8gW3ZhbHVlXSA6IHZhbHVlO1xyXG4gICAgICAgICAgICB2YWx1ZUFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVGb3VuZCA9IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05pbChub2RlRm91bmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KG5vZGVGb3VuZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF91cGRhdGVTZWxlY3QodmFsdWU6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFpc05pbCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVBcnJheTogYW55W10gPSAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbdmFsdWVdIDogdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmFsbFNlYXJjaEVuYWJsZWQpLy/mnInmkJzntKLlip/og73vvIzovazljJbpgInkuK3oioLngrnkuLrlvZPliY3mlbDmja7mupDoioLngrlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUZvdW5kID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05pbChub2RlRm91bmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCArPSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChpdGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KG5vZGVGb3VuZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2hlY2tTdGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9hcHBseUNvbHVtbkxldmVsRmlsdGVycyhub2RlOiBDbWF0U2VsZWN0VHJlZU5vZGUsIGZpbHRlcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAobm9kZT8uY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRUZW1wID0gdGhpcy5fYXBwbHlDb2x1bW5MZXZlbEZpbHRlcnMobm9kZS5jaGlsZHJlbltpXSwgZmlsdGVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRlbXApIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRUZW1wIHx8IHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG5vZGU/LmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gbm9kZVsnbmFtZSddLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGNlbGxWYWx1ZS5pbmRleE9mKGZpbHRlcikgPiAtMSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUNoZWNrU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1RvZ2dsZUFsbENoZWNrYm94ICYmIHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gdGhpcy5jaGVja0NvdW50IDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoICYmIHRoaXMuY2hlY2tDb3VudCA+IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gdGhpcy5jaGVja0NvdW50ID09PSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGggJiYgdGhpcy5jaGVja0NvdW50ID4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiQGlmKG11bHRpcGxlKXtcbjxtYXQtc2VsZWN0ICNjb21wb25lbnRTZWxlY3QgbXVsdGlwbGUgcGFuZWxDbGFzcz1cIm92ZXJmbG93LXktYXV0byBsZzpvdmVyZmxvdy15LWhpZGRlbiBsZzpob3ZlcjpvdmVyZmxvdy15LWF1dG8gc2Nyb2xsYmFyLWN1c3RvbVwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gIFtmb3JtQ29udHJvbF09XCJzZWxlY3RDb250cm9sXCIgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVPYmplY3RzXCJcbiAgKGZvY3VzaW4pPVwib25Gb2N1c0luKClcIj5cbiAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICBAaWYgKCFjdXN0b21UcmlnZ2VyTGFiZWxGbikge1xuICAgIHt7c2ltcGxlVHJpZ2dlckxhYmVsRm4oY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKX19XG4gICAgfVxuICAgIEBlbHNle1xuICAgIHt7Y3VzdG9tVHJpZ2dlckxhYmVsRm59fVxuICAgIH1cbiAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG5cbiAgPGRpdiAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCI+XG4gICAgQGlmIChvdmVyYWxsU2VhcmNoRW5hYmxlZCkge1xuICAgIDxtYXQtb3B0aW9uPlxuICAgICAgPGNtYXQtc2VsZWN0LXNlYXJjaCBbc2hvd05vRm91bmRMYWJlbF09XCJzaG93Tm9Gb3VuZExhYmVsXCIgW25vRW50cmllc0ZvdW5kTGFiZWxdPVwibm9FbnRyaWVzRm91bmRMYWJlbFwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJvdmVyYWxsRmlsdGVyQ29udHJvbFwiIFtjbGVhclNlYXJjaElucHV0XT1cInRydWVcIlxuICAgICAgICBbdG9nZ2xlQWxsQ2hlY2tib3hJbmRldGVybWluYXRlXT1cImlzSW5kZXRlcm1pbmF0ZVwiIFt0b2dnbGVBbGxDaGVja2JveENoZWNrZWRdPVwiaXNDaGVja2VkXCJcbiAgICAgICAgW3Nob3dUb2dnbGVBbGxDaGVja2JveF09XCJzaG93VG9nZ2xlQWxsQ2hlY2tib3gmJm11bHRpcGxlXCIgKHRvZ2dsZUFsbCk9XCJ0b2dnbGVTZWxlY3RBbGwoJGV2ZW50KVwiPlxuICAgICAgPC9jbWF0LXNlbGVjdC1zZWFyY2g+XG4gICAgPC9tYXQtb3B0aW9uPlxuICAgIH1cbiAgICBAaWYgKGNhbk51bGwmJnRyZWVEYXRhU291cmNlLmRhdGEubGVuZ3RoIT09MCkge1xuICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwicGwtMTBcIiAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oKVwiPuepujwvbWF0LW9wdGlvbj5cbiAgICB9XG4gICAgQGZvciAoc2VsZWN0RGF0YSBvZiBtYXRTZWxlY3REYXRhIHwgYXN5bmMgOyB0cmFjayAkaW5kZXgpIHtcbiAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImhpZGRlblwiIFt2YWx1ZV09XCJzZWxlY3REYXRhXCI+e3tzZWxlY3REYXRhLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICB9XG5cbiAgICA8bWF0LXRyZWUgW2RhdGFTb3VyY2VdPVwidHJlZURhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIj5cbiAgICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCIgbWF0VHJlZU5vZGVUb2dnbGUgbWF0VHJlZU5vZGVQYWRkaW5nXG4gICAgICAgIFtuZ0NsYXNzXT1cImNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpPydzZWxlY3RlZCc6JydcIlxuICAgICAgICAoY2xpY2spPVwidG9kb0xlYWZJdGVtU2VsZWN0aW9uVG9nZ2xlKCRldmVudCxub2RlKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gZGlzYWJsZWQ+XG5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cImNoZWNrbGlzdC1sZWFmLW5vZGUgdGV4dC1jdXJyZW50XCIgW2NvbG9yXT1cIidwcmltYXJ5J1wiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIj57e25vZGUubmFtZX19PC9tYXQtY2hlY2tib3g+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2V7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1jdXJyZW50XCI+e3tub2RlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9tYXQtdHJlZS1ub2RlPlxuXG4gICAgICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIiBtYXRUcmVlTm9kZVBhZGRpbmdcbiAgICAgICAgW25nQ2xhc3NdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk/J3NlbGVjdGVkJzonJ1wiIChjbGljayk9XCJ0b2RvSXRlbVNlbGVjdGlvblRvZ2dsZSgkZXZlbnQsbm9kZSlcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRyZWVOb2RlVG9nZ2xlIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3RvZ2dsZSAnICsgbm9kZS5uYW1lXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiXG4gICAgICAgICAgICBbc3ZnSWNvbl09XCJ0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ21hdF9vdXRsaW5lOmV4cGFuZF9tb3JlJyA6ICdtYXRfb3V0bGluZTpjaGV2cm9uX3JpZ2h0J1wiPlxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XCJ0ZXh0LWN1cnJlbnRcIiBbY2hlY2tlZF09XCJkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpXCJcbiAgICAgICAgICBbY29sb3JdPVwiJ3ByaW1hcnknXCIgW2luZGV0ZXJtaW5hdGVdPVwiZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlKVwiPnt7bm9kZS5uYW1lfX08L21hdC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1jdXJyZW50XCI+e3tub2RlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9tYXQtdHJlZS1ub2RlPlxuICAgIDwvbWF0LXRyZWU+XG4gIDwvZGl2PlxuPC9tYXQtc2VsZWN0PlxufVxuQGVsc2Uge1xuPG1hdC1zZWxlY3QgI2NvbXBvbmVudFNlbGVjdCBwYW5lbENsYXNzPVwib3ZlcmZsb3cteS1hdXRvIGxnOm92ZXJmbG93LXktaGlkZGVuIGxnOmhvdmVyOm92ZXJmbG93LXktYXV0byBzY3JvbGxiYXItY3VzdG9tXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgW2Zvcm1Db250cm9sXT1cInNlbGVjdENvbnRyb2xcIiBbY29tcGFyZVdpdGhdPVwiY29tcGFyZU9iamVjdHNcIlxuICAoZm9jdXNpbik9XCJvbkZvY3VzSW4oKVwiPlxuICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgIEBpZiAoIWN1c3RvbVRyaWdnZXJMYWJlbEZuKSB7XG4gICAge3tzaW1wbGVUcmlnZ2VyTGFiZWxGbihjaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQpfX1cbiAgICB9XG4gICAgQGVsc2V7XG4gICAge3tjdXN0b21UcmlnZ2VyTGFiZWxGbn19XG4gICAgfVxuICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cblxuICA8ZGl2IChmb2N1c291dCk9XCJvbkZvY3VzT3V0KCRldmVudClcIj5cbiAgICBAaWYgKG92ZXJhbGxTZWFyY2hFbmFibGVkKSB7XG4gICAgPG1hdC1vcHRpb24+XG4gICAgICA8Y21hdC1zZWxlY3Qtc2VhcmNoIFtzaG93Tm9Gb3VuZExhYmVsXT1cInNob3dOb0ZvdW5kTGFiZWxcIiBbbm9FbnRyaWVzRm91bmRMYWJlbF09XCJub0VudHJpZXNGb3VuZExhYmVsXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cIm92ZXJhbGxGaWx0ZXJDb250cm9sXCIgW2NsZWFyU2VhcmNoSW5wdXRdPVwidHJ1ZVwiXG4gICAgICAgIFt0b2dnbGVBbGxDaGVja2JveEluZGV0ZXJtaW5hdGVdPVwiaXNJbmRldGVybWluYXRlXCIgW3RvZ2dsZUFsbENoZWNrYm94Q2hlY2tlZF09XCJpc0NoZWNrZWRcIlxuICAgICAgICBbc2hvd1RvZ2dsZUFsbENoZWNrYm94XT1cInNob3dUb2dnbGVBbGxDaGVja2JveCYmbXVsdGlwbGVcIiAodG9nZ2xlQWxsKT1cInRvZ2dsZVNlbGVjdEFsbCgkZXZlbnQpXCI+XG4gICAgICA8L2NtYXQtc2VsZWN0LXNlYXJjaD5cbiAgICA8L21hdC1vcHRpb24+XG4gICAgfVxuICAgIEBpZiAoY2FuTnVsbCYmdHJlZURhdGFTb3VyY2UuZGF0YS5sZW5ndGghPT0wKSB7XG4gICAgPG1hdC1vcHRpb24gY2xhc3M9XCJwbC0xMFwiIChjbGljayk9XCJjbGVhclNlbGVjdGlvbigpXCI+56m6PC9tYXQtb3B0aW9uPlxuICAgIH1cbiAgICBAZm9yIChzZWxlY3REYXRhIG9mIG1hdFNlbGVjdERhdGEgfCBhc3luYyA7IHRyYWNrICRpbmRleCkge1xuICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaGlkZGVuXCIgW3ZhbHVlXT1cInNlbGVjdERhdGFcIj57e3NlbGVjdERhdGEubmFtZX19PC9tYXQtb3B0aW9uPlxuICAgIH1cblxuICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJ0cmVlRGF0YVNvdXJjZVwiIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbFwiPlxuICAgICAgPG1hdC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIiBtYXRUcmVlTm9kZVRvZ2dsZSBtYXRUcmVlTm9kZVBhZGRpbmdcbiAgICAgICAgW25nQ2xhc3NdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk/J3NlbGVjdGVkJzonJ1wiXG4gICAgICAgIChjbGljayk9XCJ0b2RvTGVhZkl0ZW1TZWxlY3Rpb25Ub2dnbGUoJGV2ZW50LG5vZGUpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBkaXNhYmxlZD5cblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwiY2hlY2tsaXN0LWxlYWYtbm9kZSB0ZXh0LWN1cnJlbnRcIiBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiPnt7bm9kZS5uYW1lfX08L21hdC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZXtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWN1cnJlbnRcIj57e25vZGUubmFtZX19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L21hdC10cmVlLW5vZGU+XG5cbiAgICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBoYXNDaGlsZFwiIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgICBbbmdDbGFzc109XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKT8nc2VsZWN0ZWQnOicnXCIgKGNsaWNrKT1cInRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKCRldmVudCxub2RlKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VHJlZU5vZGVUb2dnbGUgW2F0dHIuYXJpYS1sYWJlbF09XCIndG9nZ2xlICcgKyBub2RlLm5hbWVcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCJcbiAgICAgICAgICAgIFtzdmdJY29uXT1cInRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnbWF0X291dGxpbmU6ZXhwYW5kX21vcmUnIDogJ21hdF9vdXRsaW5lOmNoZXZyb25fcmlnaHQnXCI+XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInRleHQtY3VycmVudFwiIFtjaGVja2VkXT1cImRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICAgIFtjb2xvcl09XCIncHJpbWFyeSdcIiBbaW5kZXRlcm1pbmF0ZV09XCJkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGUpXCI+e3tub2RlLm5hbWV9fTwvbWF0LWNoZWNrYm94PlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWN1cnJlbnRcIj57e25vZGUubmFtZX19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L21hdC10cmVlLW5vZGU+XG4gICAgPC9tYXQtdHJlZT5cbiAgPC9kaXY+XG48L21hdC1zZWxlY3Q+XG59Il19